They did so more slowly and painstakingly, using more fundamental and primitive tools and technologies, such as command-line C compilers, and BASIC interpreters, and so forth.
I would definitely not recommend “the good old days” over the technologies that you mention, except that (by my lights) Java is also a primitive technology— a portable version of C, with a huge amount of overhead and baggage (i.e. the JVM itself) to support portability that is now somewhat spurious. Back in the day there were many, many minicomputer and micro OS's and we badly needed something like JVM, which we did not nave. Now there are only a very few environments where software is being created, and these all have “modern” interfaces and productivity aids—Windows and Linux cover 80%-90% of all new software demand, I would guess—there are myriad new chips and environments, but the first thing created for these environments (often before the environment itself is fully operational) are cross-assemblers and cross-compilers, enabling the use of great tools from other systems (like Windows and Linux) to create new software for these new environments.
But anyway, with our current “convergence-of-technology” environment, there is no reason not use Visual Studio, or any other software productivity tool which works with both Linux and Windows— they practically all do nowadays.
I would substitute Python for Java, and call the stack in your question, good.