A list of the most recently updated pages.
Jan 1, 0001 | » | Random Page
1 min; updated Aug 23, 2025
window.addEventListener("load", () = goToRandomPage()); |
Dec 24, 2019 | » | Investing in Kenya
15 min; updated Aug 8, 2025
Areas to Consider Capital Markets The Central Depository and Settlement Corporation (CDSC) runs the Central Depository System (CDS) that facilitates holding and trading of shares at the Nairobi Stock Exchange (NSE). A Central Depository Agent (CDA) is a Stockbroker, an Investment Bank, or a Custodian Bank, who has been authorized by the CDSC to open accounts in CDS on behalf of investors. In 2006, an Automatic Trading System was introduced so that orders are matched automatically and executed by stockbrokers on a first-come first-served basis.... |
Jun 6, 2022 | » | Perspectives on Software Engineering
5 min; updated Jul 20, 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.... |
Jul 19, 2025 | » | Resilient App Development in .NET
6 min; updated Jul 19, 2025
Microsoft.Extensions.Resilience and Microsoft.Extensions.Http.Resilience provide resilience mechanisms against transient failures. These two packages are built on top of the open-source Polly resilience library. Build a Resilience Pipeline Given a ServiceCollection services, configure a keyed resilience pipeline as follows: const string key = "Retry-Timeout"; services.AddResiliencePipeline(key, static builder => { builder.AddRetry(new RetryStrategyOptions { ShouldHandle = new PredicateBuilder().Handle<TimeoutRejectedException>() }); builder.AddTimeout(TimeSpan.FromSeconds(1.5)); }); Other Add* extension methods include AddCircuitBreaker, AddRateLimiter, AddConcurrencyLimiter, AddFallback, and AddHedging.... |
Mar 22, 2020 | » | Scalability
3 min; updated Jul 19, 2025
Describing Load Load parameters are numbers that describe the load on a system, e.g. number of requests per second to a web server, ratio of reads to writes in a database, number of simultaneously active users in a chat room. Example: Twitter Major operations: Users posting tweets: \(4.6k\) requests/sec on average, \(12k+\) requests/sec at peak. Users viewing timelines: \(300k\) requests/sec. Twitter’s scaling challenge is the fan-out: each user follows many people and each user is followed by many people.... |
May 17, 2020 | » | Mergeable Replicated Data Types
2 min; updated Jul 19, 2025
On a distributed system, each replica should [eventually] converge to the same state. Commutative Replicated Data Types (CRDTs) can accept updates and achieve consistent without remote synchronization. The Need for Commutativity Say we have a queue \( 1 \to 2 \). Suppose two replicas, \(r_1\) and \(r_2\), independently call pop(). Each replica will have \(2\) on their queue. However, on receiving an update that the other replica popped, each replica will call pop() to be consistent, thereby deleting \(2\).... |
Mar 22, 2020 | » | Maintainability
1 min; updated Jul 19, 2025
Ongoing maintenance includes: fixing bugs, keeping systems operational, adapting to new platforms, modifying to fit new use cases, etc. Operability: Making Life Easy for Operations Operations teams keep a software system running smoothly. A data system can make life easier for Ops people by: Providing visibility into runtime behavior and system internals. Supporting automation and integration with standard tools. Being tolerant of machines being down for maintenance. Good documentation, e.... |
Oct 1, 1974 | » | 03. The Surgical Team
4 min; updated Jul 19, 2025
The Dilemma There are wide productivity variations between good programmers and poor ones. Sackman et. al. found 10:1 ratios. The data showed no correlation between experience and performance. The idea of a 10x developer is mostly ridiculed in my online circles. That said, some jobs have X years of experience as a requirement. How can we resolve these contradictions? The major part of the cost of large teams is communication, and system debugging to correct the ill effects of miscommunication.... |
Oct 1, 1974 | » | 02. The Mythical Man-Month
4 min; updated Jul 19, 2025
More software projects have gone awry for lack of calendar time than for all other causes combined. Why is this cause of disaster so common? Our estimation techniques assume that all will go well, i.e. each task will take only as long as it “ought” to take. Our estimating techniques fallaciously confuse effort with progress, hiding the assumption that men and months are interchangeable. Because we are uncertain of our estimates, software managers often lack the courteous stubbornness - if you’re made to wait, it is to serve you better, and to please you.... |
Mar 22, 2020 | » | Reliability
2 min; updated Jul 19, 2025
A fault is when a component deviates from its spec, while a failure is when the system no longer provides the required service to the user. Better to design fault-tolerant systems because we can’t reduce the probability of a fault to zero. In fault-tolerant systems, one should trigger faults deliberately in order to test the tolerance, e.g. randomly killing individual processes. However, not all things can be tolerated. For instance, if an attacker gains access to sensitive data, then the damage can’t be undone.... |
May 29, 2023 | » | Query Languages for Data
3 min; updated Jul 19, 2025
Query Languages for Data If you have a list of animal species and you want to return only the sharks in the list, a relational algebra expression would be \( \text{sharks} = \sigma_{\text{family = “Sharks”}}(\text{animals}) \). SQL queries follow the structure of relational algebra closely: SELECT * FROM animals WHERE family = 'Sharks'; … while an imperative query would be: function getSharks() { let sharks = []; for (let i = 0; i < animals.... |
Oct 1, 1974 | » | 01. The Tar Pit
2 min; updated Jul 19, 2025
The fiercer the struggle, the more entangling the tar, and no beast is so strong or so skillful but that he ultimately sinks. The Programming Systems Product How do 2 programmers in a remodeled garage build an important program that surpasses the best efforts of large teams? A Program Garage duos typically build a program: complete in itself, ready to be run by the author on the system on which it was developed.... |
Mar 22, 2020 | » | Thinking About Data Systems
1 min; updated Jul 19, 2025
The access patterns for a data system (e.g. database, cache, etc.) motivate different implementations, and thus performance characteristics. Because many applications have a wide range of requirements, single tools no longer meet all of the data processing and storage needs. It’s up to the application to stitch together different tools. Despite the behind-the-scenes stitching, the data system may provide certain guarantees, e.g. the cache will be correctly invalidated. |
May 28, 2023 | » | Relational Model Versus Document Model
8 min; updated Jul 19, 2025
A relational data model uses tables that consist of rows and columns. A row can be uniquely identified by a table + ID combination. A column entry can reference another row in another table through a shared key. One goal is to avoid duplicating data. However, to answer a real-world query, we end up paying th cost by joining results from multiple tables. That said, with proper indexing and prior research, combining results is pretty fast.... |
Aug 17, 2018 | » | Chege Gitau
1 min; updated Jul 6, 2025
svg { width: 24px; height: 24px; } p.contact-info { display: flex; gap: 24px; } I'm a software engineer based in Redmond, Washington. Originally from Githunguri, Kenya. Outside of bytes, I play basketball recreationally. |
Jul 6, 2025 | » | .NET Linting and Style Tooling
6 min; updated Jul 6, 2025
.NET compiler platform (Roslyn) analyzers are included in the .NET SDK and enabled by default in .NET 5 and later. Code analysis violations are prefixed with CA or IDE to differentiate them from compiler errors. Not to be confused with CS-prefixed messages that are generated by the C# compiler. Rule Categories Rules fall in one of the following categories: Design: Adherence to the design guidelines for .... |
Jul 5, 2025 | » | JSON Serialization in .NET
6 min; updated Jul 5, 2025
Serialization converts the state of an object (the value of its properties) into a form that can be stored/transmitted. The serialized form doesn’t include any information about an object’s associated methods. System.Text.Json emphasizes high performance and low memory allocation over an extensive feature set. It has built-in UTF-8 support because UTF-8 is the most prevalent encoding for data on the web and files on disk. How to Serialize and Deserialize .... |
Jul 2, 2025 | » | AoC 2024 Day 03: Mull It Over
1 min; updated Jul 2, 2025
Problem Statement Part One The computer appears to be trying to run a program, but its memory is corrupted. All of the instructions have been jumbled up! It seems like the goal of the program is just to multiply some numbers. It does that with instructions like mul(X,Y) where X and Y are each 1-3 digit numbers. For instance, mul(44,46) multiplies 44 and 46 to get a result of 2024.... |