Skip Navigation
54 comments
  • I get what this is saying but on the other hand...

    Programmers now:

    💪 Can spin up a minimum viable product in a day

    💪 Writes web applications that handle millions or even billions of requests per second

    💪 Remote code execution and memory related vulnerabilities are rarer than ever now

    💪 Can send data across the world with sub 1 second latency

    💪 The same PCIe interface is now 32x faster (16x PICe 1 was 8GB/s, while PCIe 6 is 256GB/s)

    💪 The same wireless bands now have more throughput due to better radio protocols and signal processing

    💪 Writes applications that scale across the over 100 cores of modern top of the line processors

    💪 JIT and garbage collection techniques have improved to the point where they have a nearly imperceptible performance impact in the majority of use cases

    💪 Most bugs are caught by static analysis and testing frameworks before release

    💪 Codebases are worked on by thousands of people at the same time

    💪 Functional programming, which is arguably far less bug prone, is rapidly gaining traction as a paradigm

    💪 Far more emphasis on immutability to the point where many languages have it as the default

    💪 Virtual machines can be seamlessly transferred from one computer to another while they're running

    💪 Modern applications can be used by people anywhere in the world regardless of language, even things that were very difficult to do in the past like mirroring the entire interface to allow an application that was written for left to right languages to support right to left

    💪 Accessibility features allow people who are blind, paralyzed, or have other disabilities to use computers just as well as anyone else

    Just wanted to provide come counter examples because I'm not a huge fan of the "programmers are worse than they were back in the 80s" rethoric. While programmers today are more reliant on automated tools, I really disagree that programmers are less capable in general than they were in the past.

    • For sure, it's a lot easier to do a lot of stuff today than before, but the way we build software has become incredibly wasteful as well. Also worth noting that some of the workflows that were available in languages like CL or Smalltalk back in the 80s are superior to what most languages offer today. It hasn't been strictly progress in every regard.

      I'd say the issue isn't that programmers are worse today, but that the trends in the industry select for things that work just well enough, and that's how we end up with stuff like Electron.

      • Also worth noting that some of the workflows that were available in languages like CL or Smalltalk back in the 80s are superior to what most languages offer today.

        In what ways? I don't have any experience with those so I'm curious.

        • Common Lisp and Smalltalk provided live development environment where you could run any code as you write it in the context of your application. Even the whole Lisp OS was modifiable at runtime, you could just open code for any running application or even the OS itself, make changes on the fly, and see them reflected. A fun run through Symbolics Lisp Machine here https://www.youtube.com/watch?v=o4-YnLpLgtk

          Here are some highlights.

          The system was fully introspective and self-documenting. The entire OS and development environment was written in Lisp, allowing deep runtime inspection and modification. Every function, variable, or object could be inspected, traced, or redefined at runtime without restarting. Modern IDEs provide some introspection (e.g., via debuggers or REPLs), but not at the same pervasive level.

          You had dynamic code editing & debugging. Functions could be redefined while running, even in the middle of execution (e.g., fixing a bug in a running server). You had the ability to attach "before," "after," or "around" hooks to any function dynamically.

          The condition system in CL provided advanced error handling with restarts allowed interactive recovery from errors (far beyond modern exception handling).

          Dynamic Window System UI elements were live Lisp objects that could be inspected and modified interactively. Objects could be inspected and edited in structured ways (e.g., modifying a list or hash table directly in the inspector). Modern IDEs lack this level of direct interactivity with live objects.

          You had persistent image-based development where the entire system state (including running programs, open files, and debug sessions) could be saved to an image and resumed later. This is similar to Smalltalk images, but unlike modern IDEs where state is usually lost on restart.

          You had knowledge-level documentation with Document Examiner (DOCX) which was hypertext-like documentation system where every function, variable, or concept was richly cross-linked. The system could also generate documentation from source code and comments dynamically. Modern tools such as Doxygen are less integrated and interactive.

          CL had ephemeral GC that provided real-time garbage collection with minimal pauses. Weak references and finalizers are more sophisticated than most modern GC implementations. Modern languages (e.g., Java, Go, C#) have good GC but lack the fine-grained control of Lisp Machines.

          Transparent Remote Procedure Calls (RPC) allowed Objects to seamlessly interact across machines as if they were local. Meanwhile NFS-like but Lisp-native file system allowed files to be accessed and edited remotely with versioning.

          Finally, compilers like Zeta-C) could compile Lisp to efficient machine code with deep optimizations.

    • 💪 Writes web applications that handle millions or even billions of requests per second

      This has nothing to do with SO or AI.

54 comments