Lessons

Play the long game with people, the short game with outcomes

Recently, @henry sent over my 2020 performance evaluation I had shared with him. I was just about to go from Principal to Director role. I'm still trying to get good at this. Such wonderful advice from @AC. Thanks boss!

Play the long game with people, the short game with outcomes. Knowing how much to push, when to push and how hard is an art. With technology decisions its pretty easy, there is often a right answer and a wrong answer, often the wrong answer is no decision. However with people its a bit different and Dineth can show his frustrations at times when someone is not keeping up. Dineth is great at setting a high bar, this year he will have the opportunity to set a high bar, coach and help his team to hit it but also Dineth will need to make hard calls when someone isn't going to be able to make it. This takes time and practice and I would like to see this be a big focus of his this year.

Car crashes and sticking to your lane

My team recently made the decision to not have QA role as part of experience engineering. There were a lot of complains on increased workload and not wanting to do testing, including some valid reasoning around testing not being an area of expertise.

I’ve heard similar complaints when we spoke about creating dashboards and alerts for observability — “backend crap”. When I was a manager a while back, I even had someone in my team tell me he can’t work without a TPM writing the requirements down in the card. Requirements gathering is apparently not part of the job.

I recognise that there is discomfort in breaking out of what we are good at. Being a coder, there is a level of certainty to what we do. To think about customer behaviours and ways to break a system is adding uncertainty. There is a lot of resistance to do what needs to be done. Everyone likes to stick to their lanes.

Unfortunately, hard boundaries make for shit software products. People learn to stop asking why things are done/made a certain way. A level of disengagement sets in. Boundaries take people away from what matters the most: having [customer] outcomes.

I was trying to explain this recently with the metaphor of a car crash. Maybe this will resonate.

Imagine you are in the passenger seat of a car. Your friend is driving you back from a day at the beach. Beating sun and the long drive has made him tired. You aren’t much of a confident driver, so you can’t really offer to help. Tired eyes give way and your friend falls asleep at the wheel. You try to wake them up but Morpheus has trapped him in the land of dream.

What do you do?

Do you say, “not my area of expertise” and watch yourself go hurling into a sidewall? It would be pretty sensible to grab the steering wheel and find a way to get both of you to safety.

This is what most work is like. We constantly have to go out of our comfort zones to make outcomes happen. That is the entire value of an engineer… they solve the necessary problems to make outcomes happen.

2 things to leave you with:

  1. When you hire for a team, mix experts with generalists.
  2. Explain to everyone that in your team, they’ll have to step out of their comfort zone to make things happen. That they are expected to solve problems no matter where it takes them.

Anticipatory Failure Determination

[AFD] has the objective of identifying and mitigating failures. Rather than asking developers to look for a cause of a failure mode, it reverses the problem by asking developers to view the failure of interest as the intended consequence and try to devise ways to assure that the failure always happens reliably

Interesting way to discover unknowns and side step things like denial.

https://www.npd-solutions.com/afd.html

Thanks Connor for the share...

The Bear and shows about teamwork

I love TV shows that show great teamwork. They aren’t always easy to find. Most shows tend to focus on an individual character and their story arc. I’ve been watching The Bear recently and it is one of those.

The Bear is about a restaurant that is in the brink of falling over. Most characters in the show are struggling with some issue in their lives: grappling with mental health issues, grieving lost loved ones, broken marriages, terrible childhoods etc. They bring the internal chaos to work and the there is no room for the individual skills to flourish. People are too busy screaming at each other to think about why they are there or really, to listen to any good ideas. There is strong push to go back to what was before. This feels a lot like many teams I’ve worked with. Maybe less dramatic.

It is interesting to see what gets them out of the rut. Some of it comes down to small changes — devising clever ways to say “sorry” when it is too intense to say it out loud (they roll their fist on the chest), calling every person a “chef” as a sign of respect, making sure the tape is cut properly etc. They have to continue to do non-ideal things to make ends meet. The individuals themselves have to go on their own personal journey in parallel. Some of it is brought on by new perspective from external events or time spent training internships. Overtime, they start to demonstrate to each other it can be done, as a team. Even things like changes in processes stop being taken as power plays or done for adversarial reasons.

Of course, their challenges get harder. Each individual have to step up their game overtime to make it work. However, the most important thing is that they learn to lean on each other. They learn to be candid, but respectful. Each challenge ties them closer together.

