This is a pervasive and growing concern in software: as libraries, interfaces, and tools become more complicated, they become less understood and less controllable. When everything works, rich programming environments can be very productive, but when they fail, there is little recourse. Indeed, we may not even realize that something is wrong if the problems involve performance or subtle logic errors. (…)
The importance of choosing simple algorithms and data structures, the simplest that will do the job in reasonable time for the expected problem size(…)
we find it best to start detailed design with data structures, guided by knowledge of what algorithms might be used; with the data structures settled, the code goes together easily (…)
As much as possible, start with something simple and evolve it as experience dictates.
(Kernighan & Pike, 1999)