Saturday, October 4, 2008

Software engineering is a social activity; forget that and your career is lost

Computer science is difficult. To create a non-trivial piece of software that functions correctly and reliably requires an above-average amount of logical thinking, perseverance, and intelligence. The basic level of mental competency necessary to solve problems in information storage and retrieval using the abstractions and models endemic to the software profession makes computer science a challenging academic degree program. A significant amount of mathematics, systems theory, and problem solving practice is crammed into the computer science curriculum in order that our graduates are ready for the obvious next step: a career in software engineering.

Thus, the goal of the undergraduate computer science education is to endow the graduate with the requisite level of mathematical maturity and problem-solving ability to be a good software engineer. However, nothing is typically done to instill the student with the requisite amount of plain old maturity that is required to succeed on the job. Apart from the usual trial-by-fire of working in random groups of four to complete team projects, very little is done to prepare the young person for the emotional minefield that is the modern office.

Stroustrup has said that programming is a human activity, and all is lost if this is forgotten. While I don’t know that everything is lost if we forget this, I will say that software engineering is a social activity; ignoring this fact is a recipe for career failure. But what exactly does that mean? In short, it recognizes that software development is done by teams of people working towards a common goal. Project success is effected by the team's ability to communicate and cooperate, and to understand each other and to be compassionate and supportive. While not exactly a marriage, many of the same concepts apply. Interpersonal issues - while not likely to cause a project to fail - will introduce delays and inefficiencies.

If you are reading this blog you are likely either preparing to become a software engineer, are already employed as one, or manage a group of them. This blog is about the social aspects of software engineering; or, what I call the human factors of programmers. While not meant as a self-help guide for computer scientist, you may or may not learn anything about your self or experience an introspective breakthrough that results in a happier career as a software engineer. But you might. In particular, if you are a student or new to the field, some of the things that I hope you can learn from reading this blog include:
  1. what the truly important stuff is that you learn in class;
  2. what you might expect from the real world in terms of career paths, work environments, and politics; and,
  3. that while your talent as a programmer will dictate how far your career takes you, how well you know yourself and your particular personality strengths and weaknesses will dictate how smoothly your career progresses.
There is often a cultural disconnect or divide between those who teach software engineering and those who practice it professionally. I know this first hand as someone who tried to balance parallel careers in academia and industry. One of the problems with this divide is that students often feel detached from their professors (to whom they can't relate), practitioners are out of touch with the results disseminating from academia, and professors are all whack-jobs who rely on institutional protection to thrive. While I don’t pretend that the motivations between educator, student, and professional are aligned, I do hope to build some bridges.

My intent is not to preach; it is to inform and entertain with a series of short essays that emphasize the qualitative, personal, and emotional issues you may experience as a software engineer. It is my hope that this leaves you better prepared to be a team player.

I don’t have any answers to the problems and complexities inherent in building large-scale software systems. I am not selling a methodology or a technology, but if I had to distill the essence of what I am selling down to one concept, it is this:

Overcome your insecurities and be nice to your coworkers.

While each of the entries is designed to be self-contained, there is a logical flow to the blog that I hope coalesces into this general theme of compassion through self-awareness and acceptance of oneself and others.

0 comments: