No Such Thing As a Software Engineer
Mike Fisher recently blogged about all the recent activity decrying the death of software engineering in his post “Engineering or Craftsmanship”. The two terms should never have been stuck together in the first place. Compared to the “true” engineering disciplines, the construct is as ridiculous as the term “sanitation engineer”.
Most other engineering disciplines require school trained engineers with deep technical and scientific knowledge to accomplish their associated tasks. There probably aren’t many ground breaking airplanes designed by people who do not understand lift and drag, few ground breaking electronic devices designed by people who don’t understand the principles of electromotive force and few skyscrapers designed by people who do not understand the principles of statics and dynamics. This isn’t to say that such things haven’t happened (e.g. the bicycle manufacturers turned airplane pioneers named the Wright brothers), but rather that these exceptions are examples of contributions by geniuses and savants rather than the norm.
The development of software is simply different than the work performed within true engineering disciplines. With just a little bit of time and very little training or deep knowledge, one can create a website or product that is disruptive within any given market segment. You don’t need to learn a great deal about science or technology to begin being successful and you need not be a genius. The barrier to entry to develop a business changing service on the internet simply isn’t the same as the knowledge necessary to send a man to the moon. Software, as it turns out, simply isn’t “rocket science”. To develop it we don’t need a great deal of scientific or technical experience and it’s really not the application of a “real science” (one with immutable laws etc) as is say electrical engineering.
Sure, there are some people who as a result of training are better than other people and there is still incredible value in going to school to learn the classic components of computer science such as asymptotic analysis. Experience increases one’s ability to create efficient programs that reduce the cost of operations, increase scalability and decrease the cost of development. But consider this, many people with classical engineering backgrounds simply walk into software development jobs and are incredibly successful. Seldom is it the case that a software engineer without an appropriate undergraduate engineering background will walk into a chemical, electrical or mechanical engineering position and start kicking ass.
The “laws” that developers refer to (Brooks Law, Moore’s Law, etc) aren’t really laws as much as they are observations of things that have held true for some time. It’s entirely possible that at some point Moore’s Law won’t even be a “law” anymore. They just aren’t the same as Faraday’s Law or Bernoulli’s Principle. It’s a heck of a lot easier to understand an observation than it is to understand, “prove” or derive the equations within the other engineering disciplines. Reading a Wikipedia page and applying the knowledge to your work is not as difficult as spending months learning calculus so that one can use differential equations.
All of this goes to say that software developers rarely “engineer” anything – at least not anymore and not in the sense defined by other engineering disciplines. Most software developers are closer to the technicians within other engineering disciplines; they have a knowledge that certain approaches work but do not necessarily understand the “physics” behind the approach. In fact, such “physics” (or the equivalent) rarely exist. Many no longer even understand how compilers and interpreters do their jobs (or care to do so).
None of this goes to say that we should give up managing our people or projects. Many articles decry the end of management in software, claiming that it just runs up costs. I doubt this is the case as the articles I have read do not indicate the cost of developing software without attempting to manage its quality or cost. Rather they point to the failures of past measurement and containment strategies as a reason to get rid of them. To me, it’s a reason to refine them and get better. Agile methods may be a better way to develop software over time, or it may be the next coming of the “iterative or cyclic method of software development”. Either way, we owe it to ourselves to run the scientific experiment appropriately and measure it against previous models to determine if there are true benefits in our goal of maximizing shareholder value.