Newsletter · · 9 min read

The Essential Skills of a Software Engineer

The Essential Skills of a Software Engineer

Hi everyone, Brilian here. We all know what it's like to juggle tasks, learn new technologies constantly, and wish there were more hours in the day. But what truly separates good engineers from exceptional ones? As a Principal Engineer at Blibli.com with 6 years in the industry, I've seen the power of a few key skills.

In this article, I'll share insights on what I believe are the essential areas for every software engineer to focus on. While there's always room to grow, these skills consistently make the biggest difference in unlocking your full potential:

  1. Technical Skills: The cornerstone of everything we build, technical skills empower you to tackle tough problems and confidently learn new technologies. A solid foundation in core concepts, data structures, and algorithms will take you far, no matter which specific languages or frameworks are trendy at the moment.
  2. Communication: Even the most brilliant code has limited impact if you can't articulate its value. Learn to communicate clearly with both technical and non-technical stakeholders. Practice explaining your work, get comfortable in team discussions, and don't shy away from presentations.
  3. Ownership: Be the kind of engineer who doesn't just build things, but actively improves them. Proactively seek out recurring issues and take charge of fixing them. This mindset makes you invaluable to any team and sets you on a path towards greater responsibility.
  4. Be Product-Minded: Understand the "why" behind what you're building – how does your work benefit users and support the company's goals? This broader perspective helps you prioritize tasks, anticipate problems, and suggest features that truly make a difference.

Technical Skills: The Foundation of Software Engineering

Technical skills are the heart of software engineering. They let you solve tough problems and adapt to new technologies. You don't have to be the expert in everything, but focus on understanding the core ideas. Be flexible enough to learn what you need, and carefully choose the best tool for each project. Tackling technical challenges will make you a stronger engineer and open new doors in your career.

There are a lot of discuss when it comes to technical skills. These tips are what I think will propel your growth and open doors to exciting new opportunities.

Read A lot: Reading is my number one suggestion for everyone that want to improve their technical skills. When reading, you don't just absorb the author's technical insights, you gain a window into their problem-solving process. Books, online courses, and quality newsletters each have a role to play. Make reading your habit, read every other day so you can improve your skill daily. Additionally, you could also write something from what you're reading too. - Personally, I find that writing about what I'm learning helps me organize my thoughts and build connections between concepts. This process forces me to truly grasp a topic in order to explain it clearly, deepening my understanding.

Avoid Over-engineering: Making a manual thing automated is what software engineering does. But, it's easy to fall into the trap of building features no one needs. This over-engineering slows you down and makes the system harder to work with. Complex systems can be a real obstacle, especially for new engineers joining the team. Instead, focus on solutions that tackle the core problem while keeping the code maintainable.

Don't be afraid of legacy codes: It's understandable why legacy code doesn't have the best reputation. It can be messy, outdated, and tough to work with. But every experienced engineer has worked with it at some point. Instead of avoiding it, look at legacy code as a chance to learn. You'll see how past decisions shaped the product you work on today. You'll get better at solving problems within an existing system. This skill is valuable. It will make you a more versatile engineer and also stop you from repeating old mistakes.

Be a Generalist: Being a generalist or a specialist is a constant debate in tech. From my experience, having a broad skillset unlocks exciting opportunities that specialists often miss out on. This doesn't mean being shallow – you still need deep expertise in your core areas. But being able to adapt, pick up new technologies, and see the big picture makes you invaluable. With this broader perspective, you'll assess projects more objectively and open doors to higher-level, strategic work.

What you can do to be a generalist is learn and try out different popular technologies. My suggestion is to try to become a full-stack engineer and have a side project. Side projects are a good way to improve your skills and get exposed to different technologies from start to finish. You'll understand how a product is planned, made, deployed, and kept. This is a skill that will pay off in your career.

Be critical and have a high standard: Bugs are a costly problem in software, and the longer they go unnoticed, the more costly it will get to fix. Be critical, actively try to break your features by thinking through every possible edge case. How can you gracefully handle unexpected input or errors? Don't stop there, write an automated tests like unit test or integration test. Not only it will validate your feature working as expected, but it also creates a safety net for future changes by other engineers.

Communication: It's More Than Just Technical Skills

Technical skills alone aren't enough to stand out at the company level. Being able to communicate your ideas is just as crucial. Imagine spending hours crafting an amazing solution, only to have its impact limited because you couldn't convey its value. To improve communication as a software engineer, focus on these key areas: get on the same page with stakeholders, building partnership, presenting your work with confidence, and creating clear, helpful documentation. Let's dive into each of these areas.

