Componeerbaarheid
Een tijdje geleden schreef ik hoe C de beste programmeertaal is, en dat Lisp dichtbij op de tweede plek stond. Ook ben ik sinds vorig jaar een Linux fan. Wat hebben al deze dingen gemeen?
Het heeft iets muzikaals. Iets wat gecomponeerd is... bestaat uit componenten! En in een groot systeem orkestreer je componenten! En C, Lisp, Linux, laten dit allemaal toe met zo min mogelijk moeite, dankzij de fundamentele manier waarop ze zijn ontworpen.
Voorbeeld A: Shell
De UNIX-filosofie is "do one thing, and do it well", en als je deze filosofie overal toepast leidt dat vrijwel automatisch naar een componeerbaar systeem, dit komt bijvoorbeeld naar voren in de Shell, die je aanroept met een terminal. Rond 5:32 legt Brian Kernighan, computergod, uit hoe je een spellingcontrole uit kan voeren door een aantal kleine programma's, zogenoemde "building blocks", aan elkaar te knopen. En dat zonder een enkele regel code te schrijven, of een ingewikkeld GUI programma aan te raken! En ik kan je vertellen, ja, dit is oh zo handig! Ik kan nooit meer terug naar de Windows filosofie, als die er al bestaat, welke schijnt te zijn "ga naar google en download een .exe die hopelijk doet wat je wil".
Voorbeeld B: Lisp
In de Structue and Interpretation of Computer Programs hoorcolleges worden een aantal dingen uitgelegd, zoals de programmeertaal Lisp zelf, maar ook hoe je ermee de meest algemene routines kan maken: het mooie van Lisp is dat de syntax dermate generiek is dat je elke expresse ergens anders in neer kan zetten. In die zin lijkt het op hoe je in UNIX-systemen alles naar alles kan pipen. En zo is Lisp ultiem componeerbaar. Je zal gewoon nooit syntax errors krijgen omdat dit een function is die eigenlijk een xyz verwacht of dergelijk gezeik. Het zal ook niet een fout stil opslikken. Het zal gewoon werken!
Voorbeeld C:
Ik zei al dat pointers de ultieme abstractie zijn. Maar het is echt zo. Pointers zijn fundamenteel, je kan niks verder reduceren dan pointers. Als je een functie wilt hebben die een andere functie als argument neemt, dan gebruik je een pointer. Arrays zijn niets anders dan blokjes aaneenvolgende data, en dus kunnen die gerepresenteerd worden door een pointer naar het eerste blokje data. Je kan void pointers gebruiken voor superalgemeenheid. Mijn punt is: C is een spartaanse taal die alleen de meest fundamentele bouwblokken aan je geeft. Maar juist omdat er zo weinig abstracties zijn, is er weinig sprake van abstracties die niet helemaal lekker samenwerken: de enige echte abstractie die C heeft is dat alles maar een stukje geheugen is. En zo is ook C componeerbaar.
Toepassingen in het echte leven
Koop geen "smart" shit die per se app xyz nodig heeft die alleen draait op telefoon abc vanaf versie 123, en die kapot gaat als het internet wegvalt. Dit is niet componeerbaar voor jou of je huishouden. Koop een normale lamp, die gewoon werkt met de lichtknoppen die je al hebt.
Koop geen wegwerpflesjes handontsmetter: koop hervulbare zeeppompjes, zo kun je een grote voorraadzak zeep aanhouden en de inhoud distributeren over al je zeeppompjes.
Koop geen monitor omdat hij met een verstelbare standaard komt; koop het beste monitorpaneel wat je kan vinden en een aparte monitorbeugel waaraan je in de toekomst nog andere monitors of misschien zelfs een tv zal kunnen ophangen.
Koop geen Juicero die alleen pakjes fruit van exact dat merk kan (wil) persen; koop gewoon een normale blender die niet alleen juice maakt, maar in meer taken nuttig kan zijn.
Soms heb je geen todo-app nodig, waarvoor je eerst je telefoon moet unlocken en app openen en met zo'n irritant kut"toetsenbord"je moet frunniken; soms volstaan simpelweg pen en papier, welke je ook voor andere taken dan alleen todolijsten kan gebruiken. Gebruik dingen die goed samenwerken met elkaar en wat je al hebt, niet dingen die allerlei ondersteuningen nodig hebben en de flexibiliteit van je systeem saboteren. Je zal misschien niet de hipste zijn, maar je zal wel minder hoofdpijn ervaren, en je leven wordt er daadwerkelijk makkelijker van.
2021-10-07 in blog #filosofie