And they make great food. Check it out — highly recommended.

Picture of the crew from The Bear TV show

Image credit: TVDB

The other shows I loved for its team work is “Star Trek: The Next Generation”. It probably needs no introduction to many: there are so many things to like about it. I just couldn’t noticing how their team dynamics helped them get out of so many issues. “The West Wing” isn’t bad for teamwork either.

Conflict Resolution

Recently, my friend shared this story over dinner. He is an iOS developer.

He had been tasked to create a core component for his company’s design system: a container view that sweeps over other views. But there was an issue with how padding was applied. The designer in charge of the component insisted there should be a fixed padding set for content. Most developers who used the component wanted to define custom padding. He was getting lots of requests by others in the company saying their designs can’t be achieved with the new container’s implementation.

Those who worked with me on frontend projects know, bad margins and padding really drives me crazy. They seem to be the trickiest thing for large companies.

My friend goes back to the design partner to change the requirements for the padding. “Let’s set it to zero and let people put things inside a layout view”. The designer explains, “design system needs to be opinionated; all views inside the container need to have the same padding set for consistency”. The tennis match was one of stamina. Conveying how practical usage is suffering didn’t really matter. My friend got tired and gave up after running around the court.

Conflicts like this happen all the time. Perhaps, it would help to think through a framework that helps both parties arrive at shared understanding and agreement.

Eliyahu Goldratt, in the book It’s Not LUCK, guides conflict resolution towards finding common objective. Each action in conflict is motivated by a requirement, which in turn, is motivated by an objective. If we can work back to find the common objective in a conflict, we have the opportunity to inspect underlaying assumptions and work towards resolving the conflict.

So in our story, we have…

Developer: [A. Leveraging the design system to unlock consistency]← [B. Flexible system that matches feature designs] ← [D. Remove default padding]

Designer: [A. Leveraging the design system to unlock consistency] ← [C. Consistent component behaviour through fixed values] ← [D’. Apply default padding]

My favourite thing about this framework is its invitation to show empathy. It forces us to inspect motivations on both sides. Conflicts are part of working as a diverse group of individuals. Being able to understand differences and learning to view problems from many lenses helps teams do amazing things.

Let’s take another piece of wisdom from (the super awesome book) Crucial Conversations by Kerry Patterson to help us.

Often, a conflict exist because each party doesn’t have the full picture. Much like a Venn diagram with two partially overlapping circles, each party has unique knowledge with some shared understanding between the two. We should approach conversations with a level of curiosity to close the gap on shared understanding (bring those circles closer together). What do you know that they don’t? More importantly, what do they know?

Going into a debate thinking you want to “win it” yields no favourable outcomes; only annoyed people having formed a poor opinion of you.

Again, this is sounding a lot like empathy.

A. Leveraging the design system to unlock consistency

Going back to our conflict, I played the designer and debated with my friend. We both asked “why” a whole bunch and tried to explain the differences of theoretical and practical issues.

This is where we arrived (if you care for technical details)…

Some containers describe layout patterns while others define interaction patterns. For example, a Card is a way to lay content out. A Dialog or a Split View may be more of an interaction pattern. Perhaps, we need to have an a rule in the design system on how to approach these two types of components. It make sense for layout views to pad content. How about interaction patterns? Perhaps the rule is to pair interaction components with a layout.

This seemed like a path forward to figuring out how to resolve the conflict.

Conflict resolution is all about empathy. Empathy builds great teamwork, which builds great products.

How do you communicate effectively in an asynchronously setting?

This post is part 2 of a series:
Part 1: How to make remote work successful at your workplace?

Write everything down.

For an asynchronous setting, communication can’t happen live. Obvious — I know. However, we have such strong affinity towards live communication methods. Live chats tend to be “high resolution” in nature. We get immediate feedback. In-person (and video) brings more detailed signals from tone, expressions and body language.

Writing happens in low resolution. It tends to be one dimensional. Most of the time, not all recipients fully consume the written material. However, writing can be equally high impacting method of delivery in a distributed environment.

Some benefits of writing:

  • Allows for time to think and formulate more relevant messages (adjusting for tone, emotions etc)
  • Written discussions tend to be less circular
  • Better attribution of ideas and a means to sidestep strong voices
  • Searchable, making its impact long lasting — ideas are most impactful when someone is ready to hear it
  • Get time back by turning so many BS meetings into posts (example: “what shall we name this service?”)

