My time at Microsoft

Note: This is not prescriptive advice. It is not meant to be read as: "How to land a job at Microsoft." It simply covers my meandering path which led there, and what I have been up to since. I honestly think my experience was probably a bit of an outlier; right place, right time. But hey, we all play the cards we are dealt.

A few weeks ago, I was catching up with Nate Klaiber over Zoom when he asked me how long I have been at Microsoft. I started to say: "I am coming up on year two," then I realized: No. Actually, I am nearly at the three-year mark. Given that I originally intended to chronicle my experience after having been on the job for one year, I figured this was as good a time as any to write a recap.

So, where to begin?


Backstory & interview

Initially, I was a bit incredulous when Rob Eisenberg — whom I knew from working at InVision — pinged me about the possibility in April of 2021. I would describe it as being asked: "How would you like to be considered for the first human mission to Mars?" As cool as it sounded, I considered myself woefully unqualified. I told him he could throw my name in the hat, but honestly did not expect anything to come of it. I was generally contented working for Reaktiv at the time.

Shortly thereafter, I found myself interviewing with Darren Laybourn. He was heading up a newly formed incubation team that reported to the Office of the CTO (OCTO for short), working on special projects that could possibly become real shippable products. At the time, they were ramping up efforts for multiplayer games within Microsoft Teams calls.

Darren struck me as someone who did not take himself too seriously, but was committed to ideation and moving fast. I recall a part of our conversation went something like this.

Nathan: "So, you are currently building Teams games. How many people work on the team?"

Darren: "On any given day, probably half. Because the rest of the time we are play testing."

His jovial attitude set me at ease. I shared with him the story of Stacey King, who as an NBA rookie came off the bench and made 1/2 free throws. It just so happened to be the same evening when Michael Jordan had scored 69 points himself. King was quoted as having said this after the game.

"I will always remember this as the night that Michael Jordan and I combined to score seventy points."

Source

I told him that I was not certain how much value I would be able to add to the team — by way of level-setting expectations — but that we could metaphorically combine our efforts to accumulate points. That must have resonated because after interviewing with a few other would-be coworkers, I was eventually offered the job.


Spelunking in Teams

When I initially joined, I had the opportunity to work on Microsoft Teams itself. This was due to some creative accounting, where our roles were partially funded through OCTO and the rest of the budget was covered by the Teams organization. A deal had been struck to provide two principal engineers at 50% allocation for several months, but the arrangement ended up morphing into one principal dev (me) for twice as long. That freed up another coworker who was more integral to our incubation project, whereas I was fresh on the team and more easily distributed across the two organizations.

It was an interesting induction into a large codebase. I am not at liberty to get into specifics, but suffice it to say it is one of the more complex apps I have dipped my toes into. The sheer number of feature flags being tested at any given time was staggering to think about. I know that enterprise apps tend to be the punchline of usability jokes — some of which I have made myself — but there were plenty of hardworking folks doing their level best. Teams might not be a perfect app, yet the uptake in usage has been astounding.

There was one rather humorous moment that hopefully is okay to share publicly. I had been writing up internal wiki pages, documenting how I thought things worked — as best as I could surmise by reverse engineering the existing code — and then running that by the other devs who worked full-time in the Teams org. Sometimes they would offer correction, and would occasionally say I had uncovered areas that could be refactored.

The funny incident was this. A dev from a tangential team reached out to tell me that one of my "spec" documents seemed incomplete. They wanted to schedule a chat, because they had questions about how a new feature should be implemented. During that call, I came to learn that due to the thoroughness of the documentation I had been writing — simply for my own edification, to formulate my thoughts and check for accuracy of understanding — that other devs within the Teams org had begun to circulate the URL as a resource to explain the inner workings of the functionality.


Incubation projects

In terms of the job I was hired to do, it was a mixed bag of endeavors. Initially, the team had begun by building turn-based multiplayer games. These were written using React. That approach worked well, as long as only one player was making changes to shared game state at a time. React is "good enough" when creating interfaces that do not need to be highly performant. But I digress, we will come back to that.

In addition to refactoring and perf tuning a few existing titles, I built multiplayer video game versions of several tabletop games. Here are a few highlights.

Otrio

This game is best described as 3D tic-tac-toe. Up to four players have three circular pieces of each size.

  • S = Small
  • M = Medium
  • L = Large

This game could be won by accumulating three pieces, in a variety of arrangements: columns, rows, or diagonally.

  • S S S = All small
  • M M M = All medium
  • L L L = All large
  • S M L = Ascending
  • L M S = Descending

^ For the ascending and descending cases, those could be achieved by stacking all three sizes in one area of the board. Meaning, concentric circles count as completion.

Bonsai

I partnered up with Chris Kahrs who was on another OCTO team, incubating the Bonsai AI project. The idea was to have some cross-team knowledge sharing to see what might come of it. This was an interesting foray into the fascinating world of machine learning. We ended up teaching a "Bonsai brain" how to play Otrio.

I created a Node.js version of the game, which could run with UI or headless. Chris bundled that into a Docker container, which could be deployed to Azure cloud. We eventually pitted adversarial AI playing against itself, where a previous incumbent would face a new challenger.

We realized that the AI was exhibiting a "lazy brain," in that it was settling for a tie when a win was within reach. We adjusted the weights for rewards, to further incentivize the AI to play better. I implemented action masking to aid in reinforcement learning. Eventually, the AI got to the point where if it was allowed to play the first move it was nearly impossible to beat. It exhibited a preference for playing a medium-sized piece in the center of the board, the best way to maximize options.

Bedlam

This is a self-deprecating, satirical "inside baseball" game about being a Microsoft employee. You could think of it a bit like Apples to Apples, but specifically for corporate America.

