<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: kodablah</title><link>https://news.ycombinator.com/user?id=kodablah</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 09 Apr 2026 11:03:27 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=kodablah" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by kodablah in "Artemis II's toilet is a moon mission milestone"]]></title><description><![CDATA[
<p>It is also in that book, page 36/37, with transcription and minor note on issues with ISS toilets in 2008.</p>
]]></description><pubDate>Fri, 03 Apr 2026 17:16:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47629364</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=47629364</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47629364</guid></item><item><title><![CDATA[New comment by kodablah in "Ask HN: What Are You Working On? (March 2026)"]]></title><description><![CDATA[
<p>Modern languages are not safe enough nor are they very amenable to versioning, serialization, resumption, etc. It makes sense for modern durable execution engines to meet developers where they are (I wrote multiple of the SDKs at Temporal, including the Python one, this is just a fun toy side project), but a purpose-built language that has serialization, patching, wait conditions, kwargs everywhere, externalizing side effects, etc, etc, etc is a big win vs something like Python.<p>Admittedly the lang spec doesn't do a great job at the justification side, but the engine spec adjacent to it at <a href="https://github.com/cretz/duralade/blob/initial-runtime/docs/engine-spec.md" rel="nofollow">https://github.com/cretz/duralade/blob/initial-runtime/docs/...</a> that has sections showing CLI/API commands can help make it clearer where this runtime is unique.</p>
]]></description><pubDate>Mon, 09 Mar 2026 17:33:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47312309</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=47312309</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47312309</guid></item><item><title><![CDATA[New comment by kodablah in "Ask HN: What Are You Working On? (March 2026)"]]></title><description><![CDATA[
<p>Duralade - a programming language for durable execution (but has many neat aspects)<p>Most of the work as of today is in a branch, can see the language spec at <a href="https://github.com/cretz/duralade/blob/initial-runtime/docs/language-spec.md" rel="nofollow">https://github.com/cretz/duralade/blob/initial-runtime/docs/...</a>, and some samples at <a href="https://github.com/cretz/duralade/tree/initial-runtime/samples" rel="nofollow">https://github.com/cretz/duralade/tree/initial-runtime/sampl...</a>.<p>May not amount to anything, but the ideas/concepts of this durable language are quite nice.</p>
]]></description><pubDate>Mon, 09 Mar 2026 16:29:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=47311267</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=47311267</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47311267</guid></item><item><title><![CDATA[New comment by kodablah in "Labor market impacts of AI: A new measure and early evidence"]]></title><description><![CDATA[
<p>> People who are saying they're not seeing productivity boost, can you please share where is it failing?<p>At review time.<p>There are simply too many software industries that can't delegate both authorship _and_ review to non-humans because the maintenance/use of such software, especially in libraries and backwards-compat-concerning environments, cannot justify an "ends justifies the means" approach (yet).</p>
]]></description><pubDate>Fri, 06 Mar 2026 05:57:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=47271409</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=47271409</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47271409</guid></item><item><title><![CDATA[New comment by kodablah in "Monty: A minimal, secure Python interpreter written in Rust for use by AI"]]></title><description><![CDATA[
<p>> that's the only way they "learn" anything<p>I think skills and other things have shown that a good bit of learning can be done on-demand, assuming good programming fundamentals and no surprise behavior. But agreed, having a large corpus at training time is important.<p>I have seen, given a solid lang spec to a never-before-seen lang, modern models can do a great job of writing code in it. I've done no research on ability to leverage large stdlib/ecosystem this way though.<p>> But I'd be interested to see what you come up with.<p>Under active dev at <a href="https://github.com/cretz/duralade" rel="nofollow">https://github.com/cretz/duralade</a>, super POC level atm (work continues in a branch)</p>
]]></description><pubDate>Sat, 07 Feb 2026 05:42:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=46921623</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=46921623</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46921623</guid></item><item><title><![CDATA[New comment by kodablah in "Monty: A minimal, secure Python interpreter written in Rust for use by AI"]]></title><description><![CDATA[
<p>I'm of the mind that it will be better to construct more strict/structured languages for AI use than to reuse existing ones.<p>My reasoning is 1) AIs can comprehend specs easily, especially if simple, 2) it is only valuable to "meet developers where they are" if really needing the developers' history/experience which I'd argue LLMs don't need as much (or only need because lang is so flexible/loose), and 3) human languages were developed to provide extreme human subjectivity which is way too much wiggle-room/flexibility (and is why people have to keep writing projects like these to reduce it).<p>We should be writing languages that are super-strict by default (e.g. down to the literal ordering/alphabetizing of constructs, exact spacing expectations) and only having opt-in loose modes for humans and tooling to format. I admit I am toying w/ such a lang myself, but in general we can ask more of AI code generations than we can of ourselves.</p>
]]></description><pubDate>Fri, 06 Feb 2026 14:43:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=46913414</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=46913414</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46913414</guid></item><item><title><![CDATA[New comment by kodablah in "How to think about durable execution"]]></title><description><![CDATA[
<p>> The thing is, if you want people to understand durability but you also hide it from them, it will actually be much more complicated to understand and work with a framework.<p>> The real golden ticket I think is to make readable intuitive abstractions around durability, not hide it behind normal-looking code.<p>It's a tradeoff. People tend to want to use languages they are familiar with, even at the cost of being constrained within them. A naive DSL would not be expressive enough for the turing completeness one needs, so effectively you'd need a new language/runtime. It's far easier to constrain an existing language than write a new one of course.<p>Some languages/runtimes are easier to apply durable/deterministic constraints too (e.g. WASM which is deterministic by design and JS which has a tiny stdlib that just needs a few things like time and rand replaced), but they still don't take the ideal step you mention - put the durable primitives and their benefits/constraints in front of the dev clearly.</p>
]]></description><pubDate>Fri, 19 Dec 2025 21:42:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=46331291</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=46331291</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46331291</guid></item><item><title><![CDATA[New comment by kodablah in "How to think about durable execution"]]></title><description><![CDATA[
<p>> that your entire workflow still needs to be idempotent<p>If just meaning workflow logic, as the article mentions it has to be deterministic, which implies idempotency but that is fine because workflow logic doesn't have side effects. But the side-effecting functions invoked from a workflow (what Temporal dubs "activities") of course _should_ be idempotent so they can be retried upon failure, as is the case for all retryable code, but this is not a requirement. These side effecting functions can be configured at the callsite to have at-most-once semantics.<p>In addition to many other things like observability, the value of durable execution is persisted advanced logic like loops, try/catch, concurrent async ops, sleeping, etc and making all of that crash proof (i.e. resumes from where it left off on another machine).</p>
]]></description><pubDate>Fri, 19 Dec 2025 15:23:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=46326798</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=46326798</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46326798</guid></item><item><title><![CDATA[New comment by kodablah in "Building a Durable Execution Engine with SQLite"]]></title><description><![CDATA[
<p>At Temporal, for Java we did a hybrid approach of what you have. Specifically, we do the java.lang.reflect.Proxy approach, but the user has to make a call instantiating it from the implementation. This allows users to provide those options at proxy creation time and not require they configure a build step. I can't speak for all JVM people, but I get nervous if I have to use a library that requires an agent or annotation processor.<p>Also, since Temporal activity invocations are (often) remote, many times a user may only have the definition/contract of the "step" (aka activity in Temporal parlance) without a body. Finally, many times users _start_ the "step", not just _execute_ it, which means it needs to return a promise/future/task. Sure this can be wrapped in a suspended virtual thread, but it makes reasoning about things like cancellation harder, and from a client-not-workflow POV, it makes it harder to reattach to an invocation in a type-safe way to, say, wait for the result of something started elsewhere.<p>We did the same proxying approach for TypeScript, but we saw as we got to Python, .NET, and Ruby that being able to _reference_ a "step" while also providing options and having many overloads/approaches of invoking that step has benefits.</p>
]]></description><pubDate>Fri, 21 Nov 2025 20:54:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=46008873</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=46008873</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46008873</guid></item><item><title><![CDATA[New comment by kodablah in "Building a Durable Execution Engine with SQLite"]]></title><description><![CDATA[
<p>> The author's point about the friction from explicit step wrappers is fair, as we don't use bytecode generation today, but we're actively exploring it to improve DX.<p>There is value in such a wrapper/call at invocation time instead of using the proxy pattern. Specifically, it makes it very clear to both the code author and code reader that this is not a normal method invocation. This is important because it is very common to perform normal method invocations and the caller needs to author code knowing the difference. Java developers, perhaps more than most, likely prefer such invocation explicitness over a JVM agent doing byte code manip.<p>There is also another reason for preferring a wrapped-like approach - providing options. If you need to provide options (say timeout info) from the call site, it is hard to do if your call is limited to the signature of the implementation and options will have to be provided in a different place.</p>
]]></description><pubDate>Fri, 21 Nov 2025 20:37:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=46008690</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=46008690</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46008690</guid></item><item><title><![CDATA[New comment by kodablah in "Building a Durable Execution Engine with SQLite"]]></title><description><![CDATA[
<p>> is it the dev ergonomics that's cool here?<p>Yup. Being able to write imperative code that automatically resumes where it left off is very valuable. It's best to represent durable turing completeness using modern approaches of authoring such logic - programming languages. Being able to loop, try/catch, apply advanced conditional logic, etc in a crash-proof algorithm that can run for weeks/months/years and is introspectable has a lot of value over just using queues.<p>Durable execution is all just queues and task processing and event sourcing under the hood though.</p>
]]></description><pubDate>Fri, 21 Nov 2025 19:58:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=46008279</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=46008279</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46008279</guid></item><item><title><![CDATA[New comment by kodablah in "GitHut – Programming Languages and GitHub (2014)"]]></title><description><![CDATA[
<p>Yes, maybe the causation assumption here is inaccurate.</p>
]]></description><pubDate>Thu, 20 Nov 2025 22:40:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=45998870</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=45998870</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45998870</guid></item><item><title><![CDATA[New comment by kodablah in "GitHut – Programming Languages and GitHub (2014)"]]></title><description><![CDATA[
<p>I think correlating "pushes per repository" to certain languages is interesting. The top "pushes per repository" are C++, TeX, Rust, C, and CSS. I guess it's no surprise many would also consider those the most guess-and-check or hard-to-get-right-upfront-without-tooling languages too.</p>
]]></description><pubDate>Thu, 20 Nov 2025 21:44:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=45998214</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=45998214</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45998214</guid></item><item><title><![CDATA[New comment by kodablah in "Defeating Nondeterminism in LLM Inference"]]></title><description><![CDATA[
<p>Deterministic output is needed when LLMs are used for validations. This can be anything from input validation at runtime to a CI check leveraging LLMs. It can be argued this is not an acceptable use of AI, but it will become increasingly common and it will need to be tweaked/tested. You cannot tweak/test a response you don't know you're going to get.</p>
]]></description><pubDate>Thu, 11 Sep 2025 12:35:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=45210827</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=45210827</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45210827</guid></item><item><title><![CDATA[New comment by kodablah in "Fiber Concurrency"]]></title><description><![CDATA[
<p>As someone that has had to build libraries for the nuances of coroutine vs thread async in several languages (Python, .NET, Java, Ruby, etc), I believe how Ruby did fibers to be the best.<p>Ruby's standard library was not littered with too many sync helpers, so making them fiber capable without much standard library effect is a big win. In Python, explicit coloring is required and it's easy to block your asyncio coroutines with sync calls. In .NET, it is nice that tasks can be blocking or not, but there is one fixed global static thread pool for all tasks and so one is tacitly encouraged to do CPU bound work in a task (granted CPU bound fibers are an issue in Ruby too), not to mention issues with changing the default scheduler. In Java, virtual threads take a Ruby-esque approach of letting most code work unchanged, but the Java concurrency standard library is large with slight potential incompatibilities.<p>Ruby is both 1) lucky it did not have a large standard library of thread primitives to adapt, and 2) smart in that they can recognize when they are in a fiber-scheduler-enabled environment or not.<p>Granted that lack of primitives sure does hurt if you want to use concurrency utilities like combinators. And at that point, you reach for a third party and you're back in the situation of not being as portable/obvious.</p>
]]></description><pubDate>Fri, 05 Sep 2025 13:30:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=45138341</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=45138341</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45138341</guid></item><item><title><![CDATA[New comment by kodablah in "Do I not like Ruby anymore? (2024)"]]></title><description><![CDATA[
<p>I use RBS/steep with great success to catch plenty of nil issues early, but it's similarly not great from a dev POV to have to maintain a completely separate set of rbs files (or special comments with rbs-inline). Also in my experience, modern editors don't leverage it for typing/intellisense.</p>
]]></description><pubDate>Tue, 26 Aug 2025 12:15:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=45025498</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=45025498</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45025498</guid></item><item><title><![CDATA[New comment by kodablah in "Building Effective AI Agents"]]></title><description><![CDATA[
<p>> Agents, on the other hand, are often given a set of tools and a prompt. They are much more free-form.<p>This defines how workflows are used with modern systems in my experience. Workflows are often not predictable, they often execute one of a set of tools based on a response from a previous invocation (e.g. an LLM call).</p>
]]></description><pubDate>Wed, 18 Jun 2025 16:48:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=44311442</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=44311442</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44311442</guid></item><item><title><![CDATA[New comment by kodablah in "Building Effective AI Agents"]]></title><description><![CDATA[
<p>Right, I am saying I don't think their definition is an accurate one with the modern use of the term. It's an artificially limited definition to fit a narrative. An agent is nothing more than a very limited workflow.</p>
]]></description><pubDate>Wed, 18 Jun 2025 16:46:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=44311420</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=44311420</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44311420</guid></item><item><title><![CDATA[New comment by kodablah in "Building Effective AI Agents"]]></title><description><![CDATA[
<p>I believe the definition of workflows in this article is inaccurate. Workflows in modern engines do not take predefined code paths, and agents are effectively the same as workflows in these cases. The redefinition of workflows seems to be an attempt to differentiate, but for the most part an agent is nothing more than a workflow that is a loop that dynamically invokes things based on LLM responses. Modern workflow engines are very dynamic.</p>
]]></description><pubDate>Wed, 18 Jun 2025 01:44:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=44305898</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=44305898</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44305898</guid></item><item><title><![CDATA[New comment by kodablah in "Past, present, and future of Sorbet type syntax"]]></title><description><![CDATA[
<p>> I hate this idea that Ruby needs to be more like Python or Typescript<p>It's not be more like those, it's be more like helpful, author-friendly programming which is very much Ruby's ethos.<p>Every time I think about ripping out all of the RBS sig files in my project because I'm tired of maintaining them (I can't use Sorbet for a few reasons), Steep catches a `nil` error ahead of time. Sure we can all say "why didn't you have test coverage?" but ideally you want all help you can get.</p>
]]></description><pubDate>Fri, 09 May 2025 17:04:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=43938994</link><dc:creator>kodablah</dc:creator><comments>https://news.ycombinator.com/item?id=43938994</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43938994</guid></item></channel></rss>