Here I write technical posts across a broad category of topics, mostly related to programming languages and productivity tips.
→ 👨💻 More about me
→ 📺 Talks I’ve given
→ 💭 Thoughts and opinion
pieces
Jump to All Posts or to All Categories, or subscribe via RSS.
Suggested posts
Sorbet’s weird approach to exception handling
September 4, 2022
A quick post explaining why exception handling in Sorbet is weird, by
way of a buggy program and some pretty pictures.
Read more →
Profiling in Haskell for a 10x Speedup
May 19, 2019
I wrote up a toy project in Haskell and profiled it to learn about
Haskell’s profiling tools and about profiling code in general. Profiling
in Haskell with Stack is super easy…
Read more →
Union Types in Flow & Reason
April 19, 2018
Union types are powerful yet often overlooked. At work, I’ve been
using Flow which thankfully supports union types. But as I’ve refactored
more of our code to use union types, I’ve noticed that our bundle size
has been steadily increasing!
Read more →
Code Review from the Command Line
January 13, 2018
I do the bulk of my code reviews from the command line, especially
when reviewing larger changes. I’ve built up a number of tools and
config settings that help me dig into the nuances of the code I’m
reviewing, so that I can understand it better than if I were just
browsing online.
Read more →
Reach for Markdown, not LaTeX
February 26, 2017
Writing should be a pleasant experience. With the right tools, it can
be. LaTeX is powerful but cumbersome to use. With Markdown, we can focus
on our writing, and worry about the presentation later. Pandoc can take
care of the presentation for us, so the only thing left to do is
start.
Read more →
Categories
All posts
2024
- What if typing on phones was fast?, November 26
- Approximating strace with Instruments.app, October 9
- Using my iPhone as a travel laptop, September 15
- Bug squash: An underrated interview question, August 17
- Generic methods cannot have non-generic defaults in Sorbet, July 28
- A trick for invariant generics in Sorbet, June 5
- Old vs new case statement in Ruby, May 31
- Abstract singleton class methods are an abomination, January 1
2023
- Why don’t constructors have override checking?, December 31
- Inheritance in Ruby, in pictures, December 28
- A trick for generic constructors in Sorbet, October 28
- It’s okay to work on tiny projects, September 18
- Only return nil if given nil, September 15
- Ruby’s Conditional Send is not Safe Navigation, September 3
- ActiveSupport’s Concern, in pictures, August 26
- Driving Bazel with fzf, August 10
- Why Sorbet needs T.let(…, T::Boolean), May 13
- Every type is defined by its intro and elim forms, April 23
- Typing klass.new in Ruby with Sorbet, February 19
- Ruby’s private keyword is weird, February 13
- Problems typing equality in Ruby, January 24
- Making Sorbet more incremental, January 9
- Runtime type checking is great, January 3
2022
- Gripes with RSS after one week, December 31
- Moving to excerpt-only for feeds, December 30
- My workflow for hand-drawn diagrams, December 13
- Some Old Sorbet Compiler Notes, December 10
- Don’t bury the lede in technical docs, November 29
- Tips for large-scale codemods, November 12
- Sorbet’s weird approach to exception handling, September 4
- Control Flow in Sorbet is Syntactic, August 24
- Parse Error Recovery in Sorbet: Part 4, June 6
- With types, seeing is believing, June 4
- Is tree-sitter good enough?, May 30
- What would a type-aware Rubocop look like?, May 16
- T::Enum Pros & Cons, March 17
- Parse Error Recovery in Sorbet: Part 3, February 28
- Parse Error Recovery in Sorbet: Part 2, February 22
- Parse Error Recovery in Sorbet: Part 1, February 21
- Sorbet, Generics, and Parametricity, February 18
2021
- Typed Errors in Sorbet, June 5
- Sorbet Does Not Have Checked Exceptions, May 29
- perf, Rinse, Repeat: Making the Sorbet Compiler faster, May 23
- Instant Runtime Type Checks in Ruby, April 25
2020
- GC.compact in Pictures, December 18
- Mimicking Opaque Types in Sorbet, December 12
- Questioning self in Ruby, October 9
- Singletons and Flow-Sensitive Typing, September 25
- Fast While Loops in Ruby, September 19
- Another Look at Typed Array Access, September 11
- Types Make Array Access Faster, August 28
- Exploring Ruby with clangd, July 21
- Linkers & Ruby C Extensions, June 7
- Search Down the Stack, June 6
- Sorbet Does Not Have FixMe Comments, February 12
- Intersection Types in Sorbet are Surprisingly Common, January 4
2019
- What makes type checking Ruby hard?, December 29
- Surgery on Code from the Command Line, July 30
- On Programming Language Choice, June 21
- Notes on Continuations, June 18
- A Debugger for Bash in Six Lines of Bash, June 16
- Improving CLIs with isatty, June 11
- Standard ML in Travis CI, June 4
- Profiling in Haskell for a 10x Speedup, May 19
2018
- Concurrent Programming in ML: A Race, July 18
- Prefer .then() over .catch(), May 31
- Union Types in Flow & Reason, April 19
- Case Exhaustiveness in Flow, April 15
- Lenses & Composition, February 6
- Some Intuition on Lenses, February 6
- Code Review from the Command Line, January 13
2017
- Presenting Data & Information: Notes, December 6
- ABTs in Haskell, November 12
- Variables and Binding, October 28
- System Fω and Parameterization, September 27
- Variables in Types, September 25
- Recitation Notes, September 24
- Tests, Types, & Correctness, September 10
- If, Else, & Purity, September 1
- Haskell Development with Neovim, July 16
- Reach for Markdown, not LaTeX, February 26
2016
- Troubleshooting Haskell Stack Setup on OS X, August 3
- Let’s Have a Chat about Encryption, April 17
- SML Dev Setup, March 9
- Starter Zsh Setup, January 3
2015
- Leaking Free Disk Space, August 3
- Docker Tips and Cheatsheet, July 12
- Show where a Python package is used, June 12
- Why zsh?, March 10
- Noteworthy Dotfile Hacks, March 10
- Getting Started with RCM, March 9
- Vim as an IDE, March 3
- New GitHub Username, February 3
- Mastering git log for Collaboration, January 16
- The LaTeX homework Document Class, January 10
- Offline LaTeX Development - Part 2, January 10
2014
- Google Chrome: A Memory Hog, December 29
- Ruby Virtualenvs, December 22
- Vim as a Man Page Viewer, December 20
- The Joys of the Craft, December 13
- Using Multiple Git Remotes, November 1
- Using Google OAuth2 for CMU Authentication, October 20
- Offline LaTeX Development, October 6
- Solarized LaTeX Listings, October 4
- A LaTeX Homework Template, October 4
- Setting up MobaXterm for SSH on Windows, September 28
- Molokai: An iTerm2 Color Scheme, June 7
- HPSTR: An Octopress Theme, June 4
- Adding a Network Printer to a Linux Server, May 6
- Shiny New Octopress Blog, May 6