HNHacker News
TopNewBestAskShowJobs

csnover

2,354 karma · joined May 1, 2013

submissionscomments
csnover··on CSS sucks because we don't bother learning it (2022)
It used to be the case that a web developer could be reasonably expected to actually learn and know pretty much all of CSS, but it has reached the point where it is actually not possible for a single person to “learn” CSS in the way you could in the 2000s or 2010s.

Just as one example, there are now, by my count, at least eight[0] layout models (column, anchor, positioned, flow, float, table, flex, and grid), plus several things that sit in some ambiguous middle place (the inline versions of block types, sticky positioning, masonry grid layout, subgrid, `@container`, paged media), each of which is different and each of which interacts with the others in various confounding ways. Flow collapses margins; table elements can’t have margins at all, but tables can have `border-spacing`, which is like `gap`, but different. Flex has a different default `min-inline-size` than flow, and `flex-basis` overrides `inline-size` if it isn’t `auto`, which is its initial value, until you use the recommended `flex` shorthand, at which point it becomes `0%`, unless you redefine it explicitly. Table layout[1] uses a special shrink-wrapping algorithm, which the CSS authors noted back in CSS 2 might make sense to add a way to work more like a regular block-level element, and then that just never happened. Grid is a mix of implicit and explicit placements with competing ways to do the same things (named areas, number ranges, templates on the parent, properties on the child) and a bunch of special sizing algorithm keywords like `minmax` and `fit-content` which only work in grid, some of which also work in flex, most of which don’t work in flow, but some of them do now, but they didn’t before.

You can select your elements with the old CSS 3 selectors, or `:where`, or `:is`, or `&`, or `:has` (but not if they’re nested), or `@scope`, or `@layer`. Definitely don’t try to put trailing commas on your selector lists, though, since that’s not syntactically valid in CSS, until it is, in some future revision.

To make sure your site works correctly with all scripts, all the directional keywords now have logical versions with `inline` and `block` keywords. Unless it’s a transform[2]. Or a gradient[3]. That’ll probably eventually be fixed, just keep checking the spec periodically until you have to re-learn something that used to be false is now true. Which is how “learning” CSS works. There is never an end.

And this is just the tip of the iceberg. There are also all the CSS units, colours, the whole animation engine, forms, pseudo-classes, pseudo-elements, containment, paints, filter effects, environment variables (yes, those are a thing), maths functions, overflow, scroll snaps, backgrounds and borders, feature queries, font features, writing modes, the different-but-not-really CSS of SVG, the half-forgotten weirdo things like `border-image` and `clip-path`, or the half-dozen other major and minor CSS features which I am not even thinking of right now.

CSS doesn’t suck “because we don’t bother learning it”. CSS sucks because its core strength is its core weakness. It is infinitely flexible and extensible, and that means it has been flexed and extended to fulfil every design trend and address every edge case. Then it needs to support all of those things forever. Making CSS do what you want as a web developer has probably never been easier, but “learning” CSS has never been harder.

[0] Please, for my own sanity, resist the urge to pedantically nitpick in the responses about whether everything in my list is actually a “layout model”. I am aware that some of these things overlap more than others. This is just my list. You can make your own list. It’s fine.

[1] Tables also create their own anonymous layout block such that a child `<caption>` element is drawn outside the putative `<table>` in the actual layout. Framesets do a similar thing with `<legend>`. These are all things that are the result of having to retroactively shoehorn weirdo features into CSS in a backwards-compatible way, but that doesn’t make it any less insane to learn.

[2] https://github.com/w3c/csswg-drafts/issues/1544

[3] https://github.com/w3c/csswg-drafts/issues/1724

csnover··on Debian's Git Transition
As someone who uses Debian and very occasionally interacts with the BTS, what I can say is this:

As far as I know, it is impossible to use the BTS without getting spammed, because the only way to interact with it is via email, and every interaction with the BTS is published without redaction on the web. So, if you ever hope to receive updates, or want to monitor a bug, you are also going to get spam.

