Michael Suess gives an introduction to various decomposiion techniques to split the problem into sub-problems. While Michael starts with reference to parallel programming, I believe this is important in any kind of programming paradigm. Identifying tasks that can be computed in parallel are important, because they also reveal story of the other side – dependencies. While they might not be always exclusively mutual, decomposing helps in building a better design. Read the article, it will give you a good start.