On People-Watching

Wed, 30 Apr 2025

I live in a high-rise across the street from a strip mall. The cornerstone of the mall is a large grocery store, so the parking lot is busy all hours of the day. A strange thing happens with sound high above ground level; it echoes or resonates somehow, and even while indoors I can often hear conversations from below as if I were standing right next to its unknowing participants. I assume most people haven’t lived in a high-rise across the street from a busy lot, and like my past self, have no idea that their words are being projected for an array of tenants to hear.

I live in a high-rise across the street from a strip mall. Often I find myself watching the cars weaving through the parking lot, and the pedestrians maneuvering around them. The cars and the people driving them form a collective organism, whose behavior arises not from synaptic impulses but from traffic laws and the layout of parking spots. If you’ve never sat and watched something like this, you might at first be nervous that someone is going to get hit. From this vantage point it’s easy to see that a car coming around the corner cannot see a pedestrian coming around the other side. It doesn’t seem to matter; the car is always going slow enough, the driver and pedestrian aware enough, that one of them is able to move out of the way. But to be certain, accidents like these do happen, an aneurysm in the hivemind; sometimes I feel like shouting a warning, as if my bird’s-eye-view bestows a responsibility to the safety of the population below. I never do.

I live in a high-rise across the street from a strip mall. During the day, if I’m watching from indoors, it is practically impossible for any of them to know I’m there, as the glare from the sun off of my windows would obscure me from view, even on the unlikely chance anyone would look up to see if anyone is watching them. In that moment, I am a pure observer—as unwilling to affect the subject as I am incapable. That’s an unusually rare position, to observe something so real. We spend the bulk of our days observing our family, our friends, our screens, always an active participant. Everything else was formed by you and curated for your taste. Not this—these are people in their default state, running errands, certainly aware that they are being watched by someone somewhere, but numb enough that it could not possibly affect their behavior. Yet in a way, it feels like this parking lot is curated for me, too.

I live in a high-rise across the street from a strip mall. The balcony is ten stories up, and the risk of falling off of it is impossible to ignore. The ground below is concrete and asphalt; a fall would be certain death. I have no reason to believe this will happen, accidentally or otherwise; there is a sturdy rail that I don’t make a habit of leaning over. Its threat is benign and ever-present. When I focus on a group of people having a conversation below, I feel compelled to jump down, magnetically drawn to be part of it, as if I belong down there and not up here. I think about how nice it would be to freefall for those precious few seconds before the ground catches up with me.

I live in a high-rise across the street from a strip mall. In the far corner sits a seedy bar whose patrons, as best I can gather, are there because they don’t have anything better to do. At night when the rest of the mall is empty and there is little traffic on the road, it’s easy to be distracted by their conversations, often enhanced in volume by their drunkenness. Sometimes I wonder if the yelling I’m hearing is motivated by anger, passion or both. Sometimes it’s easy to tell. I wonder if the woman yelling at a man as she walks away from him is annoyed with her husband or regretful of a first date. I wonder what the man being beaten on the ground by a group of five others did to deserve it. I wonder what the woman sitting with him waiting for the ambulance thinks. I wonder if it would have happened if they knew someone was watching.

I live in a high-rise across the street from a strip mall. Behind it is another apartment complex, larger than my own and with more windows. But I have something they don’t—a clear, unobstructed view of the mall’s parking lot. Behind it is the parking lot for the apartment building, which appears a lot calmer. I wonder if they can hear the calamity and wish they could see what I’m seeing. I feel grateful. I can see into their windows, too, of course, if the lights are on and it’s dark enough. I make out shadows pacing around, nondescript figures standing in doorways, faceless construction workers on the roof. I wonder if they think about the reverse panopticon sitting alongside them and how any one of a hundred different people could be observing them at any moment. I wonder if they wonder the same about us.

