Natuurlijk komen veel problemen voort uit aannames die wij als programmeurs maken die gewoonweg niet kloppen. Ze zijn meestal wel eens een beetje waar, maar dat is niet hetzelfde als dat ze altijd waar zijn. 

Hier zijn een aantal valse overtuigingen die wij als programmeurs vaak beweren dat ze helemaal waar zijn.

Programmeertalen zijn verschillend

We slaan na het werk op de tafels in de bars. We schrijven lange manifesten. We beloven de baas dat deze keer deze nieuwe taal alles zal veranderen en dat de prachtige software zo overvloedig van de toetsenborden zal vloeien dat elk project een maand voor de deadline gereed is. Maar uiteindelijk steken we data in variabelen en schrijven we een paar if-then routines om ze te testen.

Programmeurs zien structuur in hun code en dromen ervan om er elke inefficiëntie uit te persen. Dus bedenken ze luchtkastelen die "frameworks", "scaffolding", "platformen" of "architecturen" worden genoemd en ze spelen ermee tot ze precies de juiste ondersteuning bieden voor het huidige probleem, zodat alles in een paar elegante regels kan worden geschreven. Helaas heeft de volgende opdracht een andere structuur.

Frameworks worden steeds beter

Misschien heb je je laatste webapplicatie in React gebouwd omdat je niet tevreden was over de pagina's die in Vue zijn gemaakt? Of misschien heb je een headless Ruby met wat statische pagina's in elkaar geflanst, omdat de WordPress-interface onhandig en gedateerd was? Of misschien heb je alles herschreven in iets kleiner, nieuwer of cooler, zoals Marko of Glimmer of Ghost? De programmeur is altijd op zoek naar het perfecte framework, maar dat framework verschijnt, net als het einde van de regenboog, nooit.

Ralph Waldo Emerson anticipeerde op het leven van de programmeur toen hij in 1841 "Self-Reliance" schreef. "De maatschappij komt nooit vooruit", merkte hij op, natuurlijk sprekend over de programmeringskaders. "Het neemt aan de ene kant even snel af als dat het er aan de andere kant bij komt. Voor alles wat men iets gegeven heeft, wordt er iets afgenomen."

En zo zien we steeds weer dat ontwikkelaars nieuwe frameworks creëren om de problemen van de oude frameworks op te lappen en nieuwe problemen onderweg te introduceren. Als een framework server-side rendering toevoegt, loopt het vast op de server. Maar als alles aan de clients wordt overgelaten, beginnen ze te vertragen. Elke nieuwe functie is een afweging tussen tijd, code en bandbreedte.

Null is aanvaardbaar

Het uitzoeken hoe om te gaan met null pointers is een groot probleem voor het moderne taalontwerp. Soms denk ik dat dat de helft van de Java code die ik schrijf, is om te controleren of een pointer null is.

De slimme manier waarop sommige talen een vraagteken gebruiken om te controleren op nulls helpt, maar het probleem is daarmee niet opgelost. Een aantal moderne talen heeft geprobeerd om het probleem van de nulltesten te elimineren door null helemaal te elimineren Als elke variabele geïnitialiseerd moet worden, kan er nooit een null zijn. Geen nulltesten meer. Probleem opgelost. Tijd voor de lunch.

De vreugde van deze ontdekking vervaagt binnen enkele regels nieuwe code omdat datastructuren vaak gaten zonder informatie hebben. Mensen laten regels op een formulier leeg. Soms zijn de gegevens nog niet beschikbaar. Dan heb je een of ander predicaat nodig om te beslissen of een element leeg is.

Als het element een string is, kun je testen of de lengte nul is. Als je lang en hard genoeg werkt met de typedefinities, kun je meestal iets bedenken dat logischerwijs goed is voor het specifieke probleem, in ieder geval totdat iemand de specificaties aanpast. Na dit een paar keer te hebben gedaan, begin je te verlangen naar één eenvoudig woord dat een lege variabele betekent.

Computers kunnen menselijke keuzes vastleggen

