Coders at work
I’ve just finished reading Coders at Work, and it’s a really good book for developers. Peter Seibel interviews 15 very successful programmers about how did they start programming, what changes they’ve seen in the industry over the last decades, what they look for when hiring new people, how do they debug, etc. I also quite like the tone of the book because it is a laid back conversation between peers, to the point and no bullshit.
Keep in mind that these guys are responsible for quite a few things that today we take for granted such us memcached, Unix, JS, Internet, Java, Firefox, etc.
One common thought is that back in the days they used to know in and out every line of code that run on their machines. Most of them spent quite a few years programming assembly and “close to the metal” (aka, the hardware), but today’s programmers “don’t know the whole thing“.
Well, they are right.
I for one have no idea of assembly, machine code or even C. Now, is that good or bad? Granted, the more you know, the better, but most of them also agree that with the level of abstractions that we programmers “enjoy” these days this doesn’t sound possible any more.
For example, think about the abstractions of the typical Flash movie:
Hardware > OS > browser > Flash player > framework of choice > your app here
Now, that’s obviously a gross overview, since we could break OS in (that I can think of, not even sure it’s the right order):
kernel > drivers > window system > graphic card
The thing is, even if you had access to ALL the code running (which most likely you don’t), who has the time and skills to look at it _and_ get job done?
With all those abstractions in place, when something fails good luck trying to figure out where the problem is. Can you be sure? Because even when we find a bug in the player, is that Adobe’s fault? Mozilla? Explorer? Linux? A combination? Very hard to tell, more so when a few of those elements are black boxes (proprietary software, you don’t have access to the code).
Most of those guys wonder about what are the best skills for programmers nowadays. When they started coding, it was a must having very good math skills because of the lack of HW power. They needed to squeeze every single CPU cycle and memory position. Either that or your program wouldn’t go anywhere. We all know that’s not true any more. Is this bad? I say it depends on your work.
If you are building compilers, 3D engines or drivers, then by all means you need to focus on performance and have those skills. But if you are doing user interfaces I bet your users appreciate a hand for design and usability. So, completely different skills needed. The fact that HW has gotten so powerful has lowered the barrier for being a programmer so people with very different skills can afford it now, and I think that’s good. The fact that a designer (and probably even the most advanced Flash “programmer” looks like a designer to them) can build an interface without having to worry about HW, graphic cards and code optimizations is pushing computers to different areas.
Even for developers, the skills you need now are not the skills you needed 40 years ago. They think most developers these days “play Lego“. They mean we build blocks with the frameworks or libraries available, but don’t do any “real” programming. They have a point. But again, is that good or bad? This is classic DRY stuff. Why would I want to code a SHA1 library if there are quite a few there already? Heck, doing so would not only be a waste of time, it’d probably be a security hole as most likely I wouldn’t get it right. Why would I want to roll my own PHP framework if there are a myriad of choices offering DB abstraction and XSS and CSRF protection out of the box?
See, I think what’s important is having the skills to roll your own code when needed and use somebody else’s when it makes sense. And that requires some skills as well. First, you need to be able to identify what’s core for you and disregard coding everything else. Then you need to be able to start using somebody else’s code without having to understand it all, many times only looking at some (often incomplete) docs or API. That require skills. A different type, but skills nonetheless.
Also, obviously with all due respect, I think they miss an important thing. They didn’t start from scratch either. Nobody does.
Standing in the shoulders of giants
For example, very, very, very few physicists question the thermodynamics laws. Very, very, very few mathematicians question Pythagoras. They take them for granted. They’ve been proved. They use them as a base to build on top. Yet, there’re those very, very, very few that do indeed question the core laws that everyone else just “use”. It’s their job challenging those laws, otherwise completely accepted, and put them to the limit and analyze them with modern eyes.
Why we don’t have similar laws or universal truths in computing? Well, for starters computers are what, 50 years old? 70 years old? 80? Physics and maths have been around thousands of years. Even if you could compare both worlds, the rules of the “computing universe” have been created by human beings whereas the rules of the Earth just are. Those rules haven’t changed since the Big Bang, what changes is our understanding of them (call it physics math. chemistry, whatever).
As I was saying, quite an interesting book. One of those you can re-read in 2, 3 or 5 years, still enjoy it and still learn from it. Go read it!