I’ve been programming for about 16 years now.
I almost called this my “Most Important Programming Lessons”, but I consider writing software to involve far more than a mastery over programming arcana.
When I first discovered source code, I didn’t pick up a manual and start reading about data structures and flow control. That was a lucky decision for the current me, because the former me would probably have been overwhelmed and lost interest.
Instead, I kept myself entertained by making little changes to programs that I already knew worked. I’d do fun things, like surprising the gorilla in the QBasic game ‘Gorillas‘ by modifying his thrown bananas to explode like atomic weapons. The poor guy never saw it coming.
I was writing code for me.
Anytime I showed my latest tweaks to somebody they would laugh in appreciation — but then they would always come up with another idea to push things further. What if the bananas fragmented on their descent like a MIRV missile? What if the bananas became the hero and they threw gorillas? Ha! I was hooked.
I was dealing with feedback from people who became truly inspired only after seeing something working already.
Eventually, I figured out enough through my tinkering that I could face a blank screen and enter my first instructions to make the computer do something. Paint the screen red. Draw a box. Beep!
I would only make a couple small improvements before compulsively running the program again. Did I predict how things would behave, or was I about to be rewarded with something completely unexpected (and often hilarious)?
I was practicing iterative development.
As the years of experience piled on, and I worked through various programming gigs, I started to get overly-confident in my ability to think like the computer. I wrote code for longer stretches, at times making changes so vast that it was impossible to actually run the program for several days. I also started to preemptively add new features, and I delayed for longer periods between demonstrating the new changes to actual users. “It will be finished when my task list is finished!” I thought, naively.
My growing confidence in programming was undermining my ability to collaborate with non-programmers. I was also looking at projects as a checklist of disparate tasks, instead of a cohesive experience for the user.
One day, probably after completing yet another soulless project — with my team breathing a collective sigh of relief, as if being spared from an execution at 30 seconds before midnight — it finally dawned on me that things shouldn’t be this way. Things didn’t used to be this way.
I made a short list of things that detracted from the fun I had when starting out:
- We were writing projects that we didn’t need, and wouldn’t use, ourselves.
- Management, alone, was deciding the tools we used to solved our problems, usually because of executives who bought into vendor marketing at face value.
- Our project managers weren’t programmers, and they weren’t end-users, so they couldn’t effectively communicate with either side. Their project plans revolved around the least important party — the middleman.
- Our talents were being rented out at five times our compensation.
- We had no stake, or risk, in the success or failure of our work.
Shortly after this epiphany I quit my job as a complacent programmer. I co-founded a new software company where we established an ethos of:
- Writing software that we would use as much as our end-users.
- Talking directly with our end-users instead of using middlemen.
- Sharing ideas and changes as early as possible.
- Emphasizing that sales were votes of confidence in what we’re doing going forward, opposed to a payment that merely offset our past work.
Dozens of projects, half a dozen programming languages, and tens of thousands of hours of experience later, and I it turns out I learned my most important software writing lessons in those first tinkering days with QBasic.
Did you practice any of your favorite software development lessons well before you realized what you were doing? I’d love to hear about it in the comments!
Related reading:
http://www.extremeprogramming.org/
http://c2.com/cgi/wiki?MakeItWorkMakeItRightMakeItFast

5 responses so far ↓
1
Rich
// Dec 10, 2007 at 1:02 pm
Gorillas! I did exactly the same as you, learnt on gwbasic, then got qbasic, found gorillas and that snake game (nibbles?) and modified them over and over…
I later got prince of persia, and again found I could modify the game by renaming files.
Good old qbasic!
2
Larry Clapp
// Dec 10, 2007 at 1:13 pm
I always remember fondly the syntax error I spent (at least) two hours trying to fix. Basically Turbo C was saying a line of code had a problem, and as near as I could tell it was perfect. Long story short, the problem was in the preceding line, which I had not terminated with a semi-colon, and the important lesson I learned was: when the compiler says “you have an error on line X”, it might not actually *be* on line X.
This is obvious to a seasoned programmer, but most likely because they once encountered a problem just such as this. :)
More generally, as I got into programming, I modified Turbo Pascal’s editor’s key mappings all over the place, and I was really productive with that set-up. I learned: Know Thine Editor.
3
Jeff Standen
// Dec 10, 2007 at 1:15 pm
Prince of Persia was great. Remember how it always made you go through picking those lettered potions, by looking in the manual, before you could play? It was my introduction to the world of hex editing.
4
Jeff Standen
// Dec 10, 2007 at 1:25 pm
@Larry: HA! Yeah, that lesson belongs in my ‘hard knocks’ file too. You definitely weren’t alone there. ;)
That one still popped up to visit occasionally in C, and even through to the present with PHP.
It became one of those things in my mental pre-flight checklist when a friend asks me to help debug a “strange error”.
5
Jeremy Johnstone
// Dec 10, 2007 at 2:11 pm
Interestingly, while I did first learn programming in BASIC, it wasn’t on gwbasic or qbasic (that came later in life) but rather on an Apple II. I can remember getting in trouble at school because I made an app which “simulated” hacking into a government machine. Took a long time to get the teacher to understand there was no modem or other communications device hooked up to the machine and thus it really wasn’t possible for it to be real.
Leave a Comment