Again, because of the email-only design, one must memorise commands or reference a text file to take actions on bugs. This may be decent for power users but it’s a horrible UX for most people. I can only assume that there is some analogue to the `bugreport` command I don’t know of for maintainers that actually offers some amount of UI assistance. As a user, I have no idea how to close my own bugs, or even to know which bugs I’ve created, so the burden falls entirely on the package maintainers to do all the work of keeping the bug tracker tidy (something that developers famously love to do…).

The search/bug view also does not work particularly well in my experience. The way that bugs are organised is totally unintuitive if you don’t already understand how it works. Part of this is a more general issue for all distributions of “which package is actually responsible for this bug?”, but Debian BTS is uniquely bad in my experience. It shows a combination of status and priority states and uses confusing symbols like “(frowning face which HN does not allow)” and “=” and “i” where you have to look at the tooltip just to know what the fuck that means.

csnover··on An SVG is all you need
> Also, allowing CSS inside SVG is not a great idea because the SVG renderer needs to include full CSS parser, and for example, will Inkscape work correctly when there is embedded CSS with base64 fonts? Not sure.

For better or worse, CSS parsing and WOFF support are both mandatory in SVG 2.[0][1] Time will tell whether this makes it a dead spec!

[0] https://www.w3.org/TR/SVG2/styling.html#StylingUsingCSS

[1] https://www.w3.org/TR/SVG2/text.html#FontsGlyphs

csnover··on An SVG is all you need
> - cannot wrap text

This is possible, but only in the stupid way of using a `<foreignObject>` to embed HTML in your SVG (which obviously only works if your SVG renderer also supports at least a subset of HTML). SVG 2 fixes this by adding support for `inline-size`[0], so now UAs just need to… support that.

> - cannot embed font glyphs - your SVG might be unreadable if the user doesn't have the font installed. You can convert letters to curves, but then you won't be able to select and edit text. It's such an obvious problem, yet nobody thought of it, how?

Somebody did think of it. SVG 1.1 added the `<font>` element[1]; SVG 2.0 replaced this with mandatory WOFF support.[2] A WOFF is both subsettable and embeddable using a data URI, and is supported by all the browser UAs already, so it’s obvious why this was changed, but embeddable SVG fonts have existed for a long time (I don’t know why/how they got memory holed).

> - browsers do not publish, which version and features they support

It should be possible to use CSS `@supports` for most of this and hide/show parts of the SVG accordingly in most places.[3] The SVG spec itself includes its own mechanism for feature detection[4], but since it is for “capabilities within a user agent that go beyond the feature set defined in this specification”, it’s essentially worthless.

There are obvious unsolved problems with SVG text, but they are more subtle. For example, many things one might want to render with SVG (like graphs) make more sense with an origin at the bottom-left. This is trivial using a global transform `scaleY(-100%)`, except for text. There is no “baseline” transform origin, nor any CSS unit for the ascent or descent of the line box, nor any supported `vector-effect` keyword to make the transformation apply only to the position and not the rendering. So unless the text is all the same size, and/or you know the font metrics in advance and can hard-code the correct translations, it is impossible to do the trivial thing.

There are other issues in a similar vein where scaling control is just ludicrously inadequate. Would you like to have a shape with a pattern fill that dynamically resizes itself to fill the SVG, but doesn’t distort the pattern, like how HTML elements and CSS `background` work? Good luck! (It’s possible, but much like the situation with text wrapping, requires egregious hacks.)

Some of the new `vector-effect` keywords in SVG 2 seem like they could address at least some of this, but those are “at risk” features which are not supported by UAs and may still be dropped from the final SVG 2 spec.

[0] https://www.w3.org/TR/SVG2/text.html#InlineSizeProperty

[1] https://www.w3.org/TR/SVG11/fonts.html

[2] https://www.w3.org/TR/SVG2/changes.html#fonts

