Ja, en...

Ik geef les in informatica aan de Montana State University. Ik ben de vader van drie zonen die allemaal weten dat ik computerprogrammeur ben, en van wie er minstens één interesse heeft getoond in het vakgebied. Ik hou van computerprogrammeren en probeer die liefde over te brengen op mijn zonen, de studenten in mijn klassen en iedereen die anders wil luisteren.

Een vraag die ik steeds vaker krijg van familieleden, vrienden en studenten is: Gezien AI, moet ik nog steeds overwegen om computerprogrammeur te worden?

Mijn antwoord hierop is: „Ja, en…”

„Ja”

Computerprogrammeren gaat fundamenteel over twee dingen:

  • Probleemoplossing met behulp van computers.
  • Leren hoe je complexiteit onder controle houdt terwijl je deze problemen oplost.

Ik vind het moeilijk me een toekomst voor te stellen waarin weten hoe je problemen met computers oplost en hoe je de complexiteit van die oplossingen beheerst, minder waardevol is dan vandaag. Daarom denk ik dat het een levensvatbare carrière zal blijven, zelfs met de komst van AI-tools.

„Je moet de code schrijven”

Dat gezegd hebbende, beschouw ik AI als zeer gevaarlijk voor junior programmeurs, omdat het effectief code kan genereren voor veel problemen. Als een junior programmeur niet leert hoe hij code moet schrijven en deze simpelweg genereert, berooft hij zichzelf van de kans om het viscerale begrip van code te ontwikkelen dat gepaard gaat met het „in de loopgraven” zitten.

Vanwege dit waarschuw ik mijn studenten:

„Ja, AI kan de code voor deze opdracht genereren. Laat het niet doen. Je moet zelf de code schrijven.”

Ik leg uit dat als ze de code niet zelf schrijven, ze de code ook niet effectief zullen kunnen lezen. Het vermogen om code te lezen zal zeker waardevol blijven, misschien zelfs waardevoller, in een AI-gestuurde toekomst van coderen.

Als je de code niet kunt lezen, loop je het risico in de valstrik van de tovenaarsleerling te trappen: het creëren van systemen die je niet begrijpt en niet kunt controleren.

Is Coderen → Prompten zoals Assembly → Hoger-niveau Coderen?

Sommige mensen beweren dat de overgang van hoog-niveau talen naar AI-gegenereerde code vergelijkbaar is met de overgang van assembly naar hoog-niveau programmeertalen.

Ik ben het niet eens met deze vergelijking.

Compilers zijn over het algemeen deterministisch op een manier die huidige AI-tools niet zijn. Gegeven een constructie in een hoog-nivautaal, zoals een for-loop of if-statement, kun je met redelijke zekerheid zeggen hoe de gegenereerde assembly eruit zal zien voor een bepaalde computerarchitectuur (althans, vóór optimalisatie).

Hetzelfde kan niet worden gezegd voor een op LLM's gebaseerde oplossing voor een specifieke prompt.

Hoog-niveau programmeertalen zijn een zeer goede manier om zeer specifiek gedefinieerde oplossingen voor computerproblemen te creëren met een minimum aan tekst, iets wat bij assembly niet het geval was. Ze elimineerden veel accidentele complexiteit, waardoor (ervan uitgaande dat de code redelijk goed geschreven was) vooral de noodzakelijke complexiteit overbleef.

LLM-gegenereerde code daarentegen elimineert vaak geen accidentele complexiteit en kan in feite aanzienlijke accidentele complexiteit toevoegen door ongepaste benaderingen van problemen te kiezen, shortcuts te nemen, etc.

Als je de code niet kunt lezen, hoe kun je dat dan weten? En als je de code wilt kunnen lezen, moet je de code schrijven.

AI is een geweldige assistent (TA)

Een ander ding dat ik mijn studenten vertel, is dat AI, mits correct gebruikt, een enorm effectieve onderwijsassistent (TA) is. Als je het niet gebruikt als codegenerator, maar als een partner die je helpt concepten en technieken te begrijpen, kan het een enorme boost geven aan je intellectuele ontwikkeling.

