From Functional to Object-Oriented Programming

The Java blogosphere is currently discovering or introducing to the uninitiated the benefits of closures. To me, posts like Reginald’s seem to present closures as an advance from OO. This is kind of strange, given that the historical order is exactly the other way round!

When I started digging into OO languages in the 90s, I had already spent some time with Scheme and Tycoon (a language based on Luca Cardelli‘s Quest), all of them higher-order functional-imperative programming languages. I did some non-trivial compiler programming in both languages, and it certainly was fun, in a way similar to solving math riddles.

I learned that OO was great because it names things. OO allows a traceable connection between the conceptual design level and the implementation level. Concepts have names, so you can talk about them, between programmers and architects. The promise of OO was to replace the dazzling complexity (and intellectual challenge) of functional programming with something more manageable.

Language is not understood best when you have removed as much as possible. Would you rather read a novel, or an algebra textbook? Just imagine taking your green, yellow and red pen and marking up a book by Neal Stephenson.

Conciseness comes at a price: The more compressed your code, the harder it is to understand what the consequence of some change would be. If you have left out everything you do not need for your current goal, what if the goal moves? If (e.g.) you find that what was once a closure should now be a class, e.g. because some code wants to inspect it instead of just running it, you’ll be crying for another super-advanced refactoring IDE.

“Everyone knows that debugging is twice as hard as writing a program in the first place. So if you’re as clever as you can be when you write it, how will you ever debug it?” (Kernighan)

Higher-higher-order functions and inferred types, or lists of lists of pairs whose cdr happens to represent some concept (except when it represents another concept) will all give you that occasional “ouch, there’s a error message, but I don’t think there should be!” The code looks fine, so why does the type checker not like it? (it probably took something you wrote, took it all wrong, drew impressive conclusions and is now reporting a problem at a completely different place). The program state and the code both look fine, but they differ in the level of nesting of some unnamed construct (e.g. a closure or a list where a value was expected).

I strongly associate higher-order functional programming with long stretches of uninterrupted concentrated programming work, and single-person projects. In contrast, OO gives you a pragmatic, shallow paradigm for making software intelligible and available for cooperation.

Closures can be a nice tool for creating your own DSL, to make your code get closer to the design model. But closures can also take you further away from the design model, by creating constructs that only make sense in the abstract.

Object-oriented programming was introduced to fill a need not satisfied by functional and imperative languages. Remember: Going from functional to OO is an advance.

Home Computer

Back alive – after being offline for about three weeks, I’ve finally got my notebook back. I had not realized how much I depended on it until I tried living in another computer (feels like living in a Hotel, or maybe even a Backpacker’s Hostel – you don’t want to leave your stuff lying around…). If there are virtual Keychains, why not also virtual sponge bags with toothbrush etc.?

There is always some stuff that’s too personal (financially or profile-wise) to be stored on a server, then there’s stuff that has to be local so I can access it quickly, and then there’s usability, the way I’m used to work with my stuff – even if it’s the same data, it does not feel the same when used with different apps, and even if it’s the same app, it looks a bit different on a different platform and is missing my many little customizations.

Here’s my experience when temporarily switching from a Mac to a PC:

I can still access my email – it’s stored on an IMAP server, so I can theoretically access it from multiple client computers, potentially even at the same time. HOWEVER, I’m using a different mail app (Thunderbird or Outlook instead of Apple Mail), and start hitting small and inconvenient incompatibilities in their handling of deleted and marked messages. Feels just that little bit “not at home”. And of course first thing, they try to download all the mails and spill my private stuff on my company’s computer. Webmail/Googlemail is OK, but now each email account suddenly has its own UI.

I can still read my files – at least those that I copied to a FAT drive or file server in time. Accessing the HFS+ backup is more complicated and involves at least one other Mac. I’m fairly reluctant to actually work with (update) my files because I know I’ll have to sync them back some way – not necessarily trivial. Then there’s the file format – Office documents work of course, but all the personal stuff is a different bullet.

Keychain, SSH keys and Web passwords – simple truth: the more internet services you use, the more account names and passwords you have to manage. I can’t manage without an automatic helper, namely MacOSX’ Keychain application, SSH agent, and Safari’s auto-fill-in. Now unfortunately I didn’t find a port of Keychain for Windows. (To be honest, I didn’t even look) So it’s back to pen and paper, and don’t you forget to jot down one important passwort, or else you’ll need to get that other Mac and start digging in the backup again.