[3] https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/A...

[4] https://www.w3.org/TR/SVG2/struct.html#ConditionalProcessing...

csnover··on Fast Lua runtime written in Rust
As others have noted, this is not actually a Lua engine written in Rust. It is a wrapper over existing C/C++ implementations of Lua. There is, however, an actual Lua engine written in Rust. It is called piccolo.[0]

[0] https://github.com/kyren/piccolo

csnover··on StarGrid: A new Palm OS strategy game
When opening POSE without a previous session, on Windows it would open a reasonable window with some buttons (New, Open, Download, Exit). On *nix, they instead decided to open a blank window that said “Right click on this window to show a menu of commands”. (And then, due to programming errors and bitrot, actually trying to use the context menu would access invalid memory and crash.) So I replaced that bad UI with the less bad one from Windows. :-)
csnover··on StarGrid: A new Palm OS strategy game
Oh, how frustrating. I have no idea how I missed that since I feel like I spent quite a while looking for some later update that included the source. Well, thank you for making sure to release it! I did rewrite most of the Retro68 CMake code too, perhaps for similar reasons, so I can understand how that could have been a problem. At least the newer versions of GCC do not have race conditions in their Makefiles, unlike prc-tools-remix. :-)

The work I did was intended to eventually merge and live alongside the existing stuff in Retro68 instead of just blowing it away, with the hope that nothing like this would ever happen again to anyone else, but of course I failed to actually finish the work.

csnover··on StarGrid: A new Palm OS strategy game
Yes, I saw that, it would have been really great if the source code had ever been released, instead I had to start from scratch…

My implementation does not require editing SDK headers and the goal was to support multiseg. If I had stopped at 32k single seg it would probably have been working. But I never got quite as far as being able to e.g. test libgcc, so who knows.

csnover··on StarGrid: A new Palm OS strategy game
It is 64-bit fixed (along with a bunch of other show-stopper bugs in the ancient FLTK code, and I got rid of the bizarre UI they they used only for *nix and replaced it with the UI they used for Windows). There were a couple 64-bit safety issues in the prc compiler too which I also fixed.
csnover··on StarGrid: A new Palm OS strategy game
Last year I tried to extend Retro68 to support Palm OS and made quite a lot of progress, but in the end it ended up being too much work and I abandoned the attempt. I suppose now is as good a time as any to mention that it exists (in a very ugly state with lots of unsquashed commits) in case anyone wants to pick up the mantle.[0] At the least, it has an up-to-date and functioning copy of the Palm OS Emulator which, unlike cloudpilot, retains the debugger code so you can actually debug apps with it.[1] (I also reverse-engineered the dana HAL; this is as far as I know the only open-source version of POSE which supports that hardware.)

The thing that blocked me from being able to make any more progress was a bug in GCC that causes it to ICE generating PC-relative code[2], and I absolutely could not understand GIMPLE nor the GCC internals quickly, nor could I commit any more energy to trying to learn them. (Generating PC-relative code is essential for Palm OS because, unlike Mac OS, code sections are in read-only memory and cannot have relocations, so this mode being broken means it can’t really work.)

It is fair to say that I have no idea how close to actually working things actually are in that fork since GCC/binutils are an absolute nightmare[3] and I am no compiler engineer. Retro68 has some scary-looking hacks to deal with exception handling which wouldn’t work as-is with Palm OS, at the least. (Retro68 is also itself quite a pile of hacks which were clearly made without a good understanding of how GCC works, and without any apparent care to making sure it is easy to rebase atop newer versions of GCC.)

If I were to restart the work again I would probably just have GCC do the bare minimum of emitting code with whatever relocations it can, and then just make Elf2Mac rewrite machine code. Elf2Mac is itself fairly clearly an attempt to avoid having to touch binutils as much as possible, since it redoes a lot of the work that libbfd normally does, which makes sense, because working on GCC/binutils is just awful.[4]

[0] https://github.com/csnover/Retro68/tree/palmos

