Stiff asks, great programmers answer (2006) - 21 minutes read




At some hot, boring afternoon I got an _Idea_. With the help of public accessible e-mail adresses I asked 10 questions to a bunch of programmers that I consider very interesting people and I respect them for variuos things they created. Coming out with question was a 5 minute job for me - these are things I would ask about if I could speak with them personally for, let’s say, 10 minutes, and I didn’t have time for thinking too much. The last two question don’t have anything to do with programming, this is simply something I like to know about everyone I talk to, lets say that’s my hobby. Not everyone wanted to answer them, and that’s fine. It was the first “interview” I ever made, so I also made some mistakes, which went out as people started answering… But despite of this, I learnt a lot of interesting stuff, so it was definietly a valuable experience.

Not everyone responded to my e-mail, not everyone agreed to answer the questions, maybe I will also get some answers after I published this, I didn’t have the patience to wait longer, so new things may appear here over time (Update: Bjarne Stroustrup was added on 03.08.2006).

Finally, here we go:

Dave Thomas - Author of the “Pragmmatic Programmer”, “Programming Ruby” and other great books about programming. One can read his mainly programming-related thoughts here.

David Heinemeier Hansson - Author of the Rails Framework - the new hot web development framework. He has a weblog here.

Steve Yegge - Probably the least known from guys here, but also made one of the most interestings answers, has a popular weblog about programming. He is also the author of a game called “Wyvern”.

Peter Norvig - Research Director at Google, a well known Lisper, author of famous (in some circles at least) books about AI. See his homepage.

Bjarne Stroustrup - C++ creator, has a homepage here

Tim Bray - One of the XML and Atom specifications author and a blogger too.

And here comes the main content:



- How did you learn programming? Were any schools of any use? Or maybe you didn’t even bother with ending any schools :) ?



I taught myself to program on an HP calculator using their RPN stack language when I was 17 years old. I’d tried to learn programming a few times before that but never really “got” it. The HP 28c and 48g scientific calculators were pretty powerful and had great docs. I wrote a 3D wireframe viewer for the 48g — I got a book on 3D graphics and painstakingly translated an example program in Pascal into the RPN stack language. It was pretty sweet when I got it running. After that I bought a PC and Turbo Pascal, and started studying programming in earnest. I was a decently good programmer by the time I went into the CS program in college.

I went to the University of Washington and got an undergrad degree in CS. It was definitely worthwhile, and I recommend that all programmers should try to get a CS degree if possible.

I didn’t learn programming in school, but mostly on my own reading books and just doing it (initially on a Commodore VIC-20, later on a Sinclair QL).

That said, I think especially University was very useful. Rather than go to an engineering school, I went to Helsinki University, which is pretty theoretical, so there the teaching concentrated not so much on programming (which was just a small part, and which I ended up doing more of “on the side” anyway), but most of the courses tended to be on fundamental concepts and things like complexity analysis.

Which can seem boring and even a waste of effort at times, but I think it was useful, and I mostly enjoyed it. And I think I’m probably a better programmer for it.

I learned programming by starting to put together my first web page in HTML. Then I wanted to make some dynamic pieces and picked up first ASP then PHP. After I already knew how to program, I then started on a joint computer science and business administration degree.

I took courses in high school and college, but always felt I learned more on my own.

During my secondary schooling I took a class in a local technical college on computers. It got me totally hooked: I fell in love with programming, and looked around for colleges offering courses in software. Eventually I went to Imperial College, part of London University. It was only the second year they’d offered a course in software, and it was absolutely marvelous: the staff and students worked together to make the materials better, and everyone learned a lot. The undergraduate course there gave me an incredibly strong background in software development. I stayed on to start a PhD, but got lured away by a startup.

But the overall question is “how did you learn programming?” The real answer to that is “I’m still learning programming.” I think any good developer continues to learn throughout their careers. It isn’t just a question of picking up new languages and libraries: good developers also refine their techniques and practices over the years.

I went to university where they had a big mainframe and there were various computer courses. This was very important for me.

Initially, I was self-taught. I got my first programming job before I went to college. But I’m glad I did. I had a lot of fun. I kept going until I had a PhD.

In university (Aarhus and later Cambridge). The universities taught me much that was useful, incl. most of the bases for my future work. In addition, I learned a fair bit from programming for money - where understanding of real-world problems, correctness, maintainability, on-time delivery, etc. were more pressing than in an educational setting.

I thought I was going to be a math teacher. The math program at University required a few computer science courses.



- What do you think is the most important skill every programmer should posses?



Written and verbal communication skills. You’ll never make it very far as a programmer in any field unless you can get your ideas across to people effectively. Programmers should read voraciously, practice writing, take writing courses, and even practice at public speaking.