Browser bookmarks – I’ll definitely go get a del.ici.ous account. Tonite.

Music – the mp3 files are all there on the file server, but suddenly the infrastructure for actually listening to them is awkward (where’s my iTunes library, why is that iTunes not scrobbled?) – I default to my iPod.

iPod – is just a slave device in Apple’s view. They want me to erase it completely before attaching to a different iTunes instance. I refuse!

Photos – well I can live without my family album for a few weeks, OK. But then I want to quickly take a picture for a website, and it gets a bit peculiar again for a moment (oops, Windows does NOT understand Nikon RAW format out of the box? Seems like I need to reconfigure my camera. Now what Windows tool will let me resize that… MS Paint ?!)

Firewire Hardware – not on that Dell notebook, sorry.

USB Hardware – I wouldn’t want to mess up the dell with a load of drivers, it’s just temporary anyway, and uninstalling a hardware device driver seems to be one of the unsolved riddles of our time – so I restrict myself and wait for my Home Computer.

Any take home lessons? First: Let other people care about hardware maintenance, backups and continuous service, by moving as much data as possible out of the house. Second: Concentrate the information that makes up your private and personal environment (passwords, cryptographic keys, commercial info, customizations) and backup thoroughly and securely, preferrably so that it can easily be accessed/instantiated on a different machine. Third: Find or found a company that rents Mac laptops and pair that company up with Apple support.

Sicherheit

“Die Kunst des Krieges lehrt uns, nicht darauf zu hoffen, dass der Feind nicht kommt, sondern darauf zu bauen, dass wir bereit sind, ihn zu empfangen.”

Sunzi, “Die Kunst des Krieges”, VIII: Taktische Varianten.

Mother! My logic is failing!

After hanging in the phone loop for 20 minutes, the friendly service assistant told me my hardware problem has been reproduced and a replacement “mother logic board” has been ordered. They can’t tell when Apple will deliver, but probably not this week.

Wouldn’t it be just great if I didn’t have to poll for this kind of information, but would receive some progress email (they’ve got my email address). Or if there was an online service tracker. Or a guaranteed delivery date. Or a replacement laptop for the time being (in the end, it’ll be more than the promised 3 weeks).  Just what do they do with all the Apple Care money? Spend it on new mother logic boards?

UPDATE: They actually managed to finish the laptop by Thursday, so maybe I was a bit hard on them in this post. On the bill, they had a detailed protocol of my case, including each service unit they spent, and each “customer information” (i.e. phone inquiry from my side). If they would just make that information available on the web site, UPS style, now *that* would be service.

Der Ki-Quirl

Gestern war Dieter Löpke in der Charlottenstraße und hatte ein paar ziemlich direkte Irimi-Nage-Varianten im Gepäck. Die üblichen Aikikai-Prüfungs-Techniken führen den Angreifer im weiten Bogen herum, und versuchen ihn dabei dynamisch immer am Rande seines Gleichgewichts zu halten – wenn er hinfällt, kann man ihn nicht mehr führen, wenn er stehenbleibt und fest wird, auch nicht. Auch in der kurzen Form ist das alles enthalten – mit Dieters Worten: “In einmal Werfen ist zehnmal Hüftdrehung drin”. Der Moment des Werferns wird nur weniger lang ausgedehnt. Die direkten Techniken erscheinen einem zunächst einfacher, aber auch darin noch die spiraligen Bewegungen und die Beziehung zum Zentrum des Partners zu finden, so dass der Knoten richtig sitzt, ist viel schwerer als bei der weiten Variante. (Der “Knoten”: man legt die “Schnüre” erst locker zurecht und zieht dann zu, so dass sich die Energie im Punkt des Wurfs konzentriert.)

Dieter präsentierte ein geradezu “quirliges” Aikido (Zitat!) – schwupp, Hüftdrehung parallel zum Partner, Arme schwingen, Schwupp, Hüftdrehung gegen den Partner (“Wie da die Hüfte so reinschnackelt”), Klatsch, Partner fällt.

