Hard software problems

There are only two hard problems in software engineering: cache invalidation, naming things and off-by-one errors.