I’ve been working as a software engineer for the last four years. Here are a few things I wish I knew when I got in the field.

Being able to communicate well. Engineering is a team sport even when it’s a team of just you. There is just so much going on that communication becomes a major barrier in how you get things done. Engineering is essentially 90% communication. What is this bug? How do I effectively diagnose it? How do I write a ticket for a new feature? How do I express a complex idea simply to others so they understand it? Communication is the major contributor to a successful project more than anything else. Miscommunication leads to a lot of wasted effort and time.

I thought a computer science background was necessary to be a good engineer but but honestly computer science and computer engineering are two different things. But being a good engineer does mean having the curiosity to check out new trends in computing and understanding how they work. This includes knowing the new trend’s pitfalls and alternative solutions. This should be at a deep enough level so that you can converse with another engineer. Algorithms are not really that important outside of interviews. I mean you usually use libraries. But that doesn’t mean being completely oblivious to data structures and algorithms is a good idea. Reasoning about code and where optimizations can happen is still super important especially at scale.

Learning to read code. We are taught to write code but never to read it. But it is probably one of the super important skills to have. It is an area I still struggle with but being able to jump below the surface of how something complicated works is probably one of the major things that is needed to be a good engineer.

UNIX and Linux are everywhere so know it reasonably well. Know how to move around quickly on the command line. Be able to install Linux packages and setup a server if you need to. Be able to edit quickly with vi (yes, vi. I am an Emacs user myself but vi is everywhere and it is what you are going to use to edit text quickly on servers.). A basic understanding of some of the more important unix utilities will save you a significant amount of time. Know how to use sed, grep, find, pipes, and how to code in basic bash/zsh.

Know a text editor really well. Software engineers are sculptors of text which run as programs. Text needs to be manipulated quickly. The text editor is our chisel. You need to be able to jump around quickly. Even for being dinosaurs in software time Emacs and vi are still the editors that engineers should learn. Learn one or the other really well. They both have different philosophies on how to do things but knowing one really well will make you faster in the long run and won’t tie you to one environment. And don’t just use your editor. Make it yours. Automate it, mold it to your key strokes, write scripts which solve your problems.

Mindset for automation. While copy/paste is quite the automation paradigm, writing scripts will make life easier. Writing random scripts makes programming fun. It may free up a tedious 30 minutes out of your day. It may make your life easier by making something janky less so. Its an opportunity to learn new things.

Know version control. I use git for everything. It is such a simple idea to version your code but I never really learned it in school. It is probably one of the many things that makes experimenting with code so easy. If you mess up just revert you change or clear the changes all together.

Have a side project that you work on. I feel like this is one of those anti-burnout things. You will feel burnout at some point. What we are working with is abstract. We don’t see the bridge being finished but are constantly building the bridge. But sometimes you just want to work on a project which you can develop and take care of. It’s your baby. It is something that you work on and put your craftsmanship into. It is where you learn new things and go crazy with. It is where you will utilize new tools whereas in your work you likely won’t have the opportunity.

I succeed and fail at a lot of the above. But all of these are things I wish someone told me when I started in the field.