-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcareer-history.html
272 lines (266 loc) · 32.8 KB
/
career-history.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
<!doctype html>
<html lang="en" class="min-h-full">
<head>
<meta charset="utf-8" />
<link rel="icon" href="./favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="./_app/immutable/assets/0.CdyhV9_Z.css" rel="stylesheet">
<link href="./_app/immutable/assets/NoteGridStatusFilter.eq4K4R-6.css" rel="stylesheet">
<link href="./_app/immutable/assets/MDSveXNoteLayout.fO7cJVK6.css" rel="stylesheet">
<link href="./_app/immutable/assets/4.dlggKTDc.css" rel="stylesheet">
<link rel="modulepreload" href="./_app/immutable/entry/start.GcTRgMDU.js">
<link rel="modulepreload" href="./_app/immutable/chunks/entry.BX1RhRLo.js">
<link rel="modulepreload" href="./_app/immutable/chunks/scheduler.ewBkyc9q.js">
<link rel="modulepreload" href="./_app/immutable/entry/app.BFRNH8s5.js">
<link rel="modulepreload" href="./_app/immutable/chunks/preload-helper.C1FmrZbK.js">
<link rel="modulepreload" href="./_app/immutable/chunks/index.DpmaPz1F.js">
<link rel="modulepreload" href="./_app/immutable/nodes/0.BV4L4bjs.js">
<link rel="modulepreload" href="./_app/immutable/chunks/each.DRjyAD6E.js">
<link rel="modulepreload" href="./_app/immutable/chunks/NoteGridStatusFilter.svelte_svelte_type_style_lang.DWqbp7nv.js">
<link rel="modulepreload" href="./_app/immutable/nodes/4.DFdsAAmG.js"><title>Career History - Allan Deutsch</title><!-- HEAD_svelte-1uu2jgp_START --><!-- HEAD_svelte-1uu2jgp_END --><!-- HEAD_svelte-cpyj77_START --> <meta name="theme-color" content="dark"><!-- HTML_TAG_START --><script nonce="%sveltekit.nonce%">(function setInitialMode(defaultMode, themeColors2) {
const rootEl = document.documentElement;
const mode = localStorage.getItem("mode-watcher-mode") || defaultMode;
const light = mode === "light" || mode === "system" && window.matchMedia("(prefers-color-scheme: light)").matches;
rootEl.classList[light ? "remove" : "add"]("dark");
rootEl.style.colorScheme = light ? "light" : "dark";
if (themeColors2) {
const themeMetaEl = document.querySelector('meta[name="theme-color"]');
if (themeMetaEl) {
themeMetaEl.setAttribute("content", mode === "light" ? themeColors2.light : themeColors2.dark);
}
}
localStorage.setItem("mode-watcher-mode", mode);
})("system", {"dark":"dark","light":"light"});</script><!-- HTML_TAG_END --><!-- HEAD_svelte-cpyj77_END -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=UA-86124920-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-86124920-1');
</script>
</head>
<body
data-sveltekit-preload-data="hover"
data-sveltekit-preload-data="viewport"
class="h-full min-h-[100vh] bg-base-100">
<div style="display: contents"> <div class="h-full min-h-[100dvh]"><div class="toaster svelte-jyff3d" role="alert"> </div> <div class="navbar bg-base-100 print:hidden"><div class="navbar-start"><div class="dropdown"><button tabindex="0" class="btn btn-ghost sm:hidden" data-svelte-h="svelte-o7egld"><svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h8m-8 6h16"></path></svg></button> <ul tabindex="0" class="dropdown-content menu rounded-box menu-sm mt-3 w-52 bg-base-100 p-2 shadow"><li><a href="/">Home</a></li><li><a href="/notes">Notes</a></li><li><a href="/devlog">Devlog</a></li></ul></div> <a class="btn btn-ghost text-xl normal-case" href="/">Allan Deutsch</a></div> <div class="navbar-center hidden sm:flex"><ul class="menu menu-horizontal px-1 text-base"><li><a href="/">Home</a></li><li><a href="/notes">Notes</a></li><li><a href="/devlog">Devlog</a></li></ul></div> <div class="navbar-end"> <div class="h-8" data-svelte-h="svelte-1hosge2"><a href="https://twitter.com/AllanDeutsch" class="group"><svg height="24" width="24" class="mr-1.5 inline fill-base-content transition-colors duration-300 group-hover:fill-primary" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612"><path d="M612 116.258a250.714 250.714 0 01-72.088 19.772c25.929-15.527 45.777-40.155 55.184-69.411-24.322 14.379-51.169 24.82-79.775 30.48-22.907-24.437-55.49-39.658-91.63-39.658-69.334 0-125.551 56.217-125.551 125.513 0 9.828 1.109 19.427 3.251 28.606-104.326-5.24-196.835-55.223-258.75-131.174-10.823 18.51-16.98 40.078-16.98 63.101 0 43.559 22.181 81.993 55.835 104.479a125.556 125.556 0 01-56.867-15.756v1.568c0 60.806 43.291 111.554 100.693 123.104-10.517 2.83-21.607 4.398-33.08 4.398-8.107 0-15.947-.803-23.634-2.333 15.985 49.907 62.336 86.199 117.253 87.194-42.947 33.654-97.099 53.655-155.916 53.655-10.134 0-20.116-.612-29.944-1.721 55.567 35.681 121.536 56.485 192.438 56.485 230.948 0 357.188-191.291 357.188-357.188l-.421-16.253c24.666-17.593 46.005-39.697 62.794-64.861z"></path></svg></a> <a href="https://github.com/masstronaut" class="group"><svg height="24" aria-hidden="true" viewBox="0 0 16 16" version="1.1" width="24" data-view-component="true" class="mr-1.5 inline fill-base-content transition-colors duration-300 group-hover:fill-primary"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path></svg></a></div> </div></div> <div class="h-full p-1 sm:p-4"> <div class="prose mx-auto"><div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h1 class="mt-0" slot="heading" data-svelte-h="svelte-1w77fe4">My Career History</h1> <p slot="content" data-svelte-h="svelte-8ngbou">My intense curiosity has led me down a nonlinear career path. I'm
fortunate that it's afforded me a breadth of experiences across software
development, product management, business strategy, and people. I've
chronicled some of the highlights below in roughly chronological order.</p></div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h2 class="mt-0" slot="heading" data-svelte-h="svelte-1xfpjbl">Digipen, BSCS</h2> <div slot="content" data-svelte-h="svelte-1r5widm"><p>At DigiPen I studied Computer Science and earned my Bachelor of
Science in Computer Science. This is where I began to discovered the
type of work that fulfills me: creating things that make it easier for
others to bring their visions into existence. Some highlights from my
time at DigiPen include:</p> <ul><li>Interned at Microsoft as a Software Engineer and a Product Manager</li> <li>Building 5 game engines from scratch in C and C++</li> <li>Leading multi-discipline game teams for 3 years</li> <li>Mentoring peers and subsequent cohorts as a TA, student lecturer,
and club leader</li> <li>Exhibiting my Junior year game project at Alt.Ctrl.GDC with my team</li> <li>Presented a <a href="https://youtu.be/-8UZhDjgeZU">talk on data structures</a> and a poster on game engine architecture
at CppCon in 2017</li> <li>Participating in the C++ Standards committee in an attempt to add `<a href="https://github.com/Masstronaut/slot_array">slot_map</a>` to the standard library</li></ul></div></div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 class="mt-0" slot="heading" data-svelte-h="svelte-1ep0k8d">Sand Garden</h3> <div slot="content" data-svelte-h="svelte-1tiaewf"><img src="https://img.allandeutsch.com/allandeutschcom-note-images/6450254ffa2f2ea627259d8c91bd6536.png" alt="An early prototype of Sand Garden, showing a box of sand with a TV behind it that renders the game world"> <p>Sand Garden was my Junior year project at DigiPen. At peak, the
team had 15 other people across sound design, game design,
engineering, and art. Sand Garden was a unique project in which
players shape a small world to suit its inhabitants and protect them
from disasters. Players interact by using their hands to manipulate
a real-world box of sand. Some of the challenges I overcame on the
project were:</p> <ul><li>Creating a custom game engine that enabled the whole team to
collaborate effectively within a complex, interwoven system</li> <li>📖 Convincing the school president to allow us to have a box of
sand in a computer lab, and to spend ~$1000 on fancy dirt.</li> <li>📖 Worked with the game projects faculty to get ~half the
certification requirements waived for the game.</li></ul></div></div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-1tpcbqk">Exhibiting at Alt.Ctrl.GDC</h4> <div slot="content" data-svelte-h="svelte-136hgqb"><iframe width="560" height="315" src="https://www.youtube.com/embed/L6aa6X10Ow4?si=KVHkNn8Ezk1lF7CA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> <p>Sand Garden was accepted as a finalist at Alt.Ctrl.GDC, a
competition at the largest game developer conference for games
with "alternate control" schemes.
<br> <a href="https://www.gamedeveloper.com/design/alt-ctrl-gdc-showcase-i-sand-garden-i-" target="_blank">GameDeveloper.com published an interview</a> with
me and another team member about the game.</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-3mmhtu">"It's pretty cool"</h4> <div slot="content" data-svelte-h="svelte-wi4qgl"><img src="https://img.allandeutsch.com/allandeutschcom-note-images/60a9d8c718db1f7f9b9a62cd7b9da8d0.jpeg" alt="A blurry Bill Gates stands by admiring an early Sand Garden build. The janky construction looks like it could fall over at any moment, but everyone is engrossed in the game."> <p>The Summer after my Junior year, some teammates continued to work
on Sand Garden. You can tell from the precarious contraption
towering above them that we were software folks with limited
skills in hardware.
</p><p>If you look closely, you can see the person on the right is Bill
Gates! Bill and his son stopped by to play Sand Garden.
<br>
When asked what he had to say about the game, my teammates informed
me that he had said "it's pretty cool!"</p> <p>Unfortunately, I missed out on my chance to meet Bill Gates while
he played a game I made. I was tragically unavailable because I
was busy working on another game... at Microsoft.</p></div></div> </div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 class="mt-0" slot="heading" data-svelte-h="svelte-12pulhr">Microsoft SWE internship</h3> <div slot="content" data-svelte-h="svelte-1b2896g"><img src="https://img.allandeutsch.com/allandeutschcom-note-images/39df740e01625b08bb5a5e2ea89065c6.png" alt="Cover art for ReCore, an xbox game. It shows the protagonist, Joule, in a sandstorm with a vignette of her robot companions in the bottom left corner."> <p>Microsoft's "Global Game Publishing Division" had a problem: ReCore
needs to ship soon, and it was not ready to go out the door. The
game's performance was particularly problematic, and I was super
excited to dig in and speed things up. among the myriad performance
issues I resolved, a few things stand out:</p> <ul><li>I identified a core loop in AI execution that wasn't utilizing
CPU cache effectively. Fixing this took average per-second AI
execution time from 33ms to 15ms, netting the game 1FPS at a 60FPS
target.</li> <li>Discovered that spawning entities was extremely slow due to the
way models were being loaded. My optimizations reduced total
entity spawning times by 75%.</li> <li>Implemented performance regression test scenarios that made it
easy to catch any further incoming changes that impacted
performance.</li></ul></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 class="mt-0" slot="heading" data-svelte-h="svelte-1dzx9st">Microsoft PM internship</h3> <p slot="content" data-svelte-h="svelte-1wk1iyz">I analyzed our incoming support requests to understand where our
ecosystem was failing developers and investigated 10 other developer
ecosystems to understand what a great one looks like. Then I put
together a strategy for Xbox to get there and worked across
organizations within Microsoft to get alignment on the strategy.</p></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 class="mt-0" slot="heading" data-svelte-h="svelte-46v2b5">C++Con presentation</h3> <div slot="content" data-svelte-h="svelte-1k587te"><iframe width="560" height="315" src="https://www.youtube.com/embed/-8UZhDjgeZU?si=WKaemynGjkO7x3-G" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> <p>I presented a talk on data structures and a poster on game engine
architecture at CppCon in 2017</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 class="mt-0" slot="heading" data-svelte-h="svelte-x3sc4x">Known for Linux, Git, and...</h3> <div slot="content" data-svelte-h="svelte-1qwhgfi"><img src="https://img.allandeutsch.com/allandeutschcom-note-images/99a8f82869993add58655df8a1852751.png" alt="Me standing next to Linus Torvalds, who was wearing a Subsurface shirt. We had just returned to shore from a morning of dives."> <p>If you guessed the SCUBA dive logging software, Subsurface, you got
it! It's Linus Torvalds! After missing my chance to meet Bill Gates,
redemption was mine when I met Linus Torvalds in Hawaii. We both
ditched our families on Thanksgiving morning to go SCUBA diving!</p> <p>This of course has nothing to do with my career, but I wanted to
share the happy ending after the whole Bill Gates fiasco.</p></div></div> </div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h2 class="mt-0" slot="heading" data-svelte-h="svelte-mm7aeo">Microsoft</h2> <div slot="content" data-svelte-h="svelte-kc9ku4"><p>After graduating DigiPen, I returned to Microsoft for 4 years as a
Product Manager. I was fortunate to gain a breadth of experience there
that has continued to serve me in unexpected ways ever since.</p></div></div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 class="mt-0" slot="heading" data-svelte-h="svelte-1ffxell">Game Developer Experience PM</h3> <div slot="content" data-svelte-h="svelte-jt9tte"><p>"Whatever it takes to make sure game developers can successfully
ship great games for the next-generation Xbox console launch."
That's the overarching theme of what I did in this role.</p></div></div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-hp8yfq">Game Engine API Design</h4> <div slot="content" data-svelte-h="svelte-xvwpf0"><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/W3ViIBnTTKA?si=zUvyTt8J3IgG0rBR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> <p>This was a talk I gave at C++Now in 2018, showing how API design
can impact the performance and optimizability of a game engine.
This had become a major problem for Unity, and I proposed a
different way of designing a game engine API that was expressive
and provided ample opportunities for optimization that better
aligns with how hardware works.</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-1av1n7h">A tighter feedback loop</h4> <div slot="content" data-svelte-h="svelte-9uhg9n"><p>Remember a decade ago when detailed order tracking wasn't very
common? I'd buy something online, have no idea when it shipped,
where it was, or when to expect it would be delivered. Then one
day, my package would show up. Yay!</p> <p>That's what it was like for game developers with a support
request. Fine if it's non-blocking and release is far away, or
infuriating if you're supposed to ship in a few days and your
game's Xbox build keeps crashing.</p> <p>We had a couple of separate systems we needed to integrate, but
they had conflicting constraints that made it difficult. The
answer was clear:</p> <img src="https://imgs.xkcd.com/comics/standards.png" alt="an XKCD comic about 14 competing standards. The character proposes a new 15th standard to unify them all, resulting in the new problem of 15 competing standards."> <p>Fortunately, this ended up being a great and extensible solution
for integrating our developer forums to internal task tracking.
The experience improved from a lack of clarity to being
automatically measured and reported internally. The developer
experience improved from a mystery order to a detailed pizza
tracker, which was the inspiration for how support progress was
reported to developers. This was not the last time I would be a
"pizza tracker" in my career.</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-8pwq9u">Read the f@#$ing manual</h4> <div slot="content" data-svelte-h="svelte-1g3qyrl"><p>With better issue tracking set up, a clear problem emerged: the
answers are in the docs, but devs aren't finding them.</p> <p>It didn't take long to find the problem. I couldn't find the
docs! Googling got me nothing. When I gave up, I asked the docs
team and someone showed me how to find a download link for a
compiled HTML file (.chm, pronounced "chum") containing the docs.
Fishy.</p> <p>This thing was undiscoverable, hidden behind an auth wall, and
once I downloaded it I couldn't even search for any text content!
No wonder nobody was finding answers in there.</p> <p>In my naiveté, I thought the solution was obvious: put the docs
on our good docs platform, docs.microsoft.com. Everyone told me it
was impossible. There were certain details that just couldn't be
made public.</p> <p>So I did what any reasonable person would do. I made a
spreadsheet to track every single one of our thousands of doc
pages, figured out who was responsible for each one, and got
explicit sign off for every single page that could be made public.
It took months, but in the end around 95% of the docs were cleared
for release.</p> <p>Now they're public! I also built the first version of the landing
page, which still serves as <a href="https://learn.microsoft.com/en-us/gaming/xbox/">the hub routing Xbox developers to the resources they need</a>. Most importantly, a developer can find them the easy way now:
<img src="https://img.allandeutsch.com/allandeutschcom-note-images/21f4182d53776370653d37f18a21f2ab.png" alt="a google search for 'xbox development documentation' where the top two results are the relevant documentation landing pages on docs.microsoft.com"></p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-wm6a31">No docs, no ship</h4> <div slot="content" data-svelte-h="svelte-19yg3jw"><p>"If a tree falls in the forest and no one is around to hear it,
does it make a sound?"
<br>"If I release a feature and don't tell anyone how to use it
in the docs, is it really released?"</p> <p>The fancy new Xbox features were supposed to make the new games <em>look</em>
and <em>feel</em> new. That only happens when developers use the features!</p> <p>With only 4 writers, the docs team was hopelessly outmatched by
dozens of feature teams cranking out new capabilities for the new
console. Even if we hired a bunch of new writers, we wouldn't be
able to get on top of all the existing and expected docs work.
Something had to change!</p> <p>There was really only one viable path forward after accounting
for budget and timeline constraints. I had to propose the obvious
solution: "Feature teams could write their own docs!" It wasn't a
popular suggestion among the feature team engineering leadership,
but nobody else had a solution.</p> <p>To set the feature teams up for success, I helped the docs team
put together resources to set the feature teams up for success:
templates, examples, training sessions, and a review process. I
worked with release management to make quality docs a gating
factor for releasing features. That's one way to solve the
philosophical question!</p> <p>This approach turned out to be the right solution long-term.
Nobody knows a feature better than its author, and once the dev
had written the meat of a doc they were able to pair with a writer
on making it easier to find and understand. This culture change
resulted in a longer-term trend towards better quality docs and
better docs coverage.</p></div></div> </div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 class="mt-0" slot="heading" data-svelte-h="svelte-cbnuct">Game Developer Services PM</h3> <p slot="content" data-svelte-h="svelte-1vnyu9c">My next chapter at Microsoft was working on Xbox Live and PlayFab.
Officially, I was responsible for 10 services, but Achievements, game
saves, and PlayFab's core were 95% of the work. Much of the work I did
in this role is unfortunately not easy to share as it is deeply
intertwined with sensitive business information protected by NDA.</p></div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-1dir1ol">The right defaults</h4> <div slot="content" data-svelte-h="svelte-4qjdne"><p>Smaller studios were running into issues with configuring their
achievements. Sometimes they would realize it before release,
other times it would be when players weren't getting achievements
they were supposed to. Xbox Achievements are available in two
flavors: <a href="https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/live/features/player-data/achievements/live-achievements-eb-vs-tm">event-based and title-managed</a>. Or more simply: the old complicated way and the new simple way.
Unfortunately, most new titles were choosing the old complicated
way.</p> <p>I did the obvious thing and updated the docs to make this really
easy to figure out. A big banner that says "We recommend using
title-managed Achievements to configure new titles." But of course
nobody reads the docs. No measurable change. What else can be
done?</p> <p>Second time at bat on this problem, I was curious what was going
wrong. I tried setting up a demo title, and found my answer.
Buried in a services config page was a radio selector with
"event-based" pre-selected and "title-managed" underneath.</p> <p>Gave those two the ol' switcheroo and added a link to the docs as
a cherry on top. The measure (support requests) was very lagging,
so it took a months to be sure. Gradually, these configuration
issues declined until months went by without seeing any of them.
The right default made all the difference.</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h4 class="mt-0" slot="heading" data-svelte-h="svelte-5mnquy">Consulting with Ikon Games</h4> <div slot="content" data-svelte-h="svelte-43thxc"><p>Ikon was struggling with an ambitious game project and needed an
infusion of cash and more experience shipping games. I had
identified a market opportunity that was a perfect fit: short,
inexpensive games centered around achievements for the
"Achievement Hunter" audience. We were able to develop an
achievement puzzle concept that leveraged Ikon's existing assets
and ship two games in ~6 months.</p> <p>This bold new product strategy, combined with strategic creator
partnerships proved extremely effective. The studio was able to
reach over 50k viewers and convert ~30% of them. This strategy
produced over 100K in profit for the studio.</p></div></div> </div> </div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h2 class="mt-0" slot="heading" data-svelte-h="svelte-ulilyb">Quantic MBA</h2> <p slot="content" data-svelte-h="svelte-bne9m">Having gone from a technical education to a role at the intersection of
technology and business, I felt that my business side knowledge wasn't
where I wanted it to be. I chose Quantic because of their flexible
scheduling and focus on education outcomes. My MBA began towards the end
of my tenure at Microsoft, and I graduated with honors and a breadth of
understanding about business a year later.</p></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h2 slot="heading" class="mt-0" data-svelte-h="svelte-v5yhtg">Ikigai Technologies</h2> <p slot="content" data-svelte-h="svelte-12l0sf1">I wanted to try working at a smaller company, and Ikigai was a
pre-product startup that presented a perfect opportunity for me to be
more hands-on building a new product. My work was primarily focused on
building an on-chain NFT auction platform that became <a href="https://grabbit.market" target="_blank">grabbit.market</a>. During my time at Ikigai, the company was also working on developing
a data infrastructure solution and two game products.</p></div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 slot="heading" class="mt-0" data-svelte-h="svelte-8e3kbg">Senior Software Engineer</h3> <div slot="content" data-svelte-h="svelte-xsgvp3"><p>Worked with React, NextJS, and MaterialUI in TypeScript to build out
a fine art NFT auction house concept. I worked closely with our
designer and smart contract engineer to build out the end-to-end
auctioning experience.
</p><p>For the fine art niche, there was a ritzy aesthetic we wanted to
deliver on. Working in MaterialUI made this difficult, as it's a
strongly opinionated UI framework that made matching our designs
laborious. Coupled with some other technical decisions, progress was
excruciatingly slow.</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 slot="heading" class="mt-0" data-svelte-h="svelte-1ob93nn">Software Engineering Manager</h3> <div slot="content" data-svelte-h="svelte-1qcsa9n"><p>During a three day hackathon, I teamed up with our smart contract
engineer to see how far we could get with a rewrite using SvelteKit
and Tailwind. We demonstrated enough progress & velocity that we
decided to adopt this stack for the main product. We ended up
shipping features about 5x faster after this change.</p> <p>One of my responsibilities in this role was to hire and onboard new
engineers. I created an efficient process for interviewing
candidates that enabled us to rapidly fill roles as quickly as 1
week from open req to start date. My team grew to be responsible for
the entire auction product as well as DevOps and smart contracts
across all 4 products.</p> <p>Our code review process was slow and manual. I set up Vercel to
build and deploy all PR branches. This made it possible to get
asynchronous design reviews and build confidence in the deployment
among engineers. The lower cognitive load of reviewing helped us
accelerate average PR reviews from 3 days to <1 day. It also
helped us catch design issues before they hit prod.</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h3 slot="heading" class="mt-0" data-svelte-h="svelte-4spzdb">Head of Engineering & Product</h3> <div slot="content" data-svelte-h="svelte-1q6yi9d"><p>In this role my responsibilities expanded broadly to work across the
company to ensure the Grabbit marketplace is successful. Some of my
initiatives were:</p> <ul><li>Partnering with BizDev to create a community accelerator program
to help artist partners launch collections on Grabbit</li> <li>Fostering a more collaborative culture to improve the product,
such as through cross-discipline pairing sessions</li> <li>Driving for excellence in engineering practices and rituals that
led to 100% of releases having no major issues</li></ul> <p>The company ran out of money, and I saw the opportunity to take
what I'd learned and try my hand at building software independently.</p></div></div> </div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h2 slot="heading" class="mt-0" data-svelte-h="svelte-1p39h27">Doc Duck</h2> <div slot="content" data-svelte-h="svelte-1usswi2"><p>It was a meandering path, but I found my way to the niche of docs
feedback with <a href="https://docduck.dev/">Doc Duck</a>. Some of the
more interesting technical problems include:</p> <ul><li>Creating a frontend-agnostic widget for collecting documentation
feedback</li> <li>Developing a custom auth system with the security of session-based
auth and the flexibility to mint JWTs that enable an asymmetric doc
experience</li></ul> <p>As a solo founder, I've also conducted all the discovery calls, built
the landing page, admin dashboard, APIs, etc.</p></div></div> </div> <div class="node svelte-19eh20r"><div class="mb-8 inline-block rounded-md border border-slate-100 p-6 svelte-19eh20r"><h2 slot="heading" class="mt-0" data-svelte-h="svelte-16151y9">SeattleJS Community Organizer</h2> <div slot="content" data-svelte-h="svelte-mpgfzw"><p>Being a solo founder has been very lonely, and I was fortunate to
find the SeattleJS community. It's been an opportunity to share
learnings, mentor new developers, and build a community I'm thrilled
to be part of. Recently, I've become an organizer and had some great
early wins:</p> <ul><li>Doubled YoY attendance at the first meetup I organized</li> <li>Improved my leadership skills through coaching</li> <li>Currently organizing an event in collaboration with TC39</li></ul></div></div> </div> </div></div></div></div>
<script>
{
__sveltekit_dy12v2 = {
base: new URL(".", location).pathname.slice(0, -1)
};
const element = document.currentScript.parentElement;
const data = [null,null];
Promise.all([
import("./_app/immutable/entry/start.GcTRgMDU.js"),
import("./_app/immutable/entry/app.BFRNH8s5.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 4],
data,
form: null,
error: null
});
});
}
</script>
</div>
</body>
</html>