[1] I tried to make the debugger work with the modern GDB remote protocol instead of the Palm-specific protocol which requires the ancient prc-tools version of GDB, but GDB is also broken <https://sourceware.org/bugzilla/show_bug.cgi?id=32120>, so that never worked very well. GDB’s remote protocol also does not support receiving symbols from the remote on-demand for whatever reason—it only allows to receive an ABI-compatible binary with DWARF symbols, which makes it next to impossible to get symbols out of the ROM, which uses MacsBugs format. Working with DWARF also sucks.

[2] I believe it was https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80786

[3] Just as a tiny example: never in my life have I ever considered that someone would solve the “tabs versus spaces” debate by making the rule “two spaces per indent, unless it is eight spaces, in which case use a tab”. What IDE even supports this??

[4] To be clear, I don’t mean to denigrate all the hard work that has been done over decades to create these tools. The GCC toolchain is a triumph and I am sure that my relative intelligence has something to do with why I struggle with it, compared to all the compiler people who happily work with it every day. Nevertheless, it is a forty-year-old codebase, and everyone seems quite content to continue to work more or less within constraints that made sense in the 1980s, and perhaps not so much in 2025.

csnover··on Emailing a one-time code is worse than passwords
No. This is why salts[0] are used.

[0] https://en.wikipedia.org/wiki/Salt_(cryptography)

csnover··on U.S. senators introduce new pirate site blocking bill, "Block BEARD"
Where I live, ILLs do not work for video games because the format identification for video games is “Electronic”, and their software is programmed to suppress the request button for these items because it is interpreted as “no physical media”. I emailed the people who run the system, they said it is a known issue, and as far as I can tell that just means they aren’t going to fix it, since it has been this way for at least three years.
csnover··on Bcachefs may be headed out of the kernel
In my case it was a last-ditch effort to get them to explain what was keeping them from making raid actually safe. Others have offered more concrete support more recently[0], I guess you could try reaching out to them, though I suppose they are interested in funding btrfs because they are using btrfs.

I share the sentiments of others in this discussion that I hope you are able to resolve the process issues so that bcachefs does become a viable long-term filesystem. There likely won’t be any funding from anyone ever if it looks like it’s going to get the boot. btrfs also has substantial project management issues (take a look at the graveyard of untriaged bug reports on kernel.org as one more example[1]), they just manage to keep theirs under the radar.

[0] https://lore.kernel.org/linux-btrfs/CAEFpDz+R3rLW8iujSd2m4jH...

[1] https://bugzilla.kernel.org/buglist.cgi?bug_status=__open__&...

csnover··on Bcachefs may be headed out of the kernel
btrfs is OK for a single disk. All the raid modes are not good, not just the parity modes.

The biggest reason raid btrfs is not trustable is that it has no mechanism for correctly handling a temporary device loss. It will happily rejoin an array where one of the devices didn’t see all the writes. This gives a 1/N chance of returning corrupt data for nodatacow (due to read-balancing), and for all other data it will return corrupt data according to the probability of collision of the checksum. (The default is still crc32c, so high probability for many workloads.) It apparently has no problem even with joining together a split-brained filesystem (where the two halves got distinct writes) which will happily eat itself.

One of the shittier aspects of this is that it is not clearly communicated to application developers that btrfs with nodatacow offers less data integrity than ext4 with raid, so several vendors (systemd, postgres, libvirt) turn on nodatacow by default for their data, which then gets corrupted when this problem occurs, and users won’t even know until it is too late because they didn’t enable nodatacow.

The main dev knows this is a problem but they do seem quite committed to not taking any of it seriously, given that they were arguing about it at least seven years ago[0], it’s still not fixed, and now the attitude seems to just ignore anyone who brings it up again (it comes up probably once or twice a year on the ML). Just getting them to accept documentation changes to increase awareness of the risk was like pulling teeth. It is perhaps illustrative that when Synology decided to commit to btrfs they apparently created some abomination that threads btrfs csums through md raid for error correction instead of using btrfs raid.

