What is it that we do? Are we programmers, software engineers, or computer scientists? All of the above, some combination, or none?
My thesis is that it depends. All three are real things. All three are very different. Let’s look at each, in turn.
This one seems easy: science that deals with computers and computing. But what is science?
“Science is both a body of knowledge and a process.” Understanding Science from UC Berkeley
“The intellectual and practical activity encompassing the systematic study of … structure and behavior … through observation and experiment.” Google
So what is computer science?
“Computer Science (abbreviated CS or CompSci) is the scientific and practical approach to computation and its applications. It is the systematic study of the feasibility, structure, expression, and mechanization of the methodical processes (or algorithms) that underlie the acquisition, representation, processing, storage, communication of, and access to information, whether such information is encoded in bits and bytes in a computer memory or transcribed engines and protein structures in a human cell.” Wikipedia
So, Computer Science is more concerned with computation and it’s theoretical underpinings. It isn’t as concerned with actually building applications and systems. It’s more about discovering and creating new and better ways of computation and of building systems.
Developing new algorithms (like the compression algorithm on sitcom Silicon Valley), creating new languages, compilers, etc. Tony Hoare was doing Computer Science when he developed the Quicksort algorithm. The people at Google who created the Go language are doing Computer Science. The guy who wrote FlappyBird… not so much.
“the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software”
“Planning, designing, constructing, and testing software to the rigorous standards of an engineering discipline.”
Only a small percentage of the software being written requires engineering rigor. This is software that can not fail under any circumstances. The ultimate example is software for something like space flight systems. If the software has a bug, people can die and billions of dollars can be wasted.
Comprehensive testing and brutal code reviews are the norm.
Examples: medical systems, flight systems, spacecraft systems, and reactor control software.
There are some other things that don’t directly involve potential loss of life, but which I’d consider Software Engineering. Those are things like the compilers that those life critical systems are written with.
Financial software could be considered to require an engineering approach, especially if it’s your money it’s manipulating.
This is everything else: games, personal productivity apps, graphics apps, web apps, scripts, most tools, etc. This encompasses most of the software that gets written.
So what is it we do?
Well, that depends. If you’re developing new algorithms, new programming paradigms, or new approaches to computing, then what you’re doing is probably Computer Science. If you’re designing and implementing a new language, you’re probably doing Computer Science.
Chances are you’re not doing Software Engineering, despite what the org chart or your business card says. My card says “Lead Software Engineer”, but I don’t think my job involves engineering. “Lead Programmer & Architect” would be more accurate. Some of the things I do involve a certain amount of Computer Science (designing and implimenting a general purpose version of Lisp in Go, for example).
Ask yourself what’s the worst that will happen if your code has a bug or crashes. Will a plane fall out of the sky? Will a spacecraft veer of course and wander the solar system, or crash into the moon? (Ok, sometimes that’s what’s meant to happen) Will someone’s heart stop beating?
Of course, these ideas aren’t completely disjoint. It’s a continuium with the three concepts being the extremes along their respective axis. You will likely move around in it as you work: sometimes doing some research, sometimes some engineering, and sometimes just slinging code.
What about Software Craftsmanship?
Craftsmen make nice, well made, useful things. Well, that’s the idea. And there’s nothing wrong with that; we all need well crafted things that work well. Software is no different. To me, the whole idea of Software Craftsmanship is marketing spin for consulting companies. It’s simply programmers doing a good job. Granted not all programmers do a good job. Maybe that’s the moral of this post… Do a good job. And stop worrying so much about what’s on your business card. You’re probably “just” a programmer. And that’s something to be proud of.