It can be a struggle to get a consistent, durable overview of any complex programming project. It's easy to get lost in the trees of
- entity, data access, visual interface and control classes,
- class interrelationships and dependencies,
- collections of objects instantiated from classes,
- private and public methods,
- the abstract interface classes, virtual methods, method overrides,
- algorithms, code patterns, configuration, custom types, structures,
- managed vs. unmanaged code,
- single vs. multiple inheritance,
- UML, ERD, flow charts,
- model-driven programming, functional programming and object-oriented programming,
and the list goes on and on.
You could say that the programmer is spoilt for choice. However, making and sticking to choices about how to solve a problem or set of problems is complicated by there being multiple ways of doing the same thing. Granted, some ways are more efficient or 'elegant'. There is also the right tool for job. An uncompiled scripting language can be the best choice for proto-typing. However, it can be a pain to debug if there is much data transfer going on between different parts of the program. Of course, keeping each part of the program simple and making sure you test thoroughly before moving on helps a great deal. Conversely, the simpler each part is, the more parts you have to manage.
Add the client to the above and their level of understanding about what you are doing. They may believe that production code should be as quick to write as a simple prototype. They may have heard that a UML diagram can be automatically converted into code but not realise that your software can't actually do that. Their 'nephew' doing work experience at IBM may have created this fantastic web site in a couple of days so why can't you? Doesn't everybody use the same tools?
Back on topic... I'm the kind of guy that likes to keep the overview constantly in view but how do you do that when your mind is already staggering under the weight and number of parts? It doesn't matter how clever you are or think you are. At some point parts will drop off your concious radar.
Keeping in mind that your mind can only juggle 5-7 concepts conciously at one time how can you break down any project into just 5 parts? 1. Data input. 2. Data transport. 3. Data manipulation. 4. Data storage. 5. Data display.