Beyond Software Engineering

My team lead once asked me a very simple question – “How does Boro compare today, to Boro a few years ago”?

(One of the things that a person should practice is applying the Socratic method. By asking questions like the one above, people usually get into thinking mode (like myself in this case), and they write/do stuff based on the question 🙂 Most folks in my current team have mastered the Socratic method.)

My answer was brief; working on the full-time hiring team was the biggest contributor. However, one day while I was driving*, I thought of a bit more general question: “How does one go beyond software engineering?”, put a little bit more thought into that question, and I want to share my thoughts here.

* We can debate whether the Socratic method triggered this or it was random 🙂


So, how does one go beyond just software engineering? Well, there are many ways this can be answered. First, how “beyond” do we want to go? For one, there’s the Programmer Competency Matrix, but it really sticks to mostly technicalities (hard skills). We can look at Google Software Engineer levels and what the expectations are at each level. We can also approach it by defining engineering qualities, what makes a software engineer good in terms of problem-solving, research, ability to write abstractions, etc.

In general, people will have a lot of different answers to this question. Some see management as a step upward, while others see it as marketing, business, even woodworking, etc. Think of a sphere with infinite vectors pointing upwards. In my opinion, I think all of them count, but we are limited as human beings and can only choose a small subset of those vectors 🙂

In any case, I believe there are some general traits, or core principles that can be captured that apply to a lot of roles, and not only to software engineering.

  1. The first and most obvious one is to just be friendly, peaceful, well-intentioned, and kind.
  2. The next important one is to be obsessed with thinking. But, one must also be very good at meta-thinking: e.g. self-reflection in the form of knowing when is the right time to literally do nothing and sit on the beach after having rationalized for a long time.
  3. One must also be bold about experimenting and trying out new stuff to constantly learn. For example, taking the self-initiative to learn a new programming language, tackle a coding challenge (e.g. Advent of Code), go beyond your team’s expectations, etc. It is really about having genuine curiosity: the will to dig deeper, do deep research and dissect an idea to understand it at a fundamental level. This also implies reading widely (Hacker News, Reddit, etc.), philosophizing on the topic with your friends while drinking beer, etc.
  4. Speaking of fundamental level: mathematics. It is very powerful because it sits at the bottom of all abstractions. Learn the language of mathematics and you will be able to easily climb any abstraction ladder. Especially for thinking in terms of formal systems, mathematics will give you the technical tools to understand the object level and the meta-level(s), and also the mixture of these levels (think number theory and Gödel numbering).
  5. Beyond mathematics, read philosophy, as it is another way to improve your critical thinking. Philosophy will reveal a lot of stuff, especially the boundaries of mathematics, and also, human reasoning. Knowing our boundaries is important.
  6. The English word “teacher” translates to “prosvetiteli” (просветители) in my native language. This literally means “people who enlighten“. To go beyond software engineering, this one is a must – one has to have a love for programming and also the love to spread knowledge and teach/mentor others. This implies going beyond your ego, not being afraid to not know everything, and learning while mentoring, too! And also the other more obvious stuff: write/read blog posts and books, attend/speak at conferences, give talks in hackerspaces, etc.

Can we try to address the original question by my team lead? I guess Boro became more and more aware of these things and their importance, and besides trying to apply them frequently, Boro now tries, even more, to spread them among people. Thus this blog post 🙂

So, what can we conclude here? Going Beyond Software Engineering requires a lot of self-growth. It requires a lot of soft skills, and a lot of time working on oneself, in an attempt to understand more and do our jobs better. Humans are limited, but it is on us to keep trying.

Leave a comment