<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: sasmithjr</title><link>https://news.ycombinator.com/user?id=sasmithjr</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 14 Apr 2026 11:13:53 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=sasmithjr" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by sasmithjr in "Reinventing how .NET builds and ships (again)"]]></title><description><![CDATA[
<p>> .NET is certainly better than Python, but I'm not very happy with the type system and the code organization versus my Rust projects.<p>Have you given F# a whirl?</p>
]]></description><pubDate>Wed, 26 Nov 2025 14:53:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=46057931</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=46057931</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46057931</guid></item><item><title><![CDATA[New comment by sasmithjr in "No Competition? That's Usually a Red Flag for Solopreneurs"]]></title><description><![CDATA[
<p>> So there must be some other reason you didn't get revenue?<p>Right. I think my biggest takeaway from this article is that another engineer discovered that sales and marketing are important and difficult jobs.</p>
]]></description><pubDate>Thu, 13 Nov 2025 15:48:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=45916301</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=45916301</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45916301</guid></item><item><title><![CDATA[New comment by sasmithjr in "Pain Points of OCaml"]]></title><description><![CDATA[
<p>You can write a helper method (or use FsToolkit.ErrorHandling[0]) to simplify the F# example to:<p><pre><code>    let Foo () = getData() |> Task.map _.value
</code></pre>
And it'll be easier to work with the .NET ecosystem if you use the task computation expression[1] over the async one.<p>[0]: <a href="https://github.com/demystifyfp/FsToolkit.ErrorHandling" rel="nofollow">https://github.com/demystifyfp/FsToolkit.ErrorHandling</a><p>[1]: <a href="https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/task-expressions" rel="nofollow">https://learn.microsoft.com/en-us/dotnet/fsharp/language-ref...</a></p>
]]></description><pubDate>Tue, 04 Nov 2025 14:29:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=45811427</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=45811427</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45811427</guid></item><item><title><![CDATA[New comment by sasmithjr in "Why F# could be the next mainstream programming language (2024)"]]></title><description><![CDATA[
<p>For me, AI code generation for F# has been pretty good! There's one annoying thing Opus/Sonnet do (honestly don't remember what other models do): use old syntax for array indexing.<p><pre><code>  values.[index] // Old way of indexing required a .
  values[index] // Supported for awhile now
</code></pre>
That's the "biggest" issue I run in to, and it's not that big of a deal to me.<p>Yesterday, it did try to hallucinate a function that doesn't exist; compilation failed, so the agent changed the function to a fold and everything was hunkey-dorey.</p>
]]></description><pubDate>Sat, 09 Aug 2025 12:05:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=44845883</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=44845883</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44845883</guid></item><item><title><![CDATA[New comment by sasmithjr in "Stop selling “unlimited”, when you mean “until we change our minds”"]]></title><description><![CDATA[
<p>I didn't look at the URL at first and was surprised when this turned in to an ad. Oh well!<p>> Stop selling "unlimited", when you mean "until we change our minds"<p>The limits don't go in to affect until August 28th, one month from yesterday. Is there an option to buy the Max plan yearly up front? I honestly don't know; I'm on the monthly plan. If there isn't a yearly purchase option, no one is buying unlimited and then getting bait-and-switched without enough time for them to cancel their sub if they don't like the new limits.<p>> A Different Approach: More AI for Less Money<p>I think it's really funny that the "different approach" is a limited time offer for credits that expire.<p>I don't like that the Claude Max limits are opaque, but if I really need pay-per-use, I can always switch to the API. And I'd bet I still get >$200 in API-equivalents from Claude Code once the limits are in place. If not? I'll happily switch somewhere else.<p>And on the "happily switch somewhere else", I find the "build user dependency" point pretty funny. Yes, I have a few hooks and subagents defined for Claude Code, but I have zero hard dependency on anything Anthropic produces. If another model/tool comes out tomorrow that's better than Claude Code for what I do, I'm jumping ship without a second thought.</p>
]]></description><pubDate>Tue, 29 Jul 2025 11:51:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=44722137</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=44722137</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44722137</guid></item><item><title><![CDATA[New comment by sasmithjr in ""AI Will Replace All the Jobs " Is Just Tech Execs Doing Marketing"]]></title><description><![CDATA[
<p>> sasmithjr was apparently trying to defend babysitting A.I. by making an analogy with mentoring juniors<p>I regret adding that last bit to my comment because my main point (which I clearly messed up emphasizing and communicating) is that I think you’re presenting a false dichotomy in the original comment. Now that work can be done with LLMs asynchronously, it’s possible to both write your own code and guide LLMs as they need it when you have down time. And nothing about that requires stopping other functions of the job like mentoring and teaching juniors, either, so you can still build relationships on the job, too.<p>If having to attend to an LLM in any way makes the job worse for you, I guess we’ll have to agree to disagree. So far, LLMs feel like one of many other automations that I use frequently and haven’t really changed my satisfaction with my job.</p>
]]></description><pubDate>Wed, 04 Jun 2025 18:28:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=44183918</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=44183918</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44183918</guid></item><item><title><![CDATA[New comment by sasmithjr in ""AI Will Replace All the Jobs " Is Just Tech Execs Doing Marketing"]]></title><description><![CDATA[
<p>I don't think it's an exclusive choice between the two, though. I think senior engineers will end up doing both. Looking at GitHub Copilot's agent, it can work asynchronously from the user, so a senior engineer can send it off to work on multiple issues at once while still working on tasks that aren't well suited for the agent.<p>And really, I think many senior engineers are already doing both in a lot of cases where they're helping guide and teach junior and early mid-level developers.</p>
]]></description><pubDate>Wed, 04 Jun 2025 15:57:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=44182163</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=44182163</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44182163</guid></item><item><title><![CDATA[New comment by sasmithjr in "FBI arrests judge accused of helping man evade immigration authorities"]]></title><description><![CDATA[
<p>> [Dugan allegedly] escorted the them through a private back door to avoid arrest.<p>According to the complaint [0] on page 11, Flores-Ruiz still ended up in a public hallway and was observed by one of the agents. They just didn't catch him before he was able to use the elevator.<p>INAL but I don't think "Dugan let Flores-Ruiz use a different door to get to the elevator than ICE expected" should be illegal.<p>[0]: <a href="https://static01.nyt.com/newsgraphics/documenttools/3d022b741fb2c398/97ea7f41-full.pdf" rel="nofollow">https://static01.nyt.com/newsgraphics/documenttools/3d022b74...</a></p>
]]></description><pubDate>Fri, 25 Apr 2025 19:50:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=43797878</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=43797878</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43797878</guid></item><item><title><![CDATA[New comment by sasmithjr in "The FizzBuzz that did not get me the job"]]></title><description><![CDATA[
<p>The only thing that might be tricky about FizzBuzz is if the person doesn't know about the modulo operator. I can't remember the last time I used it in production code; I use it far more thinking about FizzBuzz than I do anywhere else.</p>
]]></description><pubDate>Sat, 25 Jan 2025 15:04:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=42822011</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=42822011</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42822011</guid></item><item><title><![CDATA[New comment by sasmithjr in "Nobody cares"]]></title><description><![CDATA[
<p>I agree people should be able to design things property, but I'm not sure this ramp is actually a good example. It might be! But no one is talking about an obvious issue for any ramp that would exist in that photo: it is merging bikes in to pedestrian traffic. So I'd think that you specifically want a ramp that forces the bike to slow down.</p>
]]></description><pubDate>Thu, 16 Jan 2025 02:09:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=42720141</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=42720141</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42720141</guid></item><item><title><![CDATA[New comment by sasmithjr in "The meathead margin: how lifting weights might have saved my life"]]></title><description><![CDATA[
<p>For another perspective, if you put 22.5lbs on each side of the bar, you wouldn't call that a "1 plate" lift even though both sides add up to 45 lbs. There are no plates involved in the lift, thus it's not a "1 plate" lift.<p>If you search "1 plate overhead press" or "1 plate ohp", you'll see many references to how that's a 135lb lift.</p>
]]></description><pubDate>Sun, 11 Feb 2024 16:01:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=39335875</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=39335875</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39335875</guid></item><item><title><![CDATA[New comment by sasmithjr in "We built our customer data warehouse all on Postgres"]]></title><description><![CDATA[
<p>> But nothing is stopping you from running Postgres in a Docker container, and wrap it in a unit test with the technology of your choice<p>I agree. I'm in .NET land, I use EFCore as my ORM, and I use EFCore's migration features. My ORM models are in a separate project (same git repo) from both the web server project and test project, and any hand written SQL gets added to the migration scripts that EFCore generates.<p>I spin up a docker container for postgres, my test code clears any existing DB, creates a DB in the container, and then runs the EFCore migrations on the DB. I have simple tests that make sure my CTEs are working correctly and that things like expected unique indices are also setup.<p>This works both locally and in Github Actions.<p>I just wouldn't call any of this a "unit" test. I put all this squarely in my integration test suite. I figure if IO is happening as a consequential part of the test (i.e. not setup/teardown), it's an integration test. I wonder how much that distinction is tripping people up? A lot of people think of unit tests as small, independent, and quick, so by only thinking about unit testing, they automatically rule out tests that have app code call out to a DB.<p>Based on the sibling comment, I'm going to have to take a look at Testcontainers. I'm not sure how much it'll simplify at this point, but who knows!</p>
]]></description><pubDate>Fri, 02 Feb 2024 13:34:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=39228344</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=39228344</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39228344</guid></item><item><title><![CDATA[New comment by sasmithjr in "Gas utilities used tobacco tactics to avoid gas stove regulations"]]></title><description><![CDATA[
<p>> Heating up water quickly is almost never a use case.<p>It'd be helpful for my household for hot water for coffee and tea, and it'd also help us for heating up some extra water for grits or risotto when they need more.<p>Also, isn't boiling water just the measurable outcome of the test but what matters is that the pot is coming to temp sooner? Pots and pans heating up more quickly is helpful all the time.</p>
]]></description><pubDate>Tue, 26 Dec 2023 13:50:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=38771713</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=38771713</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38771713</guid></item><item><title><![CDATA[New comment by sasmithjr in "Substack on Nazi Views"]]></title><description><![CDATA[
<p>I cannot stress enough that I think your second bullet is missing the point by a country mile. The Substack post is specifically talking about Nazi viewpoints, not "bad" viewpoints for some shifting definition of bad. And because we're talking about Nazi views, I think your first bullet then falls apart, too. There's no new scrutiny required for Nazi views because we've already done that work.<p>Additionally, Substack is allowing the monetization of (and thus profiting from) Nazi viewpoints. That's more than "shining a light on it".</p>
]]></description><pubDate>Sat, 23 Dec 2023 19:29:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=38747289</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=38747289</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38747289</guid></item><item><title><![CDATA[New comment by sasmithjr in ""Et Tu, Ilya?""]]></title><description><![CDATA[
<p>> No builders there wanted this except one I guess (llya).<p>Ilya signed the letter, too, and has posted an apology[0].<p>[0] - <a href="https://nitter.net/ilyasut/status/1726590052392956028?s=20" rel="nofollow noreferrer">https://nitter.net/ilyasut/status/1726590052392956028?s=20</a></p>
]]></description><pubDate>Mon, 20 Nov 2023 16:41:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=38350249</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=38350249</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38350249</guid></item><item><title><![CDATA[New comment by sasmithjr in "New Covid vaccine and booster shots for this fall to be available by end of Sept"]]></title><description><![CDATA[
<p>> Especially with risk of myocardiitis predominant in young males?<p>Isn't the risk of myocarditis worse from COVID than the vaccines? From [1], "In this systematic review and meta-analysis, we found that the risk of myocarditis is more than seven fold higher in persons who were infected with the SARS-CoV-2 than in those who received the vaccine."<p>I understand that my linked source doesn't seem to split up the data by age group, but given their overall findings, do you have a source that says the 7x difference doesn't hold in younger men?<p>[1]: <a href="https://pubmed.ncbi.nlm.nih.gov/36105535/" rel="nofollow noreferrer">https://pubmed.ncbi.nlm.nih.gov/36105535/</a></p>
]]></description><pubDate>Sun, 20 Aug 2023 19:23:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=37202173</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=37202173</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37202173</guid></item><item><title><![CDATA[New comment by sasmithjr in "Railway Oriented Programming"]]></title><description><![CDATA[
<p>In my mind, the difference between errors-as-values and exceptions is most useful when describing domain-specific errors and other issues that you have to handle in support of the domain/problem space. To me, domain errors make sense as errors-as-values, but your database being unreachable is unrelated to the domain and makes sense as an exception.<p>> another example is where you are trying to fetch a file or database record that does not exist<p>I think this depends on whether or not you expect the file/record to exist. Handling a request from a user where the user provided the id used for lookup? The lookup itself is validation of the user input. But if you retrieved a DB record that has a blob name associated with it and your blob storage says that a blob doesn't exist by that name? I find that to be a great situation for an exception.<p>The errors-or-exception line is fuzzy and going to be dependent on your team and the problems you're solving, but I've found that it's a decent rule of thumb.</p>
]]></description><pubDate>Fri, 18 Aug 2023 13:05:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=37175079</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=37175079</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37175079</guid></item><item><title><![CDATA[New comment by sasmithjr in "Railway Oriented Programming"]]></title><description><![CDATA[
<p>It's possible that you could end up with your example as given, but I think you could organize it differently so that it has your handling while also maintaining the same basic top-level pipeline.<p>Given what you've specified, I might organize it like:<p><pre><code>  notify-user:
    if (ValidationError, notify-user-validation-error)
    or-if (DBError, notify-user-db-error)

  try-update-db:
    update-db
    or-then retry-in-5
    or-then retry-remote

  try-send-email:
    send-email
    or-then (requeue-email and ok)

  do-root-level-pipeline:
    validate
    and-then try-update-db
    and-then try-send-email
    or-then notify-user
</code></pre>
I think I correctly mapped the and/or/thens to map/bind, so I hope that makes sense.</p>
]]></description><pubDate>Fri, 18 Aug 2023 12:32:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=37174766</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=37174766</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37174766</guid></item><item><title><![CDATA[New comment by sasmithjr in "The combined power of F# and C#"]]></title><description><![CDATA[
<p><p><pre><code>    a <- 4 // Assignment, valid
</code></pre>
This is a compiler error because you haven't made your variable mutable.<p>Also, I actually like that initial assignment and equality testing both use =. I think of `let a = 1` to be less like assignment and more like `Assume that a = 1 is true`, so using the same operator (e.g. `a = 3`) makes sense for comparisons.<p>And `<-` as a separate operator is good because mutability should be exceptional for many (most?) codebases.</p>
]]></description><pubDate>Mon, 07 Aug 2023 19:51:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=37040012</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=37040012</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37040012</guid></item><item><title><![CDATA[New comment by sasmithjr in "Twitter under fire for reinstating account that posted child sex abuse"]]></title><description><![CDATA[
<p>The article quotes that tweet in the third paragraph. It doesn't link to the tweet, but the contents of the tweet are included word-for-word.<p>And then in the next paragraph the article notes the view and retweet counts that the tweet received (as read from a cached version of the tweet).</p>
]]></description><pubDate>Fri, 28 Jul 2023 12:02:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=36905644</link><dc:creator>sasmithjr</dc:creator><comments>https://news.ycombinator.com/item?id=36905644</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36905644</guid></item></channel></rss>