Larry Garfield has a recent post to his blog that outlines what he thinks are some of the top priorities you should take into consideration when architecting your next application - small or large - and lays that structure on top of what the Drupal project is doing.
Understanding architecture, and the trade-offs that different architectures imply, is an important part of any software project. [...] To be able to speak and think about the design of your system properly, though, you need to understand the trade-offs that come with it. There is no such thing as a free lunch, and designing a system to be powerful in one way invariably tends to harm it in another. It is important to know what your priorities are before you start building; and in a distributed collaborative environment like Drupal to all agree what those priorities are, at least to a large extent.
Talks about software architecture design patterns (like Model-View-Controller or Naked objects) including one that's not so much a pattern as an evolution - monolithic architecture. Among the list of things he suggests considering are subjects like:
He compares this list to how the Drupal project is run and finds a large emphasis on extensibility, modularity, scalability. These came at the cost of testability, verifiability and understandability however.