It is very frustrating for me because a trivial stale device bitmap written to each device would fix it totally, and more intelligently using a write intent bitmap like md, but I had to be deliberately antagonistic on the ML for the main developer to even reply at all after yet another user was caught out losing data because of this. Even then, they just said I should not talk about things I don’t understand. As far as I can tell, this is because they thought “write intent bitmap” meant a specific implementation that does not work with zone append, and I was an unserious person for not saying “write intent log” or something more generic. (This is speculation, though—they refused to engage any more when I asked for clarification, and I am not a filesystem designer, so I might actually be wrong, though I’m not sure why everyone has to suffer because a rarefied few are using zoned storage.)

A less serious but still unreasonable behaviour is that btrfs is designed to immediately go read-only if redundancy is lost, so even if you could write to the remaining good device(s), it will force you to lose anything still in transit/memory if you lose redundancy. (Except that it also doesn’t detect when a device drops through e.g. a dm layer, so you can actually ‘only’ have to deal with the much bigger first problem if you are using FDE or similar.) You could always mount with `-o degraded` to avoid this but then you are opening yourself up to inadvertently destroying your array due to the first problem if you have some thing like a backplane power issue.

Finally, unlike traditional raid, btrfs tools don’t make it possible to handle an online removal of an unhealthy device without risking data loss because in order to remove an unhealthy but extant device you must first reduce the redundancy of the array—but doing that will just cause btrfs to rebalance across all the devices, including the unhealthy one, and potentially taking corrupt data from the bad device and overwriting on the good device, or just losing the whole array if the unhealthy device fails totally during the two required rebalances.

There are some other issues where it becomes basically impossible to recover a filesystem that is very full because you cannot even delete files any more but I think this is similar on all CoW filesystems. This at least won’t eat data directly, but will cause downtime and expense to rebuild the filesystem.

The last time I was paying attention a few months ago, most of the work going into btrfs seemed to be all about improving performance and zoned devices. They won’t reply to any questions or offers for funding or personnel to complete work. It’s all very weird and unfortunate.

[0] https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg...

csnover··on Rust CLI with Clap
> But in your case, you’re investing time upfront to avoid a heavier dependency

This is very confusing to me. What of this API[0], or this one[1], requires “investing time upfront”? With argh, you already know how to use all the basic features before you even start scrolling. These crates are all practically interchangeable already with how similarly they work.

It is only now that I look at clap’s documentation that I feel like I might understand this category of reply to my post. Why does clap need two tutorials and two references and a cookbook and an FAQ and major version migration guidelines? Are you just assuming that all other command-line parsers are as complicated and hard to use as clap?

[0] https://docs.rs/argh/latest/argh/

[1] https://docs.rs/gumdrop/latest/gumdrop/

csnover··on Rust CLI with Clap
> Otherwise you’ve abjectly failed to evaluate one of the most important trade-offs in engineering: whether something is even worth your time to think about.

Phew, several folks have replied to me about how it’s not worth the time thinking about these impacts at all, thus creating a paradox whereby more time has been spent thinking about writing about whether to think about it than has been spent in not thinking about it and just accepting that I wrote a reply on HN about how I feel there are more suitable command-line parsers than clap for most Rust projects! :-)

I agree that much of high-level engineering is knowing whether something is worth thinking about; in this case, I did the thinking already, and I am sharing what I know so others can benefit from (or ignore) my thinking and not have to do so much of their own. If my own personal anecdote of significantly reducing compile times (and binary sizes) by taking a few minutes to replace clap is insufficient, and if the aggregate of other problems I identified don’t matter to others, that’s alright. If reading my comment doesn’t make someone go “huh, I didn’t know {argh|gumdrop|pico-args} existed, clap does seem a little excessive now that you mention it, I will try one of these instead on my next project and see how it goes”, then I suppose they were not the target audience.

