Avi Das

Home for my work, ideas and else.

Chicago Marathon 2019 Race Report

A big step forward and lessons learnt along the way.

Race Day

For goal races, I usually wake up before the alarm goes off. October 13th was no different. Despite the 3:30 am wakeup, I slept unusally well considering it was the night before the race. I KT taped my foot carefully, which I had to do throughout the training cycle to defend against feet issues. After the usual overpacking of gear check bag, I joined my Dashing Whippet housemates on the train ride to the starting line.

Pre race

In the race village, I watched the sea of green feet (nike Next %s), and waited till it was time to get to the start line. The race corral was already busy over half hour left before race start. I went through the motions of shedding extra clothing, doing warmups in the cramped environment and holding back the nerves. It was colder than I expected, which wasn’t a bad thing at all. It would stay cool during the whole race, which meant overheating never became an issue.

At the start line, I felt good. No major injuries have cropped up since March, and training went as well as it could. Despite that, I wanted to stay committed to running a smart race. Marathon is too long of a race distance to predict an outcome and I wanted to stay within myself as long as possible.

I saw the 3:15 pacemaker, and realized I was in two minds whether to go with him or not. I decided to trust my training and focus on running my own race.

The race began, and in the beginning mile I stayed attentive to what my body was telling me. The surge of adrenaline wanted me to speed up, but I held back and moved with caution. At mile 1, I heard my name from a friend cheering and immediately felt better. It is so valuable to see familiar faces during a race.

As early as mile 2, my GPS was completely haywire. I had to stop paying attention to the speed that the GPS was showing me and decided to count every 5k interval instead. I knew those times by heart from training.

23, 46, 1:09, 1:32, 1:55, 2:18, 2:41, 3:04…

I got to 5k within the limit without much issues. Chicago is one of the best marathons, and crowd support is a big part of that. The first half of Chicago is electric, with non stop crowd support, and they showed up strong on an overcast, windy day. It feels as if hundreds of thousands of people are on your side, and you want to run well for their sake.

Then next 5k also went fairly quickly. I have found the miles between 8-12 mentally tough during training and it was definitely no different during race day, injecting some doubt into my race strategy. Every person racing at their limit must battle negative thoughts, there is really no other way.

Chicago 20k

At 15k, I was able to keep a buffer of over a minute. It wasn’t clear to me whether the pace was sustainable the whole course. I wasn’t looking at the watch until a 5k interval, so there wasn’t much to rely on other than how I felt running. I kept repeating the words in my head.

Smooth. Calm. Relaxed. Metronomic.

Stay as calm as a Tibetan Monk.

Only a couple hours or so and I can go run trails.

Around mile 11 or 12 during the race, another runner cut sharply into my path, a near collision. As I looked at him, I went from bewilderment to anger to laughing out loud in the period of a second. “Wherever you are trying to go dude, I hope you get there”, I said silently as I shrugged and carried on.

I thought about getting to the start line and getting up to this point. I thought about the Tuesday night tempo workouts, Thursday night speed workouts in East River, Saturday morning long runs, all the work that went in. Even if the race fell apart at some point, there would solace in knowing that I came this far. Maybe I could go on for another 5k.

Once I passed 20k, I was getting more in the zone. There is a lot of beautiful Chicago neighborhoods the race takes you through. There are people carrying signs and blasting music and screaming words of affirmation from the sidelines. I don’t remember any of them specifically though. I remember staying close to the blue line as much as possible, which marked the point to point 26.2 miles on the course.

I crossed 13.1 miles at 1:36:21, well within goal time and feeling well. I was feeling well with the pacing, at the same time the relative effort was feeling harder with each 5k. I was feeling searing pain in my foot, but there wasn’t much I could do. The only possible option was to continue forward.

