<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: Dan42</title><link>https://news.ycombinator.com/user?id=Dan42</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 09:25:58 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=Dan42" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by Dan42 in "It's 2026, Just Use Postgres"]]></title><description><![CDATA[
<p>That article was clearly written by AI, based on data from 20 years ago.</p>
]]></description><pubDate>Fri, 06 Feb 2026 01:27:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=46907843</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=46907843</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46907843</guid></item><item><title><![CDATA[New comment by Dan42 in "T-Ruby is Ruby with syntax for types"]]></title><description><![CDATA[
<p>Yeah, it doesn't work with keyword arguments. In the playground I tried a simple keyword with default value, and it converted to the wrong thing, as if "someone" was a valid type.<p><pre><code>    def greet(name: "someone"): String
      "Hello, #{name}!"
    end</code></pre></p>
]]></description><pubDate>Sat, 27 Dec 2025 03:57:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=46398978</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=46398978</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46398978</guid></item><item><title><![CDATA[New comment by Dan42 in "Ruby Blocks"]]></title><description><![CDATA[
<p>This is really cute and heartwarming.<p>Back in the day, a lot of people including me reported feeling more comfortable in Ruby after one week than all their other languages with years of experience, as if Ruby just fits your mind like a glove naturally.<p>I'm glad new people are still having that "Ruby moment"</p>
]]></description><pubDate>Sat, 18 Oct 2025 12:29:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=45626828</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45626828</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45626828</guid></item><item><title><![CDATA[New comment by Dan42 in "The illegible nature of software development talent"]]></title><description><![CDATA[
<p>Wow. You are me.</p>
]]></description><pubDate>Sat, 11 Oct 2025 14:34:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=45549465</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45549465</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45549465</guid></item><item><title><![CDATA[New comment by Dan42 in "The Theatre of Pull Requests and Code Review"]]></title><description><![CDATA[
<p>I see posts like this one pop up from time to time. I love it. Based on my 30y of exp that's also the workflow I converged on. It seems to me like every experienced and skilled developer is converging on this. jujutsu is entirely built to accommodate this workflow.<p>There are no silver bullets or magical solutions, but this is as close to one as I've ever seen. A true "best practice" distilled from the accumulated experience of our field, not from someone with something to sell.</p>
]]></description><pubDate>Thu, 25 Sep 2025 14:15:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=45372874</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45372874</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45372874</guid></item><item><title><![CDATA[New comment by Dan42 in "Quicksort explained IKEA-style"]]></title><description><![CDATA[
<p>Actually you're right, it <i>is</i> an implementation detail. The original isn’t mistaken, it’s just showing the lo-to-hi partitioning pass rather than the from-both-ends version I had in mind when I implemented quicksort before.<p>shame, shame, I should have double-checked before posting.</p>
]]></description><pubDate>Wed, 24 Sep 2025 20:27:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=45365565</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45365565</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45365565</guid></item><item><title><![CDATA[New comment by Dan42 in "Quicksort explained IKEA-style"]]></title><description><![CDATA[
<p>I'm pretty sure the swapping is a fundamental part of the quicksort algorithm, not a mere implementation detail. That's the reason quicksort is an in-place algorithm.</p>
]]></description><pubDate>Wed, 24 Sep 2025 19:47:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=45365141</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45365141</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45365141</guid></item><item><title><![CDATA[New comment by Dan42 in "Quicksort explained IKEA-style"]]></title><description><![CDATA[
<p>This is cool, but missing a LOT of details between steps 4 and 5, which is the meat of the quicksort. Actually, the first and last elements of step 4 would be swapped, which means the order depicted in step 5 is incorrect.</p>
]]></description><pubDate>Wed, 24 Sep 2025 18:22:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=45364120</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45364120</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45364120</guid></item><item><title><![CDATA[New comment by Dan42 in "Look Out for Bugs"]]></title><description><![CDATA[
<p>This article really resonated with me. I've been trying to teach this way of thinking to juniors, but with mixed results. They tend to just whack at their code until it stops crashing, while I can often spot logic errors in a minute of reading. I don't think it's <i>that</i> hard, just a different mindset.<p>There's a well-known quote: "Make the program so simple, there are obviously no errors. Or make it so complicated, there are no obvious errors." A large application may not be considered "simple" but we can minimize errors by making it a sequence of small bug-free commits, each one so simple that there are obviously no errors. I first learned this as "micro-commits", but others call it "stacked diffs" or similar.<p>I think that's a really crucial part of this "read the code carefully" idea: it works best if the code is made readable first. Small readable diffs. Small self-contained subsystems. Because obviously a million-line pile of spaghetti does not lend itself to "read carefully".<p>Type systems certainly help, but there is no silver bullet. In this context, I think of type systems a bit like AI: they can improve productivity, but they should not be used as a crutch to avoid reading, reasoning, and building a mental model of the code.</p>
]]></description><pubDate>Mon, 08 Sep 2025 15:44:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=45169724</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45169724</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45169724</guid></item><item><title><![CDATA[New comment by Dan42 in "How RubyGems.org protects OSS infrastructure"]]></title><description><![CDATA[
<p>Reading this, I couldn't help but think these guys really know where their towel is. The opposite of enshittification?</p>
]]></description><pubDate>Mon, 25 Aug 2025 23:50:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=45020602</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=45020602</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45020602</guid></item><item><title><![CDATA[New comment by Dan42 in "I've Had It with Microsoft"]]></title><description><![CDATA[
<p>Beautiful. I had that exact computer model 30 years ago.</p>
]]></description><pubDate>Sun, 27 Jul 2025 11:38:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=44700560</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=44700560</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44700560</guid></item><item><title><![CDATA[New comment by Dan42 in "Trusting your own judgement on 'AI' is a risk"]]></title><description><![CDATA[
<p>> Don't we have decades of research about the improvements in productivity and correctness brought by static type checking?<p>Yes, we have decades of such research, and the aggregate result of all those studies is that no productivity gain can be significantly demonstrated for static over dynamic, and vice-versa.</p>
]]></description><pubDate>Mon, 09 Jun 2025 18:15:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=44227401</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=44227401</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44227401</guid></item><item><title><![CDATA[New comment by Dan42 in "Triptych Proposals"]]></title><description><![CDATA[
<p>> This is incorrect, according to this comment from the Firefox implementer who delayed the feature. He intended the roll back to be temporary. [0]<p>I see no such thing in the link you have there. #ref-6 starts with:<p>> [6] On 01/12/2011, at 9:57 PM, Julian Reschke wrote: "One thing I forgot earlier, and which was the reason<p>But the link you have there [1] does not contain any such comment. Wrong link?<p>[1] <a href="https://lists.w3.org/Archives/Public/public-html-comments/2011Apr/0000.html" rel="nofollow">https://lists.w3.org/Archives/Public/public-html-comments/20...</a><p>(will reply to other points as time allows, but I wanted to point out this first)</p>
]]></description><pubDate>Wed, 08 Jan 2025 15:26:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=42635180</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=42635180</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42635180</guid></item><item><title><![CDATA[New comment by Dan42 in "Triptych Proposals"]]></title><description><![CDATA[
<p>No, please, just no.<p>The idea of using PUT, DELETE, or PATCH here is entirely misguided. Maybe it was a good idea, but history has gone in a different direction so now it's irrelevant. About 20 years ago, Firefox attempted to add PUT and DELETE support to the <form> element, only to roll it back. Why? Because the semantics of PUT and DELETE are not consistently implemented across all layers of the HTTP infrastructure—proxies, caches, and intermediary systems. This inconsistency led to unpredictable failures, varying by website, network, and the specific proxy or caching software in use.<p>The <i>reality</i> we live in, shaped by decades of organic evolution, is that only GET and POST are universally supported across all layers of internet infrastructure.<p>Take a cue from the WHATWG HTML5 approach: create your RFC based on what is already the de facto standard: GET is for reading, and POST is for writing. The entire internet infrastructure operates on these semantics, with little to no consideration for other HTTP verbs. Trying to push a theoretically "correct" standard ignores this reality and, as people jump into the hype train, will consume significant time and resources across the industry without delivering proportional value. It's going to be XHTML all over again, it's going to be IPv6 all over again.<p>Please let's just use what already works. GET for reading, POST for writing. That’s all we need to define transport behavior. Any further differentiation—like what <i>kind</i> of read or write—is application-specific and should be decided by the endpoints themselves.<p>Even the <form> element’s "action" attribute is built for this simplicity. For example, if your resource is /tea/genmaicha/, you could use <form method="post" action="brew">. Voilà, relative URLs in action! This approach is powerful, practical, and aligned with the infrastructure we already rely on.<p>Let’s not overcomplicate things for the sake of theoretical perfection. KISS.</p>
]]></description><pubDate>Wed, 08 Jan 2025 01:21:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=42629856</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=42629856</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42629856</guid></item><item><title><![CDATA[New comment by Dan42 in "Why pipes sometimes get "stuck": buffering"]]></title><description><![CDATA[
<p>grep has a --line-buffered option that does the job fine in most cases. Just set in your aliases grep='grep --line-buffered', that way you get the correct behavior when you tail logs piped to a sequence of greps, and you avoid the performance penalty in scripts.</p>
]]></description><pubDate>Sat, 30 Nov 2024 03:57:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=42279270</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=42279270</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42279270</guid></item><item><title><![CDATA[New comment by Dan42 in "Testing for gender differences in Python programming style and quality on GitHub"]]></title><description><![CDATA[
<p>I'm 47 and I also have never heard this in my life. So I don't think it's just a matter of younger generations.</p>
]]></description><pubDate>Thu, 31 Oct 2024 02:46:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=42002966</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=42002966</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42002966</guid></item><item><title><![CDATA[New comment by Dan42 in "I love programming but I hate the programming industry"]]></title><description><![CDATA[
<p>An order of magnitude is a bit much. I'd say quick and dirty gets you 3 shots, while slow and beautiful gets you 1. And if you succeed, it means the result is dirty/ugly code that must be maintained forever.</p>
]]></description><pubDate>Sun, 21 Apr 2024 14:00:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=40105857</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=40105857</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40105857</guid></item><item><title><![CDATA[New comment by Dan42 in "A Plea for More Mikado"]]></title><description><![CDATA[
<p>It's the first time I hear "Mikado" but it's pretty much the commit policy I established for work, and we call it micro-commits.<p><a href="http://lucasr.org/2011/01/29/micro-commits/" rel="nofollow">http://lucasr.org/2011/01/29/micro-commits/</a><p><a href="https://mrcote.info/blog/2017/12/04/more-lessons-from-mozreview-mozilla-and-microcommits/" rel="nofollow">https://mrcote.info/blog/2017/12/04/more-lessons-from-mozrev...</a><p><a href="https://dev.to/rpalo/plan-your-commits" rel="nofollow">https://dev.to/rpalo/plan-your-commits</a><p>The article focuses on refactoring and migrations, but it works also for regular development. One rule of thumb is: write a one-line commit message, and then write the code described by the commit, and just that. Another rule of thumb is that refactors should go into their own commit. So while you are coding according to your one-line commit message, if there are small refactors needed along the way, commit them separately. Fix whitespace? One commit. Extract a method so you can re-use it? One commit to extract, then use the extracted method in your next commit.<p>Having small atomic commits makes code that is much easier to review, and much easier to test. I think it's similar to unit testing: we change how we write code in order to make it unit-testable. This is for code review: we write code with micro-commits in order to make it code-reviewable.<p>This method is pretty much incompatible with squash-and-rebase. Squashing throws away all the useful information of micro-commits. Instead, just merge, and the merge commit itself is equivalent to the squashed-rebased version.<p>> Obviously, the Mikado Method cannot work if you don’t have a good and highly reliable automated test suite.<p>I disagree. Of course it's always better to have an automated test suite. But in the absence of one, the only thing you can rely on is thorough code review. And with micro-commits you have a <i>much</i> better chance of spotting problems if the code-diff you review contains only a small self-contained atomic change. Code-reviewing a large squashed commit is all but impossible.</p>
]]></description><pubDate>Thu, 01 Feb 2024 16:22:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=39217631</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=39217631</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39217631</guid></item><item><title><![CDATA[New comment by Dan42 in "Email addresses are not good 'permanent' identifiers for accounts"]]></title><description><![CDATA[
<p>I can't believe such satirical gold is getting downvoted.</p>
]]></description><pubDate>Sun, 31 Dec 2023 15:12:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=38824554</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=38824554</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38824554</guid></item><item><title><![CDATA[New comment by Dan42 in "It's time to put REST to rest"]]></title><description><![CDATA[
<p>Yep, this is pretty much what I've settled on myself.<p>GET for read, POST for write. And a url made of a slash-terminated "resource" followed by an "action" verb. user 123 + edit = "/user/123/edit" ; user 123 + default(show) = "/user/123/" ; list of users = "/user/list" ; etc.<p>When applied to web pages, it means you can have <form action="edit"> and the "action" attribute of the form directly matches the "action" of the backend/router/API. I like that, it makes me feel warm and fuzzy. :-)</p>
]]></description><pubDate>Thu, 28 Dec 2023 21:57:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=38799216</link><dc:creator>Dan42</dc:creator><comments>https://news.ycombinator.com/item?id=38799216</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38799216</guid></item></channel></rss>