<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: MillenialMan</title><link>https://news.ycombinator.com/user?id=MillenialMan</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 22 Apr 2026 23:18:50 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=MillenialMan" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by MillenialMan in "Classic SE Mistakes (1996)"]]></title><description><![CDATA[
<p>I don't think it's about money. Software engineer salaries are very high, and cubicles are a compromise that still saves space. I think it's because for most people, procrastination reduces output a lot more than distraction and noise, and they procrastinate less when everyone can see their screen.</p>
]]></description><pubDate>Fri, 07 Oct 2022 15:50:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=33122955</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=33122955</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33122955</guid></item><item><title><![CDATA[New comment by MillenialMan in "What does a Principal Software Engineer do?"]]></title><description><![CDATA[
<p>I get what you're saying but I think it generally does the opposite. People like prestige.</p>
]]></description><pubDate>Wed, 15 Dec 2021 02:27:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=29561320</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29561320</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29561320</guid></item><item><title><![CDATA[New comment by MillenialMan in "What does a Principal Software Engineer do?"]]></title><description><![CDATA[
<p>The vast majority of titles in tech confer more prestige than deserved, because there's no downside to a company handing them out like candy. I don't look at it as a portability issue, the incentive isn't to be accurate to begin with. Inflated seniority is just a perk they can offer that doesn't cost them any money, so <i>everyone</i> offers it. Titles across the industry are meaningless unless you're calibrated to that company's levels.</p>
]]></description><pubDate>Tue, 14 Dec 2021 15:30:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=29552605</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29552605</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29552605</guid></item><item><title><![CDATA[New comment by MillenialMan in "Why general inheritance is flawed and how to finally fix it"]]></title><description><![CDATA[
<p>The reason I'd like the construct is because it's explicit - intent (and the scope/limit of your intent) is encoded in what you create. It's clear you intend to do nothing with that name except symlink to the nested member, so the reader doesn't have to anticipate other behaviour (and can't accidentally do something else with it). Generic assignment doesn't convey the same restricted intent, and it doesn't carry those guard rails.<p>Really though it's a structure that only makes sense in strongly typed languages, so I probably shouldn't have used Python to illustrate the idea.</p>
]]></description><pubDate>Tue, 14 Dec 2021 11:49:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=29550649</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29550649</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29550649</guid></item><item><title><![CDATA[New comment by MillenialMan in "The Matrix Is Unreal"]]></title><description><![CDATA[
<p>GPUs are $3000 because of Bitcoin, not Unreal Engine.</p>
]]></description><pubDate>Mon, 13 Dec 2021 13:04:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=29539175</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29539175</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29539175</guid></item><item><title><![CDATA[New comment by MillenialMan in "Why general inheritance is flawed and how to finally fix it"]]></title><description><![CDATA[
<p>I'd like languages to have some kind of "delegate" functionality, where you can just delegate names to point to nested names without screwing around with ownership - it would just act like a symlink. The scope of that action is limited and clear (and easy for your IDE to understand), and it's explicit that the subclass is still the "owner" of that property, which makes the whole thing a lot easier to navigate.<p>E.g. something like:<p><pre><code>    class MyClass:
        def __init__(self, member_class):
            self.member_class = member_class

        # Delegate one member
        delegate move member_class.position.move

        # Delegate all members
        delegate * subclass.position.*             

</code></pre>
Then:<p><pre><code>    a.move == a.member_class.position.move
</code></pre>
etc.</p>
]]></description><pubDate>Mon, 13 Dec 2021 12:48:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=29539070</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29539070</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29539070</guid></item><item><title><![CDATA[New comment by MillenialMan in "The Matrix Awakens: Unreal Engine 5 Techdemo [video]"]]></title><description><![CDATA[
<p>I stand corrected! Thanks for the link, that's very cool.</p>
]]></description><pubDate>Fri, 10 Dec 2021 16:16:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=29511618</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29511618</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29511618</guid></item><item><title><![CDATA[New comment by MillenialMan in "The Matrix Awakens: Unreal Engine 5 Techdemo [video]"]]></title><description><![CDATA[
<p>Those rivets probably aren't modelled, they'll be reconstructed from volume information in the texture. Which is still impressive and a great way of dealing with that type of geometric detail, but it has limitations, and the engine isn't processing actual models at that level of detail.<p>You can still do stuff like that in UE4. Have a look at what's possible with Quixel Mixer, you can create detail like that surprisingly quickly. I'd tentatively argue that modelling tools are the real MVP when it comes to increased geometric LOD in modern engines. They allow you to add that kind of detail quickly enough that it becomes economical to actually detail rivets.<p>Either way, it's very cool. The crowd simulation stuff is going to be useful, current tooling there absolutely sucks outside of a few very expensive dedicated products.</p>
]]></description><pubDate>Fri, 10 Dec 2021 15:06:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=29510702</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29510702</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29510702</guid></item><item><title><![CDATA[New comment by MillenialMan in " Rittenhouse lawyer claims iPad pinch-to-zoom uses AI to fake video footage"]]></title><description><![CDATA[
<p>That's not really true. Video upscaling is probably going to  be linear interpolation, which is very unlikely to add meaningful artifacts, but an intelligent zoom that tries to add visually meaningful information may change the apparent content.</p>
]]></description><pubDate>Thu, 11 Nov 2021 15:11:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=29188654</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29188654</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29188654</guid></item><item><title><![CDATA[New comment by MillenialMan in "Google Summer of Code in 2022 – No longer limited to students"]]></title><description><![CDATA[
<p>It's rarely altruistic but this seems very win/win to me. Talent without a record can prove their chops and get hired above their on-paper experience level, Google gets an additional avenue of recruitment.</p>
]]></description><pubDate>Thu, 11 Nov 2021 09:41:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=29186230</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=29186230</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29186230</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>I understand your point. I'm saying: the subset of problems that benefit in a <i>performance</i> sense from immutability is very small. The vast majority of the time, cache misses slow down algorithms. That's a perfectly reasonable generalisation and I don't really understand why you think it's untrue.<p>Re: change records, I believe Braid uses a historical record of absolute states, not a series of diffs. The state at a particular time is recreated from a minimal representation (a couple of arrays). That's much <i>more</i> efficient than throwing multiple iterations of the state in a HAMT.</p>
]]></description><pubDate>Mon, 25 Oct 2021 09:23:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=28985912</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28985912</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28985912</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>That wasn't really my point. There is still a translation process you have to apply to cross the boundary between immutable and native data structures though, and that has its own overhead.</p>
]]></description><pubDate>Sun, 24 Oct 2021 17:42:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=28980211</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28980211</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28980211</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>In general I would agree, but a significant part of Clojure's appeal is that it's immutable by default, because that allows you to make certain assumptions about the codebase. Introducing mutable datastructures means you can no longer make those assumptions, so it potentially has much wider ramifications than e.g. calling into C code from Python.</p>
]]></description><pubDate>Sun, 24 Oct 2021 15:35:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=28978877</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28978877</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28978877</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>I don't really agree. Cache friendliness is almost always a relevant factor as soon as performance becomes an issue. I get what you're saying but as I see it immutability gives you architectural efficiency and in some cases space efficiency, but rarely processing speed.<p>> Think video games like braid<p>Braid doesn't use immutable data structures, it uses a historical record (and immutability would be incompatible with some of the mechanics).[1] The author of Braid is actually quite famous for his dislike of functional languages and immutability. He doesn't even like garbage collection because of the overhead it introduces.<p>Interestingly, he was talking about data structures for codebase representation (in the context of a compiler) a while back, and someone mentioned HAMTs. I'm definitely curious if they would work well there.<p>[1] <a href="https://www.youtube.com/watch?v=8dinUbg2h70" rel="nofollow">https://www.youtube.com/watch?v=8dinUbg2h70</a></p>
]]></description><pubDate>Sun, 24 Oct 2021 12:56:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=28977466</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28977466</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28977466</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>I understand the point, I'm not arguing that you can't do that or speed up your code by doing that.<p>Python is also slow, but you can still go fast (in some cases) by calling into C libraries like numpy - but the performance is coming from C, not Python. Python is still slow, it's just not an issue because you're only using it for plumbing.<p>But Clojure is immutable-by-default, that's the point of the language - it gives you various guarantees so you don't have to worry about mutability bubbling up from lower levels. In order to wrap your heavy path you have to go outside the Clojure structure and sacrifice that guarantee. You <i>do</i> lose structural integrity when you do that, even if you attempt to insulate your mutable structure. The system loses some provability.</p>
]]></description><pubDate>Sun, 24 Oct 2021 12:24:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=28977250</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28977250</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28977250</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>You're right - I missed that, the author does mention arrays having better access characteristics, although he doesn't really explain why HAMTs specifically are slow.<p>How does Clojure's HAMT avoid fragmenting over time?<p>> Clojure standard library works on arrays just fine, as demonstrated in the article.<p>Right, but then you don't have immutability - so you lose all the guarantees that you originally had with immutable-by-default.</p>
]]></description><pubDate>Sun, 24 Oct 2021 12:18:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=28977220</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28977220</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28977220</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>Fair enough on scaling. But 24 is still a lot less than two to three orders of magnitude.</p>
]]></description><pubDate>Sun, 24 Oct 2021 10:56:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=28976696</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28976696</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28976696</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>Yes, this is a general problem with functional data structures. They have to be fragmented in order to share data. There's also the more nebulous issue that they encourage nesting to leverage the architectural benefits of immutability, which is a complete disaster for cache friendliness.<p>Replacing the critical path is an option, but that only works for numpy-style situations where you can cleanly isolate the computational work and detach it from the plumbing. If your app is slow because the inefficiencies have added up across the entire codebase (more common, I would argue), that's not an easy option.</p>
]]></description><pubDate>Sun, 24 Oct 2021 10:34:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=28976597</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28976597</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28976597</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>Threading doesn't compensate for that degree of slowdown, and itself has overhead. You'll get something back, but not much.</p>
]]></description><pubDate>Sun, 24 Oct 2021 10:07:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=28976445</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28976445</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28976445</guid></item><item><title><![CDATA[New comment by MillenialMan in "Idiomatic Clojure without sacrificing performance"]]></title><description><![CDATA[
<p>The biggest performance issue Clojure has, which isn't mentioned in the article and is fundamentally unsolvable, is that it misses the CPU cache - a lot.<p>The data structure that drives the immutable variables, the Hash-Array Mapped Trie, is efficient in terms of time- and space- complexity, but it's incredibly CPU cache-unfriendly because by nature it's fragmented - it's not contiguous in RAM. Any operation on a HAMT will be steeped in cache misses, which slows you down by a factor of hundreds to thousands. The longer the trie has been around, the more fragmented it is likely to become. Looping over a HAMT is slower than looping over an array by two or three orders of magnitude.<p>I don't think there is really a solution to that. It's inherent. Clojure will always be slow, because it's not cache friendly. The architecture of your computer means you physically can't speed it up without sacrificing immutability.</p>
]]></description><pubDate>Sun, 24 Oct 2021 08:56:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=28976053</link><dc:creator>MillenialMan</dc:creator><comments>https://news.ycombinator.com/item?id=28976053</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28976053</guid></item></channel></rss>