|For novel ideas about building embedded systems (both hardware and firmware), join the 27,000+ engineers who subscribe to The Embedded Muse, a free biweekly newsletter. The Muse has no hype, no vendor PR. It takes just a few seconds (just enter your email, which is shared with absolutely no one) to subscribe.|
By Jack Ganssle
Software Engineering is NOT an Oxymoron
In his Java Watch column in Software Development Times this week (http://22.214.171.124/article/column-20050315-01.html), always interesting author Allen Holub deconstructs the phrases "software engineering" and "computer science."
He claims that programming isn't math, even though it's often a part of colleges' math departments, and is also not a science, since scientists study nature, creating hypothesis and tests to glean insight into physical processes. I agree that doing science is nothing like programming.
But then Allen distances software engineering from engineering in general. And here I differ.
He claims that a structural engineer can analyze a bridge's design to see if it will fall down. But in software we can't do that; he says "there's no right design and wrong design - just different designs."
If only things were so simple! Consider London's Millennium pedestrian bridge, opened in 2000. Designed and analyzed by certified professional engineers, it was nevertheless a failure, a hazard in fact. Though it didn't collapse, the bridge swayed so much it had to be redesigned.
Allen goes on to say that in software "there's no right design and wrong design - just different designs." I'd argue that a design that doesn't meet the spec is intrinsically "wrong." And even in engineering buildings and bridges, there are many possible correct designs. One may be more efficient; others might have more visual appeal. But all are correct.
He complains that certification for software developers - sort of a software Professional Engineer license - is impossible as there's no absolute standard of correctness for code. Yet that's surely true in every branch of engineering. I can build a circuit that works most of the time, but fails erratically during solar flares. Or one that's apparently perfect till components age and bias levels shift enough for the system to fail. I well remember one company which built their own switching power supplies. They worked great in the lab but failed during summer thunderstorms in the Midwest.
Correctness in anything is awfully hard to identify. My code may be perfect till the customer's kid presses all of the buttons at once. An exam will never compensate for imperfect people.
Interestingly, Allen goes on to say that programming resembles the liberal arts more than engineering. It's like writing a book, he thinks, requiring the same sort of skills. Ironically, some of the best developers I've worked with were originally English majors. They know how to express themselves clearly and concisely.
But they're utter failures until they learn the arts of the engineer. Software design is engineering. It's neither science nor a liberal art. Engineering is the process of using technology to solve problems. Regardless of branch, all engineers decompose hard problems into smaller ones, identify and invent solutions, integrate these into a gestalt, and then test the result.
Engineering is analytical. Writing a program means creating elaborate structures that interact in complex - and yes, mathematical - ways. We need the ISR to run in less than 12 microseconds. The system is 92% loaded. We must guarantee locks occur in some manner to avoid priority inversion.
Finally, and this is an argument I hear a lot, Allen suggests replacing math requirements in CS curricula with English composition and Latin (gasp!). I agree that we developers desperately need better writing skills, and the colleges must challenge our right brains more.
But not at the expense of math. Studying calculus is a great way to train ourselves in the art of being analytical. I have never used abstract algebra in my career, and remember virtually nothing about the subject, but that semester spent manipulating strange symbols in new ways bears a striking analogy to writing C code.
As for Latin, so far my 3 years of Latin has yet to help me build better code.
What do you think? Is software engineering an oxymoron?