The two hardest things in software engineering: cache invalidation, naming things, and off-by-one errors.