I believe that there are just two intrinsic forces in programming: You want to minimize redundancy and, ideally, define every piece of knowledge once. You want to minimize dependencies – A should depend on B only if it absolutely must. I think that all other considerations are of the extrinsic real-world kind – domain modeling, usability, schedules, platforms, etc. I also think that I can show how