<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: ds300</title><link>https://news.ycombinator.com/user?id=ds300</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Fri, 08 May 2026 17:49:52 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=ds300" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by ds300 in "Move tests to closed source repo"]]></title><description><![CDATA[
<p>the issue was created by claude using this skill <a href="https://github.com/tldraw/tldraw/blob/main/.claude/skills/write-issue/SKILL.md" rel="nofollow">https://github.com/tldraw/tldraw/blob/main/.claude/skills/wr...</a><p>trust me this was never a serious proposal</p>
]]></description><pubDate>Fri, 27 Feb 2026 14:30:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=47180873</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=47180873</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47180873</guid></item><item><title><![CDATA[Patchfork: A new TypeScript util for immutable state]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/ds300/patchfork">https://github.com/ds300/patchfork</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=45050262">https://news.ycombinator.com/item?id=45050262</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 28 Aug 2025 09:44:49 +0000</pubDate><link>https://github.com/ds300/patchfork</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=45050262</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45050262</guid></item><item><title><![CDATA[New comment by ds300 in "Blocking Kiwifarms"]]></title><description><![CDATA[
<p>Are you keeping a spreadsheet with venn diagrams?</p>
]]></description><pubDate>Sun, 04 Sep 2022 07:43:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=32710793</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=32710793</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32710793</guid></item><item><title><![CDATA[New comment by ds300 in "Transition to React Native"]]></title><description><![CDATA[
<p>Artsy.net has had quite a bit of success with a brown field RN app. We adopted RN in our iOS app in 2016 and gradually used it to render more and more screens in the app. In 2020 we decided it would be nice to have an android app, and we spent the last year incrementally refactoring the app infrastructure from Objective-C to TypeScript to support that. Crucially we did the entire thing with a tiny team of 1-3 people and without blocking any product engineers from shipping new features.<p>We had occasional tooling issues like you describe but all fixable. I'd be happy to go through the same process again.</p>
]]></description><pubDate>Sun, 16 May 2021 08:17:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=27172091</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=27172091</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=27172091</guid></item><item><title><![CDATA[Show HN: Patch-package: Fix broken node modules instantly]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/ds300/patch-package">https://github.com/ds300/patch-package</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=26313327">https://news.ycombinator.com/item?id=26313327</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 02 Mar 2021 09:02:35 +0000</pubDate><link>https://github.com/ds300/patch-package</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=26313327</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26313327</guid></item><item><title><![CDATA[New comment by ds300 in "Ask HN: Who wants to be hired? (September 2020)"]]></title><description><![CDATA[
<p>Location: London, UK<p>Remote: Yes.<p>Willing to relocate: Probably not, but perhaps if the right opportunity comes along.<p>Technologies: Currently focused on TypeScript, GraphQL, React Native and Node. Previously Java, Clojure, Web.<p>I'm a darn good full stack product engineer with a lot of experience building and refactoring web/mobile client infrastructure. I've got solid UI design skills and a keen sense for UX. I'm good at planning and executing long-term refactors, building core app infrastructure, optimising CI workflows, automating processes. I put business value and happy users above software craftsmanship, but I've spent a lot of time maintaining old codebases and I have a good understanding of how architectural decisions, and even idiomatic patterns, can impact developers' productivity years down the line.<p>If you're building modern developer tooling that touches the JS ecosystem, we should talk. Bonus points if you get to work with Rust or C++.<p>CV: <a href="https://github.com/ds300" rel="nofollow">https://github.com/ds300</a><p>Email: d.j.sheldrick@gmail.com</p>
]]></description><pubDate>Fri, 11 Sep 2020 09:20:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=24440667</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=24440667</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=24440667</guid></item><item><title><![CDATA[New comment by ds300 in "Rx glitches aren't actually a problem"]]></title><description><![CDATA[
<p>> Glitches as demonstrated via the diamond pattern can be avoided by traversing the graph in topological order.<p>This is correct for DAGs which only propagate <i>value</i> (as in Javelin[1] and my own library DerivableJS[2]), but for graphs which propagate events (as in Rx), topological sorting would only work for those parts of the graph which are <i>effectively</i> propagating value. Events don't have an inherent dedupe operation, so it is very difficult to even imagine ways in which glitch avoidance could be automatically enforced. It would certainly require semantic program analysis.<p>Personally I think we should be avoiding the proliferation of events (as encouraged by Rx enthusiasts) for exactly this reason. Their imperative nature makes them very difficult to reason about.<p>[1]: <a href="https://github.com/hoplon/javelin" rel="nofollow">https://github.com/hoplon/javelin</a><p>[2]: <a href="https://github.com/ds300/derivablejs" rel="nofollow">https://github.com/ds300/derivablejs</a></p>
]]></description><pubDate>Thu, 17 Dec 2015 16:09:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=10752260</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=10752260</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=10752260</guid></item><item><title><![CDATA[New comment by ds300 in "Ask HN: Who wants to be hired? (October 2015)"]]></title><description><![CDATA[
<p>Location: Brighton, UK<p>Remote: Yes<p>Willing to relocate: Yes in western Europe<p>Technologies: JVM, Clojure, Java, Node, JavaScript, DOM, React.<p>Résumé/CV: <a href="http://github.com/ds300" rel="nofollow">http://github.com/ds300</a> - no CV, haven't had time yet<p>Email: djsheldrick at gmail<p>PhD dropout, 2 years full stack web dev. Good with data + functions, uses objects + methods very sparingly indeed. Designs high quality abstractions. Cares deeply about making and using good tooling. Knows how to make stuff run fast when the need arises. Wants to learn how to do event sourcing in the large. If money was no concern would be writing virtual machines (think JVM not VMWare).</p>
]]></description><pubDate>Thu, 01 Oct 2015 16:15:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=10312214</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=10312214</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=10312214</guid></item><item><title><![CDATA[Functional Reactive State]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/ds300/havelock">https://github.com/ds300/havelock</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=10238410">https://news.ycombinator.com/item?id=10238410</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 18 Sep 2015 10:42:31 +0000</pubDate><link>https://github.com/ds300/havelock</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=10238410</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=10238410</guid></item><item><title><![CDATA[Show HN: Havelock – Holistic State Management for JavaScript]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/ds300/havelock">https://github.com/ds300/havelock</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=10039751">https://news.ycombinator.com/item?id=10039751</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 11 Aug 2015 08:48:49 +0000</pubDate><link>https://github.com/ds300/havelock</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=10039751</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=10039751</guid></item><item><title><![CDATA[New comment by ds300 in "Om Next – David Nolen [video]"]]></title><description><![CDATA[
<p>That README changed my life.</p>
]]></description><pubDate>Wed, 08 Jul 2015 08:27:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=9850442</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=9850442</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=9850442</guid></item><item><title><![CDATA[New comment by ds300 in "Clojure 1.7 is now available"]]></title><description><![CDATA[
<p>> (reduce (map inc) [1 2]) ;; same as (map inc [1 2])<p>This is wrong. You've missed the point.<p><pre><code>    (map inc [1 2]) 
</code></pre>
is actually roughly equivalent to<p><pre><code>    (reduce ((map inc) conj) [] [1 2])
</code></pre>
which, due to the use of `reduce`, is eager. To get laziness back:<p><pre><code>    (sequence (map inc) [1 2])
</code></pre>
Transducers are not reducing functions, they <i>return</i> reducing functions when applied to reducing functions. `((map inc) conj)` is a version of `conj` that calls `inc` on all the rhs args before `conj`ing them into the lhs arg.</p>
]]></description><pubDate>Wed, 01 Jul 2015 08:55:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=9810691</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=9810691</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=9810691</guid></item><item><title><![CDATA[New comment by ds300 in "Pixie: A sweet Clojure-ish language"]]></title><description><![CDATA[
<p>Who got rid of the JVM? Pixie is not Clojure 2. Clojure still exists and you can use it, but now Pixie also exists and you can also use it. There is no downside unless you think developing languages which don't run on the JVM is a waste of time.</p>
]]></description><pubDate>Mon, 09 Mar 2015 12:51:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=9170579</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=9170579</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=9170579</guid></item><item><title><![CDATA[New comment by ds300 in "Comparison of the Go and Erlang concurrency models (2011)"]]></title><description><![CDATA[
<p>> With goroutines the cooperation is handled by the implementation/compiler -- i.e. Yield() calls are automatically inserted by the compiler -- rather than by the programmer manually by hand.<p>The compiler only inserts yeilds at some call sites. It's not a total solution like real preemptive scheduling, so you still need to be careful.</p>
]]></description><pubDate>Thu, 04 Dec 2014 10:01:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=8698574</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=8698574</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=8698574</guid></item><item><title><![CDATA[New comment by ds300 in "If I ever design a first course in compilers, I'll do it backwards"]]></title><description><![CDATA[
<p>I was a TA on a compilers course that worked backwards. I'd taken the course myself two years earlier when it was taught by a different lecturer and found it excellent, and most of my cohort agreed.<p>When reversed, however, most of my students found it extremely hard to wrap their head around the the first part of the course, i.e. code generation from an AST. They didn't have sufficient grounding in recursive data structures and algorithms. While this might be a problem with the degree program rather than the compilers course, I believe that learning to write a recursive descent parser (by hand) provides this grounding and makes the code generation bit much easier to grasp.<p>Unfortunately the new lecturer had also done away with teaching the students how to write parsers by hand, instead encouraging them to use parser generators. I thought that was tragic. One of the best moments of my programming life was writing a recursive descent parser for a non-trivial grammar in one sitting (about 500 lines of python), hitting run and having it just work first time. It was orgasmic.</p>
]]></description><pubDate>Thu, 07 Aug 2014 15:11:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=8148087</link><dc:creator>ds300</dc:creator><comments>https://news.ycombinator.com/item?id=8148087</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=8148087</guid></item></channel></rss>