How to become a software engineering manager

How-to software engineering manager

Introduction

Taking responsibility for the well-being of another human being is a serious responsibility, and that is what software engineering managers are expected to do. The people whose careers you have to look after have other people they have to look after as well. The decisions you make as a people manager will have a potential ripple effect on others you don’t directly manage.

Traditionally, and to an extent professionally, that is not how we think about employees. Personal matters stay at home, right? Business is business. But the angle here is shining a spotlight on the cascading responsibilities, and how we often shift our focus onto what our leaders want instead of what our people need.

There is a balance, and your people’s happiness will reflect in their work. If you hire the right people, they will go the extra mile, make you look good, and this will overflow to their managers as well. This is not rocket science, but we often see managers managing up only!

You may be a new manager or a manager experiencing some difficulty and going through a season of introspection and change, and your past management style is no longer serving you well due to people or organizational changes.

Let’s dive into some important points to cover.

Shift the focus from you to others

Work has become a very personal experience. When you excel and stand out, you get rewarded, and that can become addictive and selfish because we typically have one employer and they are our enablers. The more money we are earning, the more we are gain in our personal lives, such as our children’s education, the house we live in, or the car we can drive.

What got you to management is because you exceled or because of your experience and tenure at the company. You may be a natural leader finally getting your chance, but often, we promote our high-performing individual contributors (I hate those words, but using them anyway) because we want to retain them. Unfortunately, these engineers are not always ready for management.

When there is lack of people-first mentally that should be a warning sign. Nevertheless, it is within everyone’s ability to manage people if you make the effort and humble yourself.

When you were an engineer cutting code, your focus was on you. Yes, you worked in a team, but you had your own stories and tasks to finish, so naturally, you thought for and about yourself.

The focus has now shifted from your productivity to the productivity of others. Here are some questions to illustrate the focus shift:

  • Are my engineers doing what they are supposed to do?
  • Are they set up to be able to complete their assignments?
  • Are they performing optimally, or are work conflicts or personal circumstances preventing them?
  • Are any of my engineers at risk of leaving due to the work environment or underpay?

From these examples you can clearly see that your role and responsibilities as a software engineering manager have become exponentially more complicated. Instead of you times the problems you have it is the number of people multiply by their blockers or problems! In the past, worrying only about yourself was easy, but now, you have exponentially more people (2x or 10x) to ensure are set up for success.

If the focus remains only on yourself as their manager, this is going to have a bad ending. What is sad is that this type of bad management style is prevalent and overlooked because you as the manager still have the technical expertise, so losing other team members won’t create an immediate gap and crisis, but it is just a missed opportunity for them and the organization and more importantly losing capable people.

The first couple of months as a software engineering manager are the hardest

Not to demotivate you further, but there is more bad news. Moving away from being an individual contributor to a manager is two different worlds. Let me explain.

Cutting code and committing, building pipelines, creating ETL processes, and architectural diagrams are all tangible outputs. You know that checking in that code after, hopefully, testing it, is a satisfying and productive feeling. It is immediate, and the more you do it, the more visible results you see, and the more dopamine you get.

As a software engineering manager, you may still dedicate a percentage of your time to contributing to code or architecture, but often, you move onto tasks like budget management, organizational setup, people management, strategic meetings, etc.

Let’s focus on new managers moving completely out of being an individual contributor. The first couple of months as a new genuine manager will be challenging, as you may feel a sense of total uselessness. If we recall the questions in the first section, these items don’t have immediate tangible results. These aren’t the types of problems that can you can solve in a day. It takes time to resolve these issues and to see results, often weeks and months.

Shifting engineers’ responsibilities takes time, and the results won’t be immediate. You are now effectively managing other people’s expectations and worries.

Your role as a software engineering manager will be hard and unpredictable. Humans are unpredictable. We know ourselves, but depending on the way the focus of your lens, it will be challenging to solve these problems, and over time, the reward will be people and process synergy. Those wins tend to stick around for a while.

