<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: jbeninger</title><link>https://news.ycombinator.com/user?id=jbeninger</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 14 Oct 2026 08:07:43 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jbeninger" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jbeninger in "Ask HN: Who wants to be hired? (October 2026)"]]></title><description><![CDATA[
<p>Info:<p><pre><code>  Location: Ottawa, Canada
  Remote: Yes
  Willing to relocate: No

  Technologies: Recently a lot of Typescript/Javascript, PHP.  Web and mobile development, both frontend and backend.  I have a lot of Java and C# under my belt, but it's getting a bit dated and I kinda miss it.

  Résumé/CV: https://plaintextdev.com/wp-content/uploads/2026/10/James-Beninger-Senior-Full-Stack-Software-Developer.pdf
  Email: james@plaintextdev.com
</code></pre>
A senior developer with 20 years of experience.  I've built enterprise software for the Canadian government, worked at TripAdvisor on the review-processing team, and I've been freelancing for about a decade.  I've become an expert at taking a design and making it work on real devices, but I'm also the guy people call when their in-house developers can't figure something out.<p>I'm looking for regular remote work, and I'd be happy to discuss any short-term freelancing positions as well.  If you need a guy who can just do the thing, I'm your guy.</p>
]]></description><pubDate>Fri, 02 Oct 2026 01:25:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=49928937</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=49928937</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49928937</guid></item><item><title><![CDATA[New comment by jbeninger in "Ask HN: How do you manage skills files?"]]></title><description><![CDATA[
<p>It's possible I invented skills before they were common. I've always had some instructions in agents.md that are something like "when working with typescript, read prompts/conventions.ts.md, when working with our fooBar module, read prompts/foobar.md"<p>I'm not sure if this differs greatly from skills. Maybe my wording makes these "skills" less likely to be read at the correct times, but I haven't seen an issue.</p>
]]></description><pubDate>Mon, 07 Sep 2026 11:05:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=49596825</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=49596825</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49596825</guid></item><item><title><![CDATA[New comment by jbeninger in "The car industry A/B tested selling a car with and without CarPlay"]]></title><description><![CDATA[
<p>I'd be worried the standard wouldn't include my favourite carplay feature, where it plays the same song from my phone on startup no matter how I configure it.</p>
]]></description><pubDate>Sun, 06 Sep 2026 23:32:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49591988</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=49591988</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49591988</guid></item><item><title><![CDATA[New comment by jbeninger in "The revolt of the reader"]]></title><description><![CDATA[
<p>That's not a generator tell when used judiciously. It's a genuinely useful construction that's been poisoned by overgeneration.</p>
]]></description><pubDate>Sun, 06 Sep 2026 11:35:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=49585508</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=49585508</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49585508</guid></item><item><title><![CDATA[New comment by jbeninger in "Three sites made 215,128 “best software” pages for AI. Perplexity cites them"]]></title><description><![CDATA[
<p>Lose anonymity and bring back key-signing parties. Maybe you can't guarantee that everything is human-generated, but at least you know the chain of trust that leads to the human that signed off.<p>Yes, I'm aware of the irony of creating a darknet that only works by removing anonymity.</p>
]]></description><pubDate>Thu, 03 Sep 2026 00:44:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=49544574</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=49544574</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49544574</guid></item><item><title><![CDATA[New comment by jbeninger in "What my dad taught me about AI coding in the 90s"]]></title><description><![CDATA[
<p>As someone who spends way too much time searching for the best abstractions, absolutely this is still true.<p>I often have a long back and forth with codex to explore the problem space and settle on the best abstractions. Occasionally it will make a suggestion that helps me, but for the most part it's reviewing while I'm in the driver's seat.<p>Contrast this to simply giving it a function name and a vague description of what the function will do.  I'll generally accept its output with a few refinements.<p>But for larger project structure and metaphors, it falls flat, and often lands on a solution that's going to be a maintenance nightmare or result in endless repetition across not-quite-the-same cases.  I've never seen it happen upon an appropriate abstraction that can cleanly cut through the nonsense.</p>
]]></description><pubDate>Mon, 31 Aug 2026 01:09:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=49504530</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=49504530</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49504530</guid></item><item><title><![CDATA[New comment by jbeninger in "Just the rumour of a bug is enough to find an exploit these days"]]></title><description><![CDATA[
<p>Also, attacking good naming and structure belies their claim of knowing anything about dev at all.  If you can't tell the quality difference between a well-structured program and spaghetti code consisting of single-letter variables, you don't belong in software.<p>Honestly, from the tone, I suspect the gp post is just trying to get a rise.</p>
]]></description><pubDate>Sat, 29 Aug 2026 19:32:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=49492625</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=49492625</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49492625</guid></item><item><title><![CDATA[New comment by jbeninger in "If You Build It, They Will Come"]]></title><description><![CDATA[
<p>This analogy is one of the best I've seen. It's going to live in my head a long time, I think.</p>
]]></description><pubDate>Sat, 18 Jul 2026 23:43:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=48963573</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=48963573</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48963573</guid></item><item><title><![CDATA[New comment by jbeninger in "Maybe you should learn something"]]></title><description><![CDATA[
<p>Just want to "me too" this. I have two weeks a year where I unplug completely from my daily work and it often results in a new project or skill that I wouldn't have thought of otherwise</p>
]]></description><pubDate>Sun, 05 Jul 2026 02:02:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=48790695</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=48790695</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48790695</guid></item><item><title><![CDATA[New comment by jbeninger in "Prefer duplication over the wrong abstraction (2016)"]]></title><description><![CDATA[
<p>Glad I could help. I've been trying to use coding agents more than makes sense this year to get a feel for the tech. There's no good set of guidelines yet and everything feels like secret knowledge.<p>If you're using a coding agent like codex or claude code, I've also seen marked improvement by telling the agent to keep a journal of decision points, and every file read or written.  And then, here's the important part, read the last five journals before starting.  It primes the context with whatever you were working on and keeps a new session more focused that if it has to go searching for keywords through the whole codebase.  It can also be an interesting read.</p>
]]></description><pubDate>Sun, 21 Jun 2026 22:41:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48623336</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=48623336</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48623336</guid></item><item><title><![CDATA[New comment by jbeninger in "Prefer duplication over the wrong abstraction (2016)"]]></title><description><![CDATA[
<p>But... it shouldn't. People are arguing that a bad abstraction is better than none at all.  Badly-implemented abstraction is the same. If you hit code that is duplicated organically a dozen times, you don't make it a baker's dozen. You spend a bit of extra time at least stubbing out the abstraction so future organic duplication can at least share an entry point.  Abstractions grow organically too, in well-tended codebases.</p>
]]></description><pubDate>Sun, 21 Jun 2026 19:08:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48621664</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=48621664</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48621664</guid></item><item><title><![CDATA[New comment by jbeninger in "Prefer duplication over the wrong abstraction (2016)"]]></title><description><![CDATA[
<p>The gold standard is code samples. I've got 1000-line convention documents with very simple rules like "Early returns on a single line".  Llms sometimes ignore these or misinterpret them in unusual ways.<p>But if I tell it "read these files that use the same conventions" first, there's no misunderstanding, and the agent also picks up the general "tone" of the code. I have very little to tweak if I've defined the problem well.</p>
]]></description><pubDate>Sun, 21 Jun 2026 18:47:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48621479</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=48621479</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48621479</guid></item><item><title><![CDATA[New comment by jbeninger in "Vibe coding and agentic engineering are getting closer than I'd like"]]></title><description><![CDATA[
<p>Having worked with LLMs, you absolutely can golf most (>50%) lines of code out of existence. I regularly do, because it picks the wrong abstractions and sticks with them.</p>
]]></description><pubDate>Fri, 08 May 2026 09:55:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=48060920</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=48060920</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48060920</guid></item><item><title><![CDATA[New comment by jbeninger in "Where the goblins came from"]]></title><description><![CDATA[
<p>I think that AGI will make heavy use of LLMs. It's not a straight path, but a component.<p>To compare with the human brain, have you ever been so drunk you don't remember the night, but you're told afterwards you had coherent conversations about complex topics?  There's some aspect of our minds that is akin to a next-token-generator, pulling information from other components to produce a conversation. But that component alone is not enough to produce intelligence.</p>
]]></description><pubDate>Thu, 30 Apr 2026 14:59:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=47963550</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=47963550</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47963550</guid></item><item><title><![CDATA[New comment by jbeninger in "OpenAI – How to delete your account"]]></title><description><![CDATA[
<p>What a weird thing to say.</p>
]]></description><pubDate>Sat, 28 Feb 2026 13:12:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=47194941</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=47194941</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47194941</guid></item><item><title><![CDATA[New comment by jbeninger in "I started programming when I was 7. I'm 50 now and the thing I loved has changed"]]></title><description><![CDATA[
<p>I mean, it's not actually autocomplete.  But it serves the same role.  I know approximately what I want to type, maybe some of the details like argument-order are a bit foggy.  When I see the code I recognize it as my own and don't have too much trouble reading it.<p>But I use LLMs one level higher than autocomplete, at the level of an entire file.  My prompts tend to look like "We need a new class to store user pets.  Base it on the `person` class but remove Job and add Species.  For now, Species is an enum of CAT,DOG,FISH, but we'll probably turn that into a separate table later.  Validate the name is just a single word, and indicate that constraint when rendering it.  Read Person.js, CODE_CONVENTIONS.md, and DATA_STRUCTURES.md before starting.  When complete, read REFACTOR.md"<p>With the inclusion of code examples and conventions, the agent produces something pretty close to what I'd write myself, particularly when dealing with boilerplate Data or UI structures.  Things that share common structure or design philosophy, but not common enough to refactor meaningfully.<p>I still have to read it through and understand it as if I'd written it myself, but the LLM saves a lot of typing and acts as a second pair of eyes.  Codex currently is very defensive.  I have to remove some unnecessary guardrails, but it will protect against rare issues I might not have noticed on my first pass.</p>
]]></description><pubDate>Thu, 12 Feb 2026 13:34:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=46988638</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=46988638</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46988638</guid></item><item><title><![CDATA[New comment by jbeninger in "I started programming when I was 7. I'm 50 now and the thing I loved has changed"]]></title><description><![CDATA[
<p>Hah. I don't work with (coding) people, so thankfully I don't have that problem</p>
]]></description><pubDate>Tue, 10 Feb 2026 21:03:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=46966884</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=46966884</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46966884</guid></item><item><title><![CDATA[New comment by jbeninger in "I started programming when I was 7. I'm 50 now and the thing I loved has changed"]]></title><description><![CDATA[
<p>I've been through a few cycles of using LLMs and my current usage does scratch the itch.  It doesn't feel like I've lost anything.  The trick is I'm still programming.  I name classes and functions.  I define the directory structure.  I define the algorithms.  By the time I'm prompting an LLM I'm describing how the code will look and it becomes a supercharged autocomplete.<p>When I go overboard and just tell it "now I want a form that does X", it ends up frustrating, low-quality, and takes as long to fix as if I'd just done it myself.<p>YMMV, but from what I've seen all the "ai made my whole app" hype isn't trustworthy and is written by people who don't actually know what problems have been introduced until it's too late.  Traditional coding practices still reign supreme.  We just have a free pair of extra eyes.</p>
]]></description><pubDate>Tue, 10 Feb 2026 20:31:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=46966443</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=46966443</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46966443</guid></item><item><title><![CDATA[New comment by jbeninger in "AI fatigue is real and nobody talks about it"]]></title><description><![CDATA[
<p>I've found small features helps. If I ask the ai "do this", I wait 10 minutes for it to be finished, then another 30 understanding what was written<p>Instead, I start out broad. "I'm thinking of this feature. Let's talk about what components will go into it and where that code will live... Here are my initial thoughts. Let me know if I get anything wrong..."<p>This puts it in a conversation mode and gets you on the same page, and best of all it's quick. The llm agent isn't searching files and building, it's just giving general opinions<p>Once I have a good idea of the architecture, I move on to "write this class. Here is an overview of how I would do it", or point the agent to an existing file with the right conventions in place. Once again, if you've done your conversation doesn't take long. 20-second turnaround.<p>Then it's time to refine. "Move this function here, refactor that"<p>If you're going to have to understand the code anyway, read it while your writing it. Line by line, function by function, class by class. "Growing" a feature this way keeps you and the llm in sync. It doesn't go off on tangents. And building incrementally keeps you in the loop and in your flow.  You don't have 5 things going at once. You have 1, faster.<p>I've let agents do their thing for a dozen minutes and usually end up having to rewind the whole thing piece by piece to understand what's actually happening<p>If you're truly vibe coding, maybe you don't have to read the code and can have a dozen agents on a dozen projects. But if you're making Serious Software, I don't see how you can commit code unseen. And in that case, you're not losing anything working incrementally and reading code as it's written?</p>
]]></description><pubDate>Sun, 08 Feb 2026 21:49:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=46938865</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=46938865</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46938865</guid></item><item><title><![CDATA[New comment by jbeninger in "FracturedJson"]]></title><description><![CDATA[
<p>I'm in the JS ecosystem pretty regularly and "restrictive with no benefit" is the right description.  I use JSON5 now when I have to, which greatly reduces the restrictions. I already have a build step so throwing in a JSON5 -> JSON converter is negligible.<p>As for FracturedJson, it looks great. The basic problem statement of "either minified and unreadable or prettified and verbose" isn't one I had put my finger on before, but now that it's been said I can't unsee it.</p>
]]></description><pubDate>Sat, 03 Jan 2026 01:02:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=46471603</link><dc:creator>jbeninger</dc:creator><comments>https://news.ycombinator.com/item?id=46471603</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46471603</guid></item></channel></rss>