React Amsterdam 2019: Takeaway

  • The case of GraphQL (Peggy Rayzis)
    • Productivity boost across teams
    • Smaller payloads
    • Fewer client/server round trips
    • Preventing over fetching
  • Great Developer Experience (Peggy Rayzis)
    • Unobtrusive, out of the way e.g. Prettier
    • Predictable and intuitive, e.g. declarative React paradigm
    • Instant Feedback Loop e.g. VSCode/TS
  • Design Systems (Mark Dalgleish & Andrey Okonetchnikov)
    • Universal Language > Technology
    • Set of design related rules as system of instructions that can be reused across products
    • Shared language between designers and developers enforced by tooling
    • Design powered development tools
    • Developer workflows as productive as designers
    • UI components and pattern libraries can provide this intermediate abstraction and be a common language for both designers and developers.
  • Micro Frontends (Max Gallo)
    • Autonomy/Responsibility with Teams Innovation
  • Better you understand the abstraction, better you are at using it (Kent C Dodds)
  • Write code that is resilient to future change (Max Stoiber)
  • Use existing solutions for tech problems if you don’t understand deeply (Bias towards conservative choices)
  • Be open about roadmap to learn about users priorities

Life Lessons From Improv

I think life should be more like improv and improv should resemble life.

On a whim, I went to hideout theatre in Austin, TX for a improv beginner class back in 2016 but I have only been consistently doing improv for the past year. In the process, I have tried short and long form improv, and dabbled in musical/rap improv. Having zero theatre/stage background, it has been amazing to me how the lessons learnt from improv apply to life broadly.

  1. Yes, and..: A 101 on improv would begin with the encouragement to accept whatever the other person is bringing to the scene. We may have a great idea in mind, but the scene is ruined if we do not accept the other person’s ideas and bind the scene in a cohesive way. Taking this attitude to life can frame anything in life as a gift. This in turns lends us to be less critical and cynical about our day to day interactions.

  2. Go with the first thing that comes to mind: Perfect is often the enemy of the good. Overthinking can stand in the way of action when spontaneity may have been the right choice. In improv, trying to think of a funny punchline can ruin an act, taking away from it the natural flow of the scene. On the other hand, going with the first thing that comes to mind often leads a scene to wonderful surprises. Real life decisions do involve more thought, but the training against overthinking still holds and can help us live a more spontaneous life and overcome the fear of taking action.

  3. Embracing failure: Making a fool of yourself is encouraged and celebrated in improv. The very act of complete unpreparedness on stage, taking the audience’s suggestion to theme a scene and strangers as partners means that you don’t have any semblance of control. There is no guarantee that an improv scene will be funny to the audience or reach a satisfying closure. But everyone in improv understands this, and supports your choices on stage regardless. This empowers improvisers to be authentic on stage. It also makes us realize that the consequences of failure may be less than we realize. This training is so important in life where fear of failure can hold us back.

  4. Make others look good: In improv, we succeed when we have made the others on stage successful. Supporting their ideas, pointing out the authenticity of their actions and emotions goes a long way into making a scene feel natural and relatable to the audience. When working with improvisers who are gifted in building out storylines, a great way to complement their work is to add other dimensions to the scene such as a location, timeline or other context to create a richer, vivid scene. This prioritizing of win-win mentality is a great habit for teams, since an effective team should be greater than the sum of its individuals.

  5. Make statements, don’t ask questions: Making statements adds material to a scene, whereas a question puts the burden on the other to come up with the material. This is why it is encouraged in improv to limit questions and respond with statements. This is great for your communication skills, making conversations feel less like interrogations. People feel more at ease in a conversation when they feel they don’t have to do all the work. A related advice is to try and use every sentence in improv as if it would be a closing sentence, since a scene could end at any moment.

Frame Code Reviews as Gift Exchanges

The best metaphor I have found for thinking about code reviews is a gift exchange. The terms pull request and code reviews will be used interchangeably in this post.

The balance of writing code vs everything else that is necessary to be a successful member of a software team is one of the key challenges of our job.