Adopting a strategy of honesty can lead to more favorable outcomes for all parties involved

The key ingredient in being a manager is honesty! Simple words, but difficult to practice because of the many different people, company policies and unique situations you’ll encounter.

I personally used to avoid conflict. In itself, that is being dishonest. The situation at hand requires resolution. There is another angle: Avoiding conflict is also dishonest because you cannot handle the truth about your short comings. You aren’t true to yourself and the situation.

A situation with a report may reveal that the engineer is unhappy, not set up for success, and struggling. The metrics show this. It could be due to a failure as a manager. A lack of thoughtfulness on the best course of action for this engineer. That is hard to hear. I always feel disappointed when people are disappointed in me. It still remains, but I’ve learned how to deal with it and not let it deter me from resolving conflicts.

In cricket and baseball: You may drop the catch but you can still get a run out!

Honesty is the great equalizer! It is important to receive honest feedback from others. This helps to improve or do things differently to improve when a similar situation presents itself in the future. It is uncomfortable, but it relieves pressure after admittance. Leaving the situation unhandled will result in it getting worse over time. In my experience, dealing with it later is usually harder with much worse consequences. Deal with it immediately.

Giving feedback can be daunting. You are telling someone they are making a mistake or they messed up really badly. You know from working with that person for a while that they aren’t going to take it well. However, our perception often doesn’t reflect the truth. That person may needed a release from the old ways, or they needed the kick in the backside to get their career back on the right path. The truth always prevails, and for the short-term pain, there are usually long-term gains for you and, more importantly, the person who had to suffer the consequences.

Honesty releases tension over time. You cannot help if someone does not like you, but if you are honest, there is not much that engineer can hold against you. If they decide to leave, then it is potentially best for both parties. Honesty cleanses the situation for both. Sometimes, people aren’t compatible. Period!

Honesty creates trust! When you cultivate a culture of trust, they will respect you and will do almost anything for you.

I cannot share everything with my direct software development managers and engineers. I try to as much as I’m allowed because it is important to share. They trust me to keep them involved and informed. If people hear news from other sources and you, as their manager, I failed to inform them. It creates trust issues and a sense that either they aren’t important enough or that you are too busy to care about them.

Doing a lot of things and being busy is not an excuse. You don’t have time deficiency problems. you have prioritization issues. There is more than enough time in a day. No excuse!

What can I do to improve as a software engineering manager

The job is hard, as I mentioned previously. You need to take care of people’s well-being to get the best out of them. Focusing on yourself only as a manager and your career will cause problems and ultimately mutiny. You can bullshit your way out of it, which tends to happen but only lasts for a short while.

So, here are a couple of additional items to focus on to improve:

Be present. It is important for your direct report engineers to feel that you are available and attentive. In a previous post (How to improve one-on-one conversations as a dev manager), I provided guidelines on how to effectively interact with your engineers. This will build trust, and your engineers will give their best for you.

Let a to-do list be your assistant. This one still blows my mind that there are so many leaders in our industry not keeping track of items and conversations. A to-do list reduces cognitive overload. It is so simple to follow the list and to action items on it. Now, actioning items is a topic for another day. However, it is important how you break down these items, especially the complex ones. Use apps like Trello, Microsoft Planner, or any other task management tool.

Confirm with your company if there is a vetting process to vet for internal use. It just comes across as professional to follow up on items, even if others forget. It sets you apart. The main gain is that you GET SHIT DONE! More on this in a future post.

Micromanagement is not always bad. Think about it. Micromanagement infers being close to engineers where your presence is not required. You can do more damage to the situation by not having all the context. You also may have context, but you take a learning opportunity from a direct report. However, when there is a tough problem to solve, your presence may be appreciated. Another use case may be a new joiner feeling out of their comfort zone or overwhelmed. Checking in often and spending some direct time, even going over the work they have done, may just give them the welcome they need. After that, you can step away.

