Tuesday, August 3, 2010

What is the motivating factor for the next generation of software engineers?

As many of you know, history, urban studies, and all things Lowell are hobbies of mine.  By trade, I'm a software engineer.  Sure, it's a respected profession that pays fairly well, is creative, and is easy enough to find good jobs in  in the Greater Boston area.  But what got me into it?  Computer games.  And more importantly, wanting to write my own.  It occurred to me that the perfect storm of technological innovation and, perhaps more importantly, technological adolescence, that got me interested in that may no longer exist today.  The technology and the industry were so new yet becoming more accessible so quickly, it seemed like anyone could do it.  Without that motivation, what makes a teenager want to write software these days?

I'm going to go into my software development life story now.

I wrote my first computer program back in the mid-90s.  1995 or 1996.  The first program I had seen written by someone I knew was something my dad had to do for a class.  There was a calculator, a desktop skin, a few other things, all written in Visual Basic 3.  My dad is in high tech, but he is not an engineer, so I didn't exactly follow him.  As anybody who ever has written software knows, there is a certain mindset that is required to be able to turn ideas into software - I've always thought it was the people who liked word problems in math class and excelled in elementary physics.  Dad majored in English.

But there is more to why dad doesn't write code: he grew up in a time when computers were bulky machines that only universities and large companies had, often with teletype displays and punch-card inputs.  This obviously is a high-cost-of-entry situation with results of limited interest (at least to me).  By the time he was my age, his late 20s, the PC had been born, but it was expensive and limited in application.  The Wang PC he had when I was growing up couldn't even display extended ASCII art games like ZZT.  Still, not the interactive play-and-work environment we had 10 years later when I was a pre-teen.

However, by the time I was starting to think about what I really wanted to be when I grew up, things had changed.  The early 1990s had spawned lower-cost VGA-graphics based computers (Video Graphics Adapter...256 colors, 640x480 resolution) with a Windows operating system, hobbyist computer shows that were well-attended, and early home internet access over modems using local BBS's or the first few iterations of AOL.  Many of my friends had fathers in the computing industry, and had 286, 386, 486 machines that could take advantage of these things.  When we finally got our first IBM-compatible 33MHz 486 with a 100 MB disk drive and 4MB of ram (and later, a 2400 baud modem), the stage was set.  I had already heard about and played games like Wolfenstein 3D and King's Quest with friends, and I could finally play them.  Of course, I was already playing Nintendo and Super Nintendo, but this was different...probably because of the hobbyist community that was so active at the time.

Dad and I would go to the local shows and pick up some low-cost games (often demos called Shareware) on 3.5" floppies that held less than a megabyte and a half (double-sided, double density!) and maybe a peripheral or two.  There was no Best Buy yet or anything like that.  At home, I'd leave the phone dialed-in all night to AOL's download area pulling down some megabyte shareware demo of some new game - and it would take all night.  My mom never understood this stuff - the computer was something for work and games - it wasn't the communication mechanism that no longer tied up the phone line it became years later when she finally got hooked.  Dad, conversely, had a computer talk show on WCAP here in Lowell and had a column in a few papers, including The Sun called The Shareware Report.  There was a huge Shareware community at the time because there was something interesting about a lot of this software:  It was written by one or two people, often in their spare time, and it was usable and fun.  Even the professional games of the time, which were only a few magnitudes more complex at best, seem painfully simplistic by today's standards.  Wolfenstein 3D, which I previously mentioned, was associated with two software rock stars at id software:  John Carmack and John Romero.  King's Quest was tied to a husband and wife team at Sierra.  ZZT, also mentioned earlier, was done by just Tim Sweeney, who by the time of publication, was still only 21.  Superstar names existed at Nintendo, or in SimCity, or in Civilization, or in huge numbers of other games.  Granted, they weren't all engineers, but still, there was a seemingly single mind or small set of minds behind all the greatest games.

At the same time, software development was becoming more accessible.  Long gone were the punch cards and assembly-language coding.  Or maybe FORTRAN or COBOL if you were lucky.  While professionals were writing in C and academics were writing in Pascal, amateurs had Visual Basic...or at least QBasic, which was a form of BASIC that shipped with DOS and came with a game called Gorillas, complete with source code.  Visual Basic though, to a beginner, was the most exciting.