Een van de moeilijkste dingen bij het leren programmeren is „vastlopen”. Je ziet simpelweg de truc niet of weet niet waar je moet beginnen om vooruitgang te boeken.

Nog erger is wanneer je vastloopt door accidentele complexiteit: je weet niet hoe je met een bepaalde toolchain moet werken of zelfs niet wat een toolchain is. Dit is geen probleem met jou, maar een probleem met je omgeving. Zinloos vastlopen berooft je van tijd om daadwerkelijk te leren en jaagt mensen vaak uit de informatica. (Ik liep zelf vast bij het zelfstandig leren van Unix in Berkeley, wat een van de redenen is dat ik daar stopte met de studie informatica.)

AI kan je helpen deze blokkades te passeren en kan een geweldige TA zijn als het correct wordt gebruikt. Ik heb een AGENTS.md-bestand gedeeld met mijn studenten om coding-agents zo te configureren dat ze zich gedragen als een goede TA in plaats van een codegenerator, en ik moedig hen aan om AI in deze rol te gebruiken.

AI hoeft geen belemmering te zijn voor je groei als programmeur, zolang het maar op de juiste manier wordt ingezet.

„, en…”

Ik geloof wel dat AI computerprogrammeren gaat veranderen. Niet zo drastisch als sommige mensen denken, maar wel op enkele fundamentele manieren.

Puur coderen kan minder belangrijk worden

Het kan zijn dat de handeling van het coderen relatief aan waarde verliest. Ik vind dat jammer: ik hou meestal van het coderen zelf; het is leuk om iets te laten doen met je (metaforische) blote handen. Er zit een kunst en voldoening in het goed schrijven van code, en er moeten veel esthetische beslissingen worden genomen.

Het lijkt er echter op dat pure programmeervaardigheid in de toekomst minder belangrijk wordt. Naarmate dit relatief minder belangrijk wordt, lijkt het me dat andere vaardigheden belangrijker worden.

Communicatievaardigheden

Bijvoorbeeld het vermogen om helder te schrijven, te denken en te communiceren, zowel met LLM's als met mensen, zal waarschijnlijk veel belangrijker worden. Veel programmeurs hebben sowieso een literaire aanleg, en dit is een vaardigheid die waarschijnlijk in waarde zal stijgen en waar het loont om aan te werken. Het lezen van boeken en het schrijven van essays of blogposts lijken activiteiten die hierbij helpen.

Bedrijfsmatig inzicht

Een ander punt waar je energie in kunt steken, is het beter begrijpen van een bedrijf (of een overheidsrol, etc.). Computerprogrammeren gaat over het oplossen van problemen met computers, en bedrijven hebben genoeg van beide.

Sommige zakelijke mensen kijken naar AI en zeggen: „Geweldig, we hebben geen programmeurs meer nodig!“, maar het lijkt me net zo aannemelijk dat een programmeur zou zeggen: „Geweldig, we hebben geen zakelijke mensen meer nodig!”

Ik denk dat beide visies kortzichtig zijn, maar ik geloof wel dat AI programmeurs in staat stelt om fundamenteel als programmeur te blijven werken, terwijl ze meer tijd investeren in het begrijpen van de echte wereldproblemen (zakelijk of anders) die ze oplossen. Dit sluit goed aan bij het verbeteren van communicatievaardigheden.

Het „architectureren” van systemen

Zoals veel programmeurs ben ik ambivalent tegenover de term „software architect”. Ik heb gezien hoe architect-astronauten veel pijn in de wereld hebben veroorzaakt.

Bij gebrek aan een betere term denk ik echter dat software-architectuur een belangrijker onderdeel van het vak zal worden: het vermogen om grote softwaresystemen effectief te organiseren en, cruciaal, de complexiteit van die systemen te beheersen.