I tend to judge the people I work with not by how proficient they are: some people can churn out a _lot_ of code, but more by how they react to other peoples code, and then obviously by what their own code _looks_ like, and what approaches they chose. That tells me whether they have “good taste” or not, and the thing is, a person without “good taste” often is not very good at judging other peoples code, but his own code often ends up not being wonderfully good.

But hey, it’s not the only thing. One thing that is very useful, especially in an open source project, is simply the ability to communicate well what you want to do, and how you are going to do it. The ability to explain to others _why_ you do something a certain way is very important, and not everybody has that ability.

That said, in the end there are also the people who just churn out good code. They may not be good at explaining it, and they may not even have great taste, but the code works well. Sometimes you need another person (one that _does_ have that hard-to-define “taste”) to maybe massage the code into a form where it’s useful in the bigger picture, but just the ability to write clear code for difficult problems is obviously a fairly fundamnetal part of any programmer.

A strong sense of value. The ability to ask yourself the question: Is it worth doing what I’m doing right now? So many programmers seem to waste oceans of time on stuff that just doesn’t matter. And not enough on the stuff that does.

I don’t think there’s one, but let’s say concentration.

Your questions are rather general and hard to answer. :-) I guess being able to cook an egg for breakfast is invaluable.

To be self motivated. To be really good, you have to be in love with what you do.

The ability to think clearly: A programmer has to understand problems and express solutions.

Ability to prefer evidence to intuition.



- Do you think mathematics and/or physics are an important skill for a programmer? Why?



There is a large branch of mathematics that’s very important for programmers called “discrete math” or “concrete math”. It includes disciplines such as probability, combinatorics, graph theory, induction proofs, and other useful tools. I would encourage all programmers to study discrete mathematics to whatever extent they can. Even a little is better than none at all.

As for more traditional math, well, I don’t use it as often, but it comes in very handy when I need it. For instance, I’ve only used calculus once in the past year as part of my job. I had to estimate loads for the peak traffic hour of the day for a service whose load “follows the sun” in an approximate sine curve. The simplest way to make the estimate was to integrate over 1/24th of the curve at a specific time. If I hadn’t known calculus, I would not have known how to make a reasonably accurate estimate.

When I was writing my game, Wyvern, having a solid working knowledge of basic planar geometry was incredibly helpful. And it’s quite common to use algebra and linear algebra on a regular basis. But I rarely use trigonometry or differential equations on the job, and not much calculus either.

I’d say my basic math foundation has made me maybe 5% to 10% better as a programmer. If I knew a lot more math, I’d undoubtedly be a much better programmer than I am today, so I study and practice math several hours a week.

I love physics and I have an ongoing, lifelong quest to try to understand the underpinnings of quantum mechanics. But I’ve never personally found any physics very useful towards my job as a programmer. That would, of course, be diffferent if I were doing something in a physics domain, such as 3D game programming, or certain types of simulation.

I personally think a fairly strong math background is a good thing. I’m not as sure about the physics side, but I’m convinced that understanding math and having a good background in it helps you to be a better programmer. If only because the mental models are similar - you can build up any kind of set of rules you want, but it should be self-consistent.

Not at all. At least not for the kind of business programming needed for web applications. I consider it much more important that someone is a good writer.

Yes. Many ideas are inherently mathematical: induction, recursion, logic, etc.

Maybe. But, to be honest, I haven’t seen much of a correlation either way between these types of discipline and good software developers.

However, I _have_ seen a strong correlation between people who have some music in their background and programming skills. I have no idea why, but I suspect that some of the areas of the brain that make someone musical also make them good at software development.

Math, yes (for some parts; I don’t care for differential equations, but algebra and logic are important). Physics, I don’t think so except it’s always useful to be interested in many different things.

Yes! They teach you logic & deduction…. To have an analytical eye. And there’s no replacement for mathematics when it comes to analyzing algorithms.

Depends on the programmer and the programming tasks. Some forms of math are frequently useful; physics less often so, but then learning physics is one of the best ways of learning practical math.

In my case, I’ve almost never used my university-level math to support my programming.



- What do you think will be the next big thing in computer programming? X-oriented programming, y language, quantum computers, what?



I think web application programming is gradually going to become the most important client-side programming out there. I think it will mostly obsolete all other client-side toolkits: GTK, Java Swing/SWT, Qt, and of course all the platform-specific ones like Cocoa and Win32/MFC/etc.

It’s not going to happen overnight. It’s very slowly been going that direction for ten years, and it could well be another ten years before web apps “win”. The tools, languages, APIs, protocols, and browser technology will all have to improve far beyond what you can accomplish with them today. But each year they get a little closer, and I’ve finally decided to switch all my own app development over to browser-based programming from now on.

Microsoft and Apple definitely don’t want this to happen, so a necessary first step will be for an open-source browser such as Firefox to achieve a dominant market position, which will in turn require some sort of Firefox-only killer app. (A killer app would be something like iTunes, something that everyone in the world wants to use, badly enough to download Firefox for it.)

