Wednesday, June 10, 2009

What Type of Software Engineer Do You Aspire To Be?

This is the opening part in a series of blog posts I'm writing in helping my nephew, who's in secondary (high to the North Americans reading) school, who wants to go into software as a vocation. I've decided to experiment with a semi-didactic conversation.

If you're planning on getting started in a career in software engineering, the first thing you have to ask yourself is what type of software you're most interested in:

Pure Software Development
I classify this as working with relatively low-level systems and algorithms, and working to such a degree that satisfying business requirements (while extremely important) aren't the primary consideration of the majority of actual work you do. Rather, technical constraints factor in often enough that you are forced to innovate from a technological perspective on a regular basis.
Vocational Software Development
I classify this as working on systems where the primary consideration is the efficient encoding of business rules, where off-the-shelf frameworks/products/systems are able to satisfy virtually all the technical requirements.

While some astute readers may expect me to follow with some pithy comment about the relative quality/skills/intelligence/worthiness of people who work in one of the two areas, I won't. I actually don't fundamentally view the two as mutually exclusive, and I think assigning normative judgement isn't meaningful or helpful.

If you're going to pursue a Pure Software Development career track, you should expect:

  • You will need to go to a top-track computer science university [1], particularly one which (historically) taught SICP. [2]
  • You will need to work at said university harder than you expect, go beyond your expertise, and generally be humbled at every stage, because you will run into people who are smarter/harder working/better programmers than you.
  • You will have to decide to live in one of a few job markets in the US [3], because there's really only jobs that require that type of development in a few places [4]
  • You will find the vast majority of software engineering jobs completely boring, and more importantly, if you take a purely vocational job, you will constantly look for technical problems where there are none, to your detriment as a craftsman.
  • You will get to advance the state of the art, work with cool technologies, and generally maximize your geek nature on the job.
Perhaps most importantly, however, you will view your career through the eyes of technology.

However, if you're going to pursue a Vocational Software Development career track, you should expect:

  • You won't have to go to quite as rarified university, and you might actually properly enjoy your undergraduate years.
  • You will be able to live and work pretty much anywhere, and make choices based on you and your family's best interests rather than having to live in an extremely expensive housing market due to a pretty limited set of career opportunities outside those markets.
  • You will never find intellectual stimulation in your job, except where you add it to your detriment as a craftsman.
  • If you are good, you will never find it particularly difficult to find a job, because people who can efficiently apply technology to solve business problems are always in demand. [5]
  • You will never get to advance the state of the art, work with particularly cool technologies, and will require external stimulation to maximize your geek nature.
Perhaps most importantly, however, you will view your career through the eyes of solving business problems.

Note that saying "I want to work in Industry X" doesn't determine which of these tracks you have to go down. You can pursue either track and work in many industries:

  • Oil/Gas/Materials Exploration require loads of people who can work with 3d visualization and computational farms and GPGPUs and loads of other super-cool stuff I'm making up because I've never worked in that industry. They also require loads of people who can build systems to handle the business of pumping oil/petrol/gas/coal/gold/coltan out of the ground and into productive use.
  • Finance requires loads of people who can work with low-latency market data systems and computational farms and GPGPUs and huge risk data warehouses and loads of other super-cool stuff I can't discuss due to NDAs. It also requires loads of people who can build systems to handle moving data in between mainframes and databases and workflow engines.
  • Startups require loads of people who can generically push the state of the art in technology to assist end-users and other technologists. They also require loads of people good at building web applications that don't push the state of the art technologically at all.

Can you combine the two? Of course you can. 37Signals is a great example. They build applications that really don't push any boundaries technologically in any way: they're about more efficient ways of doing things, web-enabled, with excellent design. But they also built Ruby on Rails as a way of achieving those aims better. Financial systems are, at their heart, a way to enable a group of traders to maximize revenue subject to the needs of the business. But most of them require a massive application of technology to be able to satisfy those needs, and so require significant applications of pure technology in order to be successful.

In fact, in my mind, the best software engineers are ones who can handle both the pure technology and business vocational requirements simultaneously. They're rare, though, and most of the ones that I know start from one side and realize that they're still interested in the other, and grow their mentality to be able to simultaneously achieve both technology and business zen. You have to get to grips with what really moves you first, and then work on everything else from that perspective.

So which is it? Pure Technology Track, or Vocational Technology Track?

Footnotes

[1]: Go Bears.
[2]: If you didn't go to one of those schools, and you're getting hot and bothered at this stage, seriously, why are you reading my blog in the first place? Regardless, keep reading, as you'll find I'm not capping on your alma mater in any way.
[3]: In North America: San Francisco Bay Area, Chicago, North Carolina Research Triangle, Salt Lake City, New York, Seattle, Vancouver, Boston, Austin. Yes, there are outlier organizations everywhere, but in general, you better plan on spending the first part of your career one of those places.
[4]: Network effects in play here. You need a certain number of these people before the development team can work, and that means you have to have quite a few to draw on, and such they all flock together.
[5]: Particularly if you and your family are willing to change locations. Hiring for this type of engineer tends to follow cyclical hiring paths, and North America tends to have regional cyclical trends.