I don’t really want to keep engaging on this—as almost everyone (including me) seems to agree, command-line parser minutiae just aren’t that important—but I guess I will just conclude by saying that I believe that anchoring effects have led many programmers to consider any dependency smaller than, say, Electron to be not a big deal (and many think Electron’s fine too, obviously), whereas my experience has been that the difference between good and bad products usually hinges on many such ‘insignificant’ choices combining in aggregate.

Assuming whichever command-line parser one uses operates above a certain baseline—and I believe all of the argparse libraries in that benchmark do—it seems particularly silly to make wasteful choices here because this is such a small part of an application. Choosing wastefulness because it’s technically possible, then rationalising the waste by claiming it increases velocity/usability/scalability/whatever without actually verifying that claim because it’s ‘not worth thinking about’, seems more problematic to me than any spectre of premature or ‘unnecessary’ optimisation. I hope to find better ways to communicate this in future.

csnover··on Rust CLI with Clap
> Why wouldn't you default to the most full-featured option when its performance and space usage is adequate for the overwhelming majority of cases?

This is the logic of buying a Ford F-150 to drive your kids to school and to commute to the office because you might someday need to maybe haul some wood from the home improvement store once. The compact sedan is the obviously practical choice, but it can’t haul the wood, and you can afford the giant truck, so why not?

csnover··on Rust CLI with Clap
No, it is the following the principle of YAGNI.
csnover··on Rust CLI with Clap
In my opinion, clap is a textbook example of over-engineering for a single metric (UX) at the expense of all other considerations (compilation speed, runtime cost, binary size, auditability, and maintainability). It is an 18kloc command-line parser with an additional 125kloc of dependencies that takes nearly 6 seconds to compile (‘only’ 400ms for an incremental build) and which adds nearly 690KiB to an optimised release binary (‘only’ 430KiB if you strip out most of the sugar that only clap provides).

There are many other command-line parsers to choose from that do all the key things that clap does, with half or less the build cost, and most of them with 30x less binary overhead[0]. argh is under 4kloc. gumdrop is under 2kloc. pico-args is under 700loc. What is the value of that extra 10kloc? A 10% better parser?

I am not saying there is no room for a library like clap—it is, at least, a triumphant clown car of features that can handle practically any edge-case anyone ever thought of—but if I got a nickel every time I spent 15 minutes replacing a trivial use of clap with pico-args and thus reduced the binary size and compile time of some project by at least 80%, I would have at least three nickels.

Just to try to pre-empt arguments like “disk space is cheap”, “compiler time is cheaper than human time”, etc.: there are no golden bullets in engineering, only trade-offs. Why would you default to the biggest, slowest option? This is the “every web site must be able to scale like Facebook” type logic. You don’t even have to do more work to use argh or gumdrop. If clap ends up having some magic feature that no other parser has that you absolutely need, you can switch, but I’ve yet to ever encounter such a thing. Its inertia and popularity carry it forward, but it is perhaps the last choice you should pick for a new project—not the first.

[0] https://github.com/rosetta-rs/argparse-rosetta-rs

csnover··on It's unlikely that there will be any further releases of mt32-pi
Three-strikes-style rules like this make for easy decision-making, but they don’t make for good decision-making. They eliminate curiosity about the root problem, reject the reality of how humans learn (it is almost never linear), and usually end up backfiring catastrophically at some point. Compliance by fear does not make for open and healthy communities.

The fundamental attribution error makes us believe the problem must be that this kind of person is “not interested in listening to reason”, but I can tell you that the ones who aren’t interested in listening make that abundantly clear when you ask them to stop. They are not the ones I struggle with. The problem cases are those who act in good faith but have trouble regulating their emotions, infrequently enough to not be an obvious menace, but consistently enough that I recognise their names.

csnover··on It's unlikely that there will be any further releases of mt32-pi
The goal of an online community is to be a space where people interact, so banning someone from interacting is a failure to succeed at the goal, but so is allowing someone to remain to the point where others choose to leave voluntarily.

