I've been playing with InstantDB and Tanstack Router recently. InstantDB exposes a hook useQuery to fetch data, with a fairly typical { data, error, isLoading } return value. Using useQuery directly in page components means that the component has to handle loading and error states directly, instead of using pendingComponent and errorComponent in the router. One naive approach is to use…
Despite turning 30 last November, I ran my fastest times ever this year: 6.78 in the 60m, 10.55 in the 100m, and 21.26 in the 200m. Indoors, I missed qualifying for USATF nationals by just 0.03s. Outdoors, these were my first PRs since 2022, and my first time cracking 1000 points on the WA scoring tables. The main change? I nearly doubled my sprint volume. From 2022-2024, I averaged about 300…
Tracking a record's last modified time is a common application requirement. In Postgres, a typical implementation might look like this, using a BEFORE UPDATE trigger on a last\_modified\_at column: This works in most cases, but breaks an assumption that's likely made by the application: last\_modified\_at isn't necessarily monotonically increasing, even if the system clock is. This can cause…
Almost four years ago, I wrote a post about the relationship between temperature and speed, finding a linear relationship on 30m fly times with an R² of 0.21. I've kept tracking every rep since then—instead of 150 data points, I now have almost a thousand. I've also gotten more sophisticated with how I estimate fly and acceleration times from single reps that deserves its own blogpost. For now,…
I built a tool that predicts your 100m time given practice results—go check it out! This post details the development process, including data parsing and training and validating the model.
After a disappointing end to my season, I spent some time reflecting on what went wrong and what I can do better this year. The obvious acute answer is the back injury I suffered in March; the other obvious answer is the lack of racing between May and July to keep me sharp.
Most of the posts on this blog are about success. I write about my PRs, my wins, and my accomplishments. I write about the things that I'm proud of. When I write about my failures, I write about setbacks. I write about how they are just temporary roadblocks that make my eventual success that much sweeter. But sometimes failure is just failure.
At some point in our lives, as the story goes, the years start to blur together. As we get more settled in the rhythm of life, as our milestone events recede behind us, the distinction between any two years becomes less and less clear. And one day, we blink, and realize we've spent decades on cruise control. I'm staving off this future as long as I can—and I did so successfully in 2022. Here's…
I moved to Montana this summer. Now, in the dead of winter, I'm paying the price. I thought I'd run in the cold before—I've written about the relationship between temperature and speed. But Montana winters hit different—I'm often outside in single-digit weather with wind chill down into the negative teens. But a man's gotta work out, no matter the temperature, so I've done what I needed to do to…
This year, Adidas entered the superspike game with their Prime SP2. Their athletes found immediate success with the new spike, most notably 2022 world champions Noah Lyles and Shaunae Miller-Uibo. I recently managed to get my hands on a pair of SP2s and put them to the test.
EF Core generates and stores a full snapshot of the database for every migration. For a large data model, like we have at Vesta (come join us!), every migration adds ~15k LOC. Over time, we end up with more migration than application code—in 10 months, we generated over 2 million(!) lines of migration code. All these snapshots significantly impact compile time, and without configuration, makes…
Track has been the most constant part of my life these past few years—through job changes, moves, and a global pandemic, I've hit the track and competed. This year, my preseason started all the way back in September of last year, and I didn't run my last race until the last day of July. And I had a great season! I shaved two tenths off my wind-legal 100m (10.92->10.71) and more than a half second…
At Vesta, we have a multi-tenant application where tenant data is logically separated in our Postgres instance by a tenant\_id column on entity tables. As we've grown, we've had to delete some tenant data. Although I've done it manually a few times in psql, manually deleting rows is dangerous, so I decided to write a script to delete tenants for us. We use EF Core for all of our database…
I'm often asked by non-athletes what my mile time is when I tell them I'm a sprinter. Although there's no true comparison, I've typically used World Athletic's scoring tables to get a relatively close mark. For example, my 100m PR of 10.71 and a mile time of 4:08.41 are both worth 974 points. I've used this calculator based off of the 2017 tables for a long time, but the calculator hasn't been…
Want to convert your own times? Try the 200m Lane Draw Converter → There's a growing consensus within the sprinting world that 200- and 400-meter sprinters have an advantange in the outer lanes. Famously, Wayde van Niekerk ran his world record 400m out of lane 8, and Karsten Warholm is known for preferring lane 7. Surprisingly for such a data-driven culture, there's almost nothing in the current…
Now that it's 2022, I've scored my 2021 predictions. To get slightly bigger samples, I inverted the prediction and predicted probability of <50% predictions—e.g. "Democrats win both Georgia seats: 25%" became "Democrats do not win both Georgia seats: 75%" for scoring purposes.
November was... busy. December will be too. Goal Tracking 🟡 Get 1% faster. 🔴 50% less discretionary spending. I spent about twice as much this month as my average in 2020—between holiday flights, a trip to New York, and Black Friday, I blew my spending record for the year out of the water. 🟡 One hour of solitary free time a day. 🟡 Twice-weekly live conversations with friends.
October was my first full month in Atlanta since May—but I still found a way to get out of town for a couple of weekends. We have more travel upcoming in November and December, which is exciting but also maybe a bit too much. Goal Tracking 🟡 Get 1% faster. I tweaked my hamstring—time will tell how long I'm out, but it seems certain that my training will be affected for at least a couple weeks. 🔴…
One thing role-playing games get right about life is the concept of experience points. To get better at wood chopping, you need to... chop lots of wood. Just like in life—cook a lot and you'll probably get better at cooking. Of course, the fit isn't perfect—lots of Runescape characters are level 99, but not many people become master chefs or elite athletes.
I was recently working in a fairly new React/TypeScript codebase that was growing quickly. Because of its rapid growth, it used the default of relative paths for all local imports. This was becoming a problem for developer experience: relative paths make it harder to reorganize files in a codebase, since the developer making that change will also need to update all of that file's imports. Absolute…
September was eventful! I spent the first part of the month camping in Glacier National Park and driving back to Atlanta. Glacier was gorgeous and a great way to end my time in Montana. We drove back through the northern route, stopping in eastern Montana, Mineapolis, Madison, and Louisville. It was definitely strange re-entering civilization after months in sparsely populated Montana. September…
Last winter, I published Temperature and Speed, which looked at the correlation between my 30-meter fly times and the ambient temperature. Since then, I've gathered a lot more data: I have 49 Freelap-timed fly workouts and 245 reps across 11 months. I've also collected other metrics to help answer some questions I've had about speed: Did I get faster? There's a relatively significant negative…
Multi-factor authentication is becoming increasingly prevalent. Many companies' information security policies require employees to use MFA when available—and it's just good practice.
I've recently been looking into various row-level security schemas for Postgres, and came across this excellent article benchmarking a few different architectures for row-level security. That post shows benchmarks for Postgres 10—three major versions ago. I forked the repo (GitHub), upgraded to Postgres 13, and added a new architecture based on Carl Sverre's comment to see what's changed. I ran…
I think one of the most predictive features for personal happiness is whether you have high-quality hobbies. My friends and acquaintances with hobbies seem consistently happier and more fulfilled than those without, independent of other factors like job satisfaction, financial success, and physical health.
My time in Montana is coming to an end—I'll be spending the next few days camping in Glacier National Park, then heading back down to Atlanta. This past summer really was something special—Livingston and the whole state just have great vibes. Goal Tracking 🟢 Get 1% faster. Not much to say here—I hit this goal and it's the offseason! Since preseason is coming up again, I'll probably change this…
The central concept in James C. Scott's Seeing Like a State is legibility, and how states' desire to make their societies more legible often leads to disaster. Others have detailed the main points of Seeing Like a State far better than I could—please start with those three if you're not familiar (or just read the book, which is excellent!)
Laddered Engineering ability can be boiled down into a single "level". Levels are often based on both current ability and track record, and build on each other--a L4 engineer is expected to fulfill not only L4 expectations, but also those of L1-3. Levels are often used by management for titling and compensation bands. Levels can be either discrete or continuous, though in either case, despite the…
When's the last time you looked around for a new job? If the answer is "more than a year ago", you're doing yourself a disservice. Even if you're happy in your current role, simply looking around offers many benefits.
Another year, another track season. This was my 12th competitive season, and my second training by myself. The 2020 and 2021 seasons melted together for me—with COVID and without meets, I didn't take any time off in between. After my extended taper and after some time away from the track, I'm realizing just how beat down my body had been. My last race of the season resulted in both a PR and…
July was busy: we hosted my parents and some friends in Montana for the first two weeks, I traveled to Des Moines for the USATF Masters Championships, and I'm writing this on the way to Chicago for a bachelor party. With Delta on the rise and lockdowns restarting, this might have been my last chance to see friends in person for a while—I'm glad that I got my travel in now. Goal Tracking 🟢 Get 1%…
Genetics clearly influence sprint performance—but by how much? There are several ways of answering this question. First, we can look for specific genetic variants that have an impact on performance. Second, we can estimate the heritability of speed or speed-related traits like muscular strength, height, and body type with twin and family studies. Finally, we can analyze the demographics of elite…
Last week, I got my hands on a pair of New Balance's sprint spikes for 2021, the FuelCell Sigma SD-X. Although not as hyped as Nike's Air Zoom MaxFly, New Balance's sprint team has been running some ridiculous times in the SD-X: Trayvon Bromell is the fastest man in the world this year, and Sydney McLaughlin set the 400mh world record wearing New Balances. Like other super spikes, the SD-X has an…
I've spent the last couple hours trying to rebuild my mood tracker—although notifications still work, opening the app throws the error "'mood' Is No Longer Available". I think this is because I last built the app a year ago, and apps installed with a paid developer account only last for a year. (Sidenote—it's ridiculously hard to find definitive information about this. Instead, I had to trawl…
Just as I've settled into a pretty good groove in Atlanta, I spent the past few days driving across the country again, this time to Livingston, Montana where I'll be spending the next two months! It's the best time of year to be in Montana, and we absolutely loved it when we visited neighboring Wyoming last fall. Goal Tracking 🟡 Get 1% faster. I raced once in June—a 100 in a rainy 11.05. I only…
Sleep is a competitive advantage: good sleep is associated with improved short and long-term memory, muscle synthesis, and muscle recovery, while sleep deprivation impairs cognitive performance and increases injury risk. Said differently: how much money and time would you spend on a panacea that significantly improves both mental and athletic performance? Because sleep is so important, I've…
Go to any American track meet and you'll notice a striking lack of Asian participants. Since I started running, I've always been one of few, and often the only, Asian runner. Asians are so rare in track meets that I've had more than one conversation about my race with competitors. Why aren't there more Asian-Americans in track? Demographics Asians only represent 5.4% of the overall US population.…
My first month in Atlanta has been a blast: I drove across the country, competed in my first races in 15 months, met some friends in person for the first time in a long time, and am writing this from Charleston where I'm spending Memorial Day! I'm definitely enjoying the change of environment and pace; hopefully it's not just a honeymoon period. Goal Tracking 🟡 Get 1% faster. I ran a FAT PR of…
Managers and leaders often fall into the trap of drowning out their reports' voices with their own. Almost everybody has dealt with or will deal with a micromanagey boss at some point in their career; the loud-mouthed, anal, pointy-haired boss is a stereotype for a reason. Loud leaders cause all sorts of problems for their organization:
5/8: Atlanta Track Club—Spring Track Meet #3 My first official meet in 15 months! It was absolutely phenomenal to compete again after months of solo work. Atlanta Track Club put together an extraordinarily well-organized masters-focused meet. Since they weren't contesting the 200m, I only ran the 100m. 100m: 10.92 (+0.2) The wind cooperated, turning in or favor right before our race. I was strong…
I wrote Part 1 of this post back in February, demonstrating how to measure Next.js bundle sizes with GitHub Actions. Today, I'll walk through how to show a bundle size diff against master:
Be Patient. Measureable improvement takes a long time. Don't vaccilate between training methodologies. Instead, commit to a program for at least one full season before making strategic changes. Listen to your body—don't risk injury. The best ability is availability. It's better to miss a couple reps at the end of a workout than to pop a hamstring and miss weeks or even months.
I'm writing this from Denver—I'm moving to Atlanta! We're driving across the country with a car full of stuff. Packing and moving has reminded me just how much stuff I've accumulated. Even after a few car loads of donations, we're still bringing a lot! Goal Tracking 🟢 Get 1% faster. I ran a 200m time trial early in the month at 22.02. This is a little slower than I've run previously, but it was…
One important difference between junior and senior engineers is that senior engineers take responsibility for the software the team ships. They understand that they are the only line of defense between the company and catastrophic outages, a slow death through tech debt, and losing product-market fit by building the wrong things. Without responsible engineers, teams will ship slower, buggier,…
The dangers of social media and addictive technologies are well-documented. Reactions generally fall into two camps—accepting defeat or attempts at teetotalism. Both of these methods are flawed. But there’s a third approach: use the addictiveness for good.