Few tips from past learnings...

Placement & Format

Not all discussions should be had on Slack. It is important to think about where something should reside in. Use a variety of mediums. For example:

  • For guides / read-only pieces — Wikis and blogs do great
  • Discussions about specific work tasks — Trello cards
  • Big ideas that need shaping — documents, Miro boards
  • Sharing news, unstructured thoughts or rhetoric — team channels and emails

Something I often do with my teams is to write a “directional” post in a document and let them edit and comment over a week. Often, the draft sets up the direction and allow the team to tweak ideas and move towards something more widely bought into. One such example was “Our point of view on Agile practices”.

Another practice we had in team channels is to do more “social” chats around product ideas, debating about blog posts, sharing travel pix or building Spotify playlists together. We once had a 469-post thread for discussing Sausage & Egg vs Bacon & Egg McMuffins!

Also, more gifs and fun emojis.

Meetings

Try not to have them. Read more… Meetings are Toxic.

Some can’t be avoided. The issue in a distributed environment is that not all can be present. To combat that, most people record meetings. Thing is, not many recordings are ever viewed later on.

Public posts summarising discussion points, action items, decision points from meetings can go a long way in building trust and avoiding FOMO. It also means that there is a forum to discuss ideas missed out on or raising concerns that can undo decisions. Remember to allow time for people in other timezones to chime in.

Generally, asynchronous work places can offer more thinking and making time for all.

Leaders

As a leader, it is most critical that direction comes down in written format. Even in live setups, writing down direction does wonders. There is less ambiguity and messages lost in translation.

I write biweekly a posts to the team about what is happening in the background. They include things the company is worried about, concerns I’ve heard about, achievements etc. These keep people connected to what is happening.

More casual, candid style writing helps the team learn about the leader and their motivations. Robotic, corporate statements don’t inspire.

Open Slack debates also become a place to set up culture. Encourage people to disagree with you and when they do, praise them. Micro-moments where candid conversations happen can set the tone for how the team works. Written format is great for these as these moments last for much longer.

Concluding thoughts

Building a culture of written communication takes time and effort. Many can’t immediately see the impact of pushing for these. I’ve had many debates over why it is so much easier if we could just turn around and talk to someone instead of having to “type shit out”.

Yes, it takes more effort. At first, you may find yourself having monologues on Slack channels with many readers and no participants. People will contribute eventually. Active channels make for great meeting places to be social and get help from one another. It forms the basis for asynchronous work.

There is an asynchronous version of the team where they are more effective, collaborative and productive. It won’t matter where in the world they turn up to work from. Work can happen in true openness and inclusivity, where there will be so much learning and creativity.

It’s not a crock.

Thoughts on “Scaling Technology”

I had the privilege to take part a panel discussion on “scaling technology” for go1’s offsite. It got me thinking…

Software products are (usually) written to meet product outcomes. Initially, these outcomes tend not to include deliverables like “used by millions” or “developed by 1000s”. As a product grows and matures, these concerns start to bubble to the top. Sustaining growth requires businesses to take on “scaling” activities. They help build a lasting product.

Scaling tends to be forced upon a team on 2 directions:

  1. As market adoption increases, there’s more inbound traffic and opportunities. Product team will start to pile on new features to improve conversion and stickiness. Organisation may acquire horizontal pieces of technology to integrate and grow the business. With such rapid growth, software applications starts to breakdown under its own weight.

  2. With more customers, comes more funding and interest from the wider organisation. That means more developers start to push code into the mix. Operations start to slow down as overheads, dependencies and complexity of collaboration increases.

Scaling systems will both help continued growth and reduce some of these issues. Often, that’s not enough to be successful. We also have to evolve people’s mindset to support the growth in business (i.e. scaling people).

Scaling systems

This is a large topic. There are lots of books about achieving scalable systems. Here, I’ll focus on some ideas I’ve seen teams miss out on.

Scaling systems is a lot about having a strong architectural direction, aligned to business strategy. Where do pieces of your system go and how do they fit in? “Highly cohesive, loosely coupled” pieces that support where the business is taking the product.

The architecture cannot be “too clever” and should be easy to reason with. Sometimes, we forget that we will have more people with diverse skill levels working in the system. With more people comes more misunderstandings and confusion. Simplicity does well here… as long as simplicity doesn’t adversely affect the competitive advantage a business has.