I don’t think we’ll see a “big jump”. We’ve seen a lot of tools to help make all the everyday drudgery easier - with high-level languages and perhaps the integration of simple databases into the language being the main ones. But most of the buzz-words have been of pretty limited use.

For example, I personally believe that “Visual Basic” did more for programming than “Object-Oriented Languages” did. Yet people laugh at VB and say it’s a bad language, and they’ve been talking about OO languages for decades.

And no, Visual Basic wasn’t a great language, but I think the easy DB interfaces in VB were fundmantally more important than object orientation is, for example.

So I think there will be a lot of incremental improvements, and the hardware improvements will make programming easier, but I don’t expect any _huge_ productivity help or revolutions in how people do things.

At least not until you start approaching real AI, and I don’t think real AI is going to be anything you will ever “program”.

I try not to predict the future. I’m not a big believer in fortune telling. The best way to predict the future is to implement it.

The next big thing in computer programming will be eclipsed by the next–next big thing in programming, and so on, and so on. I’m kinda tired of the endless search for the big things, because while doing it people tend to forget about the real issues: getting the fundamentals right. We need to get a whole lot better at talking with our customers, focussing on delivering value, and taking pride in what we do. A developer who can do these things can deliver great software with any tool set, and won’t need to worry about tracking the fads and fashions.

Sorry, I’m not much of a crystal ball person. I predicted CGI about 5 years after it had been invented. :-)

The two issues I’m most concerned about now are coping with parallelism and complexity.

I don’t know, and I don’t like to guess.

No idea.



- If you had three months to learn one relativly new technology, which one would You choose?