Een lastig punt voor junioren is dat het vermogen om grotere oplossingen goed te architectureren traditioneel voortkomt uit ervaring met het bouwen van kleinere delen van systemen — eerst slecht, en na verloop van tijd effectiever. De meeste slechte architecten die ik ben tegengekomen, waren ofwel slechte coders of hadden simpelweg weinig ervaring met coderen.

Als je AI toelaat om het coderen van de „simpele” dingen over te nemen, hoe ga je dan de intuïties ontwikkelen die nodig zijn om een effectieve architect te zijn? Dit is waarom, opnieuw, je zelf de code moet schrijven.

LLM's effectief gebruiken

Een andere vaardigheid die waarschijnlijk in waarde zal stijgen (overduidelijk), is weten hoe je LLM's effectief gebruikt. Ik denk dat we momenteel nog in het proces zitten om uit te zoeken wat dat precies betekent. Bovendien denk ik dat dit verschilt per ervaringsniveau.

Seniors

Senior programmeurs die al veel ervaring hebben uit het pre-AI-tijdperk, zitten in een goede positie om LLM's effectief te gebruiken: ze weten hoe „goede” code eruitziet, ze hebben ervaring met het bouwen van grotere systemen en weten wat belangrijk is en wat niet. Het gevaar voor senior programmeurs is dat ze volledig stoppen met programmeren en last krijgen van brain rot.

Bijzonder gevaarlijk is het afvuren van prompts en vervolgens in de Eternal Scroll (eeuwige scroll) worden gezogen terwijl je wacht. Geloof me, ik weet hoe dat voelt.

Ik probeer LLM's doorgaans op de volgende manier te gebruiken:

  • Om bestaande code te analyseren om deze beter te begrijpen en problemen en inconsistenties te vinden.
  • Om mijn gedachten te ordenen voor grotere projecten die ik wil aanpakken.
  • Om relatief kleine stukjes code te genereren voor systemen waaraan ik werk.
  • Om code te genereren waar ik niet graag aan schrijf (bijv. reguliere expressies & CSS).
  • Om demo's of verkennende code te genereren die ik bereid ben weg te gooien of die ik niet diepgaand wil onderhouden.
  • Om tests voor te stellen voor een specifieke feature waaraan ik werk.

Ik probeer LLM's niet te gebruiken om volledige oplossingen te genereren die ik moet ondersteunen. Soms gebruik ik LLM's naast mijn handmatige coderen tijdens het bouwen van een oplossing, om me te helpen API's en opties te begrijpen. Ik laat LLM's nooit de API's van de systemen die ik bouw ontwerpen.

Juniors

Junioren zitten in een lastiger parket. Ik zal het herhalen: je moet zelf de code schrijven. De verleiding om je door problemen heen te „viben” (vibe coding) is erg groot, maar je zult tegen die verleiding moeten vechten.

Collega's zullen zich door dingen heen viben en dat zal irritant zijn: je zult harder moeten werken dan zij, en je wordt misschien bekritiseerd omdat je traag bent. De dynamiek op de werkvloer is hier belangrijk om te begrijpen: als je bedrijf snelheid prioriteert boven begrip (zoals velen momenteel doen), moet je dat accepteren om niet ontslagen te worden.

Ik denk echter dat dit een tijdelijke situatie is en dat bedrijven er binnenkort achter zullen komen dat vibe coding op hoge snelheid leidt tot ergere complexiteitsexplosies dan zorgvuldig, doelbewust coderen. Op dat moment verwacht ik dat langzamer, bewuster coderen met AI-assistentie zal worden gezien als de beste manier om deze nieuwe technologie te benutten.

Waar AI junioren kan helpen, is bij het versnellen van de weg naar senior developer door accidentele complexiteit weg te nemen die junioren vaak tegenhoudt. Zoals ik hierboven zei: AI zien als een nuttige, hoewel soms overijverige helper in plaats van een knecht, kan zeer effectief zijn bij het begrijpen van de structuur van codebases, welke API's en technieken beschikbaar zijn voor een specifiek probleem, hoe een bepaald buildsysteem of programmeertaal werkt, etc.