I live in a high-rise across the street from a strip mall. In a month, I will not. I watch the parking lot differently now. If it’s an organism then its cells replace themselves several hundred times a day, a steady stream of vehicles arriving and departing for hours on end. I may not have ever seen the same person twice, and it’s certain that many of the people I’ve seen there are now dead. But every day, it feels like the same thing I’ve looked at every day for five years. It looks the same, it sounds the same, it behaves the same. In five years again, this strip mall will stand here, each day bearing witness to hundreds of unique individuals but always the same collectiv. I wish I could take it with me, not the mall or the parking lot or the cars or people in it, but the spectacle. This pastime, to just sit and watch something so natural and predictable, and this position to observe so neutrally. Of course I cannot. But I will certainly miss the feeling of standing here, getting a glimpse into so many lives, watching such raw, natural existence. The parking lot will go on the same without me, but I, in some way, will not go on the same without it.

  • Personal
  • Essay
Read more

So, I'm a web developer... now what?

Sat, 21 Oct 2023

It’s been over a year now since I lost my big tech job and began my transition into web development. The majority of my then-7-year career was spent working in low-level languages like C++ and worrying about problems like memory leaks and cycle-level performance. I still couldn’t tell you how I ended up with those kinds of jobs, but once I did, it was a struggle to get out; that’s what I had experience in and so that’s what I could get hired to do. Granted, I never really tried, but I never truly loved working in that environment the way I loved making projects for the web (which I spent a lot of my free time doing).

Well, I’m happy to say that, after almost a year of professional development and job searching, I’ve now settled into a job in which I’m nominally a web developer, but I spend a lot of my time doing app development and setting up web infra too—I’m fine with this since web infra tooling is great nowadays (I’m not actually writing the infra, after all) and with frameworks like Cordova and React Native, apps are basically just websites anyway. But the main point: I achieved what I set out to do over a year ago. I proved myself enough to convince someone to hire me to make websites and now I’m doing it! So what’s the verdict? Was it worth it? Did I actually enjoy building websites or was I just excited and fulfilled by greenfield personal projects? Does the day-to-day tedium of professional coding crush my soul just the same, or was it really the type of work that got to me? Am I really having a better time than I was at previous jobs?

…Yes, oh my god yes. I don’t know the last time I thought about memory allocation or the rule of five and I am significantly happier for it. More power to you if you’re a low-level engineer—there are certainly aspects of it that I liked and I’m sure I haven’t written my last line of C++ yet—but, by and large, that type of coding is not for me. The web space is exciting, constantly changing, constantly improving. It breeds creativity in a way that low-level coding just doesn’t. Even if all I’m doing is executing someone else’s design, finding all the best ways to make things look right is like a puzzle that is, to me, very satisfying to solve.

Sure, the honeymoon phase is over, but that just makes me more confident in saying this was the right choice. I spent the first weekend after I started thinking about how I was going to restructure the code on the first project I worked on. I firmly believe in work/life separation, but I literally couldn’t help it. I was just too excited about my work. I’m even still finding time to work on projects in my free time, which is more than I can say about working anywhere else. I recently ported someone else’s web project to Vue, and it took me about a week. I basically spent all of my off hours working on this until I finished it, and I have no idea where that motivation came from, but I can tell you I definitely would not have had it if I spent my work days hating the code I was writing.

So will it last? You can never really know, but I think so, yeah. One of the biggest benefits of my current job is that we take on a lot of projects, which means I have a pretty low chance of getting burnt out from working on the same thing for years at a time. In the 6 months I’ve been there, I’ve worked on 3 or 4 main projects on a consistent rotation, and more odd jobs in the interim. Lots of people would hate that style and I totally get why, but I love the variety. But even if it wasn’t for that, the actual work I do on a given day is so much more enjoyable for me that I think I’d have a harder time burning out anyway.

I was very lucky—extremely, cosmically lucky—to be afforded the chance to take so much time off of work to put in the hours I needed to pivot career paths, and I’m grateful for it every day. There were certainly times I thought about how easily I could have gotten a similar job and stopped worrying about it earlier. But now that I’ve come out on the other end, I can say that despite everything, it was 100% worth it. If you find yourself wishing you were doing something else, and there’s any way at all you can give it a shot comfortably, do yourself a favor and go for it.

  • Professional
  • Career
