<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: sirwhinesalot</title><link>https://news.ycombinator.com/user?id=sirwhinesalot</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 28 Jul 2026 04:14:53 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=sirwhinesalot" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by sirwhinesalot in "Introduction to Data-Oriented Design [pdf]"]]></title><description><![CDATA[
<p>Eh, I don't think that's a good renaming. Data-Oriented Design is in opposition to Domain-Driven Design (a software development approach that prioritizes modeling software to match a real-world business domain).<p>OOP tells you to structure your software as objects exchanging messages, and DDD tells you what those objects (or their classes rather) should be.<p>Similarly, Procedural programming tells you to structure your software as procedures, and DOD tells you what those procedures should operate on.<p>The focus on the data is the really important part. What is the actual data I'm operating on (without any fluff on top) and what do I need to transform it into? What subsets of that data need to be operated on at any given point in the program? That's the core of DOD.<p>Then, as a second step, comes the hardware. Now that I know what data I need to operate on, how do I lay it out to best take advantage of the hardware I'm targeting? If you rename the paradigm to "Hardware Oriented Programming", it shifts the focus from data modeling to code (IMO), which is the wrong frame of mind.<p>For example, virtual calls are slow compared to direct calls, because they screw up branch prediction and often can't be inlined. In HOP, you'd probably ban virtual calls entirely because virtual calls bad.<p>But in DOD, they honestly probably don't matter at all! Because if you did the data modeling as instructed, and then you laid out the data to best take advantage of the hardware, your virtual function is going to be operating on a pile of data in bulk, making the virtual call cost pure noise.</p>
]]></description><pubDate>Mon, 27 Jul 2026 07:34:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=49066224</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=49066224</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49066224</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Introduction to Data-Oriented Design [pdf]"]]></title><description><![CDATA[
<p>Yes. Array programming happens to overlap heavily with DOD in modern hardware because of caching and SIMD, but if you were programming an Atari ST it wouldn't.<p>There are also cases where the optimal data format isn't array oriented because the memory access patterns for the problem in question just require something else.<p>You also have to think of hot vs cold data, which has nothing to do with arrays.</p>
]]></description><pubDate>Sun, 26 Jul 2026 20:10:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=49061939</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=49061939</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49061939</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Memory safety absolutists"]]></title><description><![CDATA[
<p>I wasn't aware of that VC++ feature, TIL, thanks!</p>
]]></description><pubDate>Sun, 26 Jul 2026 15:16:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49058985</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=49058985</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49058985</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Memory safety absolutists"]]></title><description><![CDATA[
<p>For std::string and std::vector yes, but not for std::span (until C++26) for reasons I cannot understand.</p>
]]></description><pubDate>Sun, 26 Jul 2026 14:46:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=49058726</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=49058726</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49058726</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Memory safety absolutists"]]></title><description><![CDATA[
<p>Partially yes. Fil-C goes further in creating an entire ecosystem of Fil-C compiled "legacy" libraries, meaning all the unsafe FFI your Rust code does into C is also safe, and even many linux syscalls.<p>Miri is meant as more of a sanitizer type tool that you use during development to catch bugs. Fil-C is a platform you compile your entire Linux distro with for use in production.</p>
]]></description><pubDate>Sun, 26 Jul 2026 11:15:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=49056920</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=49056920</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49056920</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Memory safety absolutists"]]></title><description><![CDATA[
<p>I don't particularly care about Rust vs Fil-C shit flinging, I don't even see them as competing since they have effectively near opposite tradeoffs.<p>You could even use Rust alongside Fil-C to ensure the unsafe blocks are safe. It would even be interesting to turn off some of Fil-C's expensive protections in the safe parts of the Rust code, making an average-of-both-worlds sort of solution.<p>What I do care about are C and C++, these two absolute garbage languages (though I do have a lot of love for C, you can both love and hate something).<p>Tools like Fil-C, hardened mallocs like SlimGuard, and other "make C safe" solutions all sacrifice absurd amounts of performance because these two moronic languages refuse to have a proper slice/span type.<p>Use-after-free and double-free are serious problems but they're a spec of dust compared to missing bounds-checks. The low-hanging fruit is right there for the picking but everyone is worried about how to reach the fruits at the top.<p>C++ only now in C++26 is finally adding bounds checks to the [] operator on std::span and (hilariously) is also finally adding the now mostly redundant .at() method which should have been there from day one.<p>Clang added -fbounds-safety which is a feature that should have existed for a long time and serves as a decent stop-gap to a proper slice type. But of course, since it's not standardized, most people won't use it.<p>What these two languages have taught us is that if you want to produce utter garbage you should make it an ISO standard.<p>Me, personally, I find this whole discussion on memory safety amusing. Missing bounds checks are by far the biggest source of vulnerabilities and they're a problem in exactly 2 languages and those 2 languages have outright refused to do anything about it for decades.<p>But hey, even in memory safe languages you have frameworks like log4j that had remote code execution from a format string as a feature. Is the problem memory safety specifically, or this utter cavalier attitude towards security?<p>I'm not even suggesting something dumb like "you just gotta get good at C and then you won't have any vulnerabilities". Humans are fallible, which is why we delegate what we can to machines. I'm just pointing out the utter lack of <i>care</i>. People just don't care.<p>At least do the bare minimum of effort like, I don't know, not make remote code execution a feature tied to format strings. Or provide a slice type in your language and string manipulation functions in your standard library that make use of it, preferably 20 years ago.</p>
]]></description><pubDate>Sun, 26 Jul 2026 09:17:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49056188</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=49056188</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49056188</guid></item><item><title><![CDATA[LL Handles Direct Left Recursion]]></title><description><![CDATA[
<p>Article URL: <a href="https://btmc.substack.com/p/ll-handles-direct-left-recursion">https://btmc.substack.com/p/ll-handles-direct-left-recursion</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48944106">https://news.ycombinator.com/item?id=48944106</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 17 Jul 2026 06:51:27 +0000</pubDate><link>https://btmc.substack.com/p/ll-handles-direct-left-recursion</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48944106</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48944106</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Writing a bindless GPU abstraction layer"]]></title><description><![CDATA[
<p>These attempts at better GPU abstraction layers (starting from the Sebastian Aaltonen article and continuing with the Loon GPU API in the linked article or the Odin-based no_gfx) all have the issue that they're building on top of the current jank APIs we have.<p>Basically, they're all still concerned with the realities of current day GPU hardware, which in turn means they too, much like DirectX and Vulkan, will eventually become "bad" abstractions.<p>IMO, if there is any mention of a "vertex" or "fragment" shader, it's still not there yet. End goal should be massively parallel CPU, no graphics-specific functionality beyond compiler intrinsics for whatever can't be done efficiently in software. Something like CUDA is the target to aim for.</p>
]]></description><pubDate>Tue, 14 Jul 2026 13:40:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=48906708</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48906708</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48906708</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Odin 1.0 Announcement"]]></title><description><![CDATA[
<p>By far the best feature (IMO) is that it has no trouble talking to the most important Windows COM libraries (like DirectX) and the Objective-C runtime (for Metal), and this comes as "batteries included", not some random third party library you have to download.<p>So for any sort of visual engine development (game engines being the most obvious, but also applications like blender or the JangaFx suite which is the main user of Odin), it is great. What you need is just there ready to go.<p>The language design itself is very much oriented around appealing to people who do this sort of work.<p>Other than there isn't much to the language really. It lacks a "big idea" feature like Rust's lifetimes or Zig's comptime. The closest thing to a "big idea" is the rejection of package managers but that's not really part of the language.<p>It's pleasant to use and compiles fast. Hard to complain.</p>
]]></description><pubDate>Tue, 07 Jul 2026 15:01:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48818806</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48818806</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48818806</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Odin 1.0 Announcement"]]></title><description><![CDATA[
<p>Yeah, all valid justifications.</p>
]]></description><pubDate>Tue, 07 Jul 2026 09:33:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48815490</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48815490</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48815490</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Odin 1.0 Announcement"]]></title><description><![CDATA[
<p>Clickbait video title, the first major release is going to be 2027 (date based versioning) (j/k).<p>Odin is a pretty neat language, I should play more with it. There's nothing outright wrong with it I can think of. Some things I would have done slightly different but they're all nitpicks (mainly having the context be a thread local so #contextless wouldn't be necessary).</p>
]]></description><pubDate>Tue, 07 Jul 2026 08:41:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=48815132</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48815132</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48815132</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "The LLVM Compiler Infrastructure"]]></title><description><![CDATA[
<p>The only alternative I'm aware of with a similar level of optimization is GCC's backend, which is just as slow.<p>Both should be much faster at compiling debug builds than they are though. There's an LLVM fork (TPDE-LLVM) that supports a limited set of backend targets but compiles way faster (order of magnitude) for O0, but for whatever reason they haven't managed to merge it with the mainline LLVM. Even with that there's still plenty of overhead from all the horrible C++ OOP-brained abstractions LLVM uses.</p>
]]></description><pubDate>Tue, 07 Jul 2026 08:04:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=48814908</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48814908</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48814908</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Zuckerberg says AI agent development going slower than expected"]]></title><description><![CDATA[
<p>I get why you think this but you are incorrect. Why? Because managing a team of people is very very different from managing outsourced contractors, and LLMs are much more like the latter than the former.</p>
]]></description><pubDate>Mon, 06 Jul 2026 08:58:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=48802251</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48802251</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48802251</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "It's not about physical vs. digital games, it's about ownership"]]></title><description><![CDATA[
<p>A lease should have a clear timetable. How long am I leasing this thing for? 1 year? 3 years?<p>I'm fine with companies leasing software. I don't like it, and I much prefer buying, but that's fine. That is what software subscriptions are, the terms and conditions are clear.<p>"Buying" something where access can be revoked at any time, for any reason, needs to become illegal.</p>
]]></description><pubDate>Mon, 06 Jul 2026 08:49:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=48802215</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48802215</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48802215</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Alan Kay on the meaning of "object-oriented programming" (2003)"]]></title><description><![CDATA[
<p>There are various ways to solve the problem (if you consider it a problem, I personally don't, there's no need for things to be this extremely decoupled, but for the sake of argument):<p>1) Allow objects to send messages to an implicit "parent" object, which supports "doesNotUnderstand" ala Smalltalk and that by default also forwards to the implicit parent. That means you can implement "log(...)" at the right point in the abstraction without manually passing a logger around.<p>2) Use algebraic effects, no need to handle this with OOP. A function requests the "log" effect and a handler defined in a higher level scope takes care of implementing log.<p>3) Have a language with an implicit context parameter that allows putting arbitrary things in it (closest would be Odin but Odin has a fixed set of operations in the context). Because it is implicit in the calling convention methods can be oblivious to it.<p>4) You separate the concerns: logging is the act of recording some information. Where that information is ultimately sent or stored is a separate concern. This is the more functional view of the problem. If you follow a "model-view-update" approach like the so called "Elm Architecture", logging is just another task produced by the view function, it doesn't need any special handling.<p>It's not that this is a "problem" of OOP, it is that OOP doesn't give you any tools for tackling this problem. That is why dependency injection frameworks exist. Some other paradigms and non-OOP architectures don't have any trouble with it. You can also replicate those architectures in an OOP language, but that's still "contorting the paradigm" rather than it helping or guiding you towards a clean solution.<p>Personally I think a global singleton logger is perfectly reasonable, it is other people (the ones using DI frameworks) that think otherwise ;)</p>
]]></description><pubDate>Wed, 01 Jul 2026 13:08:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=48746120</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48746120</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48746120</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Alan Kay on the meaning of "object-oriented programming" (2003)"]]></title><description><![CDATA[
<p>No it is not a fault of OOP, it is just that OOP does not really provide the tools to help either. It is the fault of people with the wrong expectations or of those trying to sell snake oil.<p>OOP allows to create decoupled systems but it doesn't help in creating them. It is not an inherent property of the paradigm, but many people sold it as such.<p>"Use OOP and your application is now magically more modular! Buy my latest book to find out how!"<p>Since you mentioned you are a junior I guess this sort of nonsense is from before your time. No worries, that just means you won't have stupid dogma shoved down your throat. Use whatever paradigm if it helps you and avoid whatever gets in the way.</p>
]]></description><pubDate>Tue, 30 Jun 2026 18:19:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=48736967</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48736967</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48736967</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Alan Kay on the meaning of "object-oriented programming" (2003)"]]></title><description><![CDATA[
<p>I think dogma is far worse than "tight coupling" or introducing mutation or even inheritance when it is the simplest and most direct solution to a problem. People get too hung up on the "ideal" way to do things.<p>I can criticize a paradigm while also using it anywhere and everywhere it benefits me ;)</p>
]]></description><pubDate>Tue, 30 Jun 2026 14:35:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48733280</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48733280</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48733280</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Alan Kay on the meaning of "object-oriented programming" (2003)"]]></title><description><![CDATA[
<p>It's not really true that components in physical engineering domains have no memory. The behavior of many physical components can only be described with access to a recent history. Other components, specially controllers, are typically state machines (which obviously have state).<p>But it is true that there will always be parts of a software system that are highly coupled. I'm not even sure if that's even a problem, unless the coupling is also highly tangled (meaning the connections are coming from too many places).<p>But <i>if</i> you want to decrease coupling between parts of a system, OOP by itself is not particularly good at it. Even something like an Entity Component System is usually less coupled than most OOP codebases because while each System is heavily coupled to the components they do work on, the Systems are usually fully independent from one another and easily replaceable.</p>
]]></description><pubDate>Tue, 30 Jun 2026 14:12:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48733010</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48733010</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48733010</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Parse, Don't Validate – In a Language That Doesn't Want You To"]]></title><description><![CDATA[
<p>Languages with refinement types (or contracts) like Dafny and Liquid Haskell can typically handle numerical predicates directly. Some can even handle string predicates directly, including regular expressions. They also allow you to write complex predicates as separate functions, albeit with limited expressiveness.<p>But you hit performance and/or outright computational limits (halting problem) rather quickly.</p>
]]></description><pubDate>Tue, 30 Jun 2026 13:54:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=48732804</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48732804</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48732804</guid></item><item><title><![CDATA[New comment by sirwhinesalot in "Alan Kay on the meaning of "object-oriented programming" (2003)"]]></title><description><![CDATA[
<p>To be clear I'm not arguing against objects here, I don't disagree with anything you wrote. I'm only arguing against the somewhat commonly held idea that OOP helps with loose coupling.<p>Interfaces (a feature of OOP) can be used to decrease coupling, but the paradigm itself doesn't really provide any assistance in regards to coupling.<p>The default is for objects to directly instantiate other concrete objects and to be able to directly communicate with any object they at any point come in contact with. That is strong coupling, by default.<p>You have to do extra work to get looser coupling. Smalltalk style OO is much better (regarding coupling) because you don't have explicit interfaces, you can always replace an object with another. You can also query all live objects of a certain type and replace all of them with a proxy if you so wish. Way better.<p>But you can go even further in regards to loosening coupling. You can have objects communicate through a tuplespace (Linda), you can have objects receive and send messages only through ports, you can have objects send a message to their implicit parent who is then responsible for redirecting it.<p>Mainstream OOP is a very poor paradigm full of issues that gets mogged by everything.
Composition-over-inheritance is an admission of defeat for a paradigm that lacks native delegation support (good on Kotlin for realising this).<p>It even gets mogged by languages like Haskell that introduced the more loosely coupled idea of typeclasses, which were inherited by Rust (traits), Swift (protocols), Go (interfaces, not to be confused with declaration-time interfaces as in Java).<p>We dug a suboptimal hole and stuck our head in there for 50 years.</p>
]]></description><pubDate>Tue, 30 Jun 2026 13:36:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=48732586</link><dc:creator>sirwhinesalot</dc:creator><comments>https://news.ycombinator.com/item?id=48732586</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48732586</guid></item></channel></rss>