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 opinionpieces
Jump toAll Posts or toAll Categories, or subscribe viaRSS.
Suggested posts
Sorbet’s weirdapproach to exception handling
September 4, 2022
A quick post explaining why exception handling in Sorbet is weird, byway of a buggy program and some pretty pictures.
Read more →
Profiling in Haskell fora 10x Speedup
May 19, 2019
I wrote up a toy project in Haskell and profiled it to learn aboutHaskell’s profiling tools and about profiling code in general. Profilingin 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 beenusing Flow which thankfully supports union types. But as I’ve refactoredmore of our code to use union types, I’ve noticed that our bundle sizehas been steadily increasing!
Read more →
Code Review from the CommandLine
January 13, 2018
I do the bulk of my code reviews from the command line, especiallywhen reviewing larger changes. I’ve built up a number of tools andconfig settings that help me dig into the nuances of the code I’mreviewing, so that I can understand it better than if I were justbrowsing online.
Read more →
Reach for Markdown, not LaTeX
February 26, 2017
Writing should be a pleasant experience. With the right tools, it canbe. LaTeX is powerful but cumbersome to use. With Markdown, we can focuson our writing, and worry about the presentation later. Pandoc can takecare of the presentation for us, so the only thing left to do isstart.
Read more →
Categories
All posts
2025
- Past, Present, and Future ofSorbet Type Syntax, April 25
- Typing instance variables in mixins,April 14
2024
- What if typing on phones was fast?,November 26
- Approximating strace withInstruments.app, October 9
- Using my iPhone as a travellaptop, September 15
- Bug squash: An underrated interviewquestion, August 17
- Generic methods cannot havenon-generic defaults in Sorbet, July 28
- A trick for invariantgenerics in Sorbet, June 5
- Old vs new case statement in Ruby, May31
- Abstract singleton classmethods are an abomination, January 1
2023
- Why don’t constructorshave override checking?, December 31
- Inheritance in Ruby, inpictures, December 28
- A trick for genericconstructors 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 SafeNavigation, September 3
- ActiveSupport’s Concern, inpictures, 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 elimforms, April 23
- Typing klass.new in Ruby withSorbet, February 19
- Ruby’s private keyword is weird,February 13
- Problems typing equalityin Ruby, January 24
- Making Sorbet moreincremental, January 9
- Runtime type checking isgreat, January 3
2022
- Gripes with RSS after one week,December 31
- Moving to excerpt-only for feeds,December 30
- My workflow for hand-drawndiagrams, December 13
- Some Old Sorbet Compiler Notes,December 10
- Don’t bury the lede in technicaldocs, November 29
- Tips for large-scale codemods,November 12
- Sorbet’s weird approach toexception handling, September 4
- Control Flow in Sorbet isSyntactic, 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 looklike?, 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, andParametricity, February 18
2021
- Typed Errors in Sorbet, June5
- Sorbet Does Not HaveChecked Exceptions, May 29
- perf, Rinse, Repeat: Making the SorbetCompiler faster, May 23
- Instant Runtime TypeChecks in Ruby, April 25
2020
- GC.compact in Pictures,December 18
- Mimicking Opaque Typesin Sorbet, December 12
- Questioning self in Ruby,October 9
- Singletons andFlow-Sensitive Typing, September 25
- Fast While Loops in Ruby,September 19
- Another Look at TypedArray Access, September 11
- Types Make Array AccessFaster, August 28
- Exploring Ruby with clangd, July 21
- Linkers & Ruby C Extensions,June 7
- Search Down the Stack, June6
- Sorbet Does Not Have FixMeComments, February 12
- Intersection Types in Sorbetare Surprisingly Common, January 4
2019
- What makes type checking Ruby hard?,December 29
- Surgery on Code from the CommandLine, July 30
- On Programming Language Choice,June 21
- Notes on Continuations, June18
- A Debugger for Bash in Six Lines ofBash, June 16
- Improving CLIs with isatty, June 11
- Standard ML in Travis CI, June 4
- Profiling in Haskell for a 10xSpeedup, May 19
2018
- Concurrent Programming in ML: A Race, July18
- Prefer .then() over .catch(),May 31
- Union Types in Flow &Reason, April 19
- Case Exhaustiveness in Flow,April 15
- Lenses & Composition, February6
- Some Intuition on Lenses, February6
- Code Review from the Command Line,January 13
2017
- Presenting Data & Information:Notes, December 6
- ABTs in Haskell, November 12
- Variables and Binding, October28
- System Fω and Parameterization,September 27
- Variables in Types, September25
- Recitation Notes, September24
- Tests, Types, &Correctness, September 10
- If, Else, & Purity, September1
- Haskell Development withNeovim, July 16
- Reach for Markdown, not LaTeX,February 26
2016
- TroubleshootingHaskell Stack Setup on OS X, August 3
- Let’s Have a Chatabout Encryption, April 17
- SML Dev Setup, March 9
- Starter Zsh Setup, January 3
2015
- Leaking Free DiskSpace, August 3
- Docker Tips andCheatsheet, July 12
- Showwhere a Python package is used, June 12
- Why zsh?, March 10
- Noteworthy Dotfile Hacks,March 10
- Getting Started withRCM, March 9
- Vim as an IDE, March 3
- New GitHub Username,February 3
- Mastering git log for Collaboration, January16
- The LaTeXhomework Document Class, January 10
- OfflineLaTeX Development - Part 2, January 10
2014
- Google Chrome: AMemory Hog, December 29
- Ruby Virtualenvs, December 22
- Vim as a Man PageViewer, December 20
- The Joys of theCraft, December 13
- Using MultipleGit Remotes, November 1
- UsingGoogle OAuth2 for CMU Authentication, October 20
- Offline LaTeXDevelopment, October 6
- Solarized LaTeXListings, October 4
- A LaTeX HomeworkTemplate, October 4
- Setting upMobaXterm for SSH on Windows, September 28
- Molokai: AniTerm2 Color Scheme, June 7
- HPSTR: An OctopressTheme, June 4
- Adding aNetwork Printer to a Linux Server, May 6
- Shiny New OctopressBlog, May 6