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

  • npm
  • webdev
  • vite
  • tailwindcss
Read more