A great deal of what we have learned in software engineering practice in the past 30+ years is of the form "technology X can speed up initial development of new software, but if you don't spend as much or more time thinking about how and when to use it as you saved by using it, in the long run it will turn your application into a sucking swamp of technical debt, costing you orders of magnitude more time and effort in maintenance."
Technologies that fall under this razor include: hand-coded assembly language, compilers, interpreters, procedure libraries, imperative programming, functional programming, object-oriented programming, manual memory allocation, garbage collection, static types, dynamic types, lexical scope, dynamic scope, "safe" pointers, "unsafe" pointers, the absence of pointers as a language concept, binary file formats, structured-markup file formats, macros, templates, avoidance of macros and templates, shared memory, message passing, threads, coroutines, asynchronous event loops, centralized remote services, distributed services, locally installed software, arrays, linked lists, hash tables, and trees.
The fact that many of the items in the above list come in groups which together exhaust the known solution space is very much intentional, and should in and of itself tell you something. One could argue that the only unambiguous, across-the-board improvements in praxis we've had since they first switched on the Z3 are block-structured programming (as opposed to spaghetti code) and memory protection (boy, do I ever not miss the days when a typo could take down my entire computer).