The letter A styled as Alchemists logo. lchemists
Published August 1, 2021 Updated March 26, 2023

Tom DeMarco and Tim Lister from Peopleware:

The manager’s function is not to make people work, but to make it possible for people to work.

The relationship with one’s manager is the lens through which the whole work experience is viewed.

Susan Scott from Fierce Converstations:

As a leader, you have one chance to get [feedback] right. If you push back or get defensive, chances are you may never get feedback again. Your job is to remain curious and grateful for whatever you get in order to pave the way for more meaningful feedback once trust has been built.

I read and think about leadership a lot, mostly because I’ve been on the receiving end of some truly terrible experiences and I’d like to share a better path forward. Like it or not, you too are a leader whether it be explicitly or implicitly acknowledged. If you are the author of some small portion of a code base, a mentor, the architect of complex software systems, or officially a manager by title, take seriously your role as a source of inspiration for others to follow. After all, good leadership requires conscious effort, which is why good leaders are rare.

Being a leader is complex because the colleagues you work with are complex and constantly evolving. Additionally, so is the business domain and software architecture in which you live and work. One way to tame the constantly shifting sands, so to speak, is to focus on three guiding principals:

  1. Lead by example: Your actions will always speak louder than your words.

  2. Establish good patterns: The patterns you establish will be picked up and replicated by younger and less experienced colleagues. If a lot of thought and effort isn’t spent up front, these well intentioned patterns can quickly become antipatterns when wielded in the wrong hands.

  3. Mentor rather than dictate: Your goal should always be to work yourself out of a job by empowering others to lead in your stead so you can achieve bigger and better things. Not only for your own career growth but for the growth of your team too.

With the above in mind and as the quotes at the top of this article emphasize, you only have one chance to get leadership right, so let’s discuss how to make that possible!


I’ve built up the following guidelines over the course of many years, decades even, based on what I’ve experienced, others’ experiences, and distillations of what I’ve read. Hopefully, these guidelines will serve you well.

  • Be human: Strive to make a connection with each and every one of your teammates so you can understand who they are, what drives them, and how best to help them grow.

  • Be honest:

    • Earn and maintain the respect and trust of your team.

    • Be quick to constructively criticize. The longer you wait, the worse the situation will become.

    • Give praise but only when it’s sincere and meaningful. Inauthentic praise will do more damage than never giving praise in the first place while losing credibility and respect.

    • Encourage others to tell the truth by recognizing those who do. This can be accomplished by sharing critical feedback, asking tough questions, etc. Do this publicly either via group chat, video conference, or any public setting by recognizing the person who originally shared the feedback (even if you might not agree) in a sincere and heartfelt manner. This indicates to others they can share, safely, too.

  • Be transparent: Share information often, clearly, and concisely by avoiding meetings and leveraging asynchronous communication.

  • Be compassionate: Strive to understand what motivates people, including their:

    • Past: Listen to where they came from, what makes them tick, and how they got to where they are now.

    • Present: Listen to what they think of the current situation, how they feel about it, and how they would change it.

    • Future: Listen to what drives them, where they are excited about going, and how you can help in these endeavors.

  • Be a listener:

    • Maintain consistently scheduled 1:1 meetings and never be late.

    • Encourage thoughtful debate:

      • Assign others the task of disagreeing with you.

      • Allow the less experienced the chance to speak first.

      • Have those with the strongest opinions speak last.

      • Ask others what they think before adding your own thoughts.

      • Ask everyone to explain their reasoning rather than state opinions.

      • Ask for advice.

      • Admit what you are unsure or struggling with.

    • Encourage an open channel of communication and honest feedback.

      • Allow sensitive feedback to be submitted anonymously.

      • Find a private space if information is sensitive and needs direct face-to-face communication. Otherwise go for a walk, grab a drink at a local tea shop, or get out of the office altogether.

    • Be aware that your best people may take days or weeks to contribute code — and not because they are slow or lazy. Often these engineers are researching solutions and unraveling unknown territory in order to best determine the right course of action for architecting well-designed/well-tested solutions. You want people these people on your team.

  • Be a mentor, always:

    • Identify weaknesses and focus on turning them into strengths while also building upon existing strengths.

  • Be a learner, always:

    • Stay current with the latest industry research by incorporating these learnings into your own workflow.

    • Keep returning to the craft to not lose your edge or understanding of what it’s like to be an engineer.

    • Remember that you learn more from failures than successes so make them part of your culture — within reason — so you can continue to grow.

    • Provide incentives for those who learn a new patterns, styles, languages, and frameworks.

    • Make it acceptable to say you don’t know something — this includes the most senior/tenured — to show there is always room for growth. This will help prevent grandstanding and cultural rot from Expert Beginners.

  • Be decisive but not a dictator:

    • Base decisions on productivity, not politics.

    • Resolve disputes with objective (i.e. facts and data) instead of subjective measures (i.e. seniority or democratic vote).

    • Avoid mandating how work will be performed/completed.

    • Let the team come to their own conclusions by facilitating, listening, and clarifying all decisions.

    • Negotiate diversity of opinion and resistance into resolved actions.

    • Delegate decisions to people that know the content better than you. They are the experts and reason they where hired. Your job is to ensure clear goals are set, any/all roadblocks are removed, and external noise is dampened so the team can stay focused.

  • Be a motivator:

    • Cheer on every teammate by taking action, when necessary, to engage people in the mission and vision of the team/company.

    • Empower teammates with a sense of purpose, giving them the autonomy to creatively solve problems, and the ability to gain/achieve excellence.

    • Protect teammates from daily distractions and interruptions.

    • When small requests are asked of you such as better equipment, flexible schedules, etc. do it. Unless the requests are ceaseless or the request would impact budget in a significant manner, do it. Don’t underestimate the morale boost this provides.

    • Craft engineers, rather than bards (a.k.a. a generalist of all trades but master of none). Abandon the notion that team members are replaceable cogs that need to have shared knowledge across all code bases. Instead, allow for code ownership of specific code bases. Provide the ability for each team member to slowly and carefully build knowledge and expertise in the various pillars of your architecture. They can eventually move on to other pillars, but let them become experts first.

  • Be courageous:

    • Fight for ideas which are not popular or even unpleasing to your superiors.

    • Have the moral courage to stand up for what you believe in and what is right.

  • Be accountable: Take responsibility for tasks assigned to the team and hold teammates to the same standard for their work accordingly.

  • Be focused on quality:

    • Encourage tackling every feature, bug, issue, etc. as a chance to pay down technical debt, refactor, and carve complex code into smaller (easier to read) pieces of functionality.

    • Encourage diligence in deleting old/unused code/features.

    • Automate everything. Do this proactively so the team is encouraged to value their colleague’s time, customer’s time, and future selves.

    • Making continual improvements a core team value encourages excellence, autonomy, and a strong sense of purpose, thereby making the team happier in the long run and able to achieve higher results. It should not be underestimated how important of a morale boost that attention to quality is.

  • Be on the lookout for natural leaders:

    • These are the people that other team members constantly seek out for advice/help.

    • It’s important that these individuals be publicly recognized with appropriate title when promoted.

  • Be cautious of false high performers:

    • The occurrence of these types of individuals is extremely rare.

    • Potential pitfalls of high output:

      • Not spending the necessary time to architect and design software using good design patterns.

      • Failure to craft code that is self-documenting, easy to read, and easy to maintain.

      • Failure to avoid code smells.

      • Failure to adequately test.

