stiff asks matt answers
I found an interesting article this morning by way of Digg.com Programming: Stiff asks, great programmers answer. The author posed 5 questions to some of the more well-known programmers of today, and their answers made for very interesting reading. Not to say that I'm a great programmer or anything, but I thought it might be a fun thought exercise to answer these questions myself. Here we go:
How did you learn programming? Were any schools of any use? Or maybe you didn't even bother with attending any schools ?
How did I learn programming? There have been several different stages of my development as a programmer. I started out copying BASIC programs from magazines into my Atari 800 and then modifying them to see what would happen. This progressed through the Commodore 64 and Apple II. In the 8th grade I earned the distinction of “Best Programmer,” not that that means very much - I figured out how to make the U.S. flag program run with only a handful of lines of code using loop and control structures vs. typing out the entire graphics display line by line.
In High School I jumped to the exciting world of Quick Basic. I can't remember the exact name of the course I took, but it was not very far above the level of what I did in Middle School/Junior High, nor was it very far below the level of my intro-level course in College. As I recall, we spent a lot of time hacking the machines to see what we could do with them. Of course you couldn't do anything cool like change your class schedule ala Hackers.
At some point I decided I would major in Computer Science at the University of Mississippi. I really enjoyed my time at Ole Miss, and I learned a lot - unfortunately, I also picked up a lot of bad programming habits. You ask were schools of any use? Definitely - one of my favorite professors secured me an internship at St. Jude, which led to my current and only full-time software development job. It wasn't until I started developing real code for real clients that I got truly serious about programming as a profession. It was then that I learned that hacking out quick and dirty scripts that worked most of the time and would get past a graduate assistant's grading wasn't what programming was all about. I think the turning point of my career was when I attended XP/Agile Universe in 2002. It was here that I really started to grasp agility, test-driven development, refactoring, and simple design - principles and practices that I consider essential to developing software of any magnitude.
What do you think is the most important skill every programmer should possess?
I'll answer this question very much like David Heinemeier Hansson answered the 10-100 times question below. I think the ability to quickly view a problem in the abstract and then mentally apply Occam's razor to it until you have what is needed for implementation is essential to programming. When I'm not managing a project team/schedule - i.e. I'm actually doing software development - I would consider this to be the core of what I do every day.
Do you think mathematics and/or physics are important skills for a programmer? Why?
I can't remember ever using any of the physics I've learned. Take that back, the concept of the electromagnetic field was useful when I was trying to understand Mass Spectrometry, which is at the heart of several of my clients’ work. Mathematics, on the other hand, is key. The concepts I learned in my discrete mathematics course seem to lie under the surface of many of the problems that I face. Even if I don't directly apply the mathematics on a day-to-day basis, the “way of thinking” that you develop when studying mathematics really sharpens you as a programmer in my opinion.
What do you think will be the next big thing in computer programming? X-oriented programming, Y language, quantum computers, etc?
Like many of those interviewed, I'm not into fortune telling and/or hype. The next big thing always quickly becomes yesterday's news as we cut through the hype to the core value of what product/technique/practice X offers. We then integrate that core value into our regular day-to-day toolset and then go back to business as usual.
If you had three months to learn one relatively new technology, which one would you choose?
THREE MONTHS?!?!? WOW! Although it isn't that new, it's still fairly new to me. I would spend the next three months learning everything I can about the Spring framework.
What do you think makes some programmers 10 or 100 times more productive than others?
This flies in the face of a lot of the agile methodologies out there, but I think solving as many problems as you can without interrupting any of your other team members will turn you into an uber-productive programmer. I taught myself 90% of what I know through self-study and independent troubleshooting. If every time you have an issue with your work you quickly run to someone on your team that “knows that software/technology/issue better,” you'll never advance past infancy as a programmer. Just like babies have to be spoon-fed, so do infant programmers. You have to learn how to feed yourself. The next time you have a problem in code that you're not familiar with, trace the execution, line-by-line. Understand for yourself how the program works. If you run across a technology or API that you're not familiar with, study the available resources related to it. “Google it” for crying out loud. The more you do this, the better you'll get at it. Soon you'll find yourself asking questions of your team members only about 5% of the time, and you'll become the most productive member of your team. Don't believe me? Give it a try.
What are your favorite 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?
My current tool set includes IntelliJ IDEA (as well as a smattering of Eclipse when I need it), AppFuse - probably the best thing that has ever happened to J2EE development, Cygwin, Tomcat, and MySQL. If I'm doing anything else in a text editor besides coding, vim is my friend. Wiki-wise we're very invested in Confluence - it rocks as a wiki. Of course I really can't live without Firefox - besides my IDE I probably spend more time there than anywhere else.
What is your favorite book related to computer programming?
I think I have to call a tie here between Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin and Test Driven Development: A Practical Guide by David Astels. Both of these books were instrumental in my development as a more agile developer.
What is your favorite book NOT related to computer programming?
This is an easy one - the Bible. My main translation is the English Standard Version.
If I had to choose a book that wasn't the Bible, it would be The Way of the Master by Ray Comfort. This book literally changed my life.
What are your favorite music bands/performers/composers?
Right now my favorite artists include The David Crowder Band, Casting Crowns, and Todd Agnew.