How Complex is my Code?

(philodev.one)

110 points | by speckx 4 days ago

8 comments

  • klabb3 6 hours ago
    From 20y experience and CS degree, I see software engineering as a constant struggle against accidental complexity. Like quicksand, every movement you make will pull you deeper, even swimming in the right direction. And like entropy, it governs all things (there are no subfields that are free of complexity). It even seems impossible to give a meaningful, useful definition, perhaps by necessity. All is dark.

    But now and then, something beautiful happens. Something that used to be dreadful, becomes "solved". Not in the mathematical strict sense, but some abstraction or some tool eliminates an entire class of issues, and once you know it you can barely imagine living without it. That's why I keep coming back to it, I think.

    As a species, I think we are in the infancy stages of software engineering, and perhaps CS as well. There's still lots of opportunity to find better abstractions, big & small.

    • mmcnl 53 minutes ago
      I'm a tech lead and pushing back against accidental complexity is basically my fulltime job.
      • onion2k 6 minutes ago
        I'm an Engineering Manager, and I think I have a similar role just applied to people processes rather than code. One nuance though - a lot of the time I suspect it's deliberate complexity designed to obfuscate how little people actually do.
    • appplication 5 hours ago
      This was really well written and I agree with you completely. Though I am not so optimistic as a species we have much runway left to get meaningfully much farther out of that infancy.

      As tech progresses and those abstractions become substantially more potent, it only amplifies the ability of small groups to use them to massively shape the world to their vision.

      On the more benign side of this is just corporate greed and extraordinary amplification of wealth inequality. On the other side is authoritarian governments and extremist groups.

      • Droobfest 3 hours ago
        Wealth inequality is a direct cause of authoritarianism and is not benign.
      • Joel_Mckay 3 hours ago
        Perhaps, but generally annoying millions of technology people tends not to end well for firms. Usually the market simply evolves to better match the fiscal conditions.

        https://en.wikipedia.org/wiki/Competitive_exclusion_principl...

        The Internet itself will likely further fracture into different ecosystems. =3

    • vbezhenar 5 hours ago
      Can you provide some examples of these beautiful abstractions or tools?
      • stephbook 4 hours ago
        Memory garbage collection, borrow checker, compile-time static typing in dynamic languages (Typescript, Python).

        Language specific for JavaScript: Strict comparison operator === that disables type coercion, together with banning ==.

        == allows "5" equals 5.

      • kelsey98765431 4 hours ago
        Take message queues. ZMQ and the like have basically solved message passing which was a ghastly thing to worry about for many years.
      • whattheheckheck 5 hours ago
        Read The Linux Programming Interface book
  • andai 13 minutes ago
    There's a metric I see omitted here which I call Rube Goldberg complexity.

    I'm working on a multiplayer game, for which I haven't touched the code in a while. The other day I asked myself, "what happens when I press the shoot button?"

    Well, it sends a message to the server, which instantiates a bullet, and broadcasts a bullet spawn message to all clients, which then simulate the bullet locally until they get a bullet died message. (And the simulation on both ends happens indirectly via global state and the bullet update function).

    My actual analysis was like 3x longer than that because it focused on functions and variables, i.e. the chain of cause and effect: the Rube Goldberg machine.

    I laughed when I realized that name was actually too charitable because at least in a Rube Goldberg machine, all the parts that interact are clearly visible and tend to be arranged in a logical sequence, whereas in my codebase it was kind of all over the place.

    So that made me realize, a function is not really a sensible unit of analysis. They're too isolated. You want to try and understand a feature.

    Also, I'm experimenting with organizing the code by feature, rather than by "responsibility." i.e. the netcode for the bullet should be in the bullet module, not the netcode module.

  • maxnk 1 hour ago
    Related problem I've been exploring lately: finding which files are most worth refactoring, with complexity as one of the inputs.

    I've built a small, opinionated tool for that [1]. It can rank files by a "Refactor Priority" score based on structural signals - size, callable burden, cyclomatic complexity, nesting - with churn and co-change from local git history layered on top.

    It's more of an exploratory tool than a general solution, but it's been practically useful for quickly spotting painful files.

    Part of why it was built: keeping coding agents in check. They tend to produce code that gets complex fast, don't feel the complexity building up, and eventually start making changes that break things. So the tool helps me catch files that are getting out of hand before that happens. It can also generate a refactoring prompt explaining why a given file is problematic - as a conversation starter for the agent.

    The article gave me a few more metric ideas to try, thanks.

    [1] https://github.com/etechlead/token-map

  • levzettelin 49 minutes ago
    I haven't read this yet, but from the title I'm surprised that it doesn't mention Kolmogorov complexity. How does Kolmogorov complexity relate to the concepts in this article?
    • bob1029 16 minutes ago
      It's probably the most ideal metric but it's impossible to find in meaningful timeframes.
  • runningmike 2 hours ago
    To do a Simple Cyclomatic Complexity check, operating on the principle that secure systems are simple systems, you can use https://github.com/nocomplexity/codeaudit or try the wasm version on https://nocomplexity.com/codeauditapp/dashboardapp.html

    Complexity directly impacts security. Simple systems are: Maintainable: Easier to change and manage. Reliable: Less prone to logic errors. Testable: Easier to validate and test.

  • mherrmann 3 hours ago
    Claude Code and others often write code that is more complex than it needs to be. It would be nice to measure the code complexity before and after a change made by the agent, and then to tell it: "You increased code complexity by 7%. Can you find a simpler solution?".
    • patrulek 2 hours ago
      You dont need to measure the code complexity, you can completely hallucinate those numbers if you feel that code is too complex and then watch how LLM will respond.
      • RealityVoid 30 minutes ago
        I love how petty this feels. :))
      • fowlie 1 hour ago
        > if you feel that code is too complex

        Now you're assuming a human is actually trying to understand the code. What a world we live in (sarcasm).

    • joshribakoff 2 hours ago
      Thats how you end up goodhearts lawing your way into simplicity eg duplicate code. Thats like the whole takeaway of the article at least for me.
  • wxw 6 hours ago
    Wonderful article, thanks for sharing. These complexity definitions and the connection to linguistic complexity are useful. Also enjoyed this line:

    > The cognitive complexity of a function can only be determined by the reader, and only caring about the reader can enable the writer to improve the learning experience.

  • AnonyMD 5 hours ago
    This is a very informative article. I hadn't really considered the complexity of the code before, so this is very helpful.