It is not that big of a deal, although there was extra work required.
You need to remember that Doom had a software renderer only. It only needed to be able to write to a color framebuffer for display. It also needed access to a keyboard, and sound. As long as you do it properly and carefully (and this is John Carmack we are talking about), it is not too difficult to abstract. You need to be careful not to paint yourself into a corner (endianness, pointer sizes, properly isolating platform-specific code, etc). That way you can develop most of the game without even touching the target hardware.
Doom did have what would be nowadays called an "engine", only it was designed for that particular game. Id Software was probably one of the first (if not the first) company to sell a generic "3d Engine". In any case, the abstractions were there.
They probably could not do the entire development using the NeXT workstations. At some point they would need real PCs to finish the port, and check how it worked on the target hardware. That was even more of an issue back then: although the C code could be cross-compiled (to solve the different CPU architecture problem), they did have lots of assembly code for performance.
Nowadays, we are spoiled. iOS developers do exactly the same thing day to day as they did, only they don't even notice for the most part. Click a button on their Macbooks (which run amd64 arch), code get cross-compiled to ARM and linked with ARM-specific libraries. Android developers do the same, and they even have a fully emulated environment.
You need to remember that Doom had a software renderer only. It only needed to be able to write to a color framebuffer for display. It also needed access to a keyboard, and sound. As long as you do it properly and carefully (and this is John Carmack we are talking about), it is not too difficult to abstract. You need to be careful not to paint yourself into a corner (endianness, pointer sizes, properly isolating platform-specific code, etc). That way you can develop most of the game without even touching the target hardware.
Doom did have what would be nowadays called an "engine", only it was designed for that particular game. Id Software was probably one of the first (if not the first) company to sell a generic "3d Engine". In any case, the abstractions were there.
They probably could not do the entire development using the NeXT workstations. At some point they would need real PCs to finish the port, and check how it worked on the target hardware. That was even more of an issue back then: although the C code could be cross-compiled (to solve the different CPU architecture problem), they did have lots of assembly code for performance.
Nowadays, we are spoiled. iOS developers do exactly the same thing day to day as they did, only they don't even notice for the most part. Click a button on their Macbooks (which run amd64 arch), code get cross-compiled to ARM and linked with ARM-specific libraries. Android developers do the same, and they even have a fully emulated environment.