Code reviews are an interesting mix. You have to understand someone else’s point of view, their journey through solving a problem in form of code. Or you have to face up to what everyone else thinks about code that you worked hard to write. Those reviews stand in your way of getting your code up to users and getting the emotional payoff from releasing something. The engagement or catharsis from building software is not an available reward when you are in code review mode.

Moreover, a code review must take into consideration not just the code, but the project, team and the company into consideration.

These qualities make code review a great opportunity to practice interpersonal skills alongside your programming skills. The best engineers I have worked with take code reviews and responding to feedback on their own pull requests very seriously. Specific strategies that engineers use are different. Some review pull requests first time in the day, others end of the day or anything in between.

Framing is a powerful technique we can use when summoning the energy to do code review everyday. It would be to see every request for a code review or feedback you receive on code review as a gift. Someone values your intelligence enough to ask for your review or taking their valuable time to give you feedback that can only improve you as an engineer. Everyday, you receive these gifts. But you can also offer them to others, which in itself is a meaningful and satisfying act.

Viewing pull requests this way makes them less of a transaction, and illustrates code reviews as a win-win game. So next time you are opening up a pull request, think how you can make it easier for someone else to review. Can you link to the ticket, provide a screenshot/gif, added sufficient comments and followed good coding practices? Have you considered breaking your change into smaller chunks? Can you sit down with a reviewer and go over the changes in code?

Let’s make it easier for someone else to offer us this gift.

Thoughts on Button Push Driven Development

I was in a conversation the other day when someone mentioned

“We may only be a couple Moore’s Law iterations away from all software built by pushing buttons and WYSIWYG editors.”

This made me think of the software that we write today and the direction software is going. It also made me think of why I got into software and am still in this profession.

Lately, I have been very curious about voice as a computing platform and what that will do for applications we use in future. Thankfully, as software engineers, we don’t have to hypothesize. We can build it.

Digging into Alexa skills development has been interesting. While the technical documentation and development for Alexa is quite good, I felt a fair amount of internal resistance during the project. The potential of this new computing platform and the possibilities it will bring kept me going.

The building blocks of working with Alexa are intents, utterances and lambda functions. After a series of thirty or so steps of wiring up buttons, copying and moving templates around, setting up attributes gives you a working voice enabled app, upload zip files, deploy it and submit for app review in the Alexa app store.

Why did I feel the resistance? Any new tool or language will bring an initial set of frustration before we achieve a minimal level of proficiency. But Alexa development felt like using a software program rather than programming. It felt challenging the way gruntwork feels challenging and as opposed to intellectually stimulating. It also felt opposite to when I have felt the most joy during programming. When I had a strong grasp of the vocabulary of the language and the meta-language (libraries, development environment,runtime, etc), leaving room for higher level product/architectural decisions where most things are a tradeoff. This meant I had to do very minimal context switching. When writing an app for Alexa, it feels driven by context switching.

Books I Read in 2018