This game was created as a physical card deck by KC Lemson, who was one of the product managers when I joined the team. One of the first things she did was send me a set of playing cards, to welcome me to the company.

Unlike the real-world game — instead of there being one judge who picks their favorite of all the cards proposed by each player — the video game version democratized the process by allowing each player to vote. With the caveat that one could not vote for their own card.

A React version started as a hackathon project, and was where we first began to uncover concurrency issues with multiple players updating their own "participant state." These updates were triggered by users playing cards from their hand, voting for a card, and changing their vote.

Eventually, I rewrote the game in Svelte. It is a modern JavaScript framework, unincumbered by React's "virtual DOM" and state queuing update model. This worked noticeably better than when the game was first built. So much so, that we decided to move away from React for newer games going forward.


Promotion

Believe it or not, until working at Microsoft I had never received a promotion. All other career progression had essentially come from being stolen away by another employer. Don't get me wrong, I have been given incremental raises. Yet at most companies where I had varying degrees of success, the paths available for promotion invariably led towards a management track. I would jokingly tell my managers: "Just pencil in that Nathan has no discernible climbing aspirations." This quote from the movie Heat says it well.

"For me, the action is the juice."

Source

During a 1:1 chat with my manager — the aforementioned Darren Laybourn — he casually broached the subject. At first, I was worried.

Darren: "Have you checked your bank account lately?"

Nathan: "No, why. Is something wrong with direct deposit?"

Darren: "Oh, I was just wondering if your promotion has been processed."

The short of it is, he felt like I was under-leveled relative to the amount of throughput I was producing. He made the case that I should be bumped up to the next pay band tier. Though my job title "principal software engineer" remained the same, it was nice to be serendipitously recognized with a promotion for which I did not even know I was eligible.


Games for Work

In October of 2022, we reached a crossroads. As far as OCTO was concerned, our project had matured to the point where we had "graduated" beyond the incubation stage. It also happened to be a tumultuous time in the tech industry with many companies doing layoffs, including Microsoft. We had a re-org reduction in force, and several team members opted to disperse to other available roles within the company. Thankfully, a subset of our team landed within the Xbox organization under the banner of Microsoft Casual Games Studio (aka MCG).

In preparation for launching the app we had been incubating, we pared down the number of titles we had in progress. Sadly, neither Bedlam nor Otrio fit the "massively single-player" criteria and have since been discontinued. We had referred to the overarching app as Arcade internally but it was dubbed Games for Work when released.

The app shipped with four total games, including one I built called IceBreakers. It was the brainchild of our product manager Nadia Fortini. She had the idea to crowdsource content from fellow employees — writing a good chunk of it herself — in exchange for getting one's name in the game credits. That is honestly one of my favorite aspects of IceBreakers, the fact that so many people came together to author its many witticisms.

If you are curious, here is a Washington Post article and an official video clip.

https://wapo.st/3tAZGMi

https://youtu.be/zdzZm7GuVts

I had first built IceBreakers using Svelte but later was convinced by my coworker Cody Lindley to try SolidJS. About two weeks into building another game using Solid, I basically said: "Dang it, you were right. Solid is objectively easier to work with than Svelte." After the launch, I rewrote IceBreakers using Solid. That is now our JavaScript framework of choice for building new apps. I also rewrote the game launcher from React to Solid as well. That resulted in an app that was not only more performant, but a codebase that was far less complicated.


Screenshots

Kudos to my designer coworker Cameron Cowles for doing a great job making IceBreakers feel fun and engaging. These static images don't quite do justice to the animations he cooked up. They were a bit tricky to implement but worth it in the end.

IceBreakers: Start screen

IceBreakers: Start screen

IceBreakers: Would you rather

IceBreakers: "Would you rather" mode

IceBreakers: Hot takes

IceBreakers: "Hot takes" mode

IceBreakers: Never have I ever

IceBreakers: "Never have I ever" mode

IceBreakers: Credits modal

IceBreakers: Credits modal

Other miscellany

Beyond what I have already covered, here is a quick rundown of other things worth noting.

  • We use Vite for localhost development and builds, paired with Vitest for unit testing.

  • For end-to-end integration tests we use Playwright. This allows us to scale up tests with hundreds of fake users via Selenium Grid.

  • Recently, we have begun using Panda CSS for styling apps built in SolidJS. It is sort of "Tailwind in reverse," in that it generates class names once for each key/value pair of an object literal. Meaning, there would only ever be a single definition of something like font-weight: bold. The result is more terse CSS file compilation than repetitious style rules.

  • For word lookup from within the Games for Work version of Wordament, I built a little micro site that uses the Oxford Dictionaries API. This is the same API that is used in Bing results when searching for a definition.

  • I have become somewhat familiar with implementing Xandr advertisements. When we eventually launch more game titles outside of Teams — which has a moratorium on in-app monetization — this will likely be an important factor.

  • Each of the devs on our four-person team takes a turn in the on-call rotation. This has stretched me beyond my normal UX and front-end comfort zone, occasionally jumping into telemetry logs to ascertain the cause of alerts.


What's next?

We are currently working on a few things that I cannot share yet. One of my server-side dev coworkers spent the past few months building a really cool flat-file API that allows our team to make requests to JSON endpoints for potentially thousands of files. We are using it for a new in-progress game. It has the dual benefit of costing less than cloud computing, as well as being extremely fast down the wire. Plus, this means we can deploy single-page apps to CDN edge servers.

From a career standpoint, I am not exactly sure what the future holds. For now it seems that my job at Microsoft is relatively safe. It has been a blast so far, and I am glad to be somewhere that offers an individual contributor path.

If you feel so inclined, follow me on LinkedIn where I occasionally post other tidbits and updates.