The angst comes from the grey area between “do nothing” and “ban forever”. How does one strike a balance between the health of the overall community against the need of the individual to be able to take risks and make mistakes? A simple binary doesn’t cut it.

csnover··on It's unlikely that there will be any further releases of mt32-pi
Sorry for the confusion. I was referring to other online spaces like Twitter and Reddit where the discourse today is so toxic that it has desensitised people into accepting or even encouraging abusive behaviour. Name-calling is a typical example. It’s something that should register as abusive but doesn’t for most people any more, because in these very high-profile online spaces it’s not just normative, it’s actively rewarded with likes and upvotes. It’s probably impossible to not have that seep into most people’s baseline expectations for online conduct.

An army of dictatorial tone-policing moderators won’t create a safe space free from abuse, just a different kind of toxic space. So it is a very hard problem, not solvable by just kicking out a couple of bad apples. We are all swimming in a sea that causes the apples to rot.

csnover··on It's unlikely that there will be any further releases of mt32-pi
This is exactly what happens on VOGONS, but it relies on the community reporting violations, and I suspect this isn’t happening consistently. I’ve reviewed too many reports where multiple people had been breaking the rules for days before anyone bothered to flag a single post.

I don’t know what to do about how toxicity has become so normalised in online spaces that people don’t even bother to flag it. I don’t know how many times I’ve had to tell new members that VOGONS is not Reddit or Twitter and to not import antisocial behaviour from those places into this place. It is like fighting a losing battle with an invasive species.

Frankly, I also don’t know how to strike the right balance when it comes to long-time members who break the rules infrequently but consistently. Knowing that a forum regular is probably going to break the rules again in the future, but not for several months, doesn’t make for an obvious solution to me. So I try to do the best I can to remind people to do better, and hope the time-until-relapse goes up. But I am sure this negatively impacts other community members since they will see the same person doing the same thing again and wonder why nothing is being done about them, not noticing that the last incident was three or six or twelve months ago.

csnover··on It's unlikely that there will be any further releases of mt32-pi
Forum admin here. No posts were reported or removed and the author hasn’t posted since last April. I don’t know what’s going on here and have reached out to them to try to understand and assist. The community standards explicitly prohibit off-site harassment but unless someone tells us, there’s nothing I can do about it.
csnover··on Bayer is getting rid of bosses and asking staff to ‘self-organize’
By the time someone has entered the workforce it should not be necessary to be ‘checked on’ by some surrogate parental figure.

In a functioning workplace, everyone agrees to do their work because it is part of the social contract of working on a team. They don’t need to be told what to do. If someone is falling behind, they’ll talk to other team members and work together to get back on track. You are there to help your coworkers, and they are there to help you. Someone doesn’t have to be your manager to make sure projects run smoothly; everyone can take turns in this role if they feel like it’s something they’re interested in doing and are competent in that role.

It’s only through the distorted lens of corporate ladder climbing and backstabbing departmental politics that the idea arises that you’ll just hire untrustworthy people and then beat them into submission by making a workplace into a prison.

csnover··on NPR suspends veteran editor as it grapples with his public criticism
There is a podcast miniseries called The Divided Dial[0] that answers the question of why conservative radio dominates in America, but very briefly, based on my understanding of their reporting:

1. The elimination of the Fairness Doctrine meant that radio stations no longer had a legal obligation to provide a fair reflection of differing viewpoints on matters of public importance;

2. The elimination of national ownership caps in the 1996 Telecommunications Act enabled a rapid and extreme consolidation of radio stations;

3. These new national radio conglomerates slashed costs by vertically integrating production, creating fewer shows, and rebroadcasting them to all their owned stations;

4. The concept of “format purity” spilled over from music radio into talk radio, causing commercial talk stations to switch from showcasing a variety of opinions to airing one political perspective all day;