Het probleem van het vastleggen van geslacht en de keuze van mogelijke voornaamwoorden (pronouns) is tegenwoordig een groot mijnenveld voor programmeurs. Computers hebben vaste lijsten en goed gedefinieerde menu's en mensen veranderen steeds weer de regels. Een zeer vooruitstrevende school in Amerika heeft een een kant-en-klare applicatie in gebruik genomen om vervolgens te ontdekken dat de formulieren “slechts” twee keuzes gaven voor het geslacht.

Computerwetenschappers lossen nooit echt problemen op, ze voegen gewoon een extra laag van indirectie toe, in dit geval een verwijzing naar een leeg tekenreeksenveld waar de persoon zijn of haar keuze kan invullen. Dan komt er een grappenmaker langs die "Zijne Majesteit" kiest als pronoun, wat sommige kinderen aan het lachen maakt en anderen beledigt. Maar teruggaan naar een vaste lijst betekent dat sommige keuzes worden uitgesloten.

Deze “ontwerpfouten” verschijnen steeds opnieuw. Als je iedereen dwingt om een voornaam en een achternaam in te vullen, zullen sommigen maar één naam willen invullen. Of dan is er iemand die niet bekend wil zijn met een reeks Unicode-tekens. En wat als iemand een nieuwe emoji kiest voor zijn naamstring en de emoji niet in de definitieve lijst van aanvaardbare tekens zit? Hoezeer je de computer ook probeert te leren flexibel te zijn en menselijke grillen en dwaasheden moet accepteren, de mensen komen met nieuwe “logic bomb” die de code vernielen.

Unicode staat voor universele communicatie

Er is een commissie die regelmatig bijeenkomt om te beslissen welke emoji moeten worden opgenomen in de definitieve lijst van glyfen die de menselijke communicatie definieert. Ze gooien ook bepaalde emoji aan de kant, waardoor ze in feite iemands gevoelens ontkennen.

De explosie aan memes laat zien hoe zinloos dit proces kan zijn. Als de wereld emojis te beperkend vindt en ze ertoe aanzet om tekst te mengen met foto's van culturele iconen, hoe kan een emoji-lijst dan voldoende zijn?

Dan is er nog het probleem van de emojilettertypen. Wat in het ene lettertype er schattig en knuffelig uitziet, kan in een ander lettertype er lelijk en verdacht uitzien. Je kan een schattige emoji kiezen, en je telefoon zal de Unicode bytes plichtsgetrouw naar je vriend sturen met een andere merktelefoon en een ander lettertype en met een beetje pech krijgt deze een lelijke of andere emoji voor z’n kiezen. Oeps.

Menselijke taal is consistent

Een van de manieren die ontwikkelaars gebruiken is om een tekstveld te gebruiken en mensen te laten vullen met wat ze maar willen. De open commentaarsecties zijn gemaakt voor mensen en worden zelden geïnterpreteerd door algoritmes, dus ze zijn geen onderdeel van het probleem.

Het echte probleem ligt in gestructureerde velden met tekst. Als mijn GPS wil dat ik een weg kies die genoemd is naar een heilige, dan zegt mijn GPS dat ik "de straat, Johns Road, op moet gaan". Wegennamen met apostrofen gooien de software soms in een loop. Het is gebruikelijk om "St. John's Road" gespeld als "St. Johns", "St. John's" en zelfs "Sint Johns'."

Tijd is consistent

Het voelt misschien alsof de tijd constant blijft stromen - en dat doet het ook, maar dat is niet het probleem voor computers. Het zijn de mensen die de regels verknoeien en het leven van een programmeur verpesten. Je denkt misschien dat er 24 uur in een dag zit, maar je kunt dat beter niet je code schrijven. Als iemand opstijgt aan de oostkust van de Verenigde Staten en aan de westkust landt, duurt die dag 27 uur.

Tijdzones zijn slechts het begin. Zomertijd telt uren op en trekt uren af, maar doet dit in het weekend, dat van jaar tot jaar verandert. In 2000 vond in de Verenigde Staten de verschuiving plaats naar april. Dit jaar veranderde het land van klok op de tweede zondag van maart. Ondertussen verhuist Europa op de laatste zondag van maart naar de "zomertijd".

