(Ganked from Nadyne.)
I think I was first exposed to computers by a neighbor of mine when I was about 8 or 9 (so, 1977 or 78) who had somehow piqued my interest with some stories of his programming mainframes. He loaned me a book he had on programming in FORTRAN, which I thumbed through but didn’t really understand. I’m not sure it was a very good book, to be honest, although at that point I had no idea what distinguished a good book on programming from a bad book. (It’s not clear to me that most people who write programming books know this either.)
Also around this time I got into video games courtesy of the Atari 2600, which was the most popular (at least in my neck of the woods) game console of its day. There was even a “programming in BASIC” cartridge for the system which I bought with images of programming my own games, but it was a waste of time since its capabilities were, uh, extremely limited. But also around this time a friend of mine, Ben, got a TRS-80 Model I, which actually did have a full BASIC programming language. I borrowed his books on BASIC programming and wrote out – in long-hand on lined paper! – lengthy programs which represented little games. I’d go over to his house and type them in and see if they worked, debug them, etc. It was all totally ad-hoc, but those days I spent lots of time writing and drawing random stuff on paper, so it was right up my alley.
My parents bought me my very own TRS-80 Model III, which must have been when I was 11 or 12 given that it was released in 1980. So I was able to create all my own little games, and I’d also create little animation programs with the rather primitive graphics system. It had a tape drive and 4K of RAM, and I wrote a text adventure game which filled up the whole of memory, and I had to cut corners to get it to fit in. Later it got upgraded to 48K of RAM with a floppy drive. This was the day of computer magazines which printed whole programs in source code, and I subscribed to one: Softside. I especially enjoyed the text adventure games, in which they encoded all of the text strings using a simple algorithm so you wouldn’t have the game spoiled for you while you typed it in. On the other hand, you ended up with some interesting typos in the strings when you ran the program.
(I sometimes wonder if typing in all this stuff from paper helped make me such a fast typist, especially since I’m a two-fingered typist.)
In late 1981 my friend Rob – who at this point qualifies as my oldest friend with whom I’m still in contact – moved in across the street. They had an Apple II+, and we spent many hours on that thing playing Ultima II and watching MTV. This was a big step forward since it had better graphics and color, which my TRS-80 didn’t have. A couple of years later my Mom bought an Apple IIe, which pretty much put my TRS-80 into mothballs.
My next step in actual programming came through playing play by mail games, which inspired me to construct my own turn-based computer games, which my friends would play. I wrote an elaborate system in BASIC to track everyone’s moves and the state of the game, and emit board state to the screen from each player’s perspective (one of the things I thought was neat about these games was that you could only see a limited amount of the board, quite different from real-time board games). Unfortunately I had no idea how to write printer code, so I had to copy all the boards onto paper to hand them out. Did I mention that I had a lot of free time back in the day? (Did I mention that my grades weren’t so great early in high school?)
By senior year of high school I was seriously interested in computer programming, and I signed up for two programming courses at once, a full-time class in Pascal, and a part-time class in BASIC (the instructor insisted I take the latter class in order to take the former). These were my first exposure to structured programming principles. I also worked part-time in the computer lab and had to restructure a program they were using in the office. This was my first experience working with someone else’s code, and it was more than I could handle at the time – it was very slow going. I just shake my head when I reminisce about it, since these days I wade into thousands of lines of code I’ve never seen before on a semi-regular basis.
The other thing to mention here is that Rob’s mother bought one of the very first Macintosh computers, which must have been right in 1984. It had MacPaint and MacWrite, plus of course an ImageWriter. The screen size, graphics, and color were a bit of a letdown compared to the Apple II, but the interface and software made up for that. I still have a paper print-out of a drawing I did in MacPaint on that very machine. I don’t really remember Rob and I using that machine for much more than novelty fiddling around – the Apple II was still the game system – but in senior year – by which time Rob had gone off to college – my new friend Matt also had a Mac, and we spent many, many hours after school at his house playing Dungeon of Doom on it.
In 1987 I headed off to college at Tulane, and although I didn’t really know what I wanted to do with my life, I did want to keep up with programming. Tulane was a little draconian about its computer science courses: I wasn’t able to test out of classes with material I’d already taken, so I spent my freshman year being re-taught stuff I’d learned the year before. Sophomore year, though, we moved on to C more advanced information about how computers work. By the end of the year I’d decided to declare my major in CS, since the competing majors (English and art) were things I thought I could work on on my own without formal collegiate training. (Naturally, I’ve done fairly little creative writing or drawing ever since. Oh well!)
So that’s when I committed to a career in software When I finished college I felt somewhat deficient in my programming skills – in particular, use of pointers in C still baffled me from time to time – so I went off to graduate school at Wisconsin. Although I didn’t get a Ph.D. there, I did have the opportunity to work with an outstanding programmer on a research project and I learned a tremendous amount from studying his code and talking with him about how he designed software.
I was never a Macintosh programmer in the classic days. Whenever I tried to learn Mac programming I was either daunted by the high price of the developer tools (“Hmm, developer tools or four months of comic books…?”) or I would read about what was involved (the APIs and the lack of protected memory) and it just didn’t seem worth it, especially once I had experienced doing programming on UNIX systems. So my first experience with graphics programming was with X Windows. On the bright side, once Apple moved to a UNIX OS with the advent of Mac OS X, that made it an ideal system for my programming background.
When I look back on it, I often feel like I backed into being a programmer. I wasn’t a hacker or prolific programmer like many of my peers at the time, and sometimes I’d wonder if I wasn’t a fraud because programming didn’t consume my hobby time like it did so many other peoples’. But I’ve always tended to spread my time and attention across a variety of hobbies and interests – as even a casual reading of my journal should prove. Despite this I’ve ended up as a solid software engineer (well, I think so, anyway) in my career. Programming isn’t the be-all and end-all of my life, but I still enjoy building things and seeing them work, and all things considered I don’t regret the choices I made to end up where I am.
My first experience was with a summer course in programming at the University of Michigan. I was about 10 and it sounded like a neat idea (I already knew that space flight involved lots of computer stuff to do the math, and I wanted to be an astronaut), so I signed up. The week before the course started, UofM got a grant/donation from Texas Instruments, and so instead of learning how to program mainframes with punch cards, we learned Basic on TRS-80s.
The next year, the junior high got a grant and bought a bunch of PETs to replace the one VAX terminal they had, so I learned BASIC on the Commodore PET. (Somewhere I still have a list of useful PEEKs and POKEs which could be used to overwrite permanent memory.) I also got curious about the VAX and learned how to use it to play Trek73 – and connect to the UofM mainframe to run more complicated programs.
In 1981 we got an Apple II+ and I learned about disk operating systems and how to write my own, and put it on a floppy so I could boot the computer with it. I also ran into the limits of memory and had to alter my programs so that instead of looping from 1 to 10 I had to loop from 1 to 7 :<)
That Christmas, we got to pick two games for the computer. We took Microsoft Olympic Decathalon and Wizardry. Wizardry quickly ate up most of my friends’ free time as we played it. We also quickly discovered it was written in Pascal – and there were decompilers available. The game and its data were copy-protected … so we quickly learned about copy-protection as well. (Turns out that several programs depended on the disk drive’s spin rate and the drives had a small tuning screw; by turning it a small amount you could allow the cracker program to read enough data to determine the coded spin rate and use that to decrypt the program. Nibble counts for the win :<) In order to hack the game, you had to know how the data was laid out on disk, and what the data meant, so we learned.
Then I got to MIT and began a formal computer science education. I had discovered that I didn’t meet the height requirements for an astronaut, but still was interested in space and aircraft, so aeronautical engineering it was. That required a lot of EE and CS, so I ended up with a double major in CS and Avionics. (I was originally going for a triple with EE but was persuaded by Jordan that the extra course during senior year in something I really wasn’t interested in wasn’t worth it. Good advice, as it happened.)
(My CS thesis was on converting X Windows programs from low-level X calls to the (new at the time) X Toolkit, which insulated a lot of the gory graphics details from users.)
Then I went to grad school for aircraft control and dynamics, but bailed out in 1991 at the height of the collapse of the aircraft industy. When I found myself competing for jobs with PhDs who’d been working in the industry for ten years, I started looking for jobs anywhere else. I invested $25 to list my resume in the MIT alumni database and ended up getting pinged by Canon Information Systems (a subdivision of Canon, Inc. doing their NeXT programming for them); my Master’s thesis was written on the NeXT, so would I be interested in a job there?
That got me to California and NeXTStep programming, and after two years into NeXT itself, and then into Apple. It’s a relatively far cry from the astronaut/avionics engineer I was pushing for at 10, but it’s treated me quite well.
I really kind of backed into software development as well. I was only a minor hacker or recreational programmer – my neighbor across the street actually wrote and distributed games for the Apple II with some success, among them a version of Tempest before the arcade game became popular! – and don’t really do a bunch of recreational programming, except as it relates to my other hobbies (i.e. I write programs to keep track of books, Magic cards, calculate baseball statistics, etc.). Computers were really just a minor focus for an insatiably curious kid who loved learning lots of things to answer one question.
Ahh, yes, I had that BASIC programming cartridge for my Atarti 2600 as well. I remember finding it useless in comparison to the Model 100, and never tried it again.
Subrata: See, it’s exactly the sorts of stuff you and your friends were doing with Wizardry that are the things I missed out on when I was in my formative years. I wasn’t really interested in cracking software, or of learning the nitty-gritty details of how the machine worked (disk drive spin rates? Ew). After a fashion I guess I was being a typical “lazy engineer”: Plenty of other people were cracking games and distributing them around, so why should I? Why did I have to learn all those low-level details, why couldn’t they be abstracted away for me by a high-level toolkit? Maybe I was just waiting for Mac OS X. 🙂
On the other hand, I did love classes in computer architecture and assembly language, so maybe I just needed to wait to get into it. On the third hand, I’m glad I don’t spend my days programming in assembly!
Anyway, Wizardry and Ultima sucked up a huge amount of free time back in the day, too. I enjoyed the complexity of Wizardry, but I don’t recall whether it had an eventual goal, or was just a lot of fighting and treasure-finding. The Ultima games did have goals, and I enjoyed working towards those.
As I recall, the first goal was to kill the evil wizard (I don’t remember his name, but the spell that he used was Tiltowait – did 100 points of damage to everything in the vicinity. It was a spell you could learn eventually too. The goal in the second one was to get the right tools from the various levels (and evil characters could only enter some levels, while good characters could enter the rest, so you had to split your party) and then use them to solve the puzzle of the final level. There was a third one, but I don’t remember anything about it.