I was just thinking about the 'full circle' today.
OSes of the past: Windows, Variations of Unix's,
OSes of 2018: Android, IOS, All Varations of Browsers, plus all the old ones
---
Cross platform (cross-os) development of the past: nasty (Widget libraries (wxWindows, QT, ... ), os-abstraction libs )
Cross platform development of 2018: nasty still (react-native, xamarin, etc .. )
---
Development pipeline tools of the past: Automake/cmake, make, linker
Development pipeline tools of 2018: npm, webpack
---
Compiler front ends of the past (things that produce assembler or low-level C or stack-machine codes): various C++ front ends, Eifel, etc
Compiler front ends of 2018 (things that spit out javascript): babel (more like macro-assembler), Clojurescript, ReasonML, Fay, Nim .. ,etc
---
In current times, we also added Wireframe/Styling tools into our development pipeline (I do not think we had it in the past). Eg Bootstrap and other styling (that are not integrated into 'compile-time-verification' stage of the modern Front-end languages.
I realize that above is somewhat front-end-dev oriented, but I think the desire to share 'same language' for front and backend development, causes the blur.
I also would add that for data crunching and data distribution (eg CORBA, DRPC) of the past -- we have gained more options, higher quality and free. So I would say this is a material advance for our productivity.
It's a punctuation heavy format with a bunch of shell code mixed in, which means projects go from using one language (Python, Ruby, JavaScript etc) to three (whatever they were using previously plus Make plus shell).
We are going around in a cycle!