Blog
Thoughts on type systems, semantics, and building software that holds up.
-
The Two Modes of Thinking: How Divergent and Convergent Thinking Drive Research and Innovation
Explore the complementary roles of divergent and convergent thinking in research, problem-solving, and creative work. Learn how to balance exploration and exploitation to maximize intellectual productivity.
-
Branded Types in TypeScript: From Structural to Nominal Typing
How to achieve nominal typing in TypeScript with branded types, preventing subtle runtime bugs by making types explicitly incompatible even when their structures match.
-
Building a View Counter for Static Sites with Supabase and Astro
How I added a simple, privacy-friendly view counter to my static Astro blog using Supabase's free tier — no backend server required.
-
Learning with the Strangler Fig Pattern: Replace Your Skills Gradually
Discover how to apply the Strangler Fig Pattern from software architecture to career transitions and skill development. Learn to modernize yourself gradually without the risk of a 'Big Bang' change.
-
The End of 'Sorry, I Didn't Understand': How AI Agents Are Replacing Old Chatbots
Explore how AI agents differ from traditional decision-tree chatbots. Learn about the perceive-reason-act loop and the four key characteristics that make agents autonomous, goal-oriented, reactive, and proactive.
-
Unveiling the Shadow Play: Simplifying Complex Data with Vector Projection
Learn how vector projection and dimensionality reduction techniques like PCA help simplify high-dimensional data for visualization and machine learning.
-
Operational Semantics: Adding Variables, Functions and Conditionals
Extend a simple arithmetic language with variables, functions, and conditionals. Learn about environments, closures, and lexical scoping in operational semantics.
-
Operational Semantics: A Formal Approach to Arithmetic Expressions
An introduction to operational semantics for programming languages. Learn small-step and big-step semantics through a simple arithmetic expression language.
-
Strengthening Connections: A Hebbians Lens on Love and Relationships
Explore how the neuroscience principle 'neurons that fire together, wire together' offers insights into romantic relationships and emotional bonds.
-
A Beginner's Guide to Functional Programming with OCaml
Learn functional programming through OCaml, from lambda calculus foundations to practical programs. Covers immutability, pattern matching, recursion, and higher-order functions.
-
Algorithms: What are they?
An introduction to algorithms in computer science. Learn what computational problems are, the difference between decision and optimization problems, and why algorithm design matters.
-
Filtering Sensitive Data in Ruby on Rails with ActiveSupport::ParameterFilter
Learn how to protect sensitive data in Rails applications using ActiveSupport::ParameterFilter. Covers filtering passwords, API keys, and custom patterns from logs.
-
How I became a Software Engineer/Programmer
My journey from studying Medicine in China to becoming a self-taught software engineer. A personal story about discovering coding, making career changes, and lessons learned along the way.