Visual Basic 3 had a WYSIWYG (What you see is what you get) editor to draw Windows applications as well as a very simple programming language syntax. Put a button and a text box on a window (a form in proper lingo), double-click the button, write what you want to happen when the button is pressed.  Probably make the text box say "Hello, world!"  One line of code.  While grade school had introduced us to coding without us even realizing it via logo on the Apple ][e, here was a language I could use to write toy programs in an hour or so.  With a little more reading up on the language (kids in school have time for such things), I was soon writing graphical games in a weekend that were like Whack-a-mole or Tic-Tac-Toe (a classic programming exercise).  From here, I went on to write more complex and time-consuming games that had music and savable state (file i/o) that looked like a complex version of Stratego.  I even wrote a trojan horse that would infect Windows 3.1 systems by copying itself to the A: drive and/or AUTOEXEC.BAT.  And many of these, save the trojan, I put up on AOLs Download Center, like hundreds and probably thousands of other programmers.  A few dozen people downloaded my games.

By this time, I was in high school and knew I was going to write software for a living.  I took every course on software my school had.  It was now the end of the 1990s and computer games - computer programs in general - were written by far larger teams.  A game like Quake, which I feel was on the cusp of a big transition in game complexity, had multiple engineers working on it, even more level designers, graphics people, musicians...and it just kept growing in complexity from there.  A modern computer game's development staff looks like that of a feature film.  The modern big-studio software days were here.  However, by this time, I had already had a few years, as a kid, tinkering with software in the golden years of the small studio.  It was a time when you could look at a program and say "with a reasonable amount of time and effort, I could do that too.  And it might not be quicker to download it / buy it"  Kids today don't have that luxury.  Look at my generation's Civilization II - coming out the same year as Quake (1996), admittedly far outside of my abilities to write, but at least there were simplistic editors to add your own unit types, etc - and compare that to Civilization IV, which was only ten years later as I was graduating college and my career path was set.  Writing tile-based games seems easy - writing true 3D games is hard.

It didn't matter - by this time I realized I liked writing programs, not just games.  I was ready to stop tinkering and start working full-time on software with a large team.  But games and tinkering with software in my bedroom got me interested in programming.

So, I went off to college in 2001 and we were a massive group of future engineers.  Around the same time the .com bubble burst and 9/11 contributed to an economic tailspin.  The years of graduates after mine were much smaller due to these factors, making it easy to find lower-level engineering jobs, just in time for me to graduate.  However, I wonder if what I've been babbling about here matters at all:  It's now been five years since I graduated college.  Some guy five years younger than me was too young in the early-to-mid 90s to have seen a rapidly maturing software industry.  They grew up playing games you could never conceive of designing, and many applications are prohibitively complex...and the easy ones are already done for you.

You know what though?  And this is largely why I wrote this to myself...to make myself think.  Something else has changed that hadn't entirely occurred to me: In the late 90s, people still were in the last few years of dialup.  The World Wide Web was still in its infancy.  I had a stupid little hand-coded webpage, but actually being a web developer never really was on my radar.  I took a few courses on static HTML and JavaScript in high school, some courses on ASP.NET in college.  There is still a lot of interesting and not prohibitively complex work to be done there, especially with how easy it is to use a modern language like Java to communicate with the internet.  It was way harder in my day.

As a matter of fact, Mark Zukerberg of Facebook is my age.  Actually, he's younger.  And actually, while I write back-end systems, our content has a web-based front-end.  But like I said, I'm not a web developer - I'm here because it's where the industry has gone, not because it's what I originally had in mind.

Another brave new world of software design is the mobile platforms.  I bought a book on how to program Android, but life, my job, and introspective blog postings like this one suck away my time.  Somewhere out there, kids are learning to write Hello, World! on an Android phone, and will be complaining in ten years that that field has matured beyond the point of easy entry for the future's children as well.


  1. I can empathize with your Father.  I took a couple of software courses at UMass Lowell when I found myself on a software project as a "knowledge engineer" working with the coders.  Pointers got to me.  I just couldn't visualize them.  Back to taking history courses.

    Regards  —  Cliff

  2. Having trouble with pointers is super common. It's something I just understood one day: the difference between variables that contain a value of some sort as you think in algebra, and those that contain a memory address where you find values.

    The story at RPI was Computer Science 1 was passable by most people (variables, methods, control structures like for..loop and if..else), Computer Science 2 by fewer (pointers, classes), and Data Structures and Algorithms by those that would be able to graduate (Search algorithm growth analysis, trees, buffers, etc).

    Interestingly, many computer science degree programs are apparently geared towards Java today, which abstracts a lot of this nitty-gritty stuff away. I'm assuming they still *have* to teach it, because it's important to understand, even if you never have to use it directly. Understanding how memory is structured is key to writing efficient software...although less so than it was even 10 years ago as modern compilers and especially virtual machines tend to be able to optimize byte code / machine code for what you *should* have written, not just what you wrote.