last of the ancients

Watching a lecture series by Richard Hamming I really have to hand it to the guy. In one of the first few lectures he mentions that Newton was the last of the ancients and not the first of the moderns. I wonder who are the moderns and the ancients in programming?

beholden to dumb and static things

What is a compiler? It’s many things but the one thing it’s not is a dynamically extensible structure transformer. The reason you write code is because the compiler can only understand certain structures and you have to specify everything in terms of those structures. Static type systems are an excellent example of those fixed and rigid structures. A type system baked into a language is forever and can only be extended by modifying the compiler code directly. Now think about that a little bit: all the code you write is to teach the compiler how to perform new structure transformation in terms of the ones the compiler already understands. What if your compiler could be extended to work with those structures directly? Wouldn’t that be something? In that world all abstractions would be zero-cost instead of the ones the compiler writers thought should be zero-cost.

kill the technical interview

I’ve been trying to hack around the technical interview process but so far I’ve been unsuccessful. That’s not to say the experience has not been worthwhile. My ability to discriminate between professional software shops and amateur ones has increased a little bit. Here are the criteria I’ve settled on. Continue reading

not rocket science (bundled chef cookbooks)

It is possible to do configuration management right but it is also possible to do it wrong. One way to do it wrong is to combine the provisioning and deployment logic into various cookbooks and isolate them from the applications that depend on them. The reason this is wrong is because to understand how the application works in production you now have to chase down dependencies somewhere else and once you get there the cookbooks will not make much sense because they will make assumptions about the application. This is all a long-winded way of saying you are keeping track of two contexts when in reality there is really just one context, the application and its associated infrastructure logic. Continue reading

i’m a full-stack developer unless…

You need someone that understands how to design extensible database schemas both for SQL and NoSQL databases, optimize kernel settings like process limits and TCP socket settings for your application and proxy servers, debug network issues, design secure APIs and mitigate any damage caused by the inevitable security exploit, manage hybrid on-premise/cloud clusters and networks, work with your favorite MVC framework both on the front-end and the back-end, have expertise in Ruby, Python, JavaScript, Java, AtScript, OCaml, F#, etc. and be equally proficient in all those languages, set up a hadoop cluster so that you can use machine learning on all the data that is being collected, implement machine learning algorithms on top of previously mentioned hadoop cluster, track down performance regressions by figuring out what is going on with CPU cache lines, codify infrastructure configuration with your favorite configuration management tool, implement a robust and efficient build and deployment pipeline, and so on and so forth.

Please stop using the phrase “full-stack developer”. The phrase “full-stack developer” is completely devoid of any meaning because as you can see above no one can be a full-stack developer given the complexity of the modern stack. In fact hearing the phrase makes me think that the place putting out the job advert is full of amateurs. Instead just spell out exactly what your stack looks like and specify you want people that have a certain level of expertise with that stack.

non-composable abstractions

Monads don’t compose and they’re a kludgy solution for structuring effectual computations. To solve the composition problem people have tried many things, e.g. monad transformers, free monad co-products with associated interpreters. If you have any aesthetic sense about theory then it is obvious none of those are the right solution. There is an excellent stackoverflow question that gets to the heart of the matter.

programming memes

Programming communities are full of memes. I say memes because there is no science backing the ideas and they are kept alive by pure communal momentum. You’d think programmers being the logical creatures that they are would not put up with such crap but it is hard to fight one’s tribal nature and win. One such meme is a quote by Alan Perlis

A language that doesn’t affect the way you think about programming, is not worth knowing.

On the surface that seems kinda correct but when you dig a little deeper it starts to fall apart. Continue reading

interview questions (graphs and cycles)

Pretty much any interview problem is going to be something about graphs or other data structures with a very thin veneer for “motivation”. The most recent one for me was a basic problem in graph theory under the guise of printing a dependency tree

Continue reading