I do happen to have 3 months (part-time), and I’m spending it learning Dojo (http://dojotoolkit.org) and advanced AJAX and DHTML. I’m learning it by writing a fairly ambitious web application. Dojo’s really cool, and I’m sure it will only improve with time.

Hmm. I’d really love to do FPGA’s, but I’ve always been too busy to really sit down and start learning. I love the notion of playing with hardware: it’s obviously one of the reasons I ended up doing operating systems, since that (along with compilers) is about as close as you can get to playing with the hardware, without actually designing or building it yourself.

I’d like to know Javascript better. Also flash.

If “new” means “new to Dave Thomas” then I think I’d take intensive piano lessons.

If “new” means technology stuff, then I guess I’d choose technologies related to accessibility for people with disabilities.

For fun, I’d catch up on the latest in 3D rendering. I’d probably write a photon-map renderer.

There are very few things of any importance that you can learn in three month. I think you must be thinking of training in a well established field.

Security, encryption, digital signatures, identity, etc. It’s a big problem for me that I’ve never learned this stuff.



- What do you think makes some programmers 10 or 100 times more productive than others?



I think if you pause to consider why not all atheletes are equally good, you’ll have your answer(s). Thomas Edison has a relevant quote about genius that might also provide you some clues.

I really have no idea. I think some people are just better able to concentrate on the things that matter, and I think a lot of it is just doing it. Most of the really good programmers I know started doing it fairly young.

The ability to restate hard problems as easy ones.

The ability to fit the whole problem into their heads at one time.

They care about what they do.

They think about what they do. They don’t rush in and slap things together. They have a holistic picture of what is to be built.

First a general lack of professionalism and adequate training. that sets the base level too low. Secondly, some people have a combination of “smarts” (ability to think clearly and get to the heart of things), experience, and knowledge of tools. Programming leaves more scope for that because it is a combination of theory and practice - neither of which is much use without domain knowledge.

The surprising variability of the human mind.



- What are your favourite tools (operating system, programming/scripting language, text editor, version control system, shell, database engine, other tools you can’t live without) and why do you like them more than others?



OS: Unix! I use linux, cygwin, and darwin all about equally often now. You just can’t beat it for productivity tools. Every programmer should learn how to use every tool in /bin and /usr/bin.

Scripting language: Ruby. I’m proficient with just about every major scripting language out there: Perl, Python, Tcl, Lua, Awk, Bash, and others I’m forgetting. But I’m really lazy, and Ruby’s by far the easiest, so it’s a match made in heaven.

Programming language: I don’t have a favorite; I think they all suck. I tend to prefer Java because it’s a strong, portable platform with good tools and good libraries. But the Java language will evolve or die; it’s not good enough as-is to hold the lead indefinitely.

Text editor: Emacs, because it’s the best thing out there today.

Version control: SVN. Perforce is better, but it’s very expensive.

Shell: Bash, because I’m too lazy to learn a better one.

Database engine: MySQL, of course. Nothing else comes close.

Others: I find the GIMP invaluable, and also maddeningly unintuitive. I’ve been using it for years and can still barely do anything with it. But I couldn’t live without it, ironically enough.

Firefox is becoming an increasingly critical part of my tools lineup. I feel suffocated when I’m forced to use IE or Safari.

Note that all these tools (Unix, Emacs, Firefox, GIMP, MySQL, Bash, SVN, Perforce) have something in common: they’re extensible; i.e., they all have programming APIs. Great programmers learn how to program their tools, not just use them.

I actually don’t end up having that many tools I work with, and for the many of them I have spent some time of my own to just make them work for me. The OS part is clearly the biggest one, but I’ve obviously also written my own version control system (git), and the text editor I use (micro-emacs) I’ve ended up customizing and extending upon too.

Other than those three parts, the only thing I care deeply about is my email reader. I use “pine” - not because it’s necessarily the greatest email reader ever, but because I’m used to it, and it does what I need it to do with a minimum of fuzz.

OS X, TextMate, Ruby, Subversion, MySQL. That’s the combo currently keeping me happy. I like tools that exhibit good taste and a focus on the stuff that matters.

I dislike all three major OS - Windows, Mac, Linux. I like Python and Lisp. Emacs.

I switched to Macs a couple of years ago after being a Linux person for more than 10 years. The tools are not necessarily better, but they don’t have to be sharpened or maintained as often, which lets be concentrate on just using them.

I’m not a great believer in single tools: I tend to switch around quite frequently just so I can get experience with as many tools as possible. Right now I’m using OSX, Emacs, TextMate, Rails, Ruby, SVN, CVS, Rake, make, xsltproc, TeX, MySQL, Postgres, and a whole lot of small productivity aids. Who knows what I’ll be using next year.

These days I live in NetBeans. It does everything I want, very cleanly simply and efficiently. It’s the nicest environment I’ve ever lived in.

Unix, sam (a very simple text editor), and a good C++ compiler, of course.

I like Unix-like operating systems, dynamic languages like Python and Ruby and statically-typed languages like Java (in particular the Java APIs), Emacs, whatever, bash, whatever, NetBeans.



- What is your favourite book related to computer programming?



Man, that’s a tough one. Maybe *Gödel, Escher, Bach: an Eternal Golden Braid *(Hofstadter)? Although it’s not strictly about programming. If you specifically mean “favorite book about programming”, then maybe SICP (mitpress.mit.edu/* sicp*/).

Heh. When I read these days, I tend to either read fiction, or non-computer-related stuff (oldie but goodie: “The Selfish Gene” by Richard Dawkins).

When it comes to programming, the only real programming book that comes to mind is actually the classic Kernighan & Ritchie “The C Programming Language” book, because it’s such an incredibly useful book while being so very readable and _short_. Considering that you can basically learn one of the most important programming languages of our times from it, the fact that it’s thin and readable is just a wonder.

That said, many other books I enjoyed a lot were not about programming per se, but about computer architecture and hardware. There’s obviously Patterson & Hennessy’s computer architecture book, but for me personally perhaps even more Crawford & Gelsinger’s “Programming the 80386″, which was what I used when I started with Linux.

For similar reasons, I have a soft spot for Andrew Tanenbaum’s “Operating Systems: Design and Implementation”.

I like Extreme Programming Explained for its rejection of common thinking about programming practices and Patterns of Enterprise Application Architecture for striking the right balance of abstract and concrete.

It depends on what you mean by “favorite.” Probably the best written book I’ve read in the area is IBM’s “IBM/360 Principles of Operation.”

Bentley’s Programming Pearls



- What is Your favourite book NOT related to computer programming?



Just one book? You’re asking for the impossible. There are too many great books out there to choose just one.

My favorite books that I’ve read this month are “Stardust” (Neil Gaiman) and “The Mind’s I” (Hofstadter/Dennet).

My favorite writers are Kurt Vonnegut, Jr. and Jack Vance.

Well, I already mentioned the Selfish Gene by Dawkins. On the fictional side, there’s just a lot of books I’ve read and anjoyed, but few I’d say were my “favourite” one. I tend to not often re-read the books, and the selection would change over time. It’s mostly science fiction and fantasy, eg “Stranger in a Strange Land” by Heinlein was my favourite one as a teenager, but it’s a bit less clear-cut for me these days..

It changes over time. Currently O’Brian’s Aubrey/Maturin series. See also Day in the Life of Ivan Denisovich



- What are your favourite music actually not very much into music, but when I listen to it, I tend to listen to various classic-rockish things, ranging from Pink Floyd to the Beatles to Queen and The Who.

I like a lot of genres. Beth Orton, Aimee Mann, Jewel, Lauryn Hill. Actually, all those examples would fit under Girls with Guitars ;).

[ Comments not in english will be deleted, thanks for Martinez for helping correcting my poor english ]

Source: Archive.org

Powered by NewsAPI.org