I found a tiny bug in a library. A single, trivial, “the docs say this utility function does X, but it actually does Y”. I’m not even allowed to file a bug report. It took me some time to figure out how to even ask for permission, and they referred it to some committee where it’s in limbo.
I have to resist the urge to tile every surface with blinky lights. I think part of the appeal goes back to why I enjoyed writing programs on my C64 to bounce my name around the screen. It’s a limited playground, and limitations inspire creativity.
On rare occasions, I use it for the virtual display; it's actually usable to sit outside and work with a giant display on the deck, or to dial myself onto the beach. But it's not exactly comfortable for extended use, and most of the time I'd rather sit at my nice desktop with multiple monitors etc.
I also have a Quest 3 and if I could only own one device, I'd take the Q3 hands-down. The games are fun, they get you up and moving, and although I'm not going to argue that the quality of the screens is the same or anything, it's more than good enough. I'll happily give up the virtual laptop screen in exchange for the library of VR games on the Quest.
I'm not much for consuming media so that aspect is lost on me. Unfortunately, that seems to be the primary use case Apple has focused on, if you can call the anemic dribble of content they've put out focus.
I've been using Clerk and it seems fine. I'm sure there's some drama, because everything comes with drama, but I just want to get on with building stuff.
Sometimes I spend half an hour writing a prompt and realize that I’ve basically rubber-ducked the problem to the point where I know exactly what I want, so I just write the code myself.
I have been doing my best to give these tools a fair shake, because I want to have an informed opinion (and certainly some fear of being left behind). I find that their utility in a given area is inversely proportional to my skill level. I have rewritten or fixed most of the backend business logic that AI spits out. Even if it’s mostly ok on a first pass, I’ve been doing this gig for decades now and I am pretty good at spotting future technical debt.
On the other hand, I’m consistently impressed by its ability to save me time with UI code. Or maybe it’s not that it saves me time, but it gets me to do more ambitious things. I’d typically just throw stuff on the page with the excuse that I’m not a designer, and hope that eventually I can bring in someone else to make it look better. Now I can tell the robot I want to have drag and drop here and autocomplete there, and a share to flooberflop button, and it’ll do enough of the implementation that even if I have to fix it up, I’m not as intimidated to start.
I've had the Corporate Approved CoPilot + Sonnet 4 write a full working React page for me based on a screenshot of a Figma model. (Not even through an MCP)
It even discovered that we have some internal components and used them for it.
Got me from 0-MVP in less then an hour. Would've easily taken me a full day
I don’t know if this counts as experienced, but I’ve spent about a year exploring Next.js, the last 6 months of which transitioning from exploring to building a serious project.
I understand the author’s frustrations. I have had similar ones when it comes to middleware and other parts of Next.js. I’ve also had those kinds of frustrations with every piece of software and framework I’ve ever used. A lot of times they stem from trying to shove a square peg into a round hole, and it only gets better when I finally develop the right mental model for how the thing works.
As a web developer going back to CGI scripts in the 90s, all this server and client side rendering, edge runtimes, etc., is quite foreign. But when I find myself screaming “why won’t it let me do this?”, the answer is often “because it doesn’t make sense to do that”. Auth is one of the places where that happened, and going through the process of “but why can’t I look the user up in my database from middleware” was a big part of wrapping my head around the parts of Next.js that I had been ignoring.
As far as being married to Vercel for hosting, not at all, if you don’t choose to use all their stuff. The sample Docker build they have works just fine to deploy anywhere, in my experience.
Maybe I’m speaking mostly out of ignorance of not having tried dozens of other modern TS web frameworks (I was on a big tech island for a decade and not in touch with what the cool kids were up to), but I rather like Next.js. I may feel differently when I want to start adding native mobile apps and realize I was lulled into omitting a clean API layer, but for now, adding features has been pretty smooth.
This is literally the same mistake that has been made many times before. Of course it will be made again. “New feature is rolled out carefully with a bug that remains latent until triggered by new data” could summarize most global outages.
The thing is, nobody is perfect. Except armchair HN commenters on threads about FAANG outages, of course.
First some feedback (I see the author is interested), and then a personal take on how I deal with this stuff.
As someone who has spent decades procrastinating, reading about systems to get things done, trying many of them, working with coaches and mentors, and teaching project management, I like to think have a cultivated interest in the topic. I’m very happy that the author found something that works for them. I’m not a gamer, so I didn’t find the comparison particularly relatable. What I did find relatable was the point about getting the dopamine hit (I know that’s debated, but let’s use it as a metaphor) off crumpling up the paper and throwing it away. That’s something I always found gratifying about a physical board full of sticky notes, and it’s just not as rewarding to mark a ticket done in Jira.
In my personal experience of ADD, novelty is a major motivator. A system like this has the appeal of all sorts of new sources of stimulation - physical objects, a new electronic toy, software to write, etc. The problem is that once that wears off, if I’m only doing it for the novelty, I won’t stick with it. I need to engage some of the other sources of motivation (interest, challenge, urgency).
Also, I would love to see someone write an article like this where they keep it entirely in the first person. In other words, focus on “my experience” and “I do this” and “this works for me”. I experience a sort of automatic pushback when I read things like “this will help you” or “you need to”. It may be linked to demand avoidance, or just my belief that there is not a single productivity system or hack that works for everyone. “You need to” try things out, reflect on your own personal struggles, and tailor the solutions to fit. Also, I’m not sure if I would ever call it a cure.
Something I’ve found very helpful is an app called Llama Life. It is not free, so stop reading if that’s a deal breaker. I think of it as kind of a pomodoro timer that someone cleverly fixed for me. I find pomodoros appealing, but they never worked for me. With Llama Life, I stack up what I plan to do for the day along with a guess at how long each task will take. The first benefit this has is that I know what I’m meant to be working on. And when the timer goes off, if I’m not done, I can snooze or extend it, or cut my losses and move on. The other thing I like is that it shows me the total amount of time I’ve allocated, and when each item ends. This helps me to avoid overcommitting: when I look at the end time and see 9:30 at night, I’m forced to reevaluate and cut some things. Anyway, I’m a happy customer.
I jumped in to the TypeScript deep end a few months back. I build a lot of web applications back in the 2000s, then disappeared onto a big tech island where everything was a little different. After popping back out into the real world, I wanted to see how the cool kids are doing things these days, so I figured I would try full immersion by creating a bunch of Next.js sites.
For the purpose of the experiment, I turned every linter and compiler strictness to maximum, and enforced draconian code formatting requirements with pre-commit hooks. Given that my last language love was Perl, I thought I would despise TypeScript for getting in the way. To my surprise, I think I like it. It's not just complexity like I hated in C++ and tedious boilerplate like I hated in Java. The complexity is highly expressive and serves a purpose beyond trying to protect me from a class of bugs that are frankly pretty rare. When done well, TypeScript-native APIs feel a lot more intentional and thought out. When I refactored my code from slinging bags of properties around to take more advantage of TypeScript features, it shook out weaknesses in the design and interfaces.
I've definitely run into those libraries, though, where someone has constructed an elaborate and impenetrable type jungle. If that were an opaque implementation detail, it would be one thing, but I find these are often the libraries where there's little to no documentation, so you're forced to dig into the source code, desperately trying to understand what all of this indirection is trying to accomplish.
The other one that surprises me when it pops up (unfortunately more than once) is the "in your zeal to keep the implementation opaque, you didn't export something I need, so I have to do weird backflips with ReturnType<> and Parameters<>" problem.
Teaching myself BASIC on a Commodore 64 in elementary school made me a programmer and set the direction for the next 40 years. Different strokes I guess.
The same for me. I only knew how to assign variables, use for loops, if->then, and use poke command. And from this specific point I started thinking about myself as programmer event that the only thing I wrote with C64 basic was a ball moving on the screen. :)
reply