Nieuwe dingen leren voor lichtgevorderden

Vandaag leerde ik iets nieuws over Java, een programmeertaal waar ik vijf jaar in gewerkt heb (al is dat al een tijdje geleden). En kort nadat ik het leerde leerde iedereen in mijn bedrijf iets nieuws over Java, want niemand wist het en ik heb het ze verteld.

Voor de liefhebbers die ook iets nieuws willen leren zal ik het onderaan dit stukje toevoegen, maar wat ik interessanter vond is wat ik over mezelf moest leren om dit te kunnen leren. Want waarom kende niemand in mijn bedrijf vol alleszins capabele softwareontwikkelaars deze eigenschap van Java?

Omdat het alleen relevant is als je slechte code typt.

Dat doen wij niet. Dus voor ons is het niet relevant.

Waarom moet ik het van mijn alleszins capabele docent “Geavanceerd objectgeoriënteerd programmeren” dan alsnog kunnen? Omdat als je dit snapt, je precies snapt in welke volgorde Java bepaalde dingen doet. Ook als je goede code typt.

Tot voor kort liep ik enorm vast op dit soort didactische trucs. Ik ben namelijk afgericht om diep ongelukkig te worden van slechte code. Dan krijg je het bij dit soort cursussen wel moeilijk. Nu vertel ik mezelf periodiek HET IS VOOR HET LEEREFFECT en dan lukt het wel. Tenzij ik het vergeet, dan heb ik een paar mensen klaarstaan die het tegen me roepen als ik bij ze kom klagen.

Op de een of andere manier is dit essentieel voor mij om dingen te leren die niet objectief geweldig zijn (zoals logica en lineaire algebra 😍😍😍). En ik ben erg blij dat ik dit nu geleerd heb, want het maakt nieuwe dingen leren ontzettend veel makkelijker.

(Overigens zou ik het waarderen als ze ook in de cursus zouden zeggen “deze code is superkut, niet gebruiken”. Al staat er gelukkig af en toe wel iets als “De nadruk ligt op het bestendigen van de theorie en niet de toepassingen als zodanig”.)


Bijlage voor de liefhebbers: wat is de output van main() (in class B)?
Of, de eigenlijke relevante vraag: wat is de waarde van B.b direct nadat B geïnitialiseerd is?

public class A {

    protected int a = 5;


    
    public A() {

        System.out.println("constructor A: a = " + a);

        a = 7;

    }



    public int getA() {

        return a;

    }

}



public class B extends A {

    private int b = a + 10;



    public B() {

        a = 2;

        System.out.println("constructor B: a = " + a + ", b = " + b);

    }



    public int getB() {

        return b;
    
    }



    public static void main(String[] args) {

        B b = new B();

        System.out.println("main: a = " + b.getA() + ", b = " + b.getB());

    }

}

 

Update de revolutie

Drie jaar geleden publiceerde ik (op de geheel willekeurige datum 1 april) een scriptje dat biologische metaforen preciezer maakt. Een van mijn collega’s vond dit, constateerde dat het niet meer werkt, en (omdat ik een smerige backender ben die nog geen javascript-update zou herkennen als het rondjes om me heen fietste op een eenwieler) fixte het. Dank je Niels!

Met een plugin als TamperMonkey kun je dit ook draaien in Chrome.

