Programmeren is een ambacht


externe linkProgrammeren is de ambacht. Het is vergelijkbaar met boeken schrijven, componeren, gedichten schrijven en wiskundige problemen oplossen. Er is creativiteit en vaardigheid voor nodig, even als veel doorzettingsvermogen. Het is daardoor intrinsiek niet industrialiseerbaar: Het is niet samen te vatten tot een eenvoudig process of om te zetten in lopende band werk.

Als het al vergelijkbaar is met bouwen, dan met het bouwen van kathedralen en niet de moderne prefab bouwsystemen. Het is ook te vergelijken met tuinieren aangezien het meeste software nooit af is en continue onderhoud nodig heeft: je moet het laten groeien, zo nu en dan snoeien, en soms vervangen.

A tourist visiting England's Eton College asked the gardener how he got the lawns so perfect. "That's easy", he replied, "You just brush off the dew every morning, mow them every other day, and roll them once a week."
"Is that all?" asked the tourist.
"Absolutely," replied the gardener. "Do that for 500 years and you'll have a nice lawn, too."

Dit heeft veel gevolgen voor de manier waarop we met software ontwikkeling om zouden moeten gaan. Vooral management (ontstaan uit de industrialisering) heeft hier een groot probleem mee: in hun opleiding wordt er wordt vrijwel geen aandacht besteed aan de ambachten.

De inzichten van Brooks in Mythical Man-Month staan vaak haaks op de intuitive reactie van veel leidinggevenden. Ook programmeurs merken dat hun realiteit niet over een komt met wat de cultuur van geïndustrialiseerde landen, hun realiteit is post-industrialisatie.

Programeren is een basisvaardigheid


Software wordt nog steeds veel als externe linktechnologie gezien, maar dit wordt vrijwel altijd veroorzaakt door slecht gereedschap. Beter gereedschap is beschikbaar en wordt steeds vaker toegepast, met als gevolg dat programmeren steeds minder "technisch" gevonden zal worden.

De basisvaardigheden voor een kennis samenleving zijn leren begrijpend lezen, duidelijk schrijven, een mate van wiskundige kennis (rekenen, statistiek, etc) en programmeren.

Programmeren is een vorm van delegatie: als je een bepaalde taak die zich steeds herhaald kunt automatiseren dan kun je deze taal delegeren aan een computer. Programmeren is niet moeilijk, je moet er alleen veel in oefenen. Daarom zou men er zo vroeg mogelijk mee in aanraking moeten komen.


Programmeren is het beheersen van complexiteit

Het is de kunst of vaardigheid om complexiteit te beheersen. Het gaat daarbij vooral om het processen en procedures. Hiervoor worden hoofdzakelijk drie verschillende methoden van abstractie gebruikt: Black-Box Abstractie, Conventionele Interfaces en Metalinguistische Abstractie.

Black-Box Abstractie


In dit geval gaat men concepten samenstellen en een naam geven waarna we ons niet meer druk maken over de inhoud van deze samenstelling maar er wel gebruik van kunnen maken. Dit is hetzelfde als dat men een nieuw woord bedenkt voor een bepaald ingewikkeld begrip en daarna ook niet meer overal hoeft uit te leggen wat het betekend: het is als het ware een zwarte doos die we kunnen toepassen en gebruiken waar we maar willen.

Voorbeeld: het "kwadraat van een getal" is gelijk aan het product van dit getal met zichzelf. Vertaald naar Scheme schrijf je dat als:
(define (kwadraat getal) 
  (* getal getal))
Daarna kun je overal "kwadraat van een getal" gebruiken en hoef je niet steeds weer "product van een getal met zichzelf" te zeggen.

Conventionele Interfaces


Het ordenen van bovenstaande zwarte dozen tot ketens van verwerking te maken die samenwerken net als woorden in een zin samenwerken om begripen over te brengen die niet in een enkel woord te vatten zijn.

