Migrating Clouds Quickly

In August 2020, ShipperBee migrated the bulk of their business from Google Cloud Platform (GCP) to Microsoft Azure. It took us under 3 months start-to-finish, with about 4 days of panic. We managed to finish the year with a 99.5% uptime on our core services (not amazing, but really good!).

I think this was well-executed, especially for a business with a few hundred daily clients, several hundred delivery drivers, and a team of about 70 people using and operating in the platform 6 days per week.

ShipperBee’s landscape included: 2 x REST API services, 4 x web portals, an IoT/hardware support stack, Apple + Android notifications system, PostGres databases, Redis caches, and a Shopify app already running in Azure.

Here is what we did, and what I learned.

Hire + Trust the Experts

Our dev team had the will, but not quite the internal experience with Azure, to execute on a migration like this. We determined that hired-guns on a short engagement would be cheaper than hiring a full-time Azure infrastructure expert (or two) … and it definitely was.

Via our Microsoft CSP Arrow, we hired their subsidiary company, eInfoChips from India, to help with the lift. It went OK! eIC were knowledgeable about what Microsoft has to offer in Azure, about proven configurations, and which products/settings to avoid.

The most controversial example of following expert advice was using VM Scale Sets rather than Docker containers for core APIs. On the advice of their system architects, we avoided the Docker ecosystem in Microsoft since it wasn’t as well tooled for scaling, repair, price reservations, etc.

Do DevOps Yourself

I wish we had avoided leveraging our experts in setting up our DevOps / build / CI / CD pipelines. Ultimately that should be owned and managed by the people closest to the product code.

Nuances like naming convention and owners for service accounts matter in future upkeep. A contractor won’t be as concerned with those details as your team might be.

We migrated our deployment process to Azure Pipelines, rather than staying with existing Bitbucket pipelines that had been hardened over the years. There was no real need to move our deployment pipeline with our Cloud provider; it ended up being extra scope that ultimately caused a bunch of confusion and problems.

Skip the Great Inventory

Whenever you decide to move Clouds, inevitably someone will suggest you do a complete inventory of your software system, and how it interacts with every other piece (including your IT and DevOps stack).

I believed we had a thorough inventory of every GCP component that we used, and moving it would involve checking things off a list. Unless you’ve turned off the Console/Portal and everything you’ve ever put in the cloud was done explicitly via Terraform, you’ll learn more than you’ve ever wanted about vnet’s, service accounts, storage keys, and deleted users. And you’ll miss things.

Do enough of an inventory to understand the big pieces of the lift, but each instance of each service will have to be migrated independently, with care for all the small stuff around it (ex. resource groups, networking, IAM)

Aggressive Timelines are Key

Our COO decided that we had to be done the migration by September 25th for some business reason. That gave us under 3 months to complete the project. Frankly, without that arbitrary target, we’d still be “multi-cloud” and struggling to get pieces over the line many quarters later.

Having an aggressive target date helped us identify two critical “all hands on deck” weekends, which became our key milestones. One milestone involved a working Demo environment. Two weekends after that, we’d move the Production environment.

Those weekends were predictably terrible; 18 hour days, non-stop War Rooms and unexpected emergencies. Since we had the next stage scheduled for the following weekend and business resuming Monday, we just kept “failing forward” instead of responsibly reverting.

As long as things were 90% working by start of business on Monday, we explained the problems away with the COO and resolved the remaining 10% quietly during the week.

Reset your IAM and Subscriptions

My favourite part of the transition to Azure was updating our access control lists and permissions (we went to a group-based permission model after years of adding trusted dev’s as Editors or Owners to pieces), and taking advantage of the Subscription level segregation in Azure.

Subscriptions are one level higher than Projects in GCP. I created Subscriptions for Development, Production, and Integrations .. which made cost analysis for those budget items much easier. It was easy to lock down Production access since it didn’t impact the design of the Development and Integrations resources.