You are only as good as the feedback you receive. I’ve been in situations where I’m told I’m doing great and exceeding expectations, but it feels like you become stagnant. In an earlier post, a previous Director of a previous company told me I’m not a good coder, which was exactly what I needed to hear to become a good coder. The same applies to management. You need to listen to your boss, and hopefully, they are good, or you need to find a mentor. In addition, you need to take feedback from your reports! Yes, you are the boss, but they should have a say, and you should be open to it. If not, then you may have a problem that will make management very challenging for you.

Ultimately, it comes down to discipline and repetition. Having all the information you need and executing on it with good speed will become a super power!

Feedback is new information, like reading a new article and learning something.

Conclusion

In conclusion, becoming a software engineering manager is a transformative journey that requires a shift from individual achievement to team-centric leadership. The role demands more than technical expertise. It requires emotional intelligence, a commitment to honest communication, and an unwavering focus on the well-being and development of your team. Remember, your success as a manager is measured not by your personal output, but by the growth and satisfaction of the engineers you guide.

Embrace this role with a mindset of service and continuous learning, understanding that each decision you make impacts lives beyond your immediate scope. By prioritizing the needs of your team over individual accolades, you not only foster a positive work environment but also drive meaningful progress within your organization. To all aspiring and current managers, your role is crucial—approach it with humility, courage, and a deep sense of responsibility.

How to become a software engineering manager

A top tip for new Software Engineers

Every time you start a new job there is newfound energy that comes with the new territory. You feel rejuvenated and ready to learn. This is a powerful force and when used correctly can speed up learning in your new environment as a software engineer extremely fast. Typically, you enter a new working environment with less bias about what you prefer to work on. This bias slowly accumulates over time and will eventually result in a preference.

I can write this article from a couple of different points of view. I am focusing purely on maximizing domain knowledge as a new Software Engineer and learning many different skills. This is not for everyone but I realize that most engineers struggle to understand their domain because of a lack of communication channels and or engagement or maybe just the sheer volume of information that overwhelms engineers.

Success depends on what you are willing to put in!

The noise at the office.

Before the world had to deal with Covid-19, I spent most of my time in an open office environment with loads of noise around. This noise was mainly people discussing work, yes, and the occasional social discussion, well let’s be honest a whole lot more of that. We aren’t part of these work desk discussions thus why would it be relevant to us?

A top tip solution is to cancel this out by putting on our earphones with some of our favorite music or podcasts to block it out and focus on work. Nothing wrong with that. Software engineers need solid focus time.

However, whilst it could be perceived as noise I would argue differently in that there are copious amounts of gold nuggets in the audio moving around the office. In previous jobs I had, I would remove my earphones and listen to the office chats and write down some of the terms or jargon I heard for exploring later. If you struggle to work and listen at the same time then take 15 minutes when the chatter is high or specific people are conversing and write down what you hear.

This presents a good opportunity to approach these colleagues and ask what this means in the context of the business. This learning did not fall on your lap accidentally you were looking for it and probably learned faster than you would have. Active learning! And, bonus! you showed interest and socialized with a colleague.

Doing this continuously over time will increase your knowledge and the positive by-product is to give you the ability to become part of the conversation if you decide to.

I’m working from home now!

“Ok, but with Covid-19 I started working from home. What do I do now?”.

Chat applications are the new office environment and most business-related chats at the office will move into some chat or personal channel on Teams, Zoom, Slack, or Google Meet.

There is an obscene amount of chatter in these channels and the noise (information) can be so much more than in an office. These are much easier to ignore no earphones are required. If you are new to the domain all the chatter in the chat application will be the gold nuggets you need. It is tough to follow all the channels and notifications have become the poison to our attention span.

Schedule 15 minutes during morning, midday, and evening respectively to work through these messages and write down terms you aren’t familiar with. Approach the person in a personal chat and ASK or ask in the next general meeting in a video call direct. Typically asking a question in a chat on a large channel can result in “bystander effect” where everyone else thinks someone else will answer potentially ending up with no response. This is a real phenomenon. Don’t take it personal

