If I do get a call from someone who spotted it (rare, once every 3 months), the recruiter is 99/100 an asshole he isn't going to ask you to do something you want. Really!Yeah, I can imagine that. One of the reasons I've put up a mini CV is that every few months I'm asked some of these basics usually found on CVs because of my art - I have some poetry on my page that is very popular, and every now and then someone wants to use it in school; teachers always want people to be able to tell something about the author. In such cases, I find it actually worth to highlight that I'm a math and computer science guy, to make people see that it isn't an either-or thing, language and science.]
"build beautiful, lithe marionettes with"
Unfortunately, I haven't had the time or inclination to learn Haskell (yet), but I have used Erlang professionally, so I do have a bit of experience using a functional programming language. What comes to my mind isn't marionettes, but clockwork. That's a purposefully neutral word, in case you were wondering. An enthusiast might say "a finely crafted swiss watch", and a detractor might grumble "a windup toy". In my mind's eye, the concept is that in functional languages you get this succession of things happening one after the other that happen precisely the same way, if the program is wound up just the same each time. To paraphrase:
Do this with the result of this with what this produces when given
this input that is derived from this function which takes the
result of this other thing after calculating the result of
something that is derived from the output of a function that ...
And so on and so forth...tick, tock, tick, tock.
While I can appreciate that in some ways, this is likely to produce clean programming, in other ways I am less convinced of its practicality. If you'll bear with a poor comparison, sometimes programming is like a song. You do the tricky section, then you go back to an easier section and catch your breath for a bit. That seems to work out in a language like Ruby or Java fairly well, depending on how densely you like your code. You get sections with DoThisAndThisAndThatWithTheResultsOfSelectThisFromTableXYZ that you have to slow down to think through. And then:
GoToTheNextTrickyBit where ManyThingsHappen.
All in all, you wind up with a sort of ebb and flow that works out pretty well if you're in tune with the code being written, going from intense calculations, to a line or two where you do no more than store things in a variable, take a breather, and prepare for the next important stanza.
In my limited experience, I have to say that I didn't always get that sensation from Erlang (which in some ways is apparently less "hair shirt" oriented than Haskell). You always had to be writing something with an eye to where it was coming from, and where it was going.
Without a doubt, this produces code that is more compact in terms of meaning and functionality, but at times it leaves a guy like me, who grew up with Basic, C, Python, and so on with the desire to say "woah there, nelly", let's take a breather and sort things out a bit in a few variables before moving on to the next bit of fancy code gymnastics.
What I'm curious about is what will catch on from academically oriented programming languages like Haskell. The people working on them are without doubt very smart, and there are some interesting concepts being bandied about (pattern matching is pretty cool, just to cite one). But academia doesn't always produce things that catch on with the average Joe programmer, either, and while the more elitist out there may attribute this to simplistic reasoning such as 'well then Joe is just stupid', I think that the more thoughtful language crafters will attempt to ascertain what works, and what doesn't, and perhaps we will see the Ruby of functional languages emerge from Haskell, the Smalltalk of functional languages.
What do you think?
| [0] | I brought my bike along, for transport and exploring. This involved packing a bit of extra stuff, borrowing a friend's Tranzbag, arriving early at the airport to get it boxed to ensure a safer journey, picking it up in Dublin, and somehow getting it to Limerick, where I'd have to reassemble it. I wasn't really looking forward to the trip. It turned out to be stressless, as I said. The boxing cost me 10 Franks at the airport and was completed in less than 5 minutes, nobody at the check-in counter said anything, as if it was the most normal thing for them to check in bikes, some dude retrieved the box in Dublin and placed it on my cart, and while I was waiting, I found out that I wouldn't have to hop on a coach (bus) to go to the Dublin train station, catch a train to Limerick, and then finish the last mile in a taxi: a bus operates fairly regularly directly from Dublin airport to Limerick, taking four hours for the journey. That's about how long it would have taken me via the train station, but I only had to pay 19 the train itself would have been 25 , plus the taxi charges. The coach driver was curious when he saw the box, but I didn't have to pay extra, and after watching Airport on my laptop and listening to the new Katatonia album, I found myself with my bag and the bike next to the university's main entrance, with Mel and Daren on the way to pick me up. Five minutes later, I was in my home-to-be-for-five-weeks. |
I am keeping a close eye on the Wordpress 2.0.7 release.
I am being cautious because:
"Pbuilder is great (and cowbuilder even more so). First of all, it makes setting up and upgrading chroots easier (even easier than dchroot etc.), but it will also handle dependencies and do install/removals (well, technically it won't remove stuff, the chroot is just thrown away afterwards). That way, pbuilder helps getting build dependencies right, and ensures the package is currently buildable (not with some library package you still happen to have on your system, but that has been removed from Debian; not uninstallable for some reason etc.). This makes the job easier for porters, since a FTBFS is less likely to be an error in packaging by the maintainer... At some point I had like 6 pbuilder chroots... woody, sarge, unstable, woody with some backports, sarge with SELinux backports, unstable with experimental. Sure, we don't need debhelper either? After all, it just does some cp and mvs, doesn't it? There IS some benefit in having stuff automatized in a standard way; even though we could all do our chroots ourselves, I want to express my thanks to the pbuilder (and cowbuilder) authors and maintainers for making life EASIER for me. A lot easier. I could live without, but I would probably not keep that many chroots."Ken Bloom added:
"One important feature of a pbuilder chroot is that pbuilder installs build-dependencies as you ask it to build debian packages, and removes them as soon as it finishes building the packages. In this sense, pbuilder is specifically intended to replicate the buildd environment, so you can find out whether your packages will break on a buildd (e.g. whether you've remembered to include all of the build-deps in debian/control, because things will break on the buildds if you forgot to add a build-dep because the build-dep was just lying around on your system (or in your unstable chroot)."Sven M ller wrote:
"Well, pbuilder has several benefits, but the most important one to me is that it restarts from a clean system (only base packages + build-essentials installed) on each build. Sure this adds to the time needed for the build, but it also makes sure that I get all build-deps right and that the whole build process is as reproducible as possible."Ben Hutchings commented:
"The major difference between pbuilder's approach and simply building in a chroot'ed installation is that pbuilder tries to build on a minimal system plus the specified build-dependencies. If you always build with pbuilder or similar it's much less likely that you will miss a build-dependency or otherwise produce a package that can't be auto-built elsewhere."I take the clean chroot point as a clear benefit, but it still strikes me that there are easier ways to do the same thing (rsync --delete) without all the waiting around for pbuilder on my slow mipsel. I guess that's the difference with debhelper: debhelper use doesn't seem to slow me down.
Next.