Sometimes I think the most interesting thing about (and perhaps the only deep problem concerning) software is complexity. Never before in the history of the constructed world, of human artifact realisation, has it been possible to create complexity on such scale.
For a given design problem there are usually a handful of sensible solutions, so the solution complexity is bounded below accordingly. With buildings, machines etc, the laws of physics and economics bounds potential solutions above. This is not the case with software! Given the ever increasing amounts of processing and memory available, solution complexity is bounded above only by human ingenuity (particularly the kind of ingenuity that emerges from large groups) - and occasionally the necessity for someone to actually understand what is going on.
For a given design problem there are usually a handful of sensible solutions, so the solution complexity is bounded below accordingly. With buildings, machines etc, the laws of physics and economics bounds potential solutions above. This is not the case with software! Given the ever increasing amounts of processing and memory available, solution complexity is bounded above only by human ingenuity (particularly the kind of ingenuity that emerges from large groups) - and occasionally the necessity for someone to actually understand what is going on.