Maar je moet zelf de code schrijven. En bedrijven: jullie moeten junioren de code laten schrijven.

Vandaag een baan vinden

De vragen die ik krijg over AI en programmeren draaien fundamenteel om het vinden van een fatsoenlijke baan. Het is geen geheim dat de arbeidsmarkt voor programmeurs momenteel slecht is, en ik zie goede informaticastudenten worstelen om een positie te vinden.

Hoewel ik geen glazen bol heb, geloof ik dat dit een tijdelijke en geen permanente situatie is. De arbeidsmarkt voor computerprogrammeurs is cyclisch met booms en busts, en ik geloof dat we op een gegeven moment zullen herstellen van de huidige bust.

Dat is echter een magere troost voor iemand die nu een baan zoekt, dus ik wil het specifieke advies voor het zoeken naar werk delen dat ik mijn studenten geef.

Familie, vrienden en kennissen

Ik beschouw online vacaturesites grotendeels als zinloos, vooral voor junioren. Het is een loterij en de kans om via hen een goede baan te vinden is klein. Omdat ze gratis zijn, zijn ze waarschijnlijk nog steeds de moeite waard om te gebruiken, maar het is niet de moeite waard om er veel tijd in te investeren.

Een betere aanpak zijn de „vier F's”: Family, Friends & Family of Friends (Familie, Vrienden & Familie van Vrienden). Gebruik je persoonlijke connecties om posities te vinden bij bedrijven waar je een concurrentievoordeel hebt omdat je mensen in het bedrijf kent. Familie is de sterkste mogelijkheid. Vrienden zijn vaak ook goed. Familie van vrienden is zwakker, maar ook de moeite waard om naar te vragen. Als je iemand bij een bedrijf kent, of slechts een paar stappen verwijderd bent van diegene, heb je een veel grotere kans om daar een baan te krijgen.

Ik benadruk aan veel studenten dat dit niet betekent dat je familie bij Google of een ander groot techbedrijf moet werken. Alle bedrijven van een aanzienlijke omvang hebben problemen die met computers moeten worden opgelost. Bijna elk bedrijf met meer dan 100 mensen heeft een soort ontwikkelgroep, zelfs als ze het niet zo noemen.

Als voorbeeld: ik had een student die moeite had om een baan te vinden. Ik vroeg wat hun ouder deed, en ze zeiden dat die bij het hoofdkantoor van Costco werkte. Ik vertelde hen dat ze in feite extreem gelukkig waren en dat dit hun ticket was naar een geweldig bedrijf. Misschien beginnen ze daar niet als „computerprogrammeur”, misschien beginnen ze als analist of in een andere rol. Maar het vermogen om daarnaast te programmeren zal zeer waardevol zijn en waarschijnlijk leiden tot een geweldige carrière.

Conclusie

Ik denk dus nog steeds dat het een goed idee is om computerprogrammeren als carrière na te streven. De huidige arbeidsmarkt is slecht, geen twijfel daarover, maar ik denk dat dit tijdelijk is.

Ik geloof wel dat de manier waarop computerprogrammeren wordt gedaan aan het veranderen is, en dat programmeurs moeten kijken naar het opbouwen van vaardigheden buiten het „pure” schrijven van code. Dat is altijd al een goed idee geweest.

Ik denk niet dat programmeren zo drastisch verandert als sommige mensen beweren, en ik denk dat de fundamenten van programmeren, in het bijzonder het schrijven van goede code en het beheersen van complexiteit, blijvend belangrijk zullen zijn.

Ik hoop dat dit essay nuttig is bij het beantwoorden van die vraag, vooral voor junior programmeurs, en mensen helpt zich zekerder te voelen bij het starten van een carrière die ik zeer lonend heb gevonden en verwacht nog lange tijd te blijven doen.

En bedrijven: laat de junioren ten minste een deel van de code schrijven. Het is in jullie eigen belang.