Good computer science know-how and engineering skills seem to be generally thought of like this:
The implication, of course, is that you need to be a computer scientist to be a software engineer.
If you remove the words “computer” & “software” from this & make the diagram more general, some of the absurdity of this assumption will bleed through:
i.e. to be a great Engineer, you first need to be Scientist or a Researcher in the field. This rings patently false.
Of course, Computer Science as a field is useful to become a Software Engineer. It’s just that at least, the Venn diagram should be redrawn like this:
A lot of working engineers would agree: they have used at least some of the skills and know-how that a computer scientist would pick up, but it’s not the primary thing they do.
Engineers do more than Algorithms.
They write legible code for other human beings, they think of creative solutions to real business problems (often by judicious use of libraries and software that other engineers have painstakingly written), they contribute to writing maintainable code, they document & test, and far often than worrying about O(N) complexity, they worry about building something useful and valuable.
Good Engineers do know when to use a Hashmap over a List. But they also know when to pick Redis over MySQL (Technology Choices), how to not reinvent the wheel (NIH Syndrome), and when to consciously write hacky solutions to further business goals (Pragmatism) & when to revisit it to make sure foundations remain strong (Technical Debt).
Engineers do more than Algorithms. Good engineers value collaboration and teamwork over the competition (like ugh, Coding Contests. They understand that even though they are called “Engineers”, the ephemeral code they write is not the same as brick and mortar or steel and cement. Code is fluid, and writing code that lasts and changes and builds on itself needs different planning & team management than you’ll find amongst architects or construction engineers. They value Agility over static upfront planning, and they’ve learned (often the hard way) to stand up to dysfunctional managers and team leaders who think of building software as raising up a dullard pillar: all labor and effort and a little creativity.
Good programmers are writers. They are craftsmen, working hard at their tools and tasks, learning skill & gaining experience, making wonderful tools and useful products for everybody else.
Great Software Engineers work together like a team of artists. They value each other’s work, they complement each other’s skills, and like a theater troupe, they put in their best performances to build something truly great.
Let’s redraw the Venn diagram:
Engineers do more than Algorithms. Our field sure does value the knowledge we learn from Computer Science. But let’s make sure that we understand what we do is broader than and different to what Computer Scientists and Researchers do. This is doubly important because the most profound change we need in this generation is this: everybody should be a programmer. We’d like everybody to learn how to code, but that will not happen if we continue to place the wrong emphasis on what we do and who we are.
Please hashtag your thoughts with #EngineersDoMore so I can follow up.