Software engineers have to deal with the complexity of software systems. What is complexity in software? What makes the development of software hard?
On one side, there is the inherent complexity associated with the problem the software system is addressing. For instance, the travelling salesman problem is a well-known example of a complex problem for which computer scientists have been proposing solutions. These kind of problems are not the main concern of software engineering, and are the subject of other disciplines, like Algorithms, Compilers, Databases and Data Mining. Actually, software engineers address these kind of problems by confining them to modules, such that their complexity does not spread to the whole software artefact.
So, what kind of complexity is addressed by software engineering? Basically, size complexity. The size associated with software artefacts is a direct consequence of the number of functionalities it implements, which results in code bases with hundreds of thousands lines of code, that have to be implemented by large software development teams.
But, why is there complexity in size? Why there is complexity in one million lines of code, even though they do not implement any complex algorithm?
The main reason is that size complexity involves different people that have to communicate and collaborate to develop the system. And to communicate they use language to create representations, either verbal or written. The possibility of introducing noise in the language transformations increases when there are more people involved.
Contrarily to the inherent complexity in software, for instance algorithms are designed by one or two persons, the software engineering projects involve the communication and collaboration between different people, the system stakeholders: users, customers, developers, etc. Therefore, the development of a software system designed, implemented and used by a single person would not be a software engineering project due to its lack of size complexity.