General/Personal Development

  1. The art of living (Thich nhat hanh): This is the best Thich nhat hanh I’ve read, composing his philosophy on living an examined life into day to day practices.
  2. Thinking in systems, a primer (Donella Meadows): Really, really smart author, systems thinking should be a required course in college.
  3. Ain’t I a Woman: Black Women and Feminism (Bell Hooks): Challenges a lot of assumptions, covering black woman’s involvement with race identity and feminism.
  4. When: The Scientific Secrets of Perfect Timing (Daniel Pink): Dan Pink’s books are similar to Malcolm Gladwell’s, distilling behavioral psychology research into easy reads.
  5. The Essential Rumi (Jalal Al-Din Rumi): Lately I have started admiring how much Poetry can accomplish with so few words. There is something very calming about reading Rumi.
  6. Sex at dawn (Christopher Ryan‎, Cacilda Jethá): An incendiary/challenging investigation into human/primate sexuality, sweeping across history to construct the narrative, much like Sapiens by Yuval Noah Harari.
  7. Deep work (Cal Newport): So good, anyone doing knowledge/creative work would be benefited by this classic.
  8. The life changing Manga of Tidying Up (Marie Kondo): I have been leaning towards minimalism, and Marie Kondo offers very actionable steps to cleaning up, and why doing this is related to the life we want to have.
  9. Flow: The Psychology of Optimal Experience (Mihaly Csikszentmihalyi): There is strong evidence at this point that time spent in flow state, (an state of effortless concentration on a single task), can be correlated to contentment/happiness. I really liked the first part of the book but thought it could be much shorter.
  10. Daring Greatly: How the Courage to Be Vulnerable Transforms the Way We Live, Love, Parent, and Lead (Brene Brown)
  11. So good they can’t ignore you (Cal Newport): Much like deep work, essential reading for those looking to improve their craft.
  12. How to change your mind (Michael Pollan): Eye-opening, challenging look at the resurgence of Psychedelics in mental health research.
  13. A life in parts (Bryan Cranston)

Core Tenants of Highly Effective Software Teams

This blogpost is my thoughts only and does not necessarily represent the positions of current or past employers.

We don’t build software in a vacuum. Software involves people. Beyond organizations of a handful of people, hierarchy is beneficial. We get teams, commonly with engineering manager/lead, product manager, designers and engineers. What becomes crucial for the software and the product delivered then is the effectiveness of the team. Throughout my career in the industry and being part of many teams in different circumstances, I have started noticing some key patterns that really drives standout results in teams.

  1. Believing in a common cause: The single biggest observation is that when a team of people believe in a common mission, they produce outsized returns. The most effective teams I have worked in all had a strong belief that they was a reason for the work they were doing. This also aids inter team collaboration over inter team competition, with teams often investing in tooling that makes the whole team better.

    Engineering leaders can play a key role here to frame a compelling mission for the team. Hiring for the right role also becomes super important as a highly motivated individual in a role can be 2-10x more effective than someone unmotivated with similar ability. Having a competitor or a common enemy is great since we are predisposed to bond over defending ourselves from common enemies.

  2. Psychological Safety: Google’s Project Aristotle studied 180 teams over two years and came to the conclusion that psycological safety was the best signal for how effective a team is. How comfortable do people in the team feel to share vulnerability without fear of retribution? How comfortable do people feel asking questions without fear of asking something silly or share ideas without fear of being shut down without listening? Team’s with high levels of psychological safety can have conflicts, but can deal with them in a mature way, being able to separate disagreement about ideas from disagreement with people.

    For more senior engineers/technical leaders, this is crucially important since they are in a position to determine this culture for the team. Forming strong personal relationships with the team can be really valuable for fostering safety within the team. People like their leaders to be human, and admitting your own fallibility is a great way to form trust with team members.

  3. Diversity of Thought: Diversity is a word that is commonly heard in the tech industry, and for good reason. Having diversity of people is a proven way to achieving diversity of thought, which is just one of the reasons why we must invest in software communities of women and minorities. Inclusiveness is one of the key pillars of psychological safety in a team, building on from the last section. Moreover, when software is aimed at global audience, but the team is homogeneous, it is easy to be fooled that a wide audience will get their needs met.

    Even teams of experienced contributors can fall prey to atrophy and decay, without fresh ideas so common in upstarts. A team of really excited newer developers may not realize that in balance lies the key to long term personal, team and product success. Diversity of experience in a team helps to avoid these common traps.

    Finally, cross functional teams can be more effective than teams exclusively focusing on frontend/backend/mobile. Recognizing the individual contributor’s interest in user experience/security/governance etc and enabling space for that one of the most enabling things an engineer leader can do.

  4. Growth and Ownership: It is immensely gratifying for people to feel that they are growing, and knowing that they are playing a role in the growth of others. When team members feel confident about the path in front of them can still have challenges, they are far less likely to be unmotivated and plateau. This is big for retention, since job changes frequently are a result of people feeling stuck and needing to make a change. It is costly to replace engineers, especially ones already trained and performing well in their role.

    A key intrinsic motivator for many is the feeling of ownership. Being able to really sink their teeth into a hard problem and come up with something they are proud of. Teams where people really believed that they have strong ownership of the product also care more about the end users experience, resulting in a better product.

    As engineering leadership, one of the best signals of good management is to have clarity in career ladders and promote the right people. A bias for people who make others around them better can be healthy. It is my experience that promotions should rarely come as a surprise to the individual or the team. Demonstrated investment in people as future leaders is also a major indication of a company’s belief in their people, sending them to conferences, training and giving license for creativity.

  5. Work Environment: This is a controversial one, but I do believe that companies today have bought way too much into the open office movement. While a return to cubicles does not feel desirable, dedicated interruption free zones (both space and time) are essential for good software. A chaotic office environment can also mean chaos in your codebase.

    Debates range whether standing desk or sitting is better, however many monitors are necessary. My belief here is that the team should be colocated but individuals should be empowered to find the best working situation for the track of work they are in. I have personally found that standing keeps me on my toes, making it great for lots of small tasks, whereas sitting is best for tasks that need deep thought.

