A. Provides a means of dividing up tasks
B. Provides a means of reuse of program code
C. Provides a means of testing individual parts of the program
D. All of the above