There are some pretty basic strategies to make building "large" software easier. All of them were attempted, but in an entirely broken way:
- Break the architecture down into smaller components that can be tested independently.
- Break the functionality down into smaller features that can be released independently.
- Develop automated tests at the system level (i.e. integration tests, not unit tests).
The software took 2-4 minutes to launch in development, and very few of us knew how to meaningfully test it. This meant that any change that compiled (and passed code review) would ship.
Oh yeah - and the system used binary structures in shared memory to communicate across processes, which were running code written in two entirely different languages.