Bij programmeren gebruik je daarvoor filters. Een Filter is een black-box die een bepaalde invoer verwacht deze bewerkt en dan uitvoer genereert. Deze filters kun je aan elkaar rijgen waarbij de uitvoer van de een, de invoer van de andere wordt. Zo kun je complexe bewerkingen doen, terwijl de complexiteit local minimaal blijft.

Metalinguistische Abstratie


Als blijkt dat men bepaalde nieuwe concepten slechts met veel moeite en inspanning kan samenstellen in de algorithmische taal die men heeft dan kan men de taal uitbreiden met deze nieuwe concepten: dat wil zeggen nieuwe grammatica er aan toevoegen die de notatie van dit concept vereenvoudigd. Dit heeft als grote voordeel dat men niet in een zee van details verdrinkt.

Voorbeeld: Stel men heeft een taal waarbij men grammaticaal alleen voltooid of onvoltooid kan aangeven, maar geen andere tijden. Dan moet men altijd met woorden in de zin de tijd aangeven. Indien dit lastig gevonden wordt dan zou men de grammatica kunnen aanpassen zo dat men daarna door de volgorde en de vervoegingen van de woorden de tijd kan aanduiden.

Dit wordt ook wel eens Language Oriented Programming genoemd.

Algorithmische Systemen


Er zijn vele systemen en talen bedacht om een algorithm (procedure of process) op te schijven, er zijn echter informeel twee grote takken. De Fortran Familie en de Lisp Familie, beiden zijn rond dezelfde tijd bedacht (1957/1958).

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP

De Fortran Familie kenmerk zich door getypeerde variabelen, terwijl de Lisp Familie getypeerde waarden kent. Dat is het verschil tussen op een bakje zetten wat de inhoud is en het aan de inhoud van het bakje af te leiden. Het voordeel van het eerste is verwerkingssnelheid: je hoeft immers het bakje niet te openen en er in te kijken, het voordeel van de tweede methode is vrijheid: als je er iets anders in stopt dan werkt het nog steeds (maar anders).

De Fortran Familie gaat voornamelijk uit van de computer en laat de programmeur hard werken. De Lisp Familie gaat uit van de programmeur en laat de computer hard werken. Aangezien de computers in de jaren 60 van de 20ste eeuw niet zo krachtig waren was computer tijd relatief duur en programmeurs waren goedkoop, hierdoor werd de Fortan familie snel populair en uitgebreid met Cobol, Pascal, C, Java, etc.

De Lisp familie werd alleen populair op plaatsen waar men haar expressie kracht en ondersteuning echt nodig had omdat de problemen die men wilde oplossen zo complex waren dat ze zonder Lisp niet op te lossen waren.

De afgelopen tijd zijn computers steeds sneller geworden. Hierdoor is computertijd goedkoper geworden dan programmeertijd. Tevens willen we steeds complexere software schrijven. Dit leide er toe dat men (vrij bruut) gewezen werd op de beperkingen van de Fortran familie, de nieuwe leden (Java, Objective C) van deze familie begonnen daarop veel concepten en ideeën van de Lisp familie over te nemen.

"Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of CommonLisp" -- Greenspuns Tenth Rule Of Programming

De Lisp familie werd zelf in de loop der tijd uitgebreid met Scheme en Dylan.

Python, SmallTalk en Ruby vertonen genoeg overeenkomsten om ook bij deze familie gerekend te worden hoewel directe verwantschap moeilijk is aan te wijzen. Steeds meer programmeurs wenden zich tot deze, vaak "dynamische talen" genoemd, voor inspiratie en mogelijk als een middel om hun problemen mee op te lossen.

Hyperlinks


Discussie

ProgrammerenPraat


Pagina's die naar hier verwijzen

SmallTalkPraat

Trackbacks (URL)

Er zijn geen trackbacks voor deze pagina.

Reacties

Er zijn nog geen reacties bij deze pagina. [Reactie toevoegen]