Read more

The Unbearable Lightness of Job Searching

Sat, 25 Feb 2023

Most of us are familiar with job searching to some extent. If you haven’t, you’re either supremely lucky or you’re too young to worry about it yet, in which case you should click off this post right now because I don’t want to give you a needlessly pessimistic view of the world. I’ve been in the mire of job searching for a while now, and while I totally recognize that my feelings are tainted by my current situation, it doesn’t change how I’m feeling now.

I play a game called RuneScape from time to time. One of the things to do in that game is to fight a boss for a 1/x chance of getting a specific item from it, usually a pretty low chance like 1/128 or 1/300. It’s purely random—nothing you do can affect your chances each kill. (It’s kind of like gambling, but without the really big downside.) I bring this up because it’s common for players to invoke the gambler’s fallacy when grinding for a specific drop. “I’ve killed the boss 500 times already, I must be getting close!” Mathematically savvy players point out that you are of course no closer to getting the item after killing the boss 500 times than you were at the beginning of the journey. It’s just a dice roll, and the dice have no memory.

But in my experience, it’s really, really, really hard not to feel like they do. Of course I’m closer, look at all this progress I’ve made! 500 attempts at a 1/300 event means I’m due almost twice over—it must be coming soon! I know in my head that it’s wrong, but I can’t stop myself from feeling that it’s right.


I bring it up because job searching is much the same. Applying for a job is a roll of the dice. There are things you can do to affect your chances of succeeding at a job application, of course, but if it’s a public posting, there are a lot of other applicants; you (statistically speaking) probably don’t stand out from the pack too much. And even if there were a way to seriously affect your chances with any given job listing—maybe your cover letter skills are out of this world—you still don’t know whether the company is a good fit for you or vice versa. If you keep applying, you will eventually get something. But those failed applications are, broadly, not helping you succeed at future ones. If you feel that all the jobs you applied for and didn’t get constitute progress towards getting hired, you are a victim of the gambler’s fallacy.

That’s a tough place to be in a position where we’re told merits matter. If you’re hard-working, if you’re good at your job, if you have the experience and the skills, you’ll get hired. But when there are orders of magnitude more applicants than available positions, probability takes over. Suddenly there are a whole lot of people who deserve a job, for whatever that means, and are having a hell of a time finding one. It’s easy to start feeling like you’re doing something wrong, or that you aren’t good enough.


The Unbearable Lightness of Being is a Czech novel from 1984 by Milan Kundera. He draws on Nietzsche’s teachings about the “heaviness” of eternal life—the burden of the eternal consequences of your actions—and rebuts that because we in fact live only one life, there is a cosmic absence of burden on mankind. We become lighter than air, our movements as free as they are insignificant. If we only have one life to live, might we as well not have lived at all?

A complete lack of burden can have the same effect as a massive one. Can I truly go to sleep happy after a long day of applying for jobs, knowing that unless one of them pans out (and the low chance of that happening), I might as well not have done anything at all? It is not a burden, but a lightness. If I were burdened I would know how to lift it, and I could work to achieve that. As it stands, I can’t. I can do things that feel like I’m working towards something. But what I’m really doing is pulling the handle of a slot machine and hoping something comes out. I’m rubbing my hands and blowing on the dice as much as I can, just like all the best gamblers, but just like all the best gamblers my odds of success are about the same as everyone else’s.


