Computer science and software development are two entirely different things. The former is a science, the latter is mostly craftsmanship, still struggling to become an engineering discipline in its own right. Being a good computer scientist doesn’t make you a good software developer and vice versa, but as a software developer, you have to know your computer science basics if you want to succeed.
The IT industry is full of people from different backgrounds making their living as software developers. We have computer scientists, engineers, mathematicians, physicists, and also lots of people from strictly non-technical disciplines. Some have university degrees, others don’t, but they all develop software.
Often, You Can Get By …
You don’t need a carpenter to build a doghouse. Neither does it take a software developer to hack together a simple PHP-based web site.
Knowing each and every detail about a particular programming language, playing a lot with new technologies and also reading up on your design patterns will take you a long way.
But it doesn’t end there. For standard applications in a given field, you can pick up enough knowledge to do a decent job. Frameworks like Java EE have been built so you can ignore some of the inherent complexity. If you know your tools, frameworks and business domain well, then you will most probably outperform 90% of your colleagues, computer science background or not.
But Sometimes You Can’t
More than once I’ve seen the results of improperly trained software developers trying to solve problems without the necessary background knowledge. Among other things, I’ve seen people:
- picking wrong algorithms and data structures because they don’t know
about time/space complexities.
- trying to parse a CH-2 language using regular expressions and being surprised why they "just can’t get it working".
- introducing bugs while transforming nested
ifstatements because they don’t know Boolean algebra.
- implementing network protocols without knowing what a DFA is, resulting in unreadable, unverifiable code.
That’s only the tip of the iceberg. What I find disturbing is that most don’t even realize how poorly they are doing. They’ve been developing software for years and don’t even begin to think that the problem could be them and their lack of basic knowledge. If they are able to sell themselves well, management eventually gets used to the "fact" that some things "just aren’t technically feasible".
Most people know that they’re ignorant when it comes to physics, chemistry, medicine or other disciplines. You won’t let the gardener cut your hair even though he does such a beautiful job with the roses. In software development, this doesn’t seem to apply. Hand them a keyboard and send them off to the trenches. As long as the code compiles and does roughly what you want, they can’t be this bad.
How Computer Science Helps You
I’m not talking about formal degrees here. Sure, a CS degree from a good university is a great thing, but the concepts are important and they’re very hard to learn on the job from looking at existing technologies.
Computer science is about abstraction and developing concepts that you can transfer to new, yet unknown problems. Some people are brilliant and figure it out all by themselves. I couldn’t. More than 99% of people in IT couldn’t. You can probably deduce a thing or two from examples, but that’s it.
Picking up concepts on demand isn’t enough, how would you know what’s relevant? Sometimes seemingly unrelated things play nicely together (ie. functional programming and batch processing with MapReduce). Even for computer scientists it’s difficult to see connections, but for others it’s like trying to solve a puzzle while having only a fraction of the pieces. The broader your knowledge is, the higher your chances that you can connect all those bits and pieces and come up with something that solves the problem in a clean and efficient way.
The most interesting part of software development is problem solving. You have a much better chance at succeeding if you don’t start out at zero.