When things fall apart

We do not live in a perfect world. Recessions, unexpected downsizing, market competition and many other forces can impact access to resources which could result in ways in a group of people come in to work together and stop working together. Lot of us have all worked in a team where that magic of a great team existed, and the team achieved things together what could not be achieved by individuals. It is important for us to be thinking with intention and purpose and help each other build and find teams to discover that magic.

Jersey Half Marathon 2018: Race Report

“Gatoradeee!! Water!” The sudden enthusiastic cheer after a period of silence was hard to miss. Looking up, I saw the 10k marker. I looked at my watch and I was about to PR a 10k. Except that I was not running a 10k. I was running a half Marathon and with more than half of the race still ahead of me, this was bad news.

Post NYC marathon last November, I was happy to have run my goal race in a good time. I knew I was hitting my upper limits with the Marathon, and without focus on shorter distances, I would not get faster. I focused religiously on the Tuesday tempo and Thursday speed workouts with the Dashing Whippets central park group. It was inspiring to see the people training for Boston Marathon putting in incredible work during some difficult months.

This season’s training posed many challenges, primarily freezing temperature, snowstorms, breakups. Every time I stepped out the door and breathed in the icy air into my lunges, everything inside me wanted to get back inside and wrap myself in a blanket. But the workouts had a way of enforcing discipline into my life. For Saturdays, I made the commitment to keep showing up and sometimes challenge myself by going with a slightly faster group.

The group kept me going. If everyone else have no problems showing up and putting in the work in dark and cold, I have no excuses not to. When I was in the pain cave during the Jersey Half, that was what going though my head. I am in the deep end, but I owed my 600 mile training cycle a good performance and take responsibility for strategic mistakes early in the race.

As I realized my mess up during the Jersey half, I realized I needed a baseline pace or I would fade. My inner voice said don’t fade, every second counts. So I found couple runners putting down 7:15 miles and making it look like cakewalk. Later I learnt that they were running the marathon. Talking to them helped me get some boost. After that, I found another pace group, and hung with them all the way to the end.

The value of this race as a developing runner is that it answers some lingering questions. How fast am I? Am I capable of taking my progress in training and convert it on race day? Am I training with the right group of people or just tagging along with faster runners for dear life. That’s what this half will mean for me, that I have improved this training cycle and while my strategy and mental game needs work, I can enjoy the following week knowing I made progress. Progress where I used to think there is no way I can hold a 7:09 pace for 13 miles but there is now data to prove otherwise.

So that was the Jersey Half. I am very happy with the result having converted a 10 minute PR. However, I would like to get there next time more gracefully and not feel totally wrecked at the end.