masto
Drifted off my point a bit, which I guess was meant to be it’s not necessarily Linux-specific training.
I still spot problems and “push back”, but I have the experience now to know how to get people to listen and not just write me off as an annoying prima donna.
But I very much dislike when they phase it as “you need to” or “this is how it works”. Thinking everyone else’s brain operates the way yours does seems to be a frequent bias among bloggers. And managers.
I encourage those who write about their experiences to keep it in the first person.
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.
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 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 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.
The thing is, nobody is perfect. Except armchair HN commenters on threads about FAANG outages, of course.
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.
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.
Nevertheless, on balance, I'm pretty happy.
I realize this is "a skill issue", or at the very least not a popular opinion, since impossibly hard games seem to sell well.
I believe those of us who were around from then to now experienced peak information. We went from having to look things up in libraries to being able to find anything with a Google search. We're on the downward slope now. Business models have changed, spamvertisers are winning the war against search, and generative AI slop is already the dominant source of "content", ensuring the genie can never be put back. This is not an anti-AI rant, it is just an acknowledgement that like so many things, we were foolish to think that access to information was just going to keep getting better. I did not expect that in my lifetime, I would see the best it was ever going to be.
Maybe in the future, calling a trained human for help will be the only way to sort through the mountain of infogarbage to find something. Or we'll have to go back to the library.
Python is by no means alone in this or particularly egregious. Having been a heavy Perl developer in the 2000s, I was part of the problem. I didn't understand why other people had so much trouble doing things that seemed simple to me, because I was eating, breathing, and sleeping Perl. I knew how to prolong the intervals between breaking my installation, and how to troubleshoot and repair it, but there was no reason why anyone who wanted to deploy, or even develop on, my code base should have needed that encyclopedic knowledge.
This is why, for all their faults, I count containers as the biggest revolution in the software industry, at least for us "backend" folks.
This is typical of what happens any time I try to run something written in Python. It may be easier than setting up an NVIDIA GPU, but that's a low bar.
For example, there's no command for getting a directory listing. You type `LOAD "$",8` (8 being the disk drive), and the drive pretends there's a BASIC program called `$` that happens to contain a directory listing you can then look at with `LIST`. (https://en.wikipedia.org/wiki/Commodore_DOS#/media/File:Comm...)
By default, LOAD loads tokenized BASIC programs, but if you add an extra `,1` to the command, the file can contain arbitrary data starting at any location in memory. You could use this to load a machine language program and then run it with `SYS <location>`. Clever programmers figured out they could skip this step by having their file overwrite a vector that gets called after the load completes and jump right into their code, resulting in every Commodore kid having being able to type `LOAD"*",8,1` on autopilot.
I got distracted by other trivia (I grew up with this computer and it was hugely influential and I will adore it forever) from getting to the actual point: The C64 uses a variant of the 6502, the 6510. It has a special register for swapping out any combination of the three ROMs (BASIC, KERNAL (sic), and the character ROM) plus I/O registers that overlay portions of the 64 address space. If your code doesn't use those, you can access the RAM they are hiding by turning them off.