One mistake I’ve seen made over and over is that we tend to design for the problems we face today. Scaling requires imagination and creativity to identify and agree on a future vision. This has to be done with stakeholders from other disciplines. Tradeoffs and constraints applied for future has to be made together deliberately.

Think about a road vs a F1 car design. What changes and tradeoffs are made to achieve the outcome of going around a circuit significantly faster? F1 car only carries 1 person. It has to have extreme turn around time when swapping out modules like tires and pieces of the body. It’ll support lots of configurations and costs a fortune to maintain and improve one. Scaling is a lot about trying to figure out how you can turn your road car to a race car.

Architecture should be thought as an organic/fluid element of the product. There is little chance that a living product reflect any idealised architecture design. Some parts will lag behind while others will evolve rapidly. That’s the nature of large software applications. Systems are always in motion, much like the business itself.

Think about where “rubbish is collected”. Every system produces waste as more development occurs. Waste usually floats to the top of the stack because these parts tend to be more volatile. Can you isolate areas of high waste production so they can be renewed with low friction?

Example of this is edge services (or backend-for-frontend APIs). Most changes goes into the edge to drive changes in clients. Overtime, they are natural places for bloat. They need to be regularly refactored.

Lastly, any new architecture should have an incremental migration plan. Businesses continue to operate and make money. This means that rewrites are expensive and downright dangerous. Go incremental. If you are not convinced, read the big redesign in the sky.

Scaling people

Scaling people is much harder. Even when the technology is thoughtfully designed, it may not yield good results if people didn’t learn to think from a point of scale.

All teams and companies have an equilibrium: a “default” mode of operation. New systems and processes tend to devolve back to the state of legacy systems when nothing’s done to move existing equilibrium state. Many disregard this as an issue because it is the current playbook to company’s success. Problem is, to make more money, to have scale, you have to move your equilibrium.

Example... You may build a new CI/CD system that takes an application from monthly releases to 15min. It is hailed as a victory for how quickly issues can be resolved in production. However, team’s scrum process may dictate that sprints can’t change after they are set every 2 week. This leads to bugs sit in queue for 2 weeks before picked up anyway. Team may decide it is not valuable to release all the time since the testers are over worked with hourly releases. Couple of mishaps have led to some bad performance reviews. Slowly, things move back to monthly releases. Pipelines degrade because speed is no longer a priority. PR sizes go back up since no one’s trying to push atomic changes to production.

The “way of work” has a direction, even if no ones designed it to have one. The way people work is what yields the system we are trying to replace. So we have to pair the system change with a people direction change as well. These changes have to compliment each other so we get the most out these changes.

Continuing our CI/CD example... Team may move to a Kanban model (or swim lanes for issues). Testers have to be integrated to the process in a different way. A new support process with daily triaging and SLAs will push the team towards monitoring quality. Reporting on revenue from customer value delivered may motivate the team.

On the thinking front, individuals can end up in 2 places.

  • People who have seen high collaboration at smaller scale would long for glory days of the past and continually fight for it to return. They’d want to work with a trusted few and smash out features like they used to — “who cares about design systems and business domains?!”.
  • Others will create hard boundaries in their minds and never go past to make outcomes happen. A lot of “that’s not my job” proclamations and meetings about “ownership”.

Neither of these help to achieve scale and get shit done. Most leaders lean on continuing to maintain hard boundaries and tinkering with process. These tend to have low yield.

Changing mindsets and how people think is the ultimate challenge for an organisation. Everyone has to be given a path to mentally transition from where they are to where they need to be.

…I am a frontend developer who had full autonomy to prototype and release a new UI patterns to production. Now that we are larger, customers need to have a consistent set of patterns to work with. This will help them navigate the product better. It is still important to innovate so I should discuss the new pattern with a designer to understand wider concerns. I should pitch my prototype as an opportunity to gather data on customer behavior. It will help us decide if we should deploy this pattern across the product to have wider impact than my single concern…

Elevating people who reflect the mindset required to achieve scale can help. Allowing them to take up leadership positions and making decisions can guide the rest of the organisation to see new thinking in action. It shift the organisational equilibrium quickly.


There is a lot more to changing processes and mindsets at a company. I’ve spent the last 5 years pushing for a new identity of “Maker” within Expedia to aid its transition. I hope to be writing about it more in the future.

For now, I hope these thoughts will help you scale your company better.

Why Facebook is having a tough time regulating content?

It is a diversity problem.

