In today’s letter, I want to reveal the biggest mistakes I made during more than ten years as a professional software engineer, plus five years studying for a bachelor’s degree and a lifetime trying to become a better scientist.
But first in short, let me share some story.
I have been an immigrant four times, and being an immigrant is challenging regardless of the country; you always feel with the hope that a new place will fill all corners of those empty spaces that your soul has when you leave your motherland.
The truth is that nothing replaces that litter living room that you use to smile and play with your family, but necessity blinds or clears our consciousness and makes us think differently.
Being an immigrant transforms your soul so that your biggest mistakes and painful experiences never let you alone.
But I embraced every change, even the smaller ones, with hope and positivity.
The truth is that living in different cultures also brings much learning, luckily for me, being an immigrant, despite the pain, made me a better professional.
I found the love of my life, the mother of my daughters, I met a lot of great engineers and scientists that exponentially helped me grow my skills as a software engineer, giving me kindness and patience just a scent of their knowledge.
Until now, I have worked in more than nine companies; I failed to build one SaaS company (read the story here), learned to make sales in real life, and (don’t tell anybody) executed a ‘delete * from [DB]‘ T-SQL query without a ‘Where’ clause in a production database table that made a bank system went down for hours (and luckily I did not get fired).
Yes, I have many mistakes to reveal, but since your time is precious, I will leave you today with the ones I think will deliver the most value to your career.
1. Not optimizing my learning with systems.
Computer science is always in constant change, and changes always bring complexity, and complexity carries challenges.
As a result of those changes learning fast and unlearning even quicker will be one of your most significant or critical skills to get good at as a computer scientist.
You will save years if you learn how to learn effectively, so build a system (read more here) for that and avoid at all costs faulty learning methods.
2. Not memorizing computer science fundamentals earlier and often.
I had to learn many concepts while studying for my bachelor’s degree. Still, since I was using the wrong learning strategies, mostly all those concepts and definitions were forgotten after each exam.
Pay attention to the evolutions of your industry, select the relevant topics that challenge your problem-solving skills, and memorize the essential definitions if you want to go further than the average.
These specific mistakes should be avoided at all costs; knowing the fundamentals can bring a massive difference in the type of scientist you can become.
In general, computer science fundamentals are behind these main nine topics (I’m planning to send you a letter for each of them in the future):
- Programming
- Computer Architecture
- Algorithms and Data Structures
- Mathematics for Computer Science
- Operating Systems
- Computer Networking
- Databases
- Languages and Compilers
- Distributed Systems
3. Only caring about smaller components rather than the big picture.
Depending on your type of expertise or specialization, companies will let you focus on any of these areas below (see image below); as a junior software engineer, your primary focus often will be on smaller components or specific developments features, more seniors since they have more experience will also work on the product and architecture side.
But think about this, regardless of your type of seniority,
What will happen with your wisdom if you care about every piece of the puzzle from the early beginning?
Please know, of course, you can’t understand all components of the company at first instance, but still, you can try; as time passes anyways, you will get more leverage and hopefully significant rewards for your effort, but do not expect it, that’s not your objective.
Your goal should be putting in maximum effort every day since that is the only thing you can control, nothing else.
Learn about your industry, learn about the business, the competitors, the types of products, learn about how your company is structured, what makes their culture great (or not so great), learn about the CEO, and their other work experiences, learn about your team members, about the type of architecture and the why the product was built like it is.
By then, you will be able to contribute and understand more, and every job experience will always give you a vast number of insights that will make you a better scientist or engineer.
4. Listening too much from too many people.
The more you grow the more you understand that you need a mentor, not a few of them, just one great mentor.
Listening to multiple people is not optimal for decision-making, find one great mentor that is already where you want to go, be authentic with your questions, respect their time, help him/her for free, and one day let it go, but just when your result and outcomes are more remarkable, then go and find a new challenge and of course again the next great mentor.
5. Helping others less than I could.
Bugs are software engineers’ best friends; they teach you daily and believe me, they will always fly everywhere.
But think about this, the bugs you create yourself are just a few compared with other people’s team bugs, so try to help everyone you can, this will bring you much knowledge, as a reward also good friends.
6. Being silent when I must speak.
Be careful here, it is still hard for me to know when I should talk less or more, but never be silent, express your ideas and concerns to everyone with respect and professionalism, and understand that your words are powerful, but your often silence sometimes holds incredible power, knowing when to speak and when to remain silent is a powerful and overrated skill.
7. Poor level of actions.
Oh, there is so much to talk about this that I will write a different letter for only this item.
The only thing I can briefly advise you here, with no intention of offending or disrespecting you, is that you can do more today.
As I remarked, giving maximum effort every day is hard, but you must try.
8. Not a personal commitment to greatness.
If you are not committed to greatness, you will never be great; the principles of excellence are the same for everyone, an athlete, a mathematician, a teacher, or a scientist.
You can use principles to be great, but only some will work if you are committed to living a life through resistance, maximum effort, and fearlessness, expanding your comfort zone.
But that’s a personal decision to be made inside you.
9. Not specific coding routines.
In the book The Genius in All of Us, author David Shenk talks about the most significant but litter thing that makes Beethoven one of the greatest pianists, if not the greatest, specific and restricted practice routines.Â
Use this idea to your advantage and establish an interruptible coding routine you will never skip, not a single day.
10. Not using marketing and distribution channels.
It does not matter how great or bad you are at something; today’s economy has evolved thanks to men who make mistakes and can accept them publicly.
Get out of obscurity, teach, share, and impact more engineers or scientists with your experiences and personal insights.
The cost to be paid is lower than the opportunity that can arise with just this simple idea.