Avoiding Footguns

Jul 5, 2023

Footguns are features or designs more likely to be misused, often leading to self-inflicted problems or bugs (“shooting yourself in the foot”). See a list of C functions banned in the git codebase for being footguns. Some more examples:

  • Inconsistent naming
  • Manual garbage collection for connections or open files
  • Race conditions with async code
  • Multiple sources of truth
  • Long argument lists
  • Shadowing variables in deep scopes

Avoiding footguns comes with experience — often, the footguns are perfectly legal code that can be compiled. Some languages avoid certain footguns (sometimes to introduce other ones). For example, garbage-collected languages remove one class of memory management footguns (at the expense of a GC).

Language-level footguns are probably the biggest class of footguns — e.g., default arguments are mutable in Python, useEffect without dependencies in React, not closing connections in a defer block in Go or the Drop trait in Rust.

Linters can sometimes catch footgun constructions and surface them as warnings. But the most effective way is just learning them.

Daily posts on startups, engineering, and AI