One problem is that there hasn't been much written about the topics you seek. Experienced developers know about such things, but not much has been written. One book which discusses dependency graphs is John Lakos's book "Large Scale C++ Software Design", but I find that book a bit dry. Lakos discusses dependency graphs in the context of testing and software releases (i.e., if you change a module you need to test the changed module and all modules which depend upon the changed module -- if you don't manage dependencies you have to retest the whole system). It's a good, thorough treatment of the subject, but don't try to read it before bed -- it's a snoozer that will put you out faster than warm milk and a comfy blanket. Robert Martin at Object Mentor has some online article you might find useful and he is a much better read.Push vs. pull are different technique for delivering data to components which need the data. In a push architecture, some high-level program guesses what data will be needed, packages it up, and pushes it to lower level routines which work on the data. In a pull architecture, the lower level routines have access to various data provider services and pull only the data they need. The trade-off you make with one or the other is that with data push you might spend time fetching and pushing data which might never used. On the other hand, the pull approach risks having two or more routines need the same data and the provider ends up fetching twice. The key to making the pull strategy work is having data providers which do lazy loading of the data with cache support to deal with multiple fetches. But then you need intelligent caching....I hope this helps.