A list of the most recently updated pages.
| Jan 23, 2024 | » | If You Can: How Millennials Can Get Rich Slowly
6 min; updated Jan 3, 2026
The Game Plan Save at least 15% of your salary from age 25 into a 401(k) plan, an IRA, or a taxable account. Put equal amounts of that 15% into three buckets: A US total stock market index fund An international total stock market index fund A US total bond market index fund A lot of the conventional advice mentions S&P 500 instead of a total stock market index.... |
| Jan 2, 2026 | » | Remarks on Numeric Types
2 min; updated Jan 2, 2026
Inconveniences of Unsigned Types in .NET Languages like C++ come with convenient support for unsigned integer types where non-negative values make sense. std::size_t is the unsigned integer type of the sizeof and alignof operators. std::size_t is also used when indexing C++ containers. In contrast, .NET tends to use signed integer types even where unsigned ones would be more intuitive, e.g., List<T>.Count returns an Int32 Indexing into a List<T> takes in an Int32 index .... |
| Jan 2, 2026 | » | C# Performance Tools
4 min; updated Jan 2, 2026
BenchmarkDotNet Some work projects use BenchmarkDotNet as the .NET library for benchmarking. Getting familiar with it should pay dividends. To run the benchmarks in the Day13ClawContraption class: dotnet run -c Release -- -f '*Day13ClawContraption*' A job describes how to run your benchmark, e.g, ID, environment, run settings. BenchmarkDotNet has a smart algorithm for choosing values like IterationCount, so you typically don’t need to specify those. Sample measurements for the default job:... |
| Dec 27, 2025 | » | Children of Time
29 min; updated Dec 30, 2025
body { background-image: url('/img/fiction/children-of-time.jpg'); } Children of Time. Adrian Tchaikovsky. ISBN: 978-1-4472-7328-8 . I wish I had encountered a similar story back in 2012 when covering evolution in high school biology. It took me a while to appreciate that populations, and not individuals, evolve. Of Self-Proclaimed Messiahs Dr. Avrana Kern reminds me of ruthless pragmatists common in dystopian stories, e.g., Boy Wonder in “Alien: Earth”, Evelyn Maddox in “The Ark”, etc.... |
| Dec 24, 2025 | » | The Ultimate Hitchhiker's Guide to the Galaxy
7 min; updated Dec 24, 2025
The Hitchhiker’s Guide to the Galaxy And then, one Thursday, nearly two thousand years after one man had been nailed to a tree for saying how great it would be to nice for a change, … The thing that used to worry him most was the fact that people always used to ask him what he was looking so worried about. Mr. Prosser’s accepted role was to tackle Arthur with the occasional new ploy such as the For the Public Good talk, or the March of Progress talk, the They Knocked My House Down Once You Know, Never Looked Back talk and various other cajoleries and threats.... |
| Dec 14, 2025 | » | Shortest Paths in a Graph
8 min; updated Dec 14, 2025
A shortest path from vertex \(s\) to vertex \(t\) in an edge-weighted digraph is a directed path from \(s\) to \(t\) with the property that no other path has a lower weight. A shortest-paths tree for a source \(s\) is a subgraph containing \(s\) and all the vertices reachable from \(s\) that forms a directed tree rooted at \(s\) such that every tree path is a shortest path in the digraph.... |
| Dec 7, 2025 | » | AoC 2024 Day 13: Claw Contraption
7 min; updated Dec 7, 2025
Parsing The input is a list of machine configurations, where buttons \(A\) and \(B\) move the claw some distance \(X\) and \(Y\), and the location of the prize is specified. Button A: X+43, Y+68 Button B: X+10, Y+36 Prize: X=4800, Y=6250 Button A: X+63, Y+41 Button B: X+89, Y+18 Prize: X=17648, Y=19276 namespace AoC2024; using Vector = ClawContraption.Vector; using Button = ClawContraption.Button; using MachineConfig = ClawContraption.MachineConfig; using DirectedEdge = ClawContraption.... |
| Nov 30, 2025 | » | Given Language Models, Why Learn About Large Language Models?
4 min; updated Nov 30, 2025
This part of seems pertinent to respond to “LLMs are just (auto-complete; Markov chains; [insert pre-existing LM-adjacent tech]) on steroids”. Scale LLMs are massive. From 2018 - 2022, model sizes have increased 5000x. OpenAI’s GPT model from June 2018 had 110M parameters; GPT-3 from May 2020 had 175B parameters. LLM providers no longer seem to advertise their parameter counts; GPT-4 was leaked to have 1.8T parameters.... |
| Dec 24, 2024 | » | Using LLMs to Enhance My Capabilities
6 min; updated Nov 30, 2025
Sample Use Cases LLMs are increasingly here to stay despite the reservations . How can I use them to enhance my capabilities? Look out for the Gell-Man amnesia effect. You prompt the LLM on some subject you know well. You read the response and see the LLM has absolutely no understanding of either the facts or the issues. In any case, you read with exasperation or amusement the multiple errors in the response, and then ask it about something else, and read the response as if it’s more accurate than the baloney you just read.... |
| Nov 30, 2025 | » | AoC 2024 Day 12: Garden Groups
8 min; updated Nov 30, 2025
Parsing Each garden plot grows only a single type of plant indicated by a single letter. This \(4 \times 4\) arrangement includes garden plots growing 5 different types of plants (labelled A, B, C, D, E). AAAA BBCD BBCC EEEC The area of a region is the number of garden plots the region contains. The perimeter of a region is the number of sides of garden plots in the region that do not touch another garden plot in the same region.... |
| Nov 29, 2025 | » | AoC 2024 Day 11: Plutonian Pebbles
4 min; updated Nov 29, 2025
Parsing The stones are in a line, with each stone having a number engraved on it. namespace AoC2024; public static partial class PlutonianPebbles { public static IEnumerable<ulong> ReadStones(string filePath) { var line = File.ReadAllText(filePath).Trim(); return line.Split().Select(ulong.Parse); } } The snippet below contains a subtle bug. The using statement disposes the StreamReader at the end of the scope . This happens before the IEnumerable<ulong> is consumed. However, because ReadLine eagerly reads the content, there is no exception thrown.... |
| Nov 27, 2024 | » | Consistent Hashing
6 min; updated Nov 27, 2025
The term “consistent hashing” makes me think of hashing without randomization. Why isn’t every hash consistent by definition? For example, a map implementation would need consistent hashing lest it’s inaccurate when searching for stored values. Or is consistent hashing a tradeoff between collision-resistance and speed? Web Caching Web caching was the original motivation for consistent hashing. With a web cache, if a browser requests a URL that is not in the cache, the page is downloaded from the server, and the result is sent to both the browser and the cache.... |
| Nov 24, 2025 | » | Playing Politics as a SWE
3 min; updated Nov 25, 2025
Macro-Economics: Interest Rates and You In the 2010s, interest rates were near-zero; investors borrowed a lot of money and spent it on tech companies hoping for outsized returns. Companies desired to attract and retain talent; “literally anything” is worth spending money on to accumulate engineers. In 2023, interest rates rose to ~5%. Tech companies now need to make money. If your work isn’t clearly connected to company profit, then your position is unstable and on the whims of an executive that personally values your work.... |
| Nov 23, 2025 | » | Thinking Like a Strong Engineer
12 min; updated Nov 25, 2025
Strong Engineers Strong engineers can do things that weaker engineers just can’t, even with all the time in the world. Some examples of capabilities: Solving very difficult bugs, e.g., race conditions across multiple services. Delivering meaningful improvements to the thorniest parts of legacy codebases. Making changes that require a big architectural rework. At the top end of strongest engineers, capabilities become something like “improving the SOTA for LLMs”.... |
| Nov 16, 2024 | » | Leading Big Projects
15 min; updated Nov 24, 2025
Create clarity for everyone such that they know what they need to do and how it fits into the bigger picture. Communicate openly. Give team members a stage to be publicly competent. Pick up the grunt work that others might not find enjoyable. Allocate time for support work, e.g., reviewing user feedback and error reports. Usually, the reason a project is difficult isn’t that you’re pushing the boundaries of technology, it’s that you’re dealing with ambiguity: unclear direction; messy, complicated humans; or legacy systems with behavior you can’t predict.... |
| Jun 6, 2022 | » | Perspectives on Software Engineering
8 min; updated Nov 24, 2025
On the Clean Code Movement Good enough is good enough. The architectural choices and bugs in the implementation tend to be more impactful, so focus more on those. Be conservative in what you consider technical debt. It should be something that slows down current/future changes, and not code that doesn’t “feel nice”. A code base that is free if technical debt is likely over-emphasizing polish over delivery. Abstractions and indirections in the name of future-proofing tend to be wrong especially when treading new paths, where you can’t reliably predict the future.... |
| Sep 6, 2022 | » | Fiction Potpourri
10 min; updated Oct 26, 2025
A collection of notes/impressions from titles where I didn’t find enough to necessitate a dedicated page. Usually short works of fiction. Unknown Number Unknown Number. Blue Neustifter. twitter.com . genderdysphoria.fyi . Jul 27, 2021. Accessed Sep 6, 2022. tells the story of a person who has gender dysphoria. In an alternate universe, they never transitioned but went on to become an established physicist who could communicate across parallel universes.... |
| Sep 7, 2025 | » | LLM Instructions for Advent of Code Using C#
1 min; updated Sep 7, 2025
The project uses modern C#. The user is an experienced programmer who has been writing C# for a year. Before that, the user mostly wrote imperative object oriented C++ code. Reference concepts from https://learn.microsoft.com/en-us/dotnet/csharp/ where appropriate. Beware of the user writing non idiomatic code, e.g., being too imperative where a declarative or functional programming approach might be better suited. |
| Sep 7, 2025 | » | LLM Instructions for Advent of Code
1 min; updated Sep 7, 2025
Advent of Code Challenges Advent of Code is an annual programming event comprising of 25 challenges that are tied together by a narrative. The user’s objective is to pick a language and then learn about it by solving the programming challenges. At the end of each event, the user should have a working knowledge of the chosen language. Given a file like advent-of-code/2024/AoC2024/06-guard-gallivant/06-guard-gallivant.md, you can find the source files by searching the containing folder, i.... |
| Sep 6, 2025 | » | Generic and Non-Generic Collection Interfaces in C#
4 min; updated Sep 6, 2025
There are two main types of collections: non-generic (ICollection) and generic (ICollection<T>). Non-generic collections only exist because .NET did not originally have generic data types. They shouldn’t be used because: They are untyped at compile time. The frequent casting from object and the actual type is error-prone; it’s easy to put the wrong type in the wrong collection. Value types need to be boxed as object, e.g., List<int> stores its data in an int[], which is more performant than using object[] as that requires boxing.... |