// ==UserScript==
// @name        Stuifmeel
// @namespace   http://nescia.nl/anna
// @description Verander het woord 'zaad' in 'stuifmeel' op plekken waar dat waarschijnlijk passender is.
// @version     1
// @grant       none
// @match        *://*/*
// @exclude     http://*seed*
// @exclude     http://*garden*
// @exclude     http://*tuin*
// @exclude     http://*zaad*
// @exclude     http://*zad*
// ==/UserScript==
var textNodes = document.evaluate('//text()', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var searchRE_1 = new RegExp('(zijn |mijn |je |uw |hun |donor|mannelijk )zaad', 'gi');
var replace_1 = '$1stuifmeel';
var searchRE_2 = new RegExp('zaad(donor|bal|leider)', 'gi');
var replace_2 = 'stuifmeel$1';
var searchRE_3 = new RegExp('(sperma.+)zaad', 'gi');
var replace_3 = '$1stuifmeel';
var searchRE_3a = new RegExp('zaad(.+sperma)', 'gi');
var replace_3a = 'stuifmeel$1';
var searchRE_4 = new RegExp('(his |my |your |their |donor |male |manly )seed', 'gi');
var replace_4 = '$1 pollen';
var searchRE_5 = new RegExp('(sperm.+)seed', 'gi');
var replace_5 = '$1pollen';
var searchRE_5a = new RegExp('seed(.+sperm)', 'gi');
var replace_5a = 'pollen$1';

for (var i = 0; i < textNodes.snapshotLength; i++) {
  var node = textNodes.snapshotItem(i);
  node.data = node.data.replace(searchRE_1, replace_1);
  node.data = node.data.replace(searchRE_2, replace_2);
  node.data = node.data.replace(searchRE_3, replace_3);
  node.data = node.data.replace(searchRE_3a, replace_3a);
  node.data = node.data.replace(searchRE_4, replace_4);
  node.data = node.data.replace(searchRE_5, replace_5);
  node.data = node.data.replace(searchRE_5a, replace_5a);
}

 

Artist impression

Software maken is creatief in de letterlijke betekenis van het woord. Je maakt iets wat er eerst nog niet was. (Mocht je vinden dat dingen die alleen op computers bestaan niet echt zijn, dan is deze tekst ook niet echt, en wat ben je nu dan aan het doen? Maar dat terzijde.)

Zelf moet je er ook op z’n minst een beetje creatief voor zijn, want doorgaans maak je iets unieks. Ik zie het wel eens als het schrijven van een verhaaltje: ik heb een aantal karakters, en die kunnen dingen, en ze reageren op elkaar, en ze maken allerlei avonturen mee. Om dat een beetje goed te doen is het zaak duidelijk te krijgen wat de onderdelen van je verhaaltje zijn (dat kunnen concrete dingen zijn zoals stoelen en tafels, maar ook meer abstracte zoals het concept meubels of tijd), en hoe ze zich allemaal tot elkaar kunnen verhouden (een stoel kan onder de tafel tenzij de tafel te laag is, en op de tafel tenzij de stoel te zwaar is…). Nu wordt het al snel ingewikkeld. Daarom noemen we de sjiekere programmeurs ‘architect’.

Er zijn ook mensen die zichzelf ‘code poet’ noemen. Maar aangezien poëzie geloof ik bedoeld is als multi-interpretabel, dat juist iets anders probeert over te brengen dan alleen de woorden waar het uit bestaat, zou ik er liever geen in mijn team hebben.

Omdat ik voor verzekeraars werk beginnen al mijn verhaaltjes eigenlijk met ‘Er was eens een polis…’ Zo heb ik de afgelopen jaren geleerd dat polissen heel wat wilde avonturen mee kunnen maken. Al vraag ik me natuurlijk wel eens af wat voor verhalen ik zou tegenkomen als ik een andere hoofdpersoon had.

Accuratere biologische metaforen for fun and (no) profit

Vroeger, toen baby’s nog niet gewoon door de ooievaar werden gebracht, zorgde men voor nageslacht door sperma te planten in een dame en daar groeide dan een baby uit. Bij de Grieken dan. (Bij de Romeinen hadden de vrouwen zelf ook sperma en was het de combinatie waar zich de magie voltrok.)

Enfin, dit idee was vrij populair, niet zo gek als je bedenkt dat onze homies Pythagoras en Aristoteles er fan van waren (ook de grootste genieën praten soms poep, dat blijkt maar weer) en het heeft dan ook tot in de 17e eeuw ons denken doordesemd… en tot op de dag van vandaag onze taal.

Want, lieve mensen, ook wij 21e-eeuwers die beter zouden moeten weten noemen sperma nog steeds zaad. En dat is fout. Het is een scheve metafoor. Als je zo graag een link wilt leggen tussen de plant- en dierkunde is er een overduidelijk functioneel equivalent van sperma, en dat is stuifmeel.

Tja, als je het je eenmaal gerealiseerd hebt kun je het je niet ont-realiseren. En dan is het wel irritant dat iedereen het verkeerd doet. Om dat in mijn eigen wereldje op te lossen heb ik daarom een greasemonkey-scriptje geschreven zodat in mijn browser de metaforen tenminste correct worden toegepast. Dit is het resultaat:

Voor wie het zelf ook wil proberen, dit is het script.

// ==UserScript==
// @name        Stuifmeel
// @namespace   http://nescia.nl/anna
// @description Verander het woord 'zaad' in 'stuifmeel' op plekken waar dat waarschijnlijk passender is.
// @version     1
// @grant       none
// @exclude     http://*seed*
// @exclude     http://*garden*
// @exclude     http://*zaad*
// @exclude     http://*zad*
// ==/UserScript==
textNodes = document.evaluate('//text()', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var searchRE_1 = new RegExp('(zijn |mijn |je |uw |hun |donor|mannelijk )zaad', 'gi');
var replace_1 = '$1stuifmeel';
var searchRE_2 = new RegExp('zaad(donor|bal|leider)', 'gi');
var replace_2 = 'stuifmeel$1';
var searchRE_3 = new RegExp('(sperma.+)stuifmeel', 'gi');
var replace_3 = '$1stuifmeel';
var searchRE_3a = new RegExp('stuifmeel(.+sperma)', 'gi');
var replace_3a = 'stuifmeel$1';
var searchRE_4 = new RegExp('(his |my |your |their |donor |male |manly )seed', 'gi');
var replace_4 = '$1 pollen';
var searchRE_5 = new RegExp('(sperm.+)pollen', 'gi');
var replace_5 = '$1pollen';
var searchRE_5a = new RegExp('pollen(.+sperm)', 'gi');
var replace_5a = 'pollen$1';

for (var i = 0; i < textNodes.snapshotLength; i++) {
  var node = textNodes.snapshotItem(i);
  node.data = node.data.replace(searchRE_1, replace_1);
  node.data = node.data.replace(searchRE_2, replace_2);
  node.data = node.data.replace(searchRE_3, replace_3);
  node.data = node.data.replace(searchRE_3a, replace_3a);
  node.data = node.data.replace(searchRE_4, replace_4);
  node.data = node.data.replace(searchRE_5, replace_5);
  node.data = node.data.replace(searchRE_5a, replace_5a);
}

 

Programmeuse

Als ik deze weken twee uur per dag code schrijf is het veel.

Dat is ingewikkeld, want ik had ooit bedacht dat ik code schrijven superleuk vind en het wel erg tof zou zijn als ik iemand over kon halen om me dat de hele dag te laten doen en me daar dan ook geld voor te geven. Dat was gelukt. Hoera! Blije Anna.

Na een tijdje begon ik in meer dan de helft van de gevallen het gevoel te ontwikkelen dat ik enigszins wist waar ik mee bezig was, en toen kreeg ik een groepje fijne collega’s om aan te vertellen waar we mee bezig zijn.

(Ik heb aan m’n teamleider geprobeerd uit te leggen dat hoogstens 1 per 9 maanden toch meer een normaal tempo is, daar was hij niet van onder de indruk.)

Wat heel tof is want het zijn leuke collega’s en ik hoef de saaie dingen niet meer te doen we zijn met z’n allen mooie projecten aan het bouwen. En iets goed uitleggen is minstens zo moeilijk als het uitprogrammeren. En iedereen heeft er begrip voor dat ik nog maar net kom kijken, op het whoa-ik-was-toch-de-junior-hier-waar-komen-al-die-mensen-vandaan-vlak.

Dus het is leuk!

Maar als ik dan ‘s ochtends voordat de rest er is het rijtje bugs op mijn naam aan het platstampen ben denk ik toch… wat is het tof om code te schrijven. En daar geld voor te krijgen.