Modular designs are essentially unfinished designs. They permit correction of errors and replacing less efficient modules with more efficient ones. If life were the work of a super-natural, omnicient, designer, shouldn't we expect perfection in the design ? Isn't that central to the arguments of creationists that life has not evolved, but is, and remains, the way it was created ?
I disagree. They can be completely finished designs. Finished meaning meeting the requirements.
It's impossible to know what to expect of a designer - anything is possible. This is why ID is unscientific.
Designs by humans get refined and improved, as experience reveals weaknesses in the orignial. Such refinements and improvements are most readily done on a modular design. If we know in advance exactly how to build a device which will function optimally, how to minimize the probability of device failure, and how to keep construction and maintenance costs under adequate control, integrated design will be employed wherever it is advantageous.
Agree, a modular design is easier to improve. But your second point is not true, the main reason being that a modular design can be designed, built and tested in independent chunks, once the interactions between the chunks are agreed. It's also much easier to understand for the people involved as it's easy to see the architecture of the whole solution in terms of the chunks. In practice, software is written with an even higher degree of modularity than that, so that someone who wants to understand the software in detail can do so.
The main reason for using modular design in software is that it is constantly being changed, to correct bugs, to stymy hackers, to accelerate execution, to add capabilities, etc. If programmers knew from the beginning precisely how the program would have to function, and could code flawlessly every time, would they still be motivated to build in so much flexibility, modifiability, reuseability, into modules ? Would they not, for example, use more constants and fewer user-settable variables, more steps in do loops and rarer criteria for escapes to other modules ? Which is faster: executing the next command in machine language or looking up the address at which to find the next command ? Admittedly, compactness of code and speed of execution are no longer valued the way they were when RAMs were much smaller, and CPUs much slower.
That is one of the main reasons, but equally important is delivering a high quality solution in the first place. I don't think the kind of programmers you are talking about exist - even if they did, the users never specify their requirements correctly anyway, so there are always changes, during the initial testing of the app or later. Modularising actually helps programmers while they are developing the code too. Hard coding is definitely faster as you say and sometimes things are hard coded for performance reasons.