Heya!

I'm David, a cooking, biking, photographing skilled whiteboarder (and software engineer!)

Programmer Systems Architect NYC
§ 01 — About

About Me

I've always loved working with computers. From simple Batch scripts in Pre-K to running one of the world's most popular Minecraft servers, I've had a deep passion for the crossroads of computing, creativity, and community.

Software engineering became my way to translate these ideas in my head to reality—from glue to keep game servers running to early machine-learning concepts for community moderation.

Nowadays, I work at Broadcom (née VMware, Pivotal) helping clients solve all sorts of technical and human challenges. From cloud platform buildouts, to solving megascale hurdles, or even starting training bootcamps, nothing is 'not my job'.

I practice Extreme Programming, focusing with User-Centered Design, and implementing with pair programming and test-driven development. I have strong opinions about platforms as products.

Also: a lot of bad bird & astro pictures, bike rides, and a Cannonball attempt.

Based: NYC · Stack: Go / Python / Java · 10+ yrs
§ 03 — Photography

Recently Seen

Can't say I'm a good photographer, but I do find it a lot of fun :)

14 photos · last updated May 2026
§ 04 — Projects

Personal Projects

§ 05 — Writing

Recent Writings

§ 06 — Hello?

Let's build something. Or just say hi.

I read every email, usually within a day or two. Happy to talk about any technical issue you're facing, or if you just wanted to chat about something.

Welcome my canvas.
Everything is laid out in space. Drag to roam, scroll to zoom, or use the nav up top to teleport.
currently planning a wedding, please send any info/tips to [email protected] :)
Tip: press 0 to reset the view if you get lost.
This is one of a few custom expansions, which includes a meta-pile (similar to Knights) of cocktails.
Full card art was a really important UI decision for me; other online variants only offer chopped-off editions.
Competitive games use OpenSkill for rank ratings, leveraging the PluckettLuce aglorithm
Achievements for common, rare, or challenges. They award points, which are exchangeable at an in-game shop for player profile cosmetics or custom SFX that fires when marquee cards are purchased during gameplay.
An achievement for an in-house rule: VP ties are solved via a coin toss if both players accept.
Dawg (not mine)
Dawg (not mine)
Car camping!
Car camping!
Dominion: In-Game
Overview of a Dominion Profile
Cocktails, a custom meta-card for a stack pile, similar to Knights
Avatar of Matthew
Avatar of Francesco
Dominion Behelit
README

Dominion online

My friends and I really like the card game Dominion. There are already official online offerings of Dominion, but we like playing with house rules, custom printed cards, and competitive matches with rewards. In addition, I thought the UX of the existing online Dominion services were a bit difficult. So, I set out to make my own.

