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.

Computer Science

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 mechanisation 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
underpinnings. 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.

Software Engineering

“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.

Programming

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 implementing 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.