Software Engineer: What 10 years can tell to my old self
How I evolved as a software engineer and keep challenging myself through the years
Hey there, it’s Ricardo again! 👋 Don’t miss out on the latest insights and articles about different daily challenges — subscribe to the newsletter today or hit that clap button to show your support. Your encouragement means the world. Stay tuned for more exciting content!
When I look back to all the years I’ve been working in IT so far, I notice two main things: The technology keeps evolving at a tremendous pace and I am getting old. Since I wrote my [very] first line of code, I tried to keep up with the market, adapting, keep improving all sorts of skills, absorb technical books, by embracing new habits, try to apply as much best practices as possible, sharing knowledge with others, looking at old code developed by me and feel “embarrassed” somehow, and explore, explore, explore…
Looking back at the old me, not just the technical skills evolved drastically. My soft skills also got its part on improvement, but also my writing skills. Welcome to the story of my first 10 years on IT. If you are just starting your journey, stick until the end. I will share a few pieces of advice that I would give to my old self if I was about to start just now.
Before I started
When I was a freshman in college, I was just carrying the naivety and immaturity of an energetic teenager. I didn’t have any habits related with IoT back in the day. I was just a boy enjoying life, being with friends and family. And playing basketball, of course. During the first weeks at the university, I got pretty overwhelmed (and shocked at times) at all the new topics being spilled out in every class. It was extremely hard to cope with all that complexity. Initially, discipline was still lacking. I admit, a few times I took advantage of the interest policy. I skipped a few classes to hang around my new friends. Can’t blame a freshman, right?
Looking at other freshmen, it seemed like a few already had some experience with programming. Some developed countless side projects in their spare time already, discuss algorithms and other IT things between themselves, but they were also the ones competing to be the ones answering the questions first. Hey, I am just exaggerating on this last one. Simply put, I was (way) back when it comes to experience. If I ever wanted to succeed in the academic environment and catch up the train, discipline and curiosity was needed. Despite of all this demand, I was sure about my potential and hard work, but also confident that I was able to conciliate the academic life with the personal life.
From a teaching perspective, it didn’t seem that my university was taking big priority in introducing new tools, teaching new programming languages that were on the brink of popularity, but instead focusing on the foundations of computer science: mathematics, algorithms, operative systems, distributed systems, databases, and so on.
Nowadays, I am thankful for that approach. I really appreciated the teacher’s efforts to bring clarity about topics concerning computer science, although sometimes (lots of times) I looked at them like “I have no clue of what this is all about”. It turned out to be really beneficial to me long term as it gave me the baseline to face any kind of challenge related with software engineering nowadays in a pragmatic way.
Keywords: Discipline, curiosity, pragmatism
How I started
Back to square one, I was an engineer that just got out of university and I was a totally novice at my craft. I didn’t have any experience with frameworks, didn’t solve any architecture problem, I barely dominate design patterns, I was not aware of cutting edge technologies and best practices. Even though I did a couple of internships during college, it was difficult to assimilate best practices or so due to the fact the period was very short. When I was on the brink of getting used to the company processes or so, it was time to go. On top of that, was still hard to figure out what could be my focus for the years to come. I was still in the process of discovery the domain of expertise that I would devote myself in the first years or big part of my career: Frontend engineer, Backend engineer, Machine learning engineer, Data engineer, Mobile engineer, you name it. With so many options to start with, I put my efforts in finding a company that:
- Was looking for a total rookie;
- Allow developers to try different things over time;
- Would have mentorship program, in which newcomers would be supported by experienced people and would introduce best practices and new challenges on a daily basis;
Fortunately, the company where I started gave me confidence and allowed me to try different programming languages in different projects, but also boosted my technical skills and soft skills. At this stage, the salary was not even a requirement. With such low experience and expertise, but also the eagerness to start learning as soon as possible, I decided to focus more on my professional development. I believed in my capabilities as an engineer. I just needed to trust one process. During three years I stayed in this company, I contributed to several projects as:
- Mobile engineer, which included native android and ios applications
- Fullstack engineer, which projects were made with vueJS and .net;
And overall:
- I “hit my head in the wall” several times, in which I had to dig through bugs that most of the times were introduced by me;
- Developed problem solving skills, by thinking about potential solutions to problems and debate with the team about them;
- Became very fond of the fullstack engineer role;
- Still need to improve (a lot);
Keywords: root cause analysis, best practices
Go abroad
After a few years of experience, I felt that something was missing. When I was still in college, I wanted to signup for an Erasmus program cause I was eager to have an experience abroad. Due to the lack of opportunity (and money), that door closed to me at that moment. However, that goal didn’t vanish. After some research, the opportunity arose and I had the chance to relocate to Barcelona. Even though it was a goal from a long while, it was still hard to leave everything behind and embrace a new challenge in a different country, and knowing no one. Getting out of the comfort zone, big time. This was something huge to me at the time. The decision was made. But better making mistakes and regretting it later than hesitating, right Ricardo?
The following four years of my life brought a whole bunch of different challenges, professionally and personally wise, but also brought joy. In terms of one’s career, I started my journey in Barcelona on a [very] growing company. I decided to start humble and show my value every day. The idea of “you build your own progress” sold by this company back in the day was taken very seriously. Leave the comfort zone was the saying of the day, everyday. They noticed my value. I moved from fullstack engineer to a more senior position and lastly to a technical lead. The eagerness to learn, the curiosity about the codebase, asking questions (sometimes silly ones) was noticed and recognised. But, along with growth came responsibility. At first, I was a bit frightened as I was just not caring about my work. I was responsible for a small team. Let me tell you, managing people is a very hard task.
After some time, it was time to look for another challenge. There is always something to learn every day in your current job. However, I was looking for something new, despite of enjoying working with fantastic human beings and being surrounded by a good working environment and vibes. It was not a goodbye, it was a see you later.
My next challenge took place in a startup that was taking the first steps and was refining the vision and market target. Since day one I was aware of the increase of risk and the odds of success that this decision implied. But I took it anyway. I was young, no family. Worst case scenario, I will need to look for another job. It was a safe call for a young fella discovering the world. And since day one there was a complete need to release something as soon as possible to the market. The pressure of finishing things, leaving a few behind, take hard calls. If you worked before in a startup, you know the deal. From these two working experiences I got a showcase of both worlds, one with defined processes and a clear vision of the months and years to come, and another with no clear vision, no target 100% defined and a constant change of context. Unfortunately, I faced failure the hard way: no success was yet to come and I had to leave the company. But I kinda enjoyed the rush of startups and what comes with it. I tried it another time, but in a different company. Same old, same old. Lack of vision (and success). From all those working experiences, I took different roles, each one with different responsibilities:
- Fullstack developer and Technical lead;
- Software engineer and CTO
- Backend engineer;
I believe being a CTO and a technical lead was by far the more challenging ones. Being in situations that your calls will take direct impact on the success of the team (or company) was something huge. Surprisingly, I discovered that I like to take hard decisions and expect the worst at all times.
Then covid appeared…And it was time to come back home.
A few things that I was able to conclude about my journey and discover about myself:
- My passion for startups got bigger;
- Didn’t want to dedicate my entire career into a single role and specialising in a specific technology;
- Love wearing many hats;
- Need to choose your “wars” wisely (I will dedicate a whole section about this);
- I am not ready for leadership yet. I feel like I can add more value by becoming a engineer that is very close to a CTO and help others solving technical problems;
- Still need to improve (a lot);
In my very humble opinion, I think that, nowadays, is not entirely true that you need to go abroad in order to expand your horizons and become a better software engineer. At least in my country, Portugal, different cultures interact with each other everyday and can learn from each other. Different cultures come up with different ways of working and different ideas. Besides the startups and other companies that emerged there, you can get a good feeling of what is being doing in the market these days.
Money wise, unfortunately, Portugal is still missing competitiveness. Is a real problem for youngsters trying to prosper in their birth country. Well, is a story for another day. Stay with me, for what comes next.
Nonetheless, I totally recommend going abroad. Not just for the sake of evolving as a professional. But also as a person. Living for four years in Barcelona was one of the best periods of my life. Looking back at those days, is pretty satisfying to see how immature I was and how I grown up, but also how I coped with different challenges. Last, but not least, I met one of the best, strongest and smartest woman of my life. Without Barcelona, I truly doubt that I would ever met her. Not a superstitious guy right here.
Keywords: Humbleness
Startups
I started to find my passion in startups since I embraced a project that was at the very beginning. There was an idea already and a potential target market. It was missing developers turning the idea into something tangible. The feeling of writing the very first line of code was huge. However, what should be the tech stack? How the cloud infrastructure will look like? How do we want to grow the team? How the development process will look like? Gladly, I didn’t have to take all those decisions myself. I was being supported by a CTO back in the day. His years of experience, his knowledge about the pros and cons of different approach took a massive impact on the months ahead. I was taking notes on how to deal with this kind of problems, and how to schematise a line of thought to face any kind of challenge.
From the very start on my journey with startups, I started to be aware of the increasing risk, the impact that each decision, the need of wearing many hats, the diversity of skills needed (sometimes learning the hard way), and changing context constantly. Being totally honest, kinda like it. I didn’t feel bored at any moment and felt quite amused by it. On the other hand, you can count on stability and margin to grow if you are in a more stablished company. But with that comes the risk of boredom and having the same day, everyday. Life is all about trade-offs.
Mistakes happen
I wanted to isolate this section cause I feel that its important to share with you, so you don’t make the same mistakes as well. Not everything was perfect during the first ten years. Mistakes happened, lots of f***ups, frustrations and a few conflicts.
Lack of feedback
One of the learnings that I take from experience is that feedback is never enough. Even though if you have 1-on-1s specifically to specifically focus on feedback the previous weeks, you should aim to keep asking for feedback from everyone. Specially when you are leading a team.
Conflicts
One massive lesson that I take from all those years is that every person is different, have different values, different personalities, different everything. The need to be constantly adapting your speech is necessary. It may happen that the way you talk to someone is good enough but not for others. Being transparent and honest at all times might be good, but it can also be bad. Learned this the hard way. Is still something that I try to keep evolving, although a considerable slice comes with maturity and age.
Defence at all costs
Back in the day, I was still an engineer that was extremely eager to learn and fix problems. Occasionally, architecture debates was a big part of my day. And with that comes the process of proposing solutions and defend your idea at all costs and trying to take your approach forward. That is not necessarily true cause your solution sometimes is not ideal or is far from perfect. Most of the times, the team is rowing to the same side, but some others not. My key lesson here is:
- Take different ideas and try to see the problem in a different perspective;
- Choose your “wars” wisely. Take compromises, accept other ideas with positivism. My idea of a team is one that regardless of a bad decision, all elements are rowing to the same side rather than having people rowing in different directions and getting nowhere;
Code style
One thing I learned from total programming rockstars is that when it comes to a point that the code review is taking code style in the majority of discussions, leave it be. Take clean code principles and best practices as a baseline for reviews, but leave code style to the linters and prettiers. Debate with the whole team what should be a standard and what not and stick to it. Delegating the styling to tools is one of the best ways to avoid very long pull request reviews. Your team productivity will be grateful.
Break production
Who never? This was a hard one a few times. You develop code, you are confident about it, the review process goes smoothly and you deploy your code as usual. However, production starts to break, lots of errors, I mean lots. Lots! The dashboards are red all over the place. The consummation of your nightmare takes place when your boss right next to you asking questions. Production down meant loss of profits. Big time. I still remember a few occasions nowadays.
All in all, from all the mistakes I made until now, and from talking with different people about them, I took a few lessons with me and I still try to enforce it on myself:
- You will still do fuckups. Is part of being a software engineer. Expect the worst and you will be fine;
- Be humble about the process. Raise your hand when in need of support;
- Leave the ego at the door;
- Improve your debugging skills constantly;
- Think proactively about hotfixes so you can fix things fast. And elegant later on. Compromise is important at this point.
Keywords: Mistakes, feedback, adapt
The surprise
Since some years ago I challenge myself to keep documentation as part of my development process as much as possible and motivate others to do the same. Sometimes, it can be frustrating to start contributing to a project and no documentation is available. You need to ask lots of question cause you feel stuck all the time. Or being more specifically, when all your typescript code is overwhelmed by any
keywords, cause one would not care to understand.
To my surprise, I started to get more joy out of it. Keeping things simple, explain how to run things, frequently asked question about random errors that may happen occasionally so one has to struggle again about it, and so on. I took the challenge even further, by creating this medium blog. I feel like I improved a lot since I wrote my first article. I still need to improve, of course. I feel like engagement is still missing sometimes. But is still a work in progress. I used to struggle sometimes when someone asked me to explain specific topics. I still do. However, writing constantly helped me to better structure my thoughts. And also write better code.
Doing almost a full rewind. Back to my 9th grade. I was a teenager not very fond of writing and reading in general. I would say that big part of it was my fault. The lack of interest in “boring” things like reading was real. I would rather being playing soccer or basketball or going out. Nowadays, reading and writing became a considerable part of my life. What age makes to people. No! Being around very nice people that inspire you every day. Yes!
Nowadays, I take reading and writing more seriously, by reading more, not just technical books, but also trying to write more. Well, here I am writing this article. This one took a long while. A big part of writing includes inspiration. Sometimes, that day is not the day.
Keywords: Reading, documentation, share knowledge
The future
Artificial Intelligence (AI)
Technically speaking, something seasoned with AI. In my very humble opinion, the soon you start embracing AI, learning the bits and pieces, making mistakes, learning from them, the better. I am not sure how long it will take to replace us (if ever will), but one thing is certain, is confirmed that it can leverage our productivity already
Imagine in a few years. As already mentioned above, expect the worst and you will be somehow prepared. On top of that, learning AI is not learned in one night. Is a long, long process…
Keywords: Expect the worst
10x Developer
Before you jump into conclusions, I don’t feel I ever going to be that kind of developer. And its ok. There are so many things to learn and so many things to become an expert that becomes impossible to a single human being to achieve. And honestly, I really like that feeling. Imagine reaching the very top of your capabilities and having nothing to improve. That would feel sad and boring.
The skills that make someone a 10x developer in one area (like algorithms or React) do not necessarily translate to others (like DevOps or design). Exceptional performance is domain-specific. Having a well-rounded team with complementary strengths is better than hunting for rockstar unicorns.
Dreaming is still free nowadays and I can aim to shape myself to become as close as possible to that kind of developer, by improving a whole bunch of things, not just technical but also on a personal level:
- Write better requirements, code, unit tests and documentation;
- Improving understanding of complex systems, algorithms and architecture;
- Improve collaboration with others and share knowledge;
- Problem solving capabilities, by deep diving into the details of problems (and includes bugs) and solve them in a fast and elegant way;
- Get things done and focus on deliver quality;
- Improve automation skills, by leaving all repetitive tasks as automated as possible;
- Improve communication skills, by passing the message as clear as possible, but also explaining complex problems so everyone understands and is on the same page;
- Don’t take your knowledge for granted and keep learning
- Constantly leave the comfort zone;
- Pragmatism is key
Conclusion
Looking back all the achievements, is so overwhelming to see the old me and realise how much I evolved, not just as a professional, but also as a person. All the mistakes, frustrations, collaborations and learnings were extremely important to shape the engineer that I am today. There are a few things that I would do differently, of course. If I had to give a few piece of advices to my old self, I would recommend:
- Keep asking for feedback;
- Leave your ego at the door;
- Pragmatism is key;
- Don’t be afraid of asking questions;
- Don’t be afraid to disagree with something;
- Choose your “wars” wisely;
- Compromise between elegant solution and “fast” solution;
- Never take your knowledge for granted;
- Embrace mistakes when they happen and learn from them;
I hope you found this article inspirational and motivated you to keep pushing yourself everyday. I am looking forward for the next ten years and what they will bring.