Software Engineering

Software Engineering

More than writing code

At work, my Engineering Manager asked me to start sharing my knowledge with the rest of the team more often. Of course, we do code reviews and we have some other ways to get the knowledge spread across the team, we have a wiki on confluence, we have tech meetings where we talk about how we will solve the problems at hand, those are good opportunities for very specific knowledge sharing, which would be in the form of advice or guidance on the approach to follow to implement something, but it would be nice to have some other kind of sessions to keep the team motivated, active and seeing each other while the lockdown lasts.

I thought of several topics I could talk about, all technical ones: DevOps, Distributed Systems, Functional Programming, very exciting ones but then I realized, the team is very very good technically, everyone is a very capable programmer, and then I stopped. See, I said programmer, is that what we are?, nope, definitely not. The job title says Software Engineer, is that all we do? write code?, I don't think so. I started writing my thoughts and put them together in the form of a talk I'll summarize in this blog post. Thinking about it, most of us don't realize the complexity around Software Engineering and we minimize our work to yeah, I write code and stuff or I maintain and implement new features but everything is much more complex than that.

Programmer vs Developer vs Engineer

Don't misunderstand me, there are plenty of roles our there and we call ourselves in many ways: Software Engineer, Software Developer, Programmer, Computer Programmer but words have an impact and everything has a meaning, I believe we should name things correctly. I'm not asking everyone to think or name things the same as I do, but I do think we should separate things and roles in a better way and with different expectations.

Programmer

A programmer is someone who writes code, that's it, a programmer wouldn't care too much about Software Architecture or Design, neither about the whole lifestyle. A programmer gets the full spec of what they need to implement, they write the code and they deliver it, not much thoughts about how it's going to be deployed, where it's going to run or how it's going to be used.

Developer

A software developer will care about the software, a bit of design and architecture but that's it, not much interest in where it's going to be deployed, how it's going to run or how it's going to be used.

I'm not saying all programmer or developers are like that, I'm just saying these should be the concerns of those roles. If you consider yourself a Programmer or a Developer and you go beyond that, great!, now, the whole point of this article is to share my views and definition about the Software Engineer role.

Software Engineer

A Software Engineer, just like a Programmer and Developer, they care about Software, they also write code and make sure it works as expected but also worry about design, architecture and implementing best practices on every aspect about software

We know about software

And we need to know a lot about it, not only to write it, but also to use it effectively, when building it:

We know around software

We not only know how to build software, we also know many things around it.

We are part of a team

All I mentioned before is very difficult and complex and, to add to that, we need to work with other humans, we are part of a team which usually has people from diverse backgrounds and specialties, a (sometimes non technical) Product or Project Manager, an Engineering Manager, some front end engineers, QA specialists and so on, we need to communicate in different ways and keep everyone aligned on the same page.

Communication is everything

If you're not taking anything from this post, the only thing I'd like you to think about is that, yes, hard skills are very important for the Software Engineering role, we need to think about how we write code that performs better, but none of that is useful if we are unable to work with others. To work with others, communication is everything.

Once you realize you don't know it all and you don't have to know everything, you also realize the rest of the people also don't know everything, and they also don't have to know it all, everyone comes from different backgrounds and knows some things they've been exposed to or studied and ignore some others. Only by talking to each other, communicating and sharing knowledge we all become stronger engineers.