<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: ragnese</title><link>https://news.ycombinator.com/user?id=ragnese</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 04 Jun 2026 08:24:46 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=ragnese" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by ragnese in "Learning Software Architecture"]]></title><description><![CDATA[
<p>When I read it, I assumed it meant like <i>network</i> communication in your program. File and network I/O having/being a "tax" makes sense to me.</p>
]]></description><pubDate>Tue, 12 May 2026 16:22:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=48110421</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=48110421</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48110421</guid></item><item><title><![CDATA[New comment by ragnese in "Your website is not for you"]]></title><description><![CDATA[
<p>Yep. I've learned that lesson more than once. Maybe one of these days it'll stick... :p<p>Specifically, I'm not a "designer", but I regularly end up making/changing UIs (mobile apps, web apps/pages, etc). When it comes to design, it really matters who the target audience is.<p>If you're creating a UI for "mass market", you have to design to a lowest-common-denominator that balances what your average user expects, generally, from UI/UX, and the more you ask them to "invest", the worse you're going to do. On the other hand, if you're making a tool for a B2B (business-to-business) product, you have more freedom to set baseline expectations of what the end user needs to be able to do and understand. You can also expose more powerful options, etc. You can sometimes end up going in very different directions. Even error handling and logging can sometimes be handled differently, depending on the context.</p>
]]></description><pubDate>Fri, 01 May 2026 13:03:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47974316</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47974316</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47974316</guid></item><item><title><![CDATA[New comment by ragnese in "I built a Game Boy emulator in F#"]]></title><description><![CDATA[
<p>Yes! That's exactly how you should do it while working with a language that doesn't have a compiler that will aggressively analyze, and rewrite and optimize your code for you. (So, most languages with "heavy runtimes" that support a bunch of dynamic stuff and JITs)<p>There are basically two points to programming with immutable-first data. One, eliminate certain classes of data race concurrency bugs. Two, less mutable state in a given context makes it easier to reason about.<p>So, if you're inside a function scope and you aren't launching any concurrent operations from inside that function, you don't have to worry about benefit #1. If you're inside a function (and you're not reaching out for global mutable state), then the context you need to keep in your working memory is likely fairly small, so a few local mutable variables doesn't significantly harm "understandability" of the implementation (in most cases). So, you really don't have to worry about #2, either. Make your functions black boxes with solid "APIs" (type signatures), and let the inside do whatever it needs to make it work the best.<p>Just because premature optimization is the root of all evil, it doesn't mean we need to jump right to premature pessimization...</p>
]]></description><pubDate>Thu, 30 Apr 2026 19:01:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47966817</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47966817</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47966817</guid></item><item><title><![CDATA[New comment by ragnese in "Super ZSNES – GPU Powered SNES Emulator"]]></title><description><![CDATA[
<p>Since it's obviously written in a casual, conversational, tone we should not expect the language to be perfectly precise. So, given that and the fact that the author felt the need to call out "vibe coding" or AI at all, <i>and</i> then double down by adding the almost-redundant "classic development style", I would be willing to bet they did not use any AI for anything at all related to this project.</p>
]]></description><pubDate>Wed, 29 Apr 2026 12:48:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=47947578</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47947578</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47947578</guid></item><item><title><![CDATA[New comment by ragnese in "Laws of Software Engineering"]]></title><description><![CDATA[
<p>Hmm. Fair point. It's entirely possible that it's not obvious and that the "law" is almost a "reminder" of sorts to not assume you're getting well-formed inputs.<p>I'm still skeptical that this is the case with Postel's Law, but I do see that it's possible to read it that way. I guess I could always go do some research to prove it one way or the other, but... nah.<p>And yes, "Parse, don't validate." is one of my absolute favorite maxims (good word choice, by the way; I would've struggled on choosing a word for it here).</p>
]]></description><pubDate>Wed, 22 Apr 2026 16:09:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=47865641</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47865641</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47865641</guid></item><item><title><![CDATA[New comment by ragnese in "Laws of Software Engineering"]]></title><description><![CDATA[
<p>Yes, what Postel's Law is about. That's the whole point of contrasting it with Hyrum's Law, no?<p>Hyrum's Law is pointing out that sometimes the new field <i>is</i> a breaking change in the liberal scenario as well, because if you used to just ignore the field before and now you don't, your client that was including it before will see a change in behavior now. At least by being strict, (not accepting empty arrays, extra fields, empty strings, incorrect types that can be coerced, etc), you know that expanding the domain of valid inputs won't conflict with some unexpected-but-previously-papered-over stuff that current clients are sending.</p>
]]></description><pubDate>Tue, 21 Apr 2026 21:43:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=47854915</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47854915</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47854915</guid></item><item><title><![CDATA[New comment by ragnese in "Laws of Software Engineering"]]></title><description><![CDATA[
<p>I don't think that interpretation makes that much sense. Isn't it a bit too... <i>obvious</i> that you shouldn't just crash and/or corrupt data on invalid input? If the law were essentially "Don't crash or corrupt data on invalid input", it would seem to me that an even better law would be: "Don't crash or corrupt data." Surely there aren't too many situations where we'd want to avoid crashing because of bad input, but we'd be totally fine crashing or corrupting data for some other (expected) reason.<p>So, I think not crashing because of invalid input is probably too obvious to be a "law" bearing someone's name. IMO, it must be asserting that we should try our best to do what the user/client <i>means</i> so that they aren't frustrated by having to be perfect.</p>
]]></description><pubDate>Tue, 21 Apr 2026 21:34:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=47854804</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47854804</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47854804</guid></item><item><title><![CDATA[New comment by ragnese in "PHP 8.6 Closure Optimizations"]]></title><description><![CDATA[
<p>This is also a problem, IMO, in having this optimization in PHP. Anonymous functions are instances of a Closure class, which means that the `===` operator <i>should</i> return false for `foo() === foo()` just like it would for `new MyClass() === new MyClass()`.<p>But, since when has PHP ever prioritized correctness or consistency over trivial convenience? (I know it's anti-cool these days to hate on PHP, but I work with PHP all the time and it's still a terrible language even in 2026)</p>
]]></description><pubDate>Thu, 16 Apr 2026 19:19:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=47798189</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47798189</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47798189</guid></item><item><title><![CDATA[New comment by ragnese in "I won't download your app. The web version is a-ok"]]></title><description><![CDATA[
<p>I'm especially angry that if you go to reddit.com in a mobile browser, it will sometimes fully block you from certain subreddits (not just NSFW ones) and tell you that you can only access it from the app. Meanwhile, you can easily visit the exact same subreddit by typing old.reddit.com/r/whatever. The outright lying bothers me so much. I refuse to be desensitized to lying just because everyone is lying all the time; it's still really wrong, and they really should be ashamed of themselves.</p>
]]></description><pubDate>Mon, 06 Apr 2026 15:31:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=47662236</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47662236</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47662236</guid></item><item><title><![CDATA[New comment by ragnese in "I won't download your app. The web version is a-ok"]]></title><description><![CDATA[
<p>When you say "meme", it sounds like it might not be true. But, a few years ago I handed my stepson a USB flash drive with some files on it, he plugged it into his laptop and the very first thing he did was launch Google Chrome and then not have any clue what to do to access the files (it was a Windows laptop).</p>
]]></description><pubDate>Mon, 06 Apr 2026 15:26:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=47662164</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47662164</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47662164</guid></item><item><title><![CDATA[New comment by ragnese in "I won't download your app. The web version is a-ok"]]></title><description><![CDATA[
<p>One of the most enraging things about life since 2005-ish is that no matter how private and careful <i>I</i> am, it doesn't even matter because every other inconsiderate fool I know and interact with will HAPPILY let some random company have access to THEIR contacts--which includes me--in order to play Farmville for a month until they get bored of that and offer up my private information to the next bullshit ad company that asks for their contacts.<p>It used to frustrate me that people didn't care about their own privacy, because I genuinely didn't want evil people to hurt them. But, it's even more angering that people don't have the common decency to consider whether their friends and family would want them sharing their phone numbers, email addresses, photos of them, etc.</p>
]]></description><pubDate>Mon, 06 Apr 2026 15:20:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=47662090</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47662090</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47662090</guid></item><item><title><![CDATA[New comment by ragnese in "I won't download your app. The web version is a-ok"]]></title><description><![CDATA[
<p>Yep. If someone is trying to make you do something, or stop doing something, or buy something, your first question should always be "Why?".<p>Why would someone try to force me off of my browser (that has ad-blocking and tracker-blocking mitigations) and on to a locked-down app that may want permission to run in the background, display notifications, access my files or camera, etc?<p>Maybe it really is to "improve my experience"... yeah, right.</p>
]]></description><pubDate>Mon, 06 Apr 2026 15:15:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=47662025</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=47662025</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47662025</guid></item><item><title><![CDATA[New comment by ragnese in "Approachable Swift Concurrency"]]></title><description><![CDATA[
<p>Talk about trivializing complexity...<p>The idea that making things immutable somehow fixes concurrency issues always made me chuckle.<p>I remember reading and watching Rich Hickey talking about Clojure's persistent objects and thinking: Okay, that's great- another thread can't change the data that my thread has because I'll just be using the old copy and they'll have a new, different copy. But now my two threads are working with different versions of reality... that's STILL a logic bug in many cases.<p>That's not to say it doesn't help at all, but it's EXTREMELY far from "share xor mutate" solving all concurrency issues/complexity. Sometimes data needs to be synchronized between different actors. There's no avoiding that. Sometimes devs don't notice it because they use a SQL database as the centralized synchronizer, but the complexity is still there once you start seeing the effect of your DB's transaction level (e.g., repeatable_read vs read_committed, etc).</p>
]]></description><pubDate>Tue, 30 Dec 2025 16:21:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=46434854</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=46434854</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46434854</guid></item><item><title><![CDATA[New comment by ragnese in "Approachable Swift Concurrency"]]></title><description><![CDATA[
<p>> It's a good article but I think you need to start explaining structured concurrency from the very core of it: why it exists in the first place.<p>I disagree. Not every single article or essay needs to start from kindergarten and walk us up through quantum theory. It's okay to set a minimum required background and write to that.<p>As a seasoned dev, every time I have to dive into a new language or framework, I'll often want to read about styles and best practices that the community is coalescing around. I <i>promise</i> there is no shortage at all of articles about Swift concurrency aimed at junior devs for whom their iOS app is the very first real programming project they've ever done.<p>I'm not saying that level of article/essay shouldn't exist. I'm just saying there's more than enough. I almost NEVER find articles that are targeting the "I'm a newbie to this language/framework, but not to programming" audience.</p>
]]></description><pubDate>Tue, 30 Dec 2025 16:11:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=46434753</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=46434753</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46434753</guid></item><item><title><![CDATA[New comment by ragnese in "Approachable Swift Concurrency"]]></title><description><![CDATA[
<p>I haven't written any Go in many years (way before generics), but I'm <i>shocked</i> that something so implicit and magical is now valid Go syntax.<p>I didn't look up this syntax or its rules, so I'm just reading the code totally naively. Am I to understand that the `user` variable in the final return statement is not really being treated as a value, but as a reference? Because the second part of the return (json.NewDecoder(resp.Body).Decode(&user)) sure looks like it's going to change the value of `user`. My brain wants to think it's "too late" to set `user` to anything by then, because the value was already read out (because I'm assuming the tuple is being constructed by evaluating its arguments left-to-right, like I thought Go's spec enforced for function arg evaluation). I would think that the returned value would be: `(nil, return-value-of-Decode-call)`.<p>I'm obviously wrong, of course, but whereas I always found Go code to at least be fairly simple--albeit tedious--to read, I find this to be very unintuitive and fairly "magical" for Go's typical design sensibilities.<p>No real point, here. Just felt so surprised that I couldn't resist saying so...</p>
]]></description><pubDate>Tue, 30 Dec 2025 16:03:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=46434662</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=46434662</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46434662</guid></item><item><title><![CDATA[New comment by ragnese in "Gnome Mutter Now "Completely Drops the Whole X11 Back End""]]></title><description><![CDATA[
<p>Unfortunately, the context starts getting lost as we get deeper into discussion threads like this, but originally, I brought up GTK stewardship because I felt that the top few comments in this thread started to conflate the various projects developed by the GNOME organization. The original HN post was about Mutter, and the first few comments in this reply chain were about software being customizable, etc. Those could've been about whether it's okay or not for <i>Mutter</i> to lose flexibility. But, the one I replied to started complaining about software "imposing limitations on the rest of the ecosystem".<p>That's when and why I decided to point out that there are different kinds of software projects, and they have different goals and priorities. It's like the old "library vs. application" code: libraries are generic and reusable, and should be written as such, whereas applications are specific and focused.<p>I brought up GTK simply as an example of a "library project", for which critique of its reusability is warranted, as a <i>counter-example</i> to Mutter, which is an application. Complaining about Mutter's effect on "the ecosystem" is silly. It wouldn't make any less sense to complain about XTerm's effect on the ecosystem by it not supporting Wayland. Anybody in their right mind would just say "So, use one of the other 10,000 terminal emulators in Wayland instead of XTerm"--and rightly so. But, because Mutter is a GNOME project, and GTK is also a GNOME project, I think that people lose focus on what they're talking about.<p>I did engage with you about GTK because it's interesting, but my point in bringing up GTK was specifically to say "Yeah, those complaints might make sense if we were talking about GTK, but since we're talking about Mutter, they do not." to the comment I replied to.</p>
]]></description><pubDate>Thu, 06 Nov 2025 19:35:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=45839305</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=45839305</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45839305</guid></item><item><title><![CDATA[New comment by ragnese in "How often does Python allocate?"]]></title><description><![CDATA[
<p>It's been a long time since I've done C/C++, but I'm not sure what you're saying with regard to provenance. I was pretty sure that you were able to cast an arbitrary integer value into a pointer, and it really didn't have to "come from" anywhere. So, all I'm saying is that, under-the-hood, a C pointer really is just an integer. Saying that a pointer <i>means</i> something beyond the bits that make up the value is no more relevant than saying a bool means something other than its integer value, which is also true.</p>
]]></description><pubDate>Thu, 06 Nov 2025 19:08:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=45839014</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=45839014</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45839014</guid></item><item><title><![CDATA[New comment by ragnese in "How often does Python allocate?"]]></title><description><![CDATA[
<p>> Are there any good resources on optimizing python performance while keeping idiomatic?<p>At the risk of sounding snarky and/or unhelpful, in my experience, the answer is that you don't try to optimize Python code beyond fixing your algorithm to have better big-O properties, followed by calling out to external code that isn't written in Python (e.g., NumPy, etc).<p>But, I'm a hater. I spent several years working with Python and hated almost every minute of it for various reasons. Very few languages repulse me the way Python does: I hate the syntax, the semantics, the difficulty of distribution, and the performance (memory and CPU, and is GIL disabled by default yet?!)...</p>
]]></description><pubDate>Thu, 06 Nov 2025 17:09:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=45837496</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=45837496</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45837496</guid></item><item><title><![CDATA[New comment by ragnese in "How often does Python allocate?"]]></title><description><![CDATA[
<p>Ints probably get a big boost in languages where the only built-in for-loop syntax involves incrementing an index variable, like C. And, speaking of C, specifically, even the non-int types are actually ints or isomorphic to ints: enums, bools, char, <i>pointers</i>, <i>arrays</i> (which are just pointers if you squint), etc...<p>But, otherwise, I'd agree that strings probably win, globally.</p>
]]></description><pubDate>Thu, 06 Nov 2025 16:58:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=45837351</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=45837351</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45837351</guid></item><item><title><![CDATA[New comment by ragnese in "Gnome Mutter Now "Completely Drops the Whole X11 Back End""]]></title><description><![CDATA[
<p>I read them, but I'm not sure what point you're trying to make, or why it's directed at my comment. I mean that genuinely.<p>This Xfce dev says that GTK4 is less capable than GTK3, and they feel that GTK5 will continue in that direction. They also acknowledge certain things in the first comment:<p>> [0] Full disclosure: I'm an Xfce developer, and have been disappointed with the direction GTK has been taking for some time. I don't begrudge them their prerogative to do what they need/want to achieve their own goals with the toolkit they've built and maintain. But it really is making life more difficult for me.<p>><p>> [1] Part of the argument is that Wayland doesn't natively support things like cross-process embedding, so a cross-platform toolkit shouldn't have these types of widgets (the classic problem of only being able to support the lowest common denominator). But a) you can absolutely build something like that for Wayland (something I've been working on, though it requires tens of thousands of lines of code to do), and b) with other changes, it's incredibly difficult and possibly impossible to even implement the XEMBED protocol on GTK4, for people who do only care about X11.<p>If the GNOME guys took out stuff from GTK4 or 5 for bad reasons, then I don't like that, either. Which is basically exactly what I said. However, it sounds like some of these changes would be hard to do and maintain well, such as cross-process embedding. Perhaps the GNOME devs made a decision to focus their surely limited resources toward things they think will be long-lasting. And, perhaps, by their estimation, trying to support Wayland and X11 by adding (and maintaining) tens of thousands of lines of code would be a big burden--especially if they believe that X11 is not going to be super-relevant in the near future. I don't agree with that estimation, and I assume that it'll be a very long time before X11 isn't necessary anymore, but so be it.<p>All that said, it still has nothing to do with Mutter, which is why I replied to the comment that I did. Because GTK, and Mutter, and GNOME Shell, and GNOME apps, and non-GNOME GTK apps, are all different things, and this post was about Mutter.</p>
]]></description><pubDate>Wed, 05 Nov 2025 19:43:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=45826980</link><dc:creator>ragnese</dc:creator><comments>https://news.ycombinator.com/item?id=45826980</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45826980</guid></item></channel></rss>