I start working as a software engineer in 2012, so it has been just a bit more than 8 years now. I started as an intern at Prezi in Budapest, and transitioned to full-time at the end of the summer. I am now working at a startup from San Diego, as a senior software engineer. This post is more a self-reflection about what changed and how I changed as a teammate over the years.
Earlier in my career, I didn’t know how to debug, and what to look for when hitting an issue. Bugs in the code you write usually have a good reason, and investigating those are usually fairly straightforward. The ones that were giving me the most issues where usually more complex bugs occuring when multiple systems where involved, or even more annoying, when your local setup is not working. I would have a tendency to look for a little bit and just give up. Nowadays, I don’t give up. I usually take it upon myself to find the root cause of an issue, and a logical explanation as to why it broke down.
At my current workplace, I have been writing new services from scratch, and I spend a lot of time trying to get a good local setup working. I am pretty obsessed about being able to run services and test features end-to-end locally. Rightfully so, I am not sure. It just give me a lot of confidence to be able to test features end to end before even deploying them to our development or staging environments.
Perseverance is probably the aspect of my mindset that evolved the most in those 8 years. This, combined with experience and improved technical skills had the biggest impact on my day to day work.
Being able to figure out problems and have solutions before other people have to fight through them is making me feel very valuable, as the time that is saved for my teammates make the time I spent on debugging issues worth it.
If I have to think about how I approach being more perseverant when debugging is to really try to go back to the simplest layer. Verify, and add an extra layer, verify, and repeat. It is easy to feel overwhelmed and start putting debugging statements everywhere, but focusing on one aspect and being able to eliminate it from the equation is what is important.
Picking your battles
Tensions and disagreement will always happen, in any job. There is no perfect job, and it would be pretty boring if everybody was always agreeing and committing. But, not every battle is worth to fight for. Knowing when to let go and disagreeing and committing is a powerful skill. Earlier in my career, I was pretty shy. Not knowing much, and still dealing with learning a second language, I was often committing without thinking too much, trusting the decision maker, whether on the technical side or product side. It was working well for me.
When I joined my second job, as an early engineer at a startup, I started to be disagreeing with everything if it was related to changing something I worked on, or my role within the team and so on. That… did not work well. It caused be to become impatient and not seeing the overall picture. I was fighting every battle, not thinking if it was worth it or not. This brought my adventure with that company to an end, as I got impatient and just moved to what I thought were greener pastures. This is a decision I still regret today, even if hindsight is 20/20.
Assume that people have good intentions and are not coming from a place of malice. If something hurts you, and rubs you the wrong way, it is most likely not intentional. It could just be a communication issue, someone having a bad day or just someone feeling some pressure. It is not personal.
Today, I always try to take a step back. It is not always easy when it is in the moment, but life is a lot more than work and things will change anyway. It is important to think, or at least try to think about the impact some changes will have on your work, and if it is even worth try to fight for a decision to be changed, or for a decision to go more towards what you believe in. Biting your lip 9 out of 10 times and not say anything works well for me. It also make the times where you decide to speak up much more meaningful, as people will really see it as thoughtful feedback and will in turn take a step back (usually) to see if it made sense.
This is a very hard thing to do. I still struggle to bite my lip 9 out of 10 times but I am getting better.
Detaching myself is something that I need to get a lot better at. I am not good at it. I think I was in a better place years ago as everything was much newer to me. Repeating that “your work is not your life”, “this is just a job” can be tough when you put a lot of pride in the work you produce, and you want people to recognize it. The thing is, people will probably recognize it but wont say anything about it. This is kind of a bad spiral to be in, as you will double down the effort to get that acknowledgement but it might never happen. Just being proud of your own work is enough. Sometimes you might get recognition from other, but don’t expect it. If you go down that path, it will make detaching yourself from your work a lot harder.
Saying I don’t know
I do interview candidates at my current job. I did interview candidates at my previous jobs too. One thing that had changed is the connotation in my mind when someone says “I don’t know”. It is refreshing. Knowing what you don’t know is important, and keeps you humble. Software engineering is all about learning more, as it is always changing. New languages come and go, new patterns start trending and are replaced after a few years. It is very hard to keep up. As long as someone can learn, it is fine. Pretending you know when you don’t is easy to spot, and won’t earn you any points in interviews usually. It gets even worse on the job where people will be less likely to trust you if you are just a talker. Doing and learning matters.
You don’t owe a company anything
That one took a while for me to set in. I met a lot of people, made friends and felt that we all had a common mission while being at a company. That might be true. A common mission is possible. Where I draw the line is when I hear about the concept of ‘we are a big family’. I used to believe it but could see the actions taken were far from the words spoken at times. It left a bitter taste in my mouth so I am very cautious about this now.
A company is trying to make money, ultimately. A company has to protect itself. If it means having to let you go, the concept of family disappears quickly. Trying to keep in mind that a company won’t hesitate to let you go is good when trying to push the extra mile, or do extra work for a company. Ask yourself what the incentive is. Ask yourself if it is worth it. Most of the time it isn’t. It doesn’t mean the job is a bad job if you are to question yourself about that. You just need to be realistic.
We are lucky to be able to work in a field that is always changing. It is not a perfect field, but it has some amazing properties when it comes to growing as an engineer. You always have to be on your feet, ready to learn something new. Entire markets are being disrupted by software. You don’t need a degree to enter the field, and if you get lucky enough to convince someone to take a chance on you, you can have a long and interesting career in my opinion. It feels a bit silly to say that as a 30 something years old but I really see myself still doing this in 20 years (even if I have my doubt sometimes). I hope to still be as excited as I am today.