Many software systems are complex not because they are large, but because they have many interconnections. Even quite large systems can be easily understood if they have a regular structure. But eliminate a regular structure, and the task of understanding becomes much more difficult.
Interconnections make it difficult to understand sections of software in isolation, or to carry components from one project to the next. This, in turn, makes it difficult to divide a project between several programmers.
To manage complexity we use abstraction, the elimination of details. One definition says that the difference between data and information is the amount of detail you can throw away. By finding a way to hide detail from a programmer, we can help that programmer deal with ever more complex tasks.