Get on the Same Page: A common problem in tech development is when the end product doesn't match the stakeholder's expectations. This mistake can be costly, requiring either a rewrite of your feature or leaving you with a product that doesn't fully contribute to your team's goals. Proactively discuss requirements with stakeholders to prevent mismatched expectations. Don't be afraid to ask clarifying questions and seek input early on in the process. Continually verify your work aligns with the agreed-upon goals.

Build Partnerships: Good communication skills will help you unblock your project when it depends on others. Your top priority work isn't always the top priority for the other. State clearly what you need, why you need it, and your expected timeline. This builds trust and makes others more willing to help you both now and in the future.

Don't be afraid to present your work: Presentations are a powerful tool to share your work and its value. Start by presenting to a smaller audience to build your confidence. Always define your goal first – what do you want to achieve with this presentation? Structure your content to support that goal. A common mistake when presenting is overloading your audience with information. Instead, focus on what matters most to them. You can start by sharing technology that you know well to your team, or maybe some business flow that not many knows!

Write a clear documentation: An underrated communication skill is documentation. Well-written documentations let you convey ideas without repeating yourself again and again. Explain your technical decisions, system architecture, and how to interact with your work. Documentation also work as roadmap will help you stay on track and ensure everyone involved has the same understanding, now and in the future. You can start with a clear documentation in your code, or maybe some production issue that often happens.

Ownership: Own Your Work

In software engineering, writing code is only a small piece of the puzzle. To make an impact in your organization, you need to dive deeper into your system and product. Seek out improvements. Take charge of solutions. Understand how your work fits into the big picture.

Engineers with a strong sense of ownership become invaluable to their teams. They expect problems, suggest new ideas, and always do good work that fits the vision. This commitment doesn't just make them better. It earns respect, opens doors for leadership, and fuels their career growth. The following are my tips on how to improve your ownership:

Understand and build context: True ownership means knowing more than your assigned tasks. Grasp the 'why' behind every feature – how it benefits the user and supports the company's goals. Delve into how your system works, its architecture, and where things might go wrong. This knowledge empowers you to make better decisions. It helps you create stronger code and catch issues early.

Be Proactive: The heart of ownership lies in taking action. Improve the same problems that happens again and again. Also, look for wasteful processes or anything to improve. This applies even if it's beyond your current duties. If you see something, don't just wait! Research potential solutions, offer to implement them, and drive positive change. Be the one who volunteers for on-call shifts and jumps in to help with those production fires.

Be Responsible: Responsibility is key. Deliver on your promises and meet deadlines (or give early warning if you can't). Own your mistakes. Acknowledge them fast. Focus on fixing the problem. Learn how to prevent it in the future.

Be a Product-Minded Engineer: Understand User Needs, Build Better Products

Your main job as a software engineer is to build the technology. But, it's also important to look from the product owner's perspective. A product-minded engineer focuses on the whole product. They care about the problems it solves for users and how their technical choices align with the company's goals.

A product-minded engineer is a key part of any successful team. They connect the technical work with the product's real-world impact. They understand what users need and what the business aims to achieve. This lets them find problems early. They can suggest smart solutions. They can ensure the code supports the product's long-term success. This approach leads to better decisions. It fuels innovation and creates a great product. These are my tips on how to become a product-minded engineers:

Focus on the users: Ask regularly, how will the task you working on affect the customer? Are you solving their real pain points? If you see a way to improve something, tell the product manager. Then, decide together which approach is better.

Learn the business: How does your work contribute to the product success? Understanding these business goals empowers you. It lets you make informed technical choices. They directly help the product's bottom line. Knowing the 'why' helps you prioritize tasks. It also helps you evaluate trade-offs. It lets you contribute to the overall success of the product and company.

Communicate Trade-offs: Being product-minded means understanding that the best solutions balance user needs, maintainability, and long-term product vision. Your technical expertise is crucial for making these informed decisions. Sometimes, a slightly less 'perfect' solution that ships faster and delivers value is the right call. Other times, investing in a stronger foundation is worth a slower initial release (think security, for example).

If you want to know more, there is an article by Gergely Orosz about product-minded engineer that I really recommend.

Conclusion

While technical excellence, communication, ownership, and a product mindset are vital areas to focus on, the journey of becoming a better engineer never truly ends. There are countless other skills to hone – debugging, security awareness, mentoring others, just to name a few. The key is to stay curious, always seek new challenges, and embrace the fact that learning is a lifelong process.

Read next