What I don’t have in common with most gamblers is the ability to stop. When a gambler resigns themselves to the statistics and quits, they get to go home. I don’t get to do that, because I have a ticking time bomb above my head at all times equal to the amount of money in my bank account, and when it hits zero my entire life detonates. I have no logical choice but to keep gambling, each failed attempt leaving me wondering what I’m doing wrong or why I’m not good enough. The truth is, of course, that most job applications don’t work out. They can’t. I can tell you with certainty I’ve never bombed a job interview hard enough to make my potential employer say “please stay far far away from our company”—when it doesn’t work out, it just means it wasn’t a good fit, or they chose someone else, and I don’t think that means anyone has done anything wrong. But the human brain likes patterns, and it likes cause and effect. It’s borderline impossible not to feel responsible for things that aren’t your fault.

And that leaves me—us, all of us—here, where the best course of action is to fail, fail, and fail again, each one a gut punch that steels you a little more in your belief that maybe you don’t deserve to succeed. The only way out is to get lucky, and not everyone can. We can look in all directions for something, anything, we can do to lift the burden, but in truth we can’t, because the burden isn’t really there. It isn’t a burden, but a lightness. A lightness that comes when your movements are as free as they are insignificant. The feeling of needing to do something, but being unable to do anything—the unbearable lightness of job searching.

  • Personal
  • Opinion
  • Professional
  • Career
Read more

Light-speed frontend prototyping with create-vite-tailwind

Sun, 11 Sep 2022

(tl;dr: create-vite-tailwind on npm)

As someone trying to get into pivot into full stack web development following a recent job loss, I knew I would have to spend time building some frontend to prove myself to prospective employers. Frontend Mentor seemed like a great addition to the portfolio - professional grade designs that look great and offer a wide range of opportunities to learn various frontend techniques, on top of getting a little practice in a designer-developer workflow, albeit a very one-sided one. So I set out to build some of these projects.

I’ve spent a lot of time building web apps using the old “save a change, restart the server, refresh the browser” loop. And if you have too, I don’t have to tell you how hard it is to go back to that once you’ve seen the light of browser sync/hot reload/etc. One of the fastest build tools out right now is Vite, which is an absolute treat to use and I recommend you try it out if you haven’t.

But something else I (and a lot of other people) have been really excited about is TailwindCSS, which (among other things) offers fantastic developer experience. You rarely, if ever, have to write bespoke CSS, instead using Tailwind’s plethora of utility classes to style your elements however you want. Writing frontend with Tailwind really feels like hitting the ground running - there’s a lot of friction in writing CSS classes that for the most part is completely taken care of by Tailwind.

The problem, though, is getting them to work together. While it’s true that Tailwind really shines with a component-based framework like React or Vue, sometimes that isn’t what you want, and I found that they were unnecessary for the Frontend Mentor flow, where you really focus on design and less on functionality. I don’t know if I’m the only person who thought this was a missing piece, but even the official Tailwind docs only offer guides on installing with Vite when using React or Vue.

As an aside, Tailwind does have a play CDN that you can link in your HTML and use most of Tailwind, but it’s still missing some important details like modifier classes (hover:, active:, responsive widths, etc.) so it really didn’t solve my problem.

Since this was something I could see a lot of use for, I created an npm initializer package to suit the use case. On top of automatically installing and configuring Tailwind, it’s extremely minimal, containing only those files necessary for a quick prototype. This package is very much aimed at prototypes and other simple use cases.


To jumpstart a project using this package, just run:

$ yarn create vite-tailwind <name>
$ cd <name>
$ yarn dev

And you’re up and running in less than 30 seconds, with all the fast refresh and Tailwind magic you could want. (You can also use the corresponding npm commands, but I recommend yarn, again for its speed.)

It’s a pretty simple package that I haven’t noticed any issues with yet, but it’s major version 0 for now. If you do notice an issue, or have a suggestion, I welcome all sorts of issues on GitHub (I did get a comment about optionally including UI frameworks like Daisy, which I’m super open to if people would use it) - or PRs!


Bonus: while writing this post, caniuse-lite made a breaking change that completely broke this package, among many others. Thanks to Andrey of PostCSS and autoprefixer for fixing so quickly!

Note: This post was originally published on dev.to.

  • npm
  • webdev
  • vite
  • tailwindcss
Read more