Remember, you will eventually learn the domain but it is in YOUR control how fast you want to learn. Learning one domain gives you the experience to more easily navigate the next.

Conclusion

Fostering this kind of awareness early on in your career will set you up for success. When you are new to a domain you are often given overwhelming knowledge transfers during hours of meetings and/or documentation that don’t provide a good starting point but rather context skipping how to get to the document is explaining.

Using this strategy allows you to put the pieces of the puzzle together until you have the full context and will greatly assist in adding context to those KTs and documentation.

Don’t wait for people to tell you what to do or feed you the info. Be proactive. Awareness, observation and just being a good listener promote active learning. This sets you apart and shows initiative which are skills managers want to see!

A top tip for new Software Engineers

How to empower teams to better support software systems?

Creating new systems from scratch is so much fun. I love it when you can dream up a project. I have a candy shop full of technologies I can choose from. It is fun creating all those shapes and connecting the lines when laying out the architecture of the system. The highlight for me is when the development starts. Not so much fun but necessary is setting up the CI/CD pipelines, and then that magical moment when you promote the production application! I have the best job in the world!

Well, not for all engineers. What about the engineers or team(s) that have to maintain the system? these engineers don’t have the in-depth understanding of the system I had because I was there from day 1. During any previous planning phases, did we think of them? Probably not.

I want to put the focus back on two often neglected functions to ensure that support and maintainability are taken into account during the initial stages and not reactive to it. This will make supporting any system a more pleasant and productive experience for the next engineer or team.

Handover to another team for support

Once a new system moves into the production environment that is when the real “fun” starts. It is seldom the case that Team A  develops the system or the feature and maintains it until its end-of-life. Let’s for a moment assume that is the case at some point people leave, and the team with the same name now looks different but the system has not changed apart from new enhancements or more features.

Team A, who is the original developer of the system hands it over to Team B, the team supporting the new feature. Team A with a specific skill set and a high-performing fast execution team moves onto a new project. Energy flows where the attention goes. Team A neglected to create sufficient documentation on potential troubles the system experienced during the development and initial production phases.

When Team B takes over it more often than not requires a handover meeting with Team A. Team A now needs to spend energy to get all the documentation up to date and add additional documentation as gaps were identified by Team B’s efforts. The timing sucks because Team A has to context switch and create more documentation in a hurry because they have other priorities to deal with and the focus has already shifted. The quality of the documentation as well as the communication during the handover suffers. 

Look at the following scenarios

Team ACreates complete documentation
Team B Read all the documentation. Is self-serving and productive
Table A

Team A Creates incomplete documentation
Team BReads incomplete documentation. Identifies the gaps
Team AMeets with Team B
Team BMeets with Team A
Team AUpdates outstanding documentation
Table B

I’ll admit. Table A looks like a pipe dream. Nonetheless, let’s marvel at the beauty of it. Extremely efficient!

During the development phase, many issues are identified and fixed which provides a good opportunity to document these problems for future reference. Not all problems have to be documented because of code fixes but there will be some processes and pipelines problems that will re-occur again.

Production is the best place to identify the one-percenters. Systems behave differently in different environments. The production database is much larger than in other non-prod environments. These lower environments have obfuscated data and much less of it. During the initial production phase, there will be enough new problems to document because of the sheer volume and combinations of data to be served.

It was impossible to account for all these scenarios and exceptions during the development and testing phases. ETL Processes fail and they will. Pipelines break during a deployment to production and there will be some other data issues. It is a perfect opportunity for Team A to document all these issues.

In addition to troubleshooting documentation, there must be installation and configuration guides as well. Think of EVERYTHING that will make life easy for newcomers to the system.

Documentation should be written like you are explaining to a non-technical person because often we try and help another person by assuming they have a certain predefined context of the system. That is where we often create problems for ourselves and waste our own time. People will come back and come back again because we neglected to explain the entire context before providing the solution.