Als je denkt dat dit het einde is, ben je misschien een programmeur die het schrijven van code beu is. De Amerikaanse staat, Arizona, doet helemaal niet aan zomertijd. De Navajo Nation is echter een groot deel van Arizona en doet wel aan zomertijd omdat het onafhankelijk is en in staat om deze dingen zelf te beslissen.

Daar houdt het niet op. De Hopi-natie ligt binnen de Navajo-natie, en misschien om haar onafhankelijkheid van de Navajo te bevestigen, doen zij weer niet aan de zomertijd.

Maar wacht, er is meer. De Navajo hebben een blok land in de Hopi Natie, waardoor het veel moeilijker is om geografische coördinaten te gebruiken om de tijd in Arizona alleen al nauwkeurig te volgen. En dat is alleen nog maar Amerika.

Bestanden zijn consistent

Je zou denken dat het opslaan van data iets is dat een computer perfect kan doen. We zouden in staat moeten zijn om de bits te herstellen, zelfs als de bits gevuld zijn met vele logische, stilistische, orthografische, numerieke of andere inconsistenties. Helaas kunnen we dat niet eens doen.

Telkens als ik mijn Mac vraag om het bestandssysteem te controleren en fouten te herstellen, vertelt hij me steevast over een lange lijst van "permissie fouten" die hij plichtsgetrouw voor mij repareert. Hoe heeft de software toestemming gekregen om de rechten voor toegang tot mijn bestanden te wijzigen als ik daar geen toestemming voor heb gegeven?

Dit zijn slechts twee voorbeelden van hoe bestandssystemen het compacte formaat tussen de gebruiker (de persoon die de elektriciteit levert) en de machine (de wanhopige behoefte aan elektriciteit) niet respecteren. Elke programmeur zal je vertellen dat er honderden andere voorbeelden zijn van situaties waarin bestanden niet bevatten wat we verwachten dat ze bevatten. Databasebedrijven krijgen veel geld betaald om ervoor te zorgen dat de gegevens op een consistente manier kunnen worden weggeschreven. Zelfs dan gaat er iets mis en krijgen de consultants nog meer geld betaald om de verdwenen/kapotte tabellen te repareren.

We hebben de controle

We geloven graag dat onze instructies de computer vertellen wat het moet doen, maar dat is helaas niet altijd het geval.

Wat? Dat geldt zeker niet voor het gemiddelde niet-programmerende gepeupel, maar niet voor ons, tovenaars van de logica en de rekenkunde, toch? Fout. We zijn allemaal machteloos plebs die het moeten doen met wat de machines ons geven. Het besturingssysteem heeft de leiding, en het kan wel of niet onze code laten berekenen wat het wil.

OK, wat als we de Linux kernel vanaf nul compileren en alleen de code installeren die we hebben gescreend? Dan hebben we zeker de controle, toch?

Helaas pindakaas, Het BIOS heeft altijd nog meer te zeggen over de computer, en het kan stiekem subtiele en niet-zo-subtiele veranderingen in je code aanbrengen. Als je in de cloud draait, heeft de hypervisor nog meer kracht.

OK, wat als we het BIOS vervangen door onze eigen aangepaste bootloader? Je komt dichterbij, maar er ligt nog steeds genoeg firmware begraven in je machine. je diskdrive, netwerkkaart en videokaart kunnen allemaal zelf nadenken, en ze luisteren eerst naar hun firmware.

Niet alleen dat, maar je CPU kan ook een "Verborgen God Mode" hebben waarmee iemand anders het de boel kan overnemen. Zoek niet naar de documentatie voor een verklaring, want die is er niet. En dat zijn slechts de problemen met de officiële chips die in je apparaat zouden moeten zitten. Iemand zou een extra chip met een verborgen agenda kunnen hebben toegevoegd.

Zelfs dat kleine usb-stickje heeft een ingebouwde processor met een eigen code die zijn eigen beslissingen neemt. Al deze ingebedde processors zijn betrapt op het gebruik van malware. Het trieste feit is dat geen van de transistors in die doos op of onder je bureau verslag uitbrengt aan jou.