I think I have realised after ruining a previous codebase with overeager abstraction. Most code should read like fiction, not a reference book.
That is they should read top to bottom with minimal jumping around and information hiding.
(Of course not in all cases, YMMV, etc)