Für mich unerwartet waren die Varianten für den “Ernstfall” – man müsse beim Irimi-Nage-Wurf nicht am Kopf vorbeigehen, man könne auch direkt auf die Nase schlagen – wenn der Angreifer den Kopf zu starr halte, könne man statt zu drehen auch über den Atlas-Wirbel rückwärts werfen, aber dabei bitte aufpassen, nicht das Genick zu brechen – beim Kotegaesh gäbe es zwei Gelegenheiten, dem Angreifer den Ellbogen zu brechen – den Kotegaesh könne man auch ganz toll mit einem Beinfeger kombinieren, dann kann der Angreifer nur noch hart fallen, tut’s dann aber auch gern – und unvergessen auch das “DongDongDong”, mit dem man bei einer Haltetechnik mit der freien Hand auf den Kopf des Angreifers einhämmern könne.

Wir bekam noch mit auf den Weg, diese Varianten nicht unangekündigt am Partner im heimischen Dojo auszuprobieren, weil “wir das nicht so gewohnt sind darauf zu reagieren”. In der Tat, es wird wohl ein paar Wochen dauern, bis sich mein Nacken wieder normal anfühlt…

Keine Strichmännchen

“Have a lifting feeling while moving down”, und “move your shoulder down while moving your arm [macht eine hineinkriechende Bewegung]. That also brings your shoulder closer to your center. You can also have a rolling feeling” – Jorma Lyly hatte heute einige überraschende Aiki-Übungen auf Lager. Sehr amüsant waren auch die Menschenketten, die dominogleich umpurzelten, wenn sich Jormas Bewegung (“not strong!”) vom Ersten auf den oder die Stützenden übertrug.

Dieser Lehrgang war deutlich anders als ein reguläres Training – von Prüfungstechniken kaum eine Spur. Jorma wirkt die ganze Zeit recht informell, und wenn er eine Bewegung mit jedem der 20-30 Teilnehmer nacheinander vorführte konnte man sehen, dass keine zwei Ukes gleich sind, und auch die passende Bewegung immer unterschiedlich ausfallen muss.

Oft werden Aikido-Bewegungen, gerade für Anfänger, nach dem Strichmännchen-Prinzip erklärt: An Deinem Körper hängen zwei Beine und zwei Arme, die Arme und Beine haben in der Mitte auch noch ein Gelenk, und los geht’s. In der Art könnte auch ein Avatar die Prüfung schaffen. Das mechanische Modell kann immer weiter verfeinert werden, mit zusätzlichen Drehachsen (insb. Drehungen um die Längsachse der Arme, Drehung der Schulterquerachse gegen die Beckenquerachse) etc.

Jormas Erklärungen heute waren sehr anders – ich würde sagen, sie gingen von Ki aus, auf jeden Fall kamen ganz andere Elemente vor: Verbindung (nicht Anspannung), Weichheit (nicht Lockerheit), Angenehme Bewegung (nicht Kraft), Balance, Leichtigkeit und Schwere (nicht Gravitation), Kontakt, Angst, und Bewegungen an Stellen, die das Strichmännchen gar nicht kennt: in den Schultern (heute bei Jorma, oder sonst auch Joachim: “Jetzt zieht er wieder die Schultern hoch!”), im Rumpf an Bauch und Rücken und dazwischen im Zentrum, und innerhalb der Gelenke.

Ich würde es so beschreiben: Um eine Gitarrensaite zu stimmen, dreht man an einer Schraube; um ein Trommelfell zu stimmen, muss man eine Balance zwischen zwölf Schrauben herstellen. Um den Winkel im Ellbogen- oder Kniegelenk zu steuern, müssen sich Bizeps und Trizeps abstimmen; die Wirbelsäule und die Bauchdecke hingegen sind – komplex. Und auch das Kniegelenk ist (wie die meisten mit zunehmendem Alter schmerzhaft feststellen) weitaus mehr als ein Scharnier, sondern reagiert zunehmen empfindlich auf unausgewogene Anspannung und Drehung.

Ein Lehrgang von zwei Stunden ist viel zu kurz, um so etwas wirklich zu verstehen. Für die beeindruckend vermittelte (bzw. bestätigte) Ahnung, dass es da etwas zu verstehen gibt, bin ich Jorma sehr, sehr dankbar.

ex-plain

“people create… little systems of explanation.

things that are not really true, but are easier to digest than the intricacies of reality”

paul hornschemeier