🎗 Remember: Excellent leadership doesn’t scale. Limit your time and attention to a team of five people or less while continuously mentoring your staff into becoming leaders themselves. Have faith and confidence in your team.


The following is a set of questions (i.e. a self-check) for maintaining a course of leadership that is humble, soulfully reflective, inclusive, and growth oriented. As a leader these should be part of your personal and weekly scheduled review to keep a pulse on how you are doing.

  • Am I on a current course of action that is moral and ethical?

  • Am I including everyone and do they push back when I’m wrong?

  • Am I hiding important business information from the team even if painful to tell?

  • Am I being transparent and can the team perform that same transparency in return?

  • Am I being curious, asking uncomfortable questions, and/or comfortable being wrong?

  • Is my team afraid to tell me things truthfully and without fear (especially if I won’t like it)?

  • Am I communicating with the same people over and over?

  • Am I feeling insecure?

  • Can my team do the jobs they are hired to do, and are those the jobs that need to be done?

  • Am I scratching an itch and not delegating to others properly?

  • Am I being judgmental and not trusting my team?

  • Am I taking risks that won’t lead to positive and fruitful outcomes?

  • Am I being manipulative?

  • Am I speaking for people or letting them speak for themselves?

Growth Tactics

While most of the earlier sections have been primarily focused on being a great leader in general, here are some lessons learned and excellent tactics for growing your team from My Management Lessons from Three Failed Startups, Google, Apple, Dropbox, and Twitter:

  • Give excellent ratings to everyone who is performing exceptionally: Even at some of the best companies, people who have valuable skills but who aren’t likely to "take over the world," will often be rated as meeting expectations because managers reserve high ratings for people they’re going to promote. This creates an unhealthy promotion obsessed culture.

  • Put the gradual growth achievers in positions where they can train others: Capitalize on their dependency, their thoroughness, and their dedication to the company. They will be your best teachers, and it’s a way to put them on stage even when they shy away from the spotlight. "Don’t promote them," Scott advises. "They don’t want to be promoted. If you make them a manager, you’ll destroy an asset."

  • Don’t ignore the middle: Very few people are truly mediocre. "If someone has been somewhere more than two years and has just met expectations the whole time, it’s time to ask yourself the hard question: If they weren’t there could you hire somebody more likely to excel?

  • Evaluate skilled underperformers: If somebody is not doing well in their role but is talented, it’s time to look at yourself in the mirror: Have you put this person in the wrong role? Is your management style just a bad fit for the person? Is this person experiencing a temporary personal problem?

  • Make the tough calls: If someone truly is bad at their job and they are unlikely ever to improve — that’s key — you have to fire them. "Don’t put it off. All that’s going to do is piss off your top performers and burn them out," Scott says. "It may seem harsh, but it’s also harsh to let your top performers carry the burden for underperformers.


In case the above wasn’t enough of a roadmap, I’d definitely encourage reading the following to learn more: