# Software Engineering > [!important] Fundamental Theorem of Software Engineering > > We can solve any problem by introducing an extra level of indirection... > except for the problem of too many levels of indirection. - [Uniform Access Principle](https://en.wikipedia.org/wiki/Uniform_access_principle), anything has the same behavior should have same interface. e.g. a method without side effect nor arguments should be accessed like an attribute. - Everyone knows that debugging is twice as hard as writing a program in the first place. So if you’re as clever as you can be when you write it, how will you ever debug it? —Brian W. Kernighan and P. J. Plauger, The Elements of Programming Style - Good frameworks are extracted, not invented. —David Heinemeier Hansson, creator of Ruby on Rails - the two views this way: 1. The conservative view: Computer programs have become too large and complex to encompass in a human mind. Therefore, the job of computer science education is to teach people how to discipline their work in such a way that 500 mediocre programmers can join together and produce a program that correctly meets its specification. 2. The radical view: Computer programs have become too large and complex to encompass in a human mind. Therefore, the job of computer science education is to teach people how to expand their minds so that the programs can fit, by learning to think in a vocabulary of larger, more powerful, more flexible ideas than the obvious ones. Each unit of programming thought must have a big payoff in the capabilities of the program. —Brian Harvey and Matthew Wright, preface to Simply Scheme