Another criticism was that a 360 instruction could not include a full address. When the 360 was new the dominant instruction format was (OP code, index register ref, full address). The most prevalent programming languages offered arrays indexed by integers and the array would acquire a definite address at load time and the address of the array be planted in the instruction stream in instructions that also designated an index register that would hold the variable offset into the array during execution. I was skeptical of this as well.
Micro code removed the barrier to complex instructions in simple machines. Indeed most delivered machines had the full instruction set because the cost and price were small. Microcode could also disguise the real nature of the IO which was in fact not overlapped on the smaller machines.
Some high speed IO devices, such as drums, could not be used on the smallest machines for their bandwidth exceeded the capabilities of the channels of those machines. For a few IO devices there were other timing limitations that the hardware CPU together with the application were required to meet. This would eliminate some CPU models as well as some user written applications. A check sorter would read information from a check and demand a very quick decision from an application on which pocket the check was to be deposited in.
Perhaps the biggest surprise of any was the success of defining an instruction set so precisely and clearly that machines built in different countries could execute the same programs, even privileged programs. See this about that.