Administering and supporting the system

I fail to recall any time in my career in software during the design and development phase when the architects and engineers envision how the system might function, and what the potential problems or one-percenter scenarios will be. It may have been part of the process initially but eventually falls behind due to time and money pressures. It is a habit to only think of the happy path.

We use the best coding techniques and practices. We use all the patterns that make the system robust. We have done everything to make the system perfect.

Then we run into problems…

Most large systems are dependent on a wide variety of data from different sources. In my experience most often data is fed using large ETL batch processes or it can be a high-volume transactional system or both! It becomes complicated to apply any large-scale fixes during failures, data removal, or large-scale data integrity problems. Flexibility is gold!

These will be the standard questions to ask to ascertain from a technical point of view if the system can be remedied at its simplest.

  • Is there a job/process that can be run to fix any data issues which might have been processed incorrectly or incorrectly inserted during input?
  • Can these processes be run during business hours?
  • Does everyone on the team have sufficient permissions or access to the servers?
  • Do we have the ability to update records in batches?

If it is yes to all the above it is still not the ideal situation. Some engineers lack confidence and if these services are restarted and fail or done at the wrong time it can affect clients and SLAs. Not everyone has elevated permission and access to database servers for example. We often lack the flexibility and by that I mean tooling to remedy any data processing problems at a large scale. Let’s take a look at the potential two areas which can make optimize support in this area.

Automation

In the outline of work, we have the luxury of the skill to automate critical business processes and/or mundane tasks we have to execute daily. We are good at automating releases and testing. Those are fundamentals of our systems and are necessary! We have to!

I don’t think we are any good at automation for self-healing or self-correction. Netflix’s infrastructure is too large for humans to monitor and out of necessity they implemented intelligent systems to monitor and apply corrections. Does this kind of intelligence always have to be born out of necessity? Why can’t it be baked into just the good practices philosophy? Are we afraid of losing control and losing our jobs? Or are we lazy in the mind?

The fact is that this type of automation will set you apart from the rest. Remember; Energy flows where the attention goes. Having these processes in place opens engineers up to focus on innovation and revenue opportunities or to pay back the debt (tech). You don’t have to be a large-scale company to achieve this.

Let 3rd party tools do the night shift instead of you looking at your email or teams/slack message every 2 hours. If these are properly configured they can do a lot more than you and best of all it never gets tired! We have lambdas, Azure function, python scripts, PowerShell, Apache Nifi, or any other robust task automation tool. There are multiple options and no excuses.

Administration interfaces

What if we need to invalidate client records and remove them from the system on request? What if we need to spot-fix a couple of records with incorrect information and it is too expensive to re-run the processes or to fix them at the source? Typically, a team would run a script directly injected into the database. Is there a review process? Is the script optimized enough if it needs to delete thousands of records from the database?

Will this script content for resources on the database server during business hours or after hours? Is this process secure? With some planning upfront and thinking about these scenarios, engineering teams can create APIs and administration UI systems to capture these one-percenters. APIs are effective to use if UIs aren’t available and with proper authorization and authentication, non-technical people can use these too.

These problems are those one-percenters but they tend to take so much time and effort to mitigate and remedy. It would be prudent to develop these mitigation steps during the development phase to administer these difficult requests. Every microservice or system must have some administration component for the data it produces.

These administration functions both UI or API endpoints that can be used by non-engineers and typically will be safe to use removing expensive time and effort from engineers to execute these processes or scripts. It creates flexibility and confidence in the system.

Conclusion

It is important to include this documentation, administration, and automation during the design and development stages. Create awareness and be diligent about it from the start. The price you pay upfront will be relatively small to the huge price you will pay later.

It is not only about making life easier for you or your team. Be different and make it easier for everyone supporting the system down the line. The lifespan of a good system can easily last 5-10 years. There will be many people and engineers responsible for it over that period.

I would love to hear your thoughts…

How to empower teams to better support software systems?