Functional decomposition is a natural way for decomposing a large problem or task into a series functional steps (e.g., connect to database, retrieve data, visualize results). The goal is to arrive at a level of granularity with steps that are easy to solve individually and then combine the steps into a main solution. The challenge with functional decomposition is that software designed from this paradigm may not respond well to change. A change in one step can ripple through the entire system. It suffers from poor [[abstraction]], [[encapsulation]], and [[modularity]]. An alternative to functional decomposition is [[object oriented programming]].