I built a verb-based engine where every Dominion card is expressed as a composition of low-level primitives (called verbs for common actions, like gain_card or trash_card. Cards register themselves via decorators into a central dispatch registry, which are looked up by the core engine loop as events come in. Branching, multi-step interactions (i.e. "trash a card, then gain a card costing $2 more than it") collapse into an atomic state machine installed as a "pending action", pausing the game loop while the nested action completes.

The payoff of this architecture is its' extensibility; adding a new card, a full custom expansion, or a house rule is a single decorated function leveraging these API-like verbs—no changes to the engine required.

status: active | 2026
  • Python
  • Flask
  • React
  • Javascript
  • Jotai
aspects.py
avatar_of_matthew
David Lohle Untitled 96 · 2026
50%
RESET
MINIMAP
x: 0 · y: 0
DRAG to roam · SCROLL to zoom · 0 to reset
Writing·Platforms as products

On Platforms as a Product

Nearly a decade on, treating your platform as a product is more important than ever.

The first internal platform I ever loved had a logo. Someone on the team had drawn it in Sketch over a long weekend—a little mascot with a name, and printed stickers you could put on your laptop. There was a Slack channel where the team triaged feature requests like a customer support queue. There was a roadmap. There were weekly reviews with users.

Technically, nothing about it was remarkable. But every product engineer in the building knew its name, knew who built it, and spoke about it as if it were a thing. They didn’t know, nor care, that it was a Concourse pipeline that pushes .jars to VMs. The technical details didn’t matter: it was a thing, with a personality, a team behind it, and a Slack channel where you could ask questions or submit feedback and someone would actually answer.

In short, this team did what we always do and built an abstraction layer. But, rather than it being a technical one, it was more of a human one: a brand. This was, and is, the whole trick.

A business within a business

The pitch for treating your internal platform like a product is not complicated. You have engineers who write applications, and you have engineers who provide the runtime those applications execute on. The runtime team’s customers are the application team. Their job is to make those customers’ lives easy enough that they’d choose your platform if it were one of three options on a procurement spreadsheet—usually against some GCP or AWS solutions. They’d want your platform, because word-of-mouth has told them how easy ACME Roadrunner (dumb example, sorry) is to use, or how cost-effective it is. Running it as a product increases user satifaction, and giving it a brand gives users something to tie that satisfaction to.

So: run it like a product. Give the team a name. Let them brand it. Let them solicit feedback. Let them say no to feature requests that don’t fit (who wants an omelette at a steakhouse?). Let them measure things—adoption, time-to-first-deploy, p99 of the time it takes to get a change into production, and report those numbers up the chain the way a product team would report DAU. Let SRE handle reliability the way a product team handles uptime. Let the platform team be proud of the thing they’ve made.

The symbiotic relationship is the point. Product engineers get to stop thinking about the runtime, which frees them to do the work they were hired for. Platform engineers get a sense of ownership—this is mine, I made this, my name is on it—which is the single most reliable motivator I’ve ever seen in a software team. Everybody gets to be good at their job because everybody gets to do their job.

The Pivot

I spent my formative years at Pivotal, a deeply XP shop: pair programming all day, TDD, pizza-box-size teams, and user-centered design applied to literally everything, including the internal tooling. The thing that impacted me the most is that “user-centered design” doesn’t stop at the external boundary of your product. Your colleagues are users. Your platform team’s users are the application engineers two desks over. The same discipline applies: talk to them, watch them work, find out where the friction is, and ship something that removes it.

The other thing Pivotal taught me—and I am still trying to articulate this properly a decade later—is that engagement matters. Engineers are creatives that want to build. The ones who feel like their work has a name, an audience, and a reputation are engaged and outperform the engineers who feel like they are filling in a Jira board, every single time. The internal platform team that has a logo and a roadmap and a Slack channel full of opinionated users is the one that ships. The team that is the “infrastructure org, second floor” is the one that’s constantly underwater.

You hired great engineers. The bet has already been placed. The only remaining question is whether the structure around them lets them do great work, or whether it grinds them down into ticket-closers.

The alternative is crashing out

The opposite of “platform as product” is “platform as cost center.” A cost center has no users. It has tickets: soulless, agency-robbing, eyes-glazed-over tickets.

I’ve spent so much time with under-resourced and under-empowered platform teams. They have all the responsibilities of running production but none of the agency to fix the things they know are broken. They cannot say no to feature requests. They cannot prioritize. They are measured on uptime but not on the experience of the people they serve. They are, in effect, an internal vendor whose customers can’t fire them. And in turn, they’ve become deeply cynical, disengaged, and burned out.

This is a particular kind of misery, but it’s solvable. Not by hiring more people, or buying another vendor product; but by giving the team a product to own. By letting them say no. By giving them KPIs that reflect the experience of their users, not the number of tickets in the backlog. By letting them put a logo on a sticker and hand it out at all-hands.

I completely get how silly this sounds. A logo? Stickers? The vibe of a startup-within-a-startup? Yes. All of it. It works. I have watched it work at countless companies now, and the variance in outcomes between “the platform team has a brand” and “the platform team has a Confluence page” is, no exaggeration, the difference between a company that can pivot when the wind changes and one that cannot.

That’s the real prize: a company whose platform engineers are proud of what they’ve built is a company whose application engineers can focus on the application. Which is to say: a company that can move. When the market shifts, when the customers shift, when somebody at the top says “we need to do X by Q3”—the company with the good internal platform can. The company without one is going to spend the first two months of Q3 arguing about whose Kubernetes cluster the new service goes on.

The platform is the substrate of the company’s ability to change. Treat it like a product. Give it a name. Let the team be proud.