Hope that helps someone! I’m now a reluctant fan of Microsoft Azure. More than anything, moving clouds convinced me of the importance of good Infrastructure and DevOps talent in today’s modern software development setup.


Developers as TeamLeads

A common career path for software developers is into a “team lead” role.  On the surface it’s a very attractive role for the organization: a transition for dev’s interested in management, retaining some of that key senior-dev contribution, and avoiding a hire for a more traditional Manager role.

But its pitfalls are serious: TL’s generally struggle balancing individual contributor commitments vs. management responsibilities, and the perceived importance of each.

From personal experience, and from managing Team Leads, some tips!

Guard Your Time

Being a Team Lead requires you to be really aware of how you spend your time.  For example, time spent on lofty, heroic senior achievements can be less important than more predictable output, especially if others depend on you for their next steps.

Ask yourself these questions:

  • How much time can I set aside for individual work.  (2-4 hours per day is normal).
  • How much time can I dedicate to organizing or unblocking work, alignment, reporting, client calls, etc. (4-6 hrs/day)
  • Do I have direct reports? How much time will I dedicate to 1:1’s, mentorship, onboarding, etc. (1-2 hrs/week/person)

This split will impact team activities like pair/mob programming, whiteboarding sessions, etc. because you may not have long stretches of dedicated time available anymore.

The simplest way to visualize this challenge is to set up your calendar.

  • Block off dedicated slots for certain types of work (then guard them with your life).
  • Pro-actively book time with your team for work that you need to do together.
  • Identify things you have to do well, give yourself time to prepare (weekly demo’s to the CEO, client meetings, etc.)

.. knowing that it’ll change week-to-week, but have these rough proportions.

Most importantly, run this setup by your manager. Maybe they have a different vision about how to spend your time?

Focus on More Constructive Efforts

The “individual contributor” time Team Leads have needs to be used very constructively.

There’s a few ways to play this … some thoughts:

Taking high value, undesirable work (difficult-to-reproduce bugs, client escalations, etc.).  Those issues keep you connected with details, and identifies difficult things to mentor the team on.

Architecture and high-level software design for the team.  Something I found works well is scaffolding new capabilities, and being involved in that first week .. but letting the team fill in the blanks and iterate.

Technical documentation becomes more important as you’re more exposed to stakeholders, other teams, etc. Docs can influence more of the organization than your dev work does.

Code reviews can get overwhelming for any lead.  Good practice is to defer to the rest of the dev team, and focus your review attention on very important or risky deliverables.

Understand Perceptions of Your Contributions

Regardless of other duties, Team Leads are often perceived as “developers first”.  That can be positive or negative, depending on how you really want to contribute.

Navigating this perception of the role can be really challenging.

Personal story: I was leading a team of four on a new product.  The plan was ambitious and unlikely to succeed, so we had designed a better solution that would move the timeline, but more likely to succeed.

I went to my executive asking that we re-evaluate the promised timeline so we can deliver this better thing.  They started asking me about some current implementation detail that I wasn’t aware of. Then mentioned that I should know those details, and ignored questions about the plan.  It was frustrating; I felt under-appreciated.  Later I realised the mismatch with what the company expected from a Lead role, vs. what I was focusing my energy on day-to-day.

Building resiliency for those times, and being flexible enough to contribute on the many sides of the role, is tough .. but good for professional growth.

Hopefully you found this helpful,  and good luck with your Team Lead future.


Project Accountability using a matrix

Once projects get too large for a small team to run, people need ways to identify who is involved (and how) beyond the basic “on the team”.

Borrowed from project management best practice, an accountability matrix is a simple system used to communicate responsibilities on a project. 

Two things all the accountability matrices have in common:

  • have sweet memorable acronyms
  • have a point person who wrangles people into that matrix.


RACI is probably the most common accountability system. In RACI, the point person is known as the “Accountable.”  The acronym identifies the roles:

  • Accountable: single person who answers for the execution of the project.
  • Responsible: people engaged in the work of the project.
  • Consulted: people who weigh-in on the project, as SMEs. (Two-way communication)
  • Informed: people who want to know what’s going on. (One-way communication)