Facebook sees its users as a singular global community, much like how we are all citizens of planet Earth. Facebook regulates by having a common set of rules it has decided as the community standard. This standard evolves and changes all the time as it is challenged with new and interesting scenarios.

Good background listen: RadioLab — Post No Evil Redux

As communities scale up to 1000s, 10000s, millions and billions, these standards start to break down.

Each of us hold a very different opinion of our world due our diverse backgrounds. Usually, we find ways to form groups and micro-communities to be with their like-minded counterparts. People in these communities start to congregate and solidify ideas around some key principles that guide their path in the world. Micro-communities strengthen the core beliefs of their members. While each individual may have slightly differing viewpoints, it is often overridden by their appetite to be in a community. Humans are, after all, communal creatures. This has allowed us to survive and dominate the planet for all this time.

For humans, the differences of their ideology is just as important. Their backgrounds and histories fuel them to appreciate and maintain the differences. These attributes help us grow and progress as people. This diversity of thought makes us creative and innovative. Therefore, it becomes important for us to support the idea of multiple micro-communities with diverse viewpoints.

What this really means is that there is no one standard we can apply to a billion people. If you look around, these diverse sets of standards are everywhere in our physical world. Whether it is countries states and districts or competing supermarket chains, people follow ideologies and split themselves up to identifiable groups. It helps them have a sense of belonging, self-worth and feel safe.

So, Facebook should stop maintaining their big list of opaque community standards. There is just no one way to define what is an acceptable level of nudity in the platform (among many other debates…).

They should move towards a model like Reddit’s where there is only a base set of company standards everyone adheres. These standards are just minimal expectations. Each of the micro-community (subreddit) moderators have the opportunity to set their own rules that build upon the base ones. This model appreciates the diversity in our community.

The problem no one has definitively solved is the one of allowing these diverse ideas to mix. How do we meaningfully facilitate the crossover of these ideas? Learning from each other is very much part of us growing as a community. For a platform like Facebook, it is also their business model. There is huge monetary value and opportunity in being able to inject new ideas into existing groups of people.

This is where simplistic metrics like “user engagement” starts to work against big platforms. A peaceful community is at medium engagement at best. Everyone is talking about new ideas and learning from one another. With higher levels of engagement, we might be looking at conflict points. Algorithms have to take more care; they are the spreaders (and catalysts) of ideas in these modern day social platforms after all. They have to work against their own appetite to engage users. Or perhaps, work as a set of algorithms that compete for balance of some sort.

If we inspect how moderation happens in the physical world, you can think of legal and justice systems as micro-communities too. Some individuals and groups respond to the calling of maintaining peace and safety. Platforms like Facebook shouldn’t be creating “a global court system”. It feels like a silly idea stemming from the belief that a community has a global standard. Instead, they should encourage and facilitate the creation of entities that uphold peace and safety. Their base standards should only allow to restrict poor business practices and guard against more universally accepted destructive human behaviour. They need to elevate groups that hold communities together and hold them accountable to the standards they set. Means for content moderation should be built on the back of these key community interactions.

We have to stop thinking of ourselves as one big idealistic western-valued society. We are not. This is working against our progress as a society. We are a diverse group, learning to exist together in a common place. Facebook should embrace the diverse nature of humanity.

A litmus test for strategy

Recently, I was questioning why I felt uneasy about some strategy talks I’ve been having with my peers. While something felt off, I was unable to articulate the why. Things didn’t come together till my friend, Scott Horn, threw in this great heuristic. It is a wonderful litmus test if you are thinking strategically about your approach.

If the opposite of your strategy doesn’t exist, it is not strategy at all.

Imagine we made a Music app with the highlight feature being “Playlists”. In order to compete with many dozens of music apps out there, You start looking around. We have…

  • Pandora making intelligent playlists out of music attributes
  • Google making playlists out of gathered data
  • Spotify allowing customers to share playlists with each other

Perhaps, our playlist solution needs to be “curated by experts”?

If our competitors are already doing this well, then it wouldn't be a great approach. It would not grant us any competitive advantage.

If a strategy is what all competitors are already executing on, then it wouldn't mean much. It would be “business as usual”. It wouldn't help the product grow as much.


Update: Having done more reading, this is possibly where these words of wisdom originated from: https://www.bridgespan.org/insights/library/strategy-development/roger-martins-unconventional-wisdom#.VRW6sZOsUYc

Wonderful read with far better examples!