<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: tikhonj</title><link>https://news.ycombinator.com/user?id=tikhonj</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 14 Apr 2026 10:16:02 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=tikhonj" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by tikhonj in "EFF is leaving X"]]></title><description><![CDATA[
<p>Ah yes, a non-profit reaching out to a broader audience for its activism is clearly a "certain ideological concern" separate from their core mission.</p>
]]></description><pubDate>Thu, 09 Apr 2026 18:02:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=47707129</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47707129</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47707129</guid></item><item><title><![CDATA[New comment by tikhonj in "The Importance of Being Idle"]]></title><description><![CDATA[
<p>We can't read everything, so we need markers of taste to figure out what is and isn't worth engaging with. AI tells are markers of drastically bad taste.</p>
]]></description><pubDate>Thu, 09 Apr 2026 14:22:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=47704143</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47704143</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47704143</guid></item><item><title><![CDATA[New comment by tikhonj in "Ask HN: Any interesting niche hobbies?"]]></title><description><![CDATA[
<p>It's a great time to get into programming languages stuff: designing domain-specific languages, building new tools/abstractions and, especially, formal verification. If you're mathematically oriented, you can explore formalizing mathematical proofs in Lean.<p>LLMs have really revitalized interest in these areas. AI can really help navigate the initial learning curve, can do a surprising amount of "heavy lifting" and can make tedious but useful work much easier. Do you want your little language to have a language server and nice editor-specific syntax highlighting? Do you need to write a parser with decent error messages? Do you need to prove a bunch of largely straightforward lemmas to get to the proof you actually care about? All of these things are easier (and, hopefully, more fun) than they were a few years ago. But, at the same time, there is still a lot of room for human insight and design in this process. There are a lot of areas that AI can't handle (or, at least, can't handle well) and, of course, nothing stops you from doing the fun stuff by hand even if you <i>could</i> hand it off to Claude.<p>And, of course, all this PL stuff was fun before LLMs. It's even more fun now even if you don't want to use AI yourself, because more people are doing and talking about PL stuff online, and there are more tools and libraries you can use yourself.</p>
]]></description><pubDate>Thu, 09 Apr 2026 02:07:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47698556</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47698556</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47698556</guid></item><item><title><![CDATA[New comment by tikhonj in "Delve removed from Y Combinator"]]></title><description><![CDATA[
<p>Yeah, fraud is what happens when you don't make it.</p>
]]></description><pubDate>Sat, 04 Apr 2026 03:55:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47635549</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47635549</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47635549</guid></item><item><title><![CDATA[New comment by tikhonj in "What category theory teaches us about dataframes"]]></title><description><![CDATA[
<p>You can have both: you start with a small, mathematically inspired algebraic core, then you express the higher-level more user-friendly operations <i>in terms</i> of the algebraic core.<p>As long as your core primitives are well designed (easier said than done!), this accomplishes two things: it makes your implementation simpler, and it helps guide and constrain your user-facing design. This latter aspect is a bit unintuitive (why would you want <i>more</i> constraints to work around?), but I've seen it lead to much better interface designs in multiple projects. By forcing yourself to express user-level affordances in terms of a small conceptual core, you end up with a user design that is more internally consistent and composable.</p>
]]></description><pubDate>Fri, 03 Apr 2026 16:23:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47628633</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47628633</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47628633</guid></item><item><title><![CDATA[New comment by tikhonj in "Delve allegedly forked an open-source tool and sold it as its own"]]></title><description><![CDATA[
<p>I wonder how much of that is posturing (less charitably, lying to outsiders) and how much is the organization effectively lying to itself.<p>Both are indictment of today's ambient startup culture, and I'm not sure which is ultimately worse.</p>
]]></description><pubDate>Thu, 02 Apr 2026 18:07:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=47618008</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47618008</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47618008</guid></item><item><title><![CDATA[New comment by tikhonj in "Slop is not necessarily the future"]]></title><description><![CDATA[
<p>The most productive teams I've seen (eg at Jane Street) rewrite things all the time, and still move faster than any "normal" teams I've seen. I remember when I interned there over a decade ago, they were already on like the seventh? version of their incremental computing framework, and were building a new build system. But they were also incredibly effective at getting things done both on a per-engineer basis and in terms of making money.</p>
]]></description><pubDate>Wed, 01 Apr 2026 00:58:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47595485</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47595485</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47595485</guid></item><item><title><![CDATA[New comment by tikhonj in "Slop is not necessarily the future"]]></title><description><![CDATA[
<p>> <i>No one has ever made a purchasing decision based on how good your code is.</i><p>This is very much a "it's not the fall that kills you, it's the sudden stop at the end" sort of thing. (Same with the other variant I've heard, which is something like "no company has gone out of business because of tech debt".)<p>Code is as much a tool for developing and expressing conceptual models as it is for making computers do things. So not only does code quality have proximate impacts on engineering productivity and reliability, but, done well, it also improves the holistic design of the system you're building. You get better tools, faster, by putting some thought and care into your codebase and, especially, your core abstractions. Teams with good code move faster even in the short term and produce better tools and products.<p>Of course, it's not just a matter of code; you also need a culture that gives engineers the agency to make real, long-term decisions about <i>what</i> you're building (not just <i>how</i>) which, unfortunately, is rare to find in the modern tech industry :/ The dominant "high-output management" paradigm where code is seen as a virtually fungible "output" to be "delivered" loses the higher-order advantages of good code and good conceptual design, and leaves us with something much closer to the trade-off you describe. But there are other ways of approaching technical work that don't make this trade-off at all!</p>
]]></description><pubDate>Wed, 01 Apr 2026 00:55:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47595466</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47595466</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47595466</guid></item><item><title><![CDATA[New comment by tikhonj in "Artemis II is not safe to fly"]]></title><description><![CDATA[
<p>Google's R&D budget is like $60B. Make of that what you will.</p>
]]></description><pubDate>Tue, 31 Mar 2026 15:51:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47589216</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47589216</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47589216</guid></item><item><title><![CDATA[New comment by tikhonj in "Artemis II is not safe to fly"]]></title><description><![CDATA[
<p>Based on some rough numbers, NASA's budget (around $24B) would be <4% of the US's total spending on entertainment, with a pretty great return in research, engineering and education to boot.<p>I also looked up the NSF's 2024 budget, which, at $9B, was much lower than I expected.</p>
]]></description><pubDate>Tue, 31 Mar 2026 08:02:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=47584103</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47584103</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47584103</guid></item><item><title><![CDATA[New comment by tikhonj in "Why I'm betting on ATProto (and why you should, too)"]]></title><description><![CDATA[
<p>There are <i>a lot</i> of small, informal and fuzzy communities around specific interests in Twitter. For example, I routinely run into the same folks talking about some specific areas in PL/FP or in complex systems/resilience engineering. These sub-communities aren't clearly delineated like a subreddit, rather they arise organically through the same set of people following each other or, at least, consistently appearing in each others' feeds and conversations.</p>
]]></description><pubDate>Tue, 31 Mar 2026 01:06:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=47581595</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47581595</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47581595</guid></item><item><title><![CDATA[New comment by tikhonj in "Dataframe 1.0.0.0"]]></title><description><![CDATA[
<p>I rather like this. A represents <i>major</i> changes like a substantial redesign of the whole API, while B catches all other breaking changes. Tiny changes to the public API of a library may not be strictly backwards compatible, even if they don't affect most users of the package or require substantial work to address.<p>A problem with Semver is that a jump from 101.1.2 to 102.0.0 might be a trivial upgrade, and then the jump to 103.0.0 requires rewriting half your code. With two major version numbers, that would be 1.101.1.2 to 1.102.0.0 to 2.0.0.0. That makes the difference immediately clear, and lets library authors push a 1.103.0.0 release if they really need to.<p>In practice, with Semver, changes like this get reflected in the <i>package name</i> instead of the version number. (Like maybe you go from data-frames 101.1.2 to data-frames-2 1.0.0.) But there's no consistent convention for how this works, and it always felt awkward to me, especially if the intention is that everyone migrates to the new version of the API eventually.</p>
]]></description><pubDate>Mon, 23 Mar 2026 14:39:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=47490192</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47490192</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47490192</guid></item><item><title><![CDATA[New comment by tikhonj in "A case against currying"]]></title><description><![CDATA[
<p>The practical upside is that it makes using higher-order functions much smoother, with less distracting visual noise.<p>In Haskell this comes up all over the place. It's somewhat nice for "basic" cases (`map (encode UTF8) lines` vs `map (\ line -> encode UTF8 line) lines`) and, especially, for more involved examples with operators: `encode <$> readEncoding env <*> readStdin` vs, well, I don't even know what...)<p>You could replace the latter uses with some alternative or special syntax that covered the most common cases, like replacing monads with an effect system that used direct syntax, but that would be a lot less flexible and extensible. Libraries would not be able to define their own higher-order operations that did not fit into the effect system without incurring <i>a lot</i> of syntactic overhead, which would make higher-order abstractions and embedded DSLs much harder to use. The only way I can think of for recovering a similar level of expressiveness would be to have a good macro system. That might actually be a better alternative, but it has its own costs and downsides!</p>
]]></description><pubDate>Mon, 23 Mar 2026 01:34:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47484433</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47484433</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47484433</guid></item><item><title><![CDATA[New comment by tikhonj in "A case against currying"]]></title><description><![CDATA[
<p>In a non-strict language without side-effects, having a function with no arguments does not make sense. Haskell doesn't even let you do that.<p>You can write a function that takes a single throw-away argument (eg 0 vs \ () -> 0) and, while the two have some <i>slight</i> differences at runtime, they're so close in practice that you almost never write functions taking a () argument in Haskell. (Which is very different from OCaml!)</p>
]]></description><pubDate>Mon, 23 Mar 2026 01:20:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47484324</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47484324</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47484324</guid></item><item><title><![CDATA[New comment by tikhonj in "Brute-forcing my algorithmic ignorance"]]></title><description><![CDATA[
<p>They've been gamed in the "study for the test" sense for <i>years</i>—a sort of human over-fitting—but managers did not mind. I've heard some insist that this is a feature, not a bug. (Depending on levels of cynicism, it's either testing for diligent workers who put effort into preparation, or selecting out non-conformists who aren't willing to put up with management bullshit.)<p>LLMs make it easier to cheat and give managers a push to develop new, AI-aware, assessment methods, but don't really change the underlying organizational dynamics that led to these tests in the first place.</p>
]]></description><pubDate>Sun, 22 Mar 2026 22:45:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=47483076</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47483076</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47483076</guid></item><item><title><![CDATA[New comment by tikhonj in "A case against currying"]]></title><description><![CDATA[
<p>> <i>in what sense is make_string_comparator_for_locale "really" a function which takes a locale and a string and returns a function from string to ordering?</i><p>In the sense that "make_string_comparator" <i>is not a useful concept</i>. Being able to make a "string comparator" is inherently a function of being able to compare strings, and carving out a bespoke concept for some variation of this universal idea adds complexity that is neither necessary nor particularly useful. At the extreme, that's how you end up with Enterprise-style OO codebases full of useless nouns like "FooAdapter" and "BarFactory".<p>The alternative is to have a consistent, systematic way to turn verbs into nouns. In English we have gerunds. I don't have to say "the sport where you ski" and "the activity where you write", I can just say "skiing" and "writing". In functional programming we have lambdas. On top of that, curried functions are just a sort of convenient contraction to make the common case smoother. And hey, maybe the <i>contraction</i> isn't worth the learning curve or usability edge-cases, but the function it's serving is still important!<p>> <i>Because of point 3, our codebase has a trivial wrapper to put round functions when your function actually returns a function</i><p>That seems either completely self-inflicted, or a limitation of whatever language you're using. I've worked on a number of codebases in Haskell, OCaml and a couple of Lisps, and I have never seen or wanted anything remotely like this.</p>
]]></description><pubDate>Sun, 22 Mar 2026 18:05:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=47480304</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47480304</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47480304</guid></item><item><title><![CDATA[New comment by tikhonj in "Mayor of Paris removed parking spaces, reduced the number of cars"]]></title><description><![CDATA[
<p>None of the changes in the comment make owning a car impossible, they just make driving marginally less privileged over walking and biking.</p>
]]></description><pubDate>Sat, 21 Mar 2026 14:16:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=47467236</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47467236</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47467236</guid></item><item><title><![CDATA[New comment by tikhonj in "Rob Pike’s Rules of Programming (1989)"]]></title><description><![CDATA[
<p>The rule of 3 is awful because it focuses on the wrong thing. If two instances of the same logic represent the same concept, they should be shared. If 10 instances of the same logic represent unrelated concepts, they should be duplicated.<p>The goal is to have code that corresponds to a coherent conceptual model for whatever you are doing, and the resulting codebase should clearly reflect the design of the system. Once I started thinking about code in these terms, I realized that questions like "DRY vs YAGNI" were not meaningful.</p>
]]></description><pubDate>Wed, 18 Mar 2026 14:00:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=47425920</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47425920</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47425920</guid></item><item><title><![CDATA[New comment by tikhonj in "Government grant-funded research should not be published in for-profit journals"]]></title><description><![CDATA[
<p>Worth pointing out a success story: all ACM publications have gone open access starting this year[1]. Papers are now going to be CC licensed, with either the very open CC-BY[2] license or the pretty restrictive (but still better than nothing!) CC-BY-NC-ND[3] license.<p>Computer science as a discipline has always been relatively open and has had its own norms on publication that are different from most other fields (the top venues are almost always conferences rather than journals, and turn-around times on publications are relatively short), so it isn't a surprise that CS is one of the first areas to embrace open access.<p>Still, having a single example of how this approach works and how grass-roots efforts by CS researchers led to change in the community is useful to demonstrate that this idea is viable, and to motivate other research communities to follow suit.<p>[1]: <a href="https://authors.acm.org/open-access/acm-open-for-authors-home" rel="nofollow">https://authors.acm.org/open-access/acm-open-for-authors-hom...</a><p>[2]: <a href="https://creativecommons.org/licenses/by/4.0/" rel="nofollow">https://creativecommons.org/licenses/by/4.0/</a><p>[3]: <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.en" rel="nofollow">https://creativecommons.org/licenses/by-nc-nd/4.0/deed.en</a></p>
]]></description><pubDate>Wed, 04 Mar 2026 16:59:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=47250412</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47250412</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47250412</guid></item><item><title><![CDATA[New comment by tikhonj in "Verified Spec-Driven Development (VSDD)"]]></title><description><![CDATA[
<p>> <i>you can't spec out something you have no clue how to build</i><p>Ideally—and at least <i>somewhat</i> in practice—a specification language is as much a tool for design as it is for correctness. Writing the specification lets you explore the design space of your problem quickly with feedback from the specification language itself, even before you get to implementing anything. A high-level spec lets you pin down which properties of the system actually matter, automatically finds an inconsistencies and forces you to resolve them explicitly. (This is especially important for using AI because an AI model will silently resolve inconsistencies in ways that don't always make sense but are also easy to miss!)<p>Then, when you do start implementing the system and inevitably find issues you missed, the specification language gives you a clear place to update your design to match your understanding. You get a concrete artifact that captures your understanding of the problem <i>and</i> the solution, and you can use that to keep the overall complexity of the system from getting beyond practical human comprehension.<p>A key insight is that formal specification absolutely does not have to be a totally up-front tool. If anything, it's a tool that makes iterating <i>on the design of the system</i> easier.<p>Traditionally, formal specification have been hard to use as design tools partly because of incidental complexity in the spec systems themselves, but mostly because of the overhead needed to not only implement the spec but also maintain a connection between the spec and the implementation. The tools that have been practical outside of specific niches are the ones that solve this connection problem. Type systems are a lightweight sort of formal verification, and the reason they took off more than other approaches is that typechecking automatically maintains the connection between the types and the rest of the code.<p>LLMs help smooth out the learning curve for using specification languages, and make it much easier to generate and check that implementations match the spec. There are still a lot of rough edges to work out but, to me, this absolutely seems to be the most promising direction for AI-supported system design and development in the future.</p>
]]></description><pubDate>Sat, 28 Feb 2026 18:09:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=47198414</link><dc:creator>tikhonj</dc:creator><comments>https://news.ycombinator.com/item?id=47198414</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47198414</guid></item></channel></rss>