One person can perform many roles. For example, an Accountable is often Responsible as well.

RACI has critics and detractors.  Most of the criticism reflects that organizations take the matrix too seriously.   I like the point that Grumpy PM makes: the best use of RACI is identifying the various dysfunctions in the organization.

Define Responsibilities

The roles have assigned responsibilities.


  • A and R’s attend all project meetings.
  • R’s do most of the actual work.
  • C’s provide timely information, and attend meetings as invited, follow Slack conversations.
  • I’s read the status emails.

If someone can’t be relied on to do the above, they are likely not actually on the project.

For example, it helps identify if someone is a C (book stuff around them), or an I (don’t).  Changing people’s role on a project is straightforward: they get a new letter!

In Software Development Teams

Accountability matrices raise eyebrows and roll eyes due to origins in consulting and Deloitte-like environments.  I still like them. The concepts are lightweight and adaptable to help at a practical level.

Things I find helpful about a matrix:

  • Calls out when someone will actually need to be engaged, which can frees up time in calendars.
  • Divides work without stepping on toes.
  • Fun to make up your own acronyms.

My observation is that matrices that break up R into other roles (Supporting, Tasked, etc.) tend to be way too specific, and categorize people that can’t help the project directly.

Adopting This

Step one: add a bit of RACI to the “epic” or “feature” or “project” templates in your work management system (Jira, Trello, or whatever).  Your project will thank you!


The Employee Lifecycle, for New Managers

At some point early in my “management” career I realised nobody had sat me down and academically explained what managing people actually involved. I didn’t know what I was doing, other than being helpful-on-demand and organizing meetings. Being empathetic came naturally, but it felt like a failure when an employee wasn’t performing well. I didn’t always know what to do, and I didn’t really have the language to explain what I didn’t know.

Leading people was far less mystifying; I had been lead by good leaders, worked in groups where I was the leader, and “leadership” was a topic well-worn in TED talks and college papers. I had a framework for leadership in mind. But it wasn’t helping me convince someone that they shouldn’t quit after a boring project that under-utilised their skills.

Over time, many people helped me build a model of managing people, and it hinged on this idea that your job is to organize people’s lives through the employee lifecycle.

People get hired, become productive employees, and eventually leave. What they do in that lifecycle is up to you to manage. Tada, management.

Engagement and Performance

The lifecycle is organized into two important, somewhat binary, things about an employee:

  • Are they engaged, or not. Employee enagement is, as of writing, the best* predictor of employee success. This is something you can only get if you ask (with surveys, reviews, or 1-on-1’s).
  • Are they performing well, or aren’t they? This can be measured in many, controversial ways. As a manager you can generally answer the question “Is this person a high-performer, or not?”

The lifecycle looks like this:

The lifecycle of employees, and how to progess them through it.  The green area is the desired landing place for all employees.


Every employee starts the same way: someone recruits them. Recruitment is a shared responsibility in the organization, typically involving a dedicated talent management department (ex. HR).

Managers themselves need to:

  • Find and attract talent beyond what other departments are doing (ex. attend meet-ups, write tech blogs)
  • Screen, interview, and assess applicants.
  • Provide a good experience for everyone involved, as applicants talk to their networks.


Once an employee has been recruited, they are likely pretty engaged (unless recruitment didn’t go great). They are likely not performing at their version of “high level”. Developing an employee into a fully-functional member of the team is a managers responsibility.

Development is a continuous activity. An employee can highly function in one part of their role (ex. technical skills), but struggle with others (ex. leading a project, professionalism).  This changes over time, as new skills are required, and the job changes.

Developing employees requires managers to:

  • Onboard, and support their early learning and concerns.
  • Coach the development of required competencies, both professional and personal.
  • Set goals and provide progressive feedback; help overcome blind spots and local maximums.