5. The conservative talk radio format was perceived as less risky by radio executives, and so that was the format that commercial talk radio switched to.

Air America may have eventually succeeded despite its many other flaws—except they owned no radio stations of their own, so there was no place for them to go in this hyper-consolidated, format-pure commercial market.

[0] https://www.wnycstudios.org/podcasts/otm/divided-dial

csnover··on Interview with Senior JavaScript Developer 2024 [video]
It’s not making up history. There is a documentary[0] on the history of React where the people involved in its creation and use at Facebook described it this way:

> Bolt [a predecessor of React] was basically more or less Facebook's implementation of a client-side MVC. [It was] not a tool belt, it was truly an application development framework. Something designed and meant to build complicated interactive rich apps and was being used to build pretty complicated very real products at Facebook at the time. […] As the product itself got more complex and as we added more engineers to the team, we didn't hit a wall but it started to get really, really hard to make changes. And that was around the time that Jordan [Walke, creator of React] was on the ads team and he's like ‘I wonder, there's got to be a better way’. […] Jordan was a product engineer at the time, working on ads, and ads has one of the most complicated pieces of UI across all of Facebook at the moment. On the ads team they were hitting the limits of what you can do without React complexity wise. […] Jordan had a lot of very interesting ideas around how you could take what we had done in Bolt and make it easier for it to scale with people's ability to understand large applications.

As the GP said, React was explicitly designed to solve the problem of having many engineers writing large, complex, client-side applications. It was not designed for building simple web sites.

[0] https://www.youtube.com/watch?v=8pDqJVdNa44

csnover··on How to think about HTML responsive images
This doesn’t make sense to me. You can perform the exact same fingerprinting by looking at which image in a srcset is being requested.
csnover··on Why is software quality worse than a decado ago
What can be asserted without evidence can also be dismissed without evidence.[0] The burden of proof is on the author to demonstrate that software quality is actually worse now. If they want to refute the argument that they are engaged in rosy retrospection, then they should offer more than a handful of personal anecdotes that demonstrate nothing.

Google Drive lost some data that one time in 2023? Cool. In the 1990s, Windows uptime was measured in BSODs per day, and data loss was predicated on how frequently you remembered to hit Ctrl+S before your computer crashed.

Your bank has a frustrating mobile UI? Cool. Ten years ago, they probably didn’t even have a mobile UI, or if it did, people were also complaining that it sucked[1].

Security is worse now because people don’t update their dependencies so leak user data? Cool. The largest known data breach to date happened in 2013[2]. Ten years before that, the entire internet nearly collapsed because of a computer worm[3].

Is any of this a more valid rebuttal to the original author? No. They’re just more anecdotes.

[0] https://en.wikipedia.org/wiki/Hitchens%27s_razor

[1] https://reddit.com/r/personalfinance/comments/30psm7/any_ban...

[2] https://www.nytimes.com/2017/10/03/technology/yahoo-hack-3-b...

[3] https://en.wikipedia.org/wiki/SQL_Slammer

csnover··on Why is software quality worse than a decado ago
The answer is “because the author is engaged in rosy retrospection”.

The Atlantic, in 2013: Why is software so slow?[0]

Mac Observer, in 2015: OS X quality is declining.[1]

Some random programmer blog, in 2015: “Worse Is Better” 25 Years Later – Have We Gotten Lazy?[2]

Information Week, in 2009: Paging AIM: Why Does Software Always Get Worse?[3]

MIT Technology Review, in 2002: Why software is so bad.[4]

[0] https://www.theatlantic.com/magazine/archive/2013/09/why-is-...

[1] https://www.macobserver.com/tmo/article/mac-experts-weigh-in...

[2] https://spin.atomicobject.com/worse-is-better-vs-right-thing...

[3] https://www.informationweek.com/it-leadership/paging-aim-why...

[4] https://www.technologyreview.com/2002/07/01/40875/why-softwa...

← PreviousPage 2 of 12Next →