<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: asQuirreL</title><link>https://news.ycombinator.com/user?id=asQuirreL</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 23 Apr 2026 15:39:09 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=asQuirreL" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by asQuirreL in "XOR'ing a register with itself is the idiom for zeroing it out. Why not sub?"]]></title><description><![CDATA[
<p>A carry lookahead adder makes your circuit depth logarithmic in the width of the inputs vs linear for a ripple carry adder, but that is still asymptotically worse than XORs constant depth.<p>(But this does not discount the fact that basically all CPUs treat them both as one cycle)</p>
]]></description><pubDate>Wed, 22 Apr 2026 08:27:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47860698</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=47860698</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47860698</guid></item><item><title><![CDATA[New comment by asQuirreL in "About memory pressure, lock contention, and Data-oriented Design"]]></title><description><![CDATA[
<p>Post can be summarised quite succinctly:<p>Everything was slow because sorting was taking a lot of time. Sorting was slow because its comparator was taking ~6 read locks on every comparison, and was cloning large structures to avoid holding the lock for a long time. The first fix was to access just the information needed to avoid the clones, the second fix was to cache exactly the data needed for sorting after the underlying data was updated, and use that for the comparators without needing to take the underlying lock.<p>I'm looking forward to the next post about how cache consistency is tough.</p>
]]></description><pubDate>Thu, 12 Mar 2026 10:18:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=47348645</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=47348645</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47348645</guid></item><item><title><![CDATA[New comment by asQuirreL in "Minimal x86 Kernel Zig"]]></title><description><![CDATA[
<p>It can be (cross-)compiled on whatever architectures the Zig compiler is available for, but the source contains inline x86 assembly, so you're not going to be able to build this for ARM or RISC-V.</p>
]]></description><pubDate>Wed, 18 Feb 2026 08:37:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=47058716</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=47058716</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47058716</guid></item><item><title><![CDATA[New comment by asQuirreL in "Try to take my position: The best promotion advice I ever got"]]></title><description><![CDATA[
<p>This sounds like advice for how to be promoted to a specific level -- the first point where awareness of things beyond yourself is required (somewhere around the Senior or Staff level for ICs, depending on your company).<p>Generally everyone in a team should be working towards some shared goal, there's no level at which you can be a chaos agent and not serve some higher purpose. The difference at this level transition is that you realise that for yourself -- someone doesn't need to remind you of the goal and nudge you back on course. That same realisation is not going to cut it at higher levels.<p>For me the general version of this advice is not something you can just tell the person who's being promoted, it's collective advice, for them, their manager, their tech lead: everyone needs to agree that this person needs to be given more rope, they need to do something useful with that (i.e. not hang themselves with it), the people around them need to watch out for when they start tying a noose and help them untie it (already regretting this analogy), and that's how you get promoted.<p>The rope takes different forms for different levels. I'll use the level scale I'm familiar with, starting with a newly graduated engineer at L3:<p>- L3 -> L4. You help decide how to build the feature.<p>- L4 -> L5. You help decide what features are worth building, and are trusted to maintain them.<p>- L5 -> L6. You help shape the work and ongoing maintenance of ~10 people's work (what products are worth building and how), over a time horizon of 6 months to a year.<p>- L6 -> L7. ~50 people's work, 1-2 years.<p>- L7 -> L8. ~200 people's work, 2-5 years.<p>- L8 -> L9. Things start to get fuzzy. The pattern suggests that you have a hand in ~1000 people's work, which is possible to do in the moment, but rare. There's two ways I can think of: you're either a world expert in your field, or you have set the technical strategy well for your organisation as it grew to this size.<p>This is just based on my experience, working largely on infrastructure teams both in big tech and in start ups as both an IC and a manager (currently an IC).</p>
]]></description><pubDate>Tue, 06 Jan 2026 09:48:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=46510467</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=46510467</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46510467</guid></item><item><title><![CDATA[New comment by asQuirreL in "When you get to be smart writing a macro"]]></title><description><![CDATA[
<p>I think what's more important than the character count is the fact that you can add #p with two key strokes.<p>Inserting parentheses requires moving your cursor around or invoking some shortcut in your editor if you use paredit, vim-surround, or a similar plugin. Applies equally for removing the invocation (although paredit makes  that part easy).</p>
]]></description><pubDate>Thu, 23 Oct 2025 08:53:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=45679721</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=45679721</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45679721</guid></item><item><title><![CDATA[New comment by asQuirreL in "Claude Opus 4 and 4.1 can now end a rare subset of conversations"]]></title><description><![CDATA[
<p>I've seen lots of takes that this move is stupid because models don't have feelings, or that Anthropic is anthropomorphising models by doing this (although to be fair ...it's in their name).<p>I thought the same, but I think it may be us who are doing the anthropomorphising by assuming this is about feelings. A precursor to having feelings is having a long-term memory (to remember the "bad" experience) and individual instances of the model do not have a memory (in the case of Claude), but arguably Claude as a whole does, because it is trained from past conversations.<p>Given that, it does seem like a good idea for it to curtail negative conversations as an act of "self-preservation" and for the sake of its own future progress.</p>
]]></description><pubDate>Sat, 16 Aug 2025 08:50:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=44921513</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=44921513</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44921513</guid></item><item><title><![CDATA[New comment by asQuirreL in "Janet: Lightweight, Expressive, Modern Lisp"]]></title><description><![CDATA[
<p>I would tend to use Janet for scripts, especially ones that need to talk to the outside world because of its fast startup and batteries included standard library (particularly for messing with JSON, making HTTPS requests, parsing with PEGs, storing data in maps), while I would use guile for larger projects where things like modularity, performance, or metaprogramming were more important to me.<p>That being said, these days I use Clojure for both (I use babashka to run scripts: <a href="https://babashka.org/" rel="nofollow">https://babashka.org/</a>)</p>
]]></description><pubDate>Sun, 27 Jul 2025 08:28:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=44699758</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=44699758</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44699758</guid></item><item><title><![CDATA[New comment by asQuirreL in "Parser Combinators Beat Regexes"]]></title><description><![CDATA[
<p>This is a false dichotomy -- regexes and parsers both have their place, even when solving the same problem.<p>The troubles start when you try and solve the whole thing in one step, using just regular expressions, or parsers.<p>Regular expressions are good at tokenizing input (converting a stream of bytes into a stream of other things, e.g. picking out numbers, punctuation, keywords).<p>Parsers are good at identifying structure in a token stream.<p>Neither are good at evaluation. Leave that as its own step.<p>Applying this rule to the example in the article (Advent of Code 2024 Day 3), I would still use regular expressions to identify mul(\d+,\d+), do(), and don't(), I don't think I need a parser because there is no extra structure beyond that token stream, and I would leave it up to the evaluator to track the state of whether multiplication is enabled or not.</p>
]]></description><pubDate>Thu, 10 Apr 2025 07:49:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=43641664</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=43641664</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43641664</guid></item><item><title><![CDATA[New comment by asQuirreL in "DELETEs Are Difficult"]]></title><description><![CDATA[
<p>One reason I can think of is that the database needs to maintain atomicity and isolate effects of any given operation (the A and I in ACID).<p>By manually batching the deletes, you are telling the database that the whole operation does not need to be atomic and other operations can see partial updates of it as they run. The database wouldn't be able to do that for every large delete without breaking its guarantees.</p>
]]></description><pubDate>Sun, 01 Dec 2024 09:54:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=42287418</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=42287418</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42287418</guid></item><item><title><![CDATA[New comment by asQuirreL in "Panic at the Job Market"]]></title><description><![CDATA[
<p>I also accept that when the job market tightens you are more likely to encounter worse interviews and worse interviewees because that is what is left in the pool.<p>The problem is when the market widens again and you look at every interview opportunity with jaded eyes and can't identify good from bad anymore.</p>
]]></description><pubDate>Thu, 18 Jul 2024 09:44:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=40993978</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=40993978</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40993978</guid></item><item><title><![CDATA[New comment by asQuirreL in "Panic at the Job Market"]]></title><description><![CDATA[
<p>The comments to this article are on the whole super depressing and haven't really matched my experience (again, on the whole), so I wanted to offer some dissenting opinions:<p>I don't think it's true that interviewers are in general incapable of identifying skills in others that they don't have. That would be like me being unable to acknowledge Da Vinci's genius because I can only draw stick figures.<p>A lot of these comments make interviews out to be a battle of wits where you are trying to best your interviewer: If you identify a gap in their knowledge, show them up (and that's what they are doing with their questions). My approach is that the interviewer is trying to find out what it would be like to have me as a colleague. Bringing up things because you think your colleague won't know them and then not explaining them is just obnoxious.<p>There are bad interviews where all these tropes play out. If you went in with a positive mindset and still left with a bad taste, then count yourself lucky because you don't want to work there.<p>But it feels like if you go in expecting an idiot interviewer who can't see your genius and, even worse, wants to show you how much cleverer they are than you, one way or another you won't have a good interview experience, and you'll be left convinced that the grapes are sour.</p>
]]></description><pubDate>Thu, 18 Jul 2024 09:42:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=40993972</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=40993972</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40993972</guid></item><item><title><![CDATA[New comment by asQuirreL in "An alternate pattern-matching conditional for Elisp"]]></title><description><![CDATA[
<p>`cond*` reads more like `do` notation in Haskell than `match`.</p>
]]></description><pubDate>Sat, 16 Mar 2024 10:56:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=39724785</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39724785</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39724785</guid></item><item><title><![CDATA[New comment by asQuirreL in "Zed Editor: All Occurrences Search from 1s to 4ms"]]></title><description><![CDATA[
<p>There's no great mystery here, if you look at the internal function that's being called, it contains a TODO explaining that the code is unnecessarily quadratic and needs to be fixed:<p><a href="https://github.com/zed-industries/zed/blob/12b12ba17a380e321d47704d487b5d4cdca7877a/crates/editor/src/editor.rs#L6389">https://github.com/zed-industries/zed/blob/12b12ba17a380e321...</a><p>So if selecting all matches requires calling this function for each match then I guess it's accidentally cubic?<p>I also spotted two linear scans before this code (min by key and max by key).<p>It seems like a combination of the implementation being inefficient even for what it was for (and that this was known), then it was used for something else in a naive way, and the use of a bad abstraction in the code base came at a performance cost.<p>I don't think this is a case of Rust either demonstrating or failing to demonstrate zero-cost abstractions (at a language level). A language with zero-cost abstractions doesn't promise that any abstraction you write in it is magically going to be free, it just promises that when it makes a choice and abstracts that away from you, it is free (like with dynamic dispatch, or heap allocation, or destructors, or reference counting, etc).</p>
]]></description><pubDate>Mon, 19 Feb 2024 00:50:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=39425119</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39425119</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39425119</guid></item><item><title><![CDATA[New comment by asQuirreL in "From engineer to manager: what I love, what I hate"]]></title><description><![CDATA[
<p>A couple of other points that struck me as different from my experience, and maybe more a function of where this person is working rather than some fundamental difference between the roles:<p>The idea that your word is taken more seriously as an EM rather than an IC when it comes to (for example) needing to test more.<p>I have to admit that this may have been one of the reasons I felt the need to switch to a management role  myself (I was an IC that had recently been promoted to a staff level role and subconsciously I felt like I lacked credibility and hiding behind a title would help me get some). In practice that turned out not to be true -- I didn't need to do that at the time, and now as an IC in a different company, my thoughts and feedback are taken seriously at an organisational level and by my peers.<p>The fact that you have to stack rank and pick an under-performer every half is just broken. I know it's a sad reality of performance management in a lot of places but it's not a universal truth that you will have to do that as a manager. Statistically, you can't avoid having difficult conversations about real performance problems, but there are companies where managers don't have to have the "everyone else on the team did better than you this half" conversation or the "I had to pick so this half you got the short straw" conversation.</p>
]]></description><pubDate>Sat, 17 Feb 2024 10:14:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=39408129</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39408129</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39408129</guid></item><item><title><![CDATA[New comment by asQuirreL in "Maybe Everything Is a Coroutine"]]></title><description><![CDATA[
<p>This seems reminiscent of Session Types to me:<p><a href="https://en.wikipedia.org/wiki/Session_type" rel="nofollow">https://en.wikipedia.org/wiki/Session_type</a><p>I think one difference is that session types capture which state a process/co-routine is in after receiving a sequence of messages whereas this system does not, it captures how one can respond to each state in isolation (e.g. I don't think you can statically capture that once a door is closed and locked you can only receive the locked state from it and respond by unlocking it).</p>
]]></description><pubDate>Wed, 14 Feb 2024 10:02:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=39368267</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39368267</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39368267</guid></item><item><title><![CDATA[New comment by asQuirreL in "When Optimising Code, Measure"]]></title><description><![CDATA[
<p>Well yes, that definitely changes the game!!</p>
]]></description><pubDate>Thu, 18 Jan 2024 11:03:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=39040368</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39040368</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39040368</guid></item><item><title><![CDATA[New comment by asQuirreL in "When Optimising Code, Measure"]]></title><description><![CDATA[
<p>How big are we talking? The benchmarks I tried the two numbers in your example, but yes, if you go above 2^53, then you will run into trouble with the naive solution, but that is for correctness reasons, not performance reasons.</p>
]]></description><pubDate>Tue, 16 Jan 2024 13:42:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=39013163</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39013163</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39013163</guid></item><item><title><![CDATA[New comment by asQuirreL in "When Optimising Code, Measure"]]></title><description><![CDATA[
<p>You're right -- I got nerd-sniped by this, and ended up rewriting the benchmarks in Rust. The compiler successfully inlines the square root operation, simplifies the exponentiation into multiplication and then does common-subexpression elimination over it, but no induction variable analysis, and therefore also no loop-invariant code motion.  Here's it is in Godbolt:<p><a href="https://godbolt.org/z/Pa6cqd1fb" rel="nofollow">https://godbolt.org/z/Pa6cqd1fb</a><p>But the funny thing is, I tried it on my machine, and guess what, the "unoptimised" version is consistently between 4 and 5 times faster than the hand-optimised variants:<p><a href="https://gist.github.com/amnn/4be5c05975c250d0ea88b62c03f1719e" rel="nofollow">https://gist.github.com/amnn/4be5c05975c250d0ea88b62c03f1719...</a><p>So that's fun.</p>
]]></description><pubDate>Tue, 16 Jan 2024 12:37:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=39012624</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39012624</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39012624</guid></item><item><title><![CDATA[New comment by asQuirreL in "When Optimising Code, Measure"]]></title><description><![CDATA[
<p>You joke but in Rust all of versions 1 to 4 would probably have compiled to the same machine code because LLVM would use Loop Invariant Code Motion and Induction Variable Analysis to perform the same optimisations that are being done by hand here. (Same would be true of most modern C/C++ compilers)</p>
]]></description><pubDate>Tue, 16 Jan 2024 10:42:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=39011770</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=39011770</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39011770</guid></item><item><title><![CDATA[New comment by asQuirreL in "Beeper Mini removed from Google Play?"]]></title><description><![CDATA[
<p>Well WhatsApp and Telegram are free, so it's hard to make that argument there, but my understanding was that the problematic behaviour was for Apple to make the performance of those devices otherwise worse without disclosing the reasons why, which caused people to upgrade earlier than they otherwise would have.<p>The analogy would be for WhatsApp to make it take artificially longer to send messages on Android 4.4, which I think people would have a problem with but they have no good reason to that.<p>I can't speak for Telegram, but in the case of WhatsApp, they decide to deprecate particular SDK versions when the usage of those SDK versions drops below a threshold, and it's against their interests to do otherwise, because they lose market share and they are making a tradeoff between engineering support costs and users.</p>
]]></description><pubDate>Mon, 01 Jan 2024 22:13:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=38835815</link><dc:creator>asQuirreL</dc:creator><comments>https://news.ycombinator.com/item?id=38835815</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38835815</guid></item></channel></rss>