instead of solving a problem using one large code segment, we can base that solution off of the solutions of smaller sub-problems. this is often referred to as modularity. this helps to manage the complexity of the program and can be done in the form of what type of abstraction?