This is different than training; development is personally tailored, and goes beyond core skills.


Employees find themselves in tough situations when they do not have the tools, or base skills required to perform parts of their job. It’s a manager’s responsibility to resolve those needs with training.

  • Identify under-developed core skills, particularly for groups of employees.
  • Create time in projects to pursue this “on the job.”
  • Watch for missing or incorrect tools, or usage of tools. (ex. wrong software, outdated guidelines)

Expecting people to train at home, or in the case of my industry on hobby projects, is a tad demanding and unpredictable.


Leaving the team (or the organization altogether) is an important moment in an employees lifecycle. Managing exits professionally, whether voluntary or involuntary, has a downstream effect on recruitment, and rest of the team’s engagement.

It doesn’t matter if the employee is let go, leaves voluntarily, stays with the company or not, a managers responsibilities are similar.

  • Prepare a replacement plan for every person on your team. Assume no replacement is coming.
  • Take part in the company “off-board”; administration can miss things that are team-specific.
  • Assess your team processes (ex. document ownership, meeting schedule) after every exit.
  • Maintain a conduit for a personal relationship; the time for learning from the experience may come later.
  • Keep the whole process positive and professional.

Exiting employees are actively networking and sharing their experience about your team with others.  They can either be building your bridges, or leaving negative Glassdoor reviews.


Very narrowly, retention is avoiding unplanned exits.  It’s expensive, disruptive, and bad karma to lose any employee (aka “churn”).

If you recognize someone is un-engaged and underperforming, the “exit or retain” decision should follow quickly.  Retaining means putting that person on a path to engagement (not necessarily high performance), and investing in their longer-term development.

This decision is difficult, and requires you to identify and address problems head on with the employee. That ruthlessness doesn’t always come naturally.

Preventing the “retain or exit” decision by setting up your team properly (including by hiring well) is the goal.

Retaining employees requires managers to:

  • Be clear and consistent about necessary behaviours and goals.
  • Foster a team identity that’s inclusive, honest, and aligned with business objectives.
  • Develop a personal “improvement plan”; the goals isn’t to make someone a rock-star, but set expectations on all those behaviours required to be successful.
  • Team-build; call out conflicts and have employees resolve them together.  Friends need strife.

The pattern here is managers retain people by being clear about: the team, it’s goals, and people’s roles on the team.


If you’ve taken management training since the late 1990’s, likely it was focused on engaging your employees.  Engagement supersedes concepts like “job satisfaction” and “morale” as a predictor of employee success.

Research that precedes this terminology still stands.  A formative, data-driven text on engagement is the (terribly named) First, Break all the Rules by the good people at Gallup.

Many activities required to engage high-performers are the same ones managers need to do in other parts of the lifecycle:

  • Ensure people have the right tools, equipment for the job.
  • Consistently communicate what is expected of the team, and the value of that work to the company.
  • Define plans for development and training.
  • Support development of team identity and friendships.

While retention requires setting up the team and roles, engagement focuses on the one-on-one relationship with the manager:

  • Know your employees as individuals, people with personal stories.
  • Find work that plays to their strengths and opinions; advocate for projects that match their skills.
  • Discuss their growth regularly
  • Plan strategies for getting promoted, compensation increases.
  • Recognize and celebrate successes; don’t wait for “announce-ables”, small wins that have creative output are great (ex. a well-written document that solved a client’s long-standing problem)

A lot like development, engagement is a continuous activity.  Like with skills, employees can be really engaged with one aspect of their job, or their team, and dis-engaged with others.   The challenge here is to develop someone to be well-rounded, and engaged with all aspects of the organizations work.

The Other Exit

The extreme end of the one-on-one relationship with your employee is identifying when to exit someone to bigger and better things, as perhaps they have outgrown the role you have for them.  Encouraging an employee onto a better opportunity is an act of being a great manager.

Hopefully you’ve found the above lifecycle helpful!  A good first step is to place your employees on the diagram above, and maybe your next one-on-one will prove insightful.