Static Types Are for Perfectionists

2025-05-1710:2939128mmapped.blog

mmap(blog) Posts About Atom Feed ✏ 2025-04-01 ✂ 2025-04-01 In this article, I reflect on my professional preferences and trace them to my early childhood experiences. I argue that culture and…

2025-04-01   2025-04-01

In this article, I reflect on my professional preferences and trace them to my early childhood experiences. I argue that culture and upbringing shape our core beliefs about technology more than rational arguments. I conclude with two implications of this idea: the necessity to accept other people’s preferences without judgment and the importance of finding an environment rewarding your style.

Perhaps the most decisive element of my game was the way my style on the board was completely in synch with my personality as a child.

Josh Waitzkin, The Art of Learning

For most of my programming career, I believed that my technological preferences were rational and reflected the realities of software development. I thought people who disagreed with my views hadn’t seen the light and hadn’t felt the pain yet. Give them time and relevant experience, and they will arrive at the same conclusions:

  • Statically typed languages are the only way to do serious software development.
  • Programmers must grok and have a solid mental model of their systems.
  • Dependencies are evil. They complicate infrastructure and deployment and slow down development in the long run.

A few years ago, after reading half a library worth of books on personal development and psychology, I realized how profoundly my early years affected my relationships, values, and core beliefs. In particular, the following two traits of my formative years stood out:

  • Mistakes were costly. Breaking something or getting a bad grade at school could result in punishment. As a result, my brain wants to avoid (or at least hide) mistakes. It demands perfection.
  • Asking for help, even from parents, often resulted in humiliation. As a result, I became counterdependent. Seeking or accepting help feels daunting. I’d rather read a gazillion books on psychology than talk to a therapist.

It didn’t take me long to realize that my technology preferences mirrored my everyday behavior. Thus, my early conditioning is a better explanation for my choices than objective evaluation:

Does my conditioning help me write better programs? Maybe. I noticed that my obsession with understanding leads to programs with few bugs, most of which come not from internal inconsistencies but from incorrect assumptions about the execution environment. Dependency aversion speeds up building, packaging, and shipping.

Do I prefer my approach because it produces better programs? Probably not. I can rationalize it all day long, but in the end, it boils down to feelings. Spending an hour fighting the compiler to craft a program that works on the first run feels terrific. Spending twenty minutes on drafting a Python script and another twenty on squeezing out runtime bugs… doesn’t.

I met many people whose programming approach was my polar opposite. They threw stuff together, experimented, and pulled in behemoth frameworks. They stopped worrying when their programs seemed to work and moved on. I don’t have any issues with their way, as long as we don’t work on the same system. In the long run, these builders might bring more value to the world than me. They fear less and try more.

In the beginner’s mind there are many possibilities, but in the expert’s there are few.

Shunryu Suzuki, Zen Mind, Beginner’s Mind: Informal Talks on Zen Meditation and Practice

Of course, I didn’t enter the profession as a fully-formed lonely grumbler. My views evolved significantly throughout my career, and continue to change.

My first programs were physics simulations and tiny games in Turbo Pascal. They were dull and brutally direct. I would create animations by individually drawing pixels at specific offsets. My only dependency was the standard library.

When I became a junior engineer in Enterprise Java world, I became obsessed with clean code. I read every book on code organization, packed my code with design patterns, and mastered bloated frameworks.

Exposure to new ideas and programming languages made me realize that most things I considered good design were unnecessary. They didn’t contribute to the solution but created accidental complexity and bloat. I didn’t need to write extensible code. I could start with the most straightforward version and rewrite it when the problem changed. As tef puts it, code should be easy to delete.

It took me over a decade to distill a programming style that resonated with me. I now care little about abstract clean code conventions and use my aesthetics and feelings as guides. That tendency sometimes leads to communication problems: I often feel that one design is preferable but can’t explain why exactly.

As all artists, programmers grow in spirals. Beginners try to achieve goals in the most straightforward way they know. Every line of code they write serves a purpose. Then they learn paradigms and good practices and imitate them. They accept that things must be done in a particular way because that’s the way of the craft. This path leads them astray, but it’s necessary for growth. They exit this limbo by reconnecting with reality and returning to their beginner’s mind. Their code becomes simple and purposeful again. Conventions fade, and their work becomes more authentic.

Programmers grow in spirals. Beginners think intuitively, but lack the language to express themselves. As they acquire knowledge and imitatate others, they curve away from their core in the authenticity space. Eventually, they learn to see things clearly and become more authentic.

The Japanese martial arts concept of shuhari describes three stages of mastery; it maps well to the authenticity spiral:

  1. At the shu stage, the practitioner learns the fundamentals, memorizes the moves, and obeys the rules. That’s the upward curve on the spiral.
  2. At the ha stage, the practitioner starts innovating by breaking the rules and connecting with reality. That’s the backward trend on the spiral.
  3. At the ri stage, the practitioner transcends the forms and performs the moves naturally. By this stage, the spiral approaches the authentic core.

If your views on technology don’t resonate with your core beliefs in other areas of life, your spiral might not have completed its cycle yet.

You will excel only by maximizing your strengths, never by fixing your weaknesses.

Marcus Buckingham

Let’s say I convinced you that your technological preferences result mostly from your upbringing and culture. What are the implications? I can think of at least two.

Firstly, we should stop labeling and accusing people who don’t share our preferences. Using a memory-unsafe language isn’t a moral crime, and a preference for dynamic typing doesn’t say anything about the programmer’s intelligence. Type theory maximalists should give up their aura of moral and intellectual superiority and accept that they need therapy just as badly as everyone else in the industry (if not more).

The sleep of self-awareness produces elegant mathematical constructs.
Source: Jay Cummings.

Secondly, we should pay more attention to how the technology feels and incorporate these feelings in our career choices.

Environment plays a crucial role in productivity and job satisfaction. I experienced this firsthand as my productivity fluctuated throughout my career. I felt at home and very productive at Yandex.Maps, and my managers were pleased with my work. When I joined Google, I felt like a cog in a vast machine. My motivation and productivity plummeted; I found it hard to focus and advance my projects. Joining dfinity and building things from the ground up was thrilling and stimulating; my four-and-a-half years there were the most productive in my life. I thought this experience changed me for good and gave me wings. I thought I could handle anything that landed on my plate. Yet, my productivity vanished after I left dfinity and joined an oversized startup. In just a few months, I felt burnt out and useless. And then it dawned on me that I didn’t change much between my experiences. My environment influenced my motivation and productivity much more than my track record. I need the right project and the right team to function well Most productivity books, including Getting Things Done and The 12 Week Year, promise you that their system will turn you into a productivity machine no matter what life throws at you. They lie. .

The right environment doesn’t make everything easy. You’ll still be frustrated a lot and will face challenges. But getting through these challenges will feel like growth, not a drag. Hence, understanding what makes you tick and finding a place where you belong (not a place where you think you should belong) will make you happier.

Haskell will still be used in 20 years, because there will always be people looking for a productive way to weaponize their autism.

Unfortunately, I couldn’t find any research that could disprove or confirm my anecdotal observations. If you’re a researcher working in the intersection of psychology and computer science, consider investigating the effects of childhood experience and neurodiversity As a frequent ZuriHac guest, I got an impression that hard-core compiled language communities have an unusually large fraction of neurodiverse people. on technology preferences. I can’t wait to read your papers!

If you liked this article, consider listening to the Leaving Stripe episode of the CoRecursive podcast. In this episode, Jon de la Motte shares his struggles with mental health and connects his career choices to his family dynamics.

I’m waiting for my first therapy appointment. Don’t hesitate to book one, too.


Read the original article

Comments

  • By Jtsummers 2025-05-1916:414 reply

    https://news.ycombinator.com/item?id=43966948

    I'll make the same remark I did last time this was posted here (it's been submitted 3 times in one week):

    The author starts with this:

    > I conclude with two implications of this idea: the necessity to accept other people’s preferences without judgment and the importance of finding an environment rewarding your style.

    And follows it with these two things:

    > Type theory maximalists should give up their aura of moral and intellectual superiority and accept that they need therapy just as badly as everyone else in the industry (if not more).

    >> Haskell will still be used in 20 years, because there will always be people looking for a productive way to weaponize their autism.

    So much for "without judgement".

    • By sshine 2025-05-1917:34

      After writing a lot of Nix in the last year, it has opened me to possibly switch to Scheme.

      I’ve always been a strong static type guy since 1st year of university, and yes, it ties to perfectionism and even a sense of OCD: if I model the world around me, I can relax.

      But here’s a take that I’ve been trying to articulate about Nix: it’s not about the static types. Nix is loosely typed, and if there is a functional language that doubles as coping strategy for recreating a quasi-perfect model of the world, it’s Nix.

      So I believe any strong modelling combined with declarative syntax can be argued is a coping strategy for autism. It’s not strictly the types.

      It also happens that software made this way is more reliable, breaks less.

      Maybe the opposition to its use in businesses is that business needs often change rapidly, and tying yourself to any correct understanding of the world means you’re late to the party.

      (I’ll then argue: there are companies that succeed at strong modelling, and companies that succeed at pivoting, and all companies need a bit of both at different times. That’s why huge companies with scaling problems and infinite runway pick Rust, and startups pick JavaScript.)

    • By 90s_dev 2025-05-1916:51

      "If I haven't seen it, it's new to me."

      I'm very happy to see the case being made for static typing. Dynamic types should be niche, and eventually they will be. Rails and Python only made them popular out of a reactionary minimalism thanks to types done wrong in C++ and Java ecosystems. New developers should read articles like this very early on. The more often they're written and posted, the sooner we can all move on from unnecessary type errors.

    • By wiseowise 2025-05-1920:321 reply

      > So much for "without judgement".

      Previously author felt enlightened by sneering on stupid normies for not understanding beautiful, clean™, statically typed code.

      What’s better way to show how better you’re now, that you’ve reached new nirvana, by sneering on ivory tower wizards with their arcane languages that are obviously a sign of autism (because whoever is different from, and possibly smarter than, you is obviously autistic)?

      • By roman-kashitsyn 2025-05-278:46

        Author here.

        > because whoever is different from, and possibly smarter than, you is obviously autistic

        I’m not sure how you came to this conclusion from the text I wrote.

        Autism has nothing to do with intelligence level.

        BTW, I identify as autistic. And I find Haskell very soothing.

  • By edg5000 2025-05-1916:312 reply

    I wrote a large enterprise JavaScript application that was behind Apple/Google update approval, was used daily by businesses whose entire operation depended on it.

    I will never touch loosely typed stuff again. I want every keystroke checked for errors. I want autocomplete to select from possible members/fields/variables/functions/classes rather than doing constant global find/replace operations and having the customer be the beta tester

    • By rrauenza 2025-05-1916:573 reply

      I adopted Python type annotations on a new project I was writing. Requirements shifted a lot as well as the implementation.

      It was amazing. I could refactor quickly after changing a dataclass, field name, function arguments, type, etc. I just ran mypy and it immediately told me everywhere I needed to update code to reference the new refactored type or data structure.

      Then only after it was mypy clean, I ran the unit tests.

      • By NeutralForest 2025-05-1917:181 reply

        My style has changed over time and part of it is thanks to static type checking in Python. I rarely use dictionaries anymore when what I actually want is a different type that functions will handle down the line. So to transfer data, I usually make frozen dataclasses where I used to use dictionaries. It's more work when you want to add fields on the fly ofc but it pays dividend anytime the logic becomes more complex.

        • By rrauenza 2025-05-1918:34

          Agreed -- dataclasses over dicts. And for legacy code I try to move them to typed dictionaries.

          Pydantic is also helpful to enforce types on json.

          I've also stopped passing around argparse namespaces. I immediately push the argparse namespace into a pydantic class (although a dataclass could also be used.)

      • By smitty1e 2025-05-1923:40

        Yes, but, the longer I use python (for personal and admin tasks mostly), the more the REPL and pytest let me sneak up on the 80% solution to my task at hand and get on with life.

        The scope of possibility does not end with a full-on enterprise application, having all of the Bell() and Whistle() classes.

      • By bpshaver 2025-05-1917:091 reply

        Even better, run `mypy` as part of your LSP setup and you don't even need to wait to run `mypy` to see type errors! If I make a mistake I want to be notified immediately.

        • By IshKebab 2025-05-1921:451 reply

          Just use VSCode with Pylance. Much better than Mypy.

          • By bpshaver 2025-05-1922:511 reply

            Not a VS Code user

            • By IshKebab 2025-05-207:471 reply

              You can use Pyright still for errors in other editors. It's better than Mypy.

              • By bpshaver 2025-05-2016:09

                I'm aware, but you said Pylance, which to my knowledge is just the VS Code extension.

                I'm satisfied with Mypy but curious to someday try other type checkers. Pyright is on the list.

    • By emoII 2025-05-1916:364 reply

      You do write tests, don’t you?

      • By ninetyninenine 2025-05-1916:403 reply

        Don't understand why people find tests important but not types.

        There's two popular ways to verify your programs. Types and tests. Types are EASIER then tests and types COVER more then tests.

        The ideal thing is to use both, but why spend so much time on unit tests over types is beyond me.

        Note that integration tests are a different beast. Why? Because you need to test things that aren't covered by either unit tests or types. In unit tests you mock out things that are external like IO, databases, and the like. In integration tests you need to test all of those things.

        Integration tests are THE most important thing to use to verify your program because it's an actual test to see if your code works. But unit tests vs. types? Types win.

        When I code. I never write a single unit test. Just types, and integration or end 2 end tests. It doesn't hurt to write a unit test and it's actually better. But the fact that I'm confident my code works without it shows the level of importance.

        • By gleenn 2025-05-1916:551 reply

          If you do it right, your tests cover the thing you care about and are less work usually because you write the test for the part of code that has the interesting part you want to verify works correctly. Types, especially on fully typed languages, make only guarantees about the type of values and they make you do it in places you might not care about. Types also only catch certain classes of errors that I personally find less helpful that tests. So to me, tests are less work, focus on thebimportant parts, and give better error messages. Obviously you can also write bad tests and do things like effectively just check the types in pmaces and you are back to square one. Testing is more of an art but the effort/economics of time are far better to me.

          • By the_af 2025-05-1917:112 reply

            > types [...] make only guarantees about the type of values

            What do you think "type of values" means and encodes, and why do you think it's different from your handwritten tests?

            I assume you do know that type checking is more than simply validating you're passing a string to a function that expects a string argument?

            > Types also only catch certain classes of errors

            Which classes of errors? Why do you think manually written unit tests are more complete?

            • By gleenn 2025-05-1918:431 reply

              If I have a complicated set of business-logic functions that all return booleans, the type-checker can tell me I got a boolean back but not that in xyz scenario my result should be true and abc scenario it should be false. You must write a test for that, the types are only the most marginal at helping check correctness. There are many more examples like this. If I have to write the tests, why do I want to spend time writing all the types too if my tests cover the things I care about the the types only cover details like "you returned a number from a function marked boolean", that type of error is super easy to catch with a test, so I didn't need the types.

              • By the_af 2025-05-1919:021 reply

                > the types only cover details like "you returned a number from a function marked boolean", that type of error is super easy to catch with a test, so I didn't need the types

                Thanks for your reply, this is why I asked: this kind of typechecking you describe only scratches the basics of what a robust type-checking system can do.

                In practice, it can cover much more than "you returned a number from a function marked as boolean", and so it saves you from writing lots of unit tests, leaving you free to write only the few tests that make sense for your business logic.

                Once you have a proper type system in place, you can do much more than:

                > [...] a complicated set of business-logic functions that all return booleans [...]

                You can encode more useful things in the type of the functions than just "it returns a boolean". Of course if every function you write only returns a boolean you won't get much from the type system! But that's circular reasoning...

                • By gleenn 2025-05-1922:141 reply

                  It's not circular reasoning, I literally have piles of boolean-typed functions in business logic and there is no quantity of type-checking that will validate that (defn should-go [light-is-green? intersection-is-clear?] (and light-is-green? intersection-is-clear?)) is correct. That requires an actual test. Obviously my example is trivial but they quickly become non-trivial and the type-chrcker will never save me if I replace "and" with "or".

                  • By the_af 2025-05-1923:072 reply

                    > I literally have piles of boolean-typed functions in business logic

                    Yes, but this is working with legacy code that wasn't written with a mature type-checking system in mind. The boolean type encodes very little meaning with it, and so there's not much you can reason about it, as you've noticed.

                    If your argument is "a modern type system cannot help me much with legacy code that didn't leverage it to begin with" I can understand you and even agree somewhat. But that's a different argument.

                    That's what I mean by circular reasoning: if you don't use the types, then yes, a type system won't be of much use. You'll spend time writing unit tests, which for legacy code seems like an adequate approach.

                    • By dragonwriter 2025-05-200:072 reply

                      If your type-checker is “mature" enough to encode the full value level semantics of the code it types (rendering the code itself superfluous, as then you’d just need to compile the type-level code to get your app), you then have the problem of validating the logic of the type-level code, and the natural solution to that problem is, again, testing.

                      • By the_af 2025-05-2011:49

                        Type checking is modeling + testing.

                    • By gleenn 2025-05-200:031 reply

                      I neither used the word legacy nor modern. I don't care how fancy your type checker is today or tomorrow, the arbitrarily deeply complicated boolean-typed function I write tomorrow gleans nearly zero value from type validation. It gains actual validation of correctness with real tests.

                      • By the_af 2025-05-2011:351 reply

                        It's a legacy problem in the sense your system is a badly designed mess of functions that only return boolean. You could encode additional semantics in the types. Of course if you don't, the type system will be unhelpful.

                        This is a modeling problem at this point. Types can make your model better by encoding more things. It's often not easy or feasible to refactor the mess, so sometimes you're stuck with it.

                        • By gleenn 2025-05-2018:471 reply

                          Can you explain concretely how adding types would make a bunch of boolean-valued functions and some tests better? What types would you introduce to my example?

                          • By ninetyninenine 2025-05-211:011 reply

                            You need dependent types for this to fly. But the main argument is that there’s an infinite number of ways your Boolean functions can go wrong if they mistakenly taken a wrong input type or return a non Boolean. Types reduce this universe of runtime errors by 99 percent. It’s still infinite though but you have a lot less possible errors.

                            • By gleenn 2025-05-2117:381 reply

                              That's my point, the type errors being reduced isn't that interesting, I usually find and fix those extremely quickly. What I don't find but am most interested in is the actual logic. So I must write tests. And when I write tests, I get the type errors covered too. So why should I spend my precious time modeling inside a type system when the ROI is minuscule and the cost is I have to litter my codebase with types. Just write the tests.

                              • By ninetyninenine 2025-05-220:26

                                You can write the test in the type system with dependent types. It's the same thing. But your language needs to support this. Typescript supports it. The static analyzer in your ide or during compilation will now run the test. You get a model and a test for free.

            • By AnimalMuppet 2025-05-1917:321 reply

              Depending on your language, some things may not be easy to encode in types. "Verify that the function handles gracefully the situation where the map it's passed doesn't contain that one magic entry." That won't be easy to encode in a type...

              • By the_af 2025-05-1917:571 reply

                Of course not everything can be encoded in types, and also YMMV regarding the specific language you're using.

                But you now why I asked the question: people who make claims like "types make only guarantees about the type of values" usually don't understand what modern type-checking can do or what can be encoded in types. People making these claims often believe type-checking is limited to validating that you only pass strings to a function expecting a string argument, or some minor variation of that.

                • By gleenn 2025-05-1922:151 reply

                  The fact remains that your type system can be turing-complete and still not validate the actual logic that I need checked/tested.

                  • By the_af 2025-05-1923:09

                    The same can be said of tests.

                    Types are just tests. By removing all the mindless, repetitive tests you write, typechecking can free you up to write the actual meaningful tests that you truly need to write.

                    It's not "pick one", it's "use type checking to help you only write the unit tests that matter".

        • By theLiminator 2025-05-1920:011 reply

          > When I code. I never write a single unit test. Just types, and integration or end 2 end tests. It doesn't hurt to write a unit test and it's actually better. But the fact that I'm confident my code works without it shows the level of importance.

          Imo this might be true if you're writing a lot of glue code. But I think unit tests are extremely valuable for testing pure functions that are pure logic/computation. For glue code/ensuring everything is hooked up correctly, types easily beat tests, but for pure logic tests (ideally property based testing if you can swing it) works great.

          • By ninetyninenine 2025-05-206:49

            Game developers work with more purity then web devs as web devs always funnel pure computations to external resources (usually the database).

            The weird thing is Game developers don't unit test stuff. Why? Because it's mostly not that effective. I know a lot of people say stuff like game devs are cowboys that don't follow best practices but that's not true. A lot of game devs know their shit inside and out.

            Here's the reason why Game devs don't unit test. There's no point. They run the program themselves a couple of times on their own computer and their good. The problem with web dev is that all their code is so Tied with IO they can't even run the code on their computer. So in order to test their logic they have to write mocks and then unit test their code with mocks in place. But why even do this when you can cover it all with an integration test?

            Hence I don't unit test. My integration tests and type checking covers it all.

        • By MoreQARespect 2025-05-1918:59

          Like tests, types can be more hassle than theyre worth if you dont use them correctly.

          Before mypy came along I was pretty disciplined at A) testing and B) ruthlessly clamping down on primitive obsession.

          I use types a lot now but I didnt see enormous quality or productivity gains when I started using them. I suspect people who let compilers catch their bugs were always A) pretty lax testers and B) probably often let primitive obsession get the better of them.

          There are only a few types of tests where I think that types actually serve as an appropriate substitute.

      • By 90s_dev 2025-05-1916:403 reply

        TDD and BDD are security blankets for enterprises and clients. They add disproportionately little value, and significantly increase the cost of evolving an app in any direction.

        • By NeutralForest 2025-05-1917:22

          TDD/BDD are just tools, in some cases they're useful and some other cases they're not.

          If your work is deeply exploratory and you don't even know what the final interface/API will look like, you shouldn't start with TDD. You should probably test as you go though, once you find some behavior you'd like to keep and pin down variations and edge cases you met during dev.

          If/Once you know what the expected behavior is, you can encapsulate that knowledge in tests, that's TDD to me. Then, I can write more code that meets the need of the expected API.

        • By MoreQARespect 2025-05-1917:121 reply

          TDD and BDD teaching and tutorials are almost universally terrible so people inevitably do them badly and then moan about the results, which can be worse than not using them at all.

          Usually the primary mistake is either using cucumber (which is awful) or surrounding the wrong interfaces with tests (usually at too low a level).

          Done well they are like a mini superpower.

          • By 90s_dev 2025-05-1917:181 reply

            I've learned from the so-called experts for years. I studied directly under them. I spent so many years trying to find the perfect way to do TDD and BDD. I saw their own code and their own solutions up close. They're frauds. It was all a sham.

            • By MoreQARespect 2025-05-1917:351 reply

              I'd be shocked if it wasnt because they also led you to make the two primary mistakes i refered to above.

              • By 90s_dev 2025-05-1917:531 reply

                Ah so you're the guru I should have studied under all those years. If only.

                • By MoreQARespect 2025-05-1918:35

                  Perhaps. More than a famous guru I find most companies badly need a testing framework that can simulate 90% of possible scenarios hermetically and lack somebody who can build that.

                  Once you have that and somebody has taken you around the block 3 or 4 times pairing with TDD on your app it usually starts to make more sense.

                  On my team after I inculcated the TDD habit properly, BDD came naturally. I didnt even encourage them to have conversations with the PO while screensharing the tests. They dont even know that's called BDD.

        • By jamil7 2025-05-1916:501 reply

          The person you're responding to only mentioned tests, not TDD or BDD.

          • By 90s_dev 2025-05-1916:53

            People who think like that commenter implied, are almost always indoctrinated into "if you don't write tests and use TDD or at least BDD, you're literally Satan."

      • By toolslive 2025-05-1916:50

        "unit tests are a poor man's compiler" (NN)

      • By fyrn_ 2025-05-1916:39

        Yeah, that will really help with the auto complete and keystroke by keystroke checking?? What?

  • By PaulKeeble 2025-05-1710:391 reply

    Despite the somewhat clickbait title this is quite interesting on technology preferences and the path to what makes us happy and productive.

    The idea that our preferences in technology are driven by our path of learning seems relatively self evident, those that started with C/C++ verses Smalltalk verses Java verses Python as their first language likely have a very different perspective on the various trade offs of these languages. Given we don't usually learn every language and certainly not to a deep extent few have deep experiences in all the possibilities to grok the differences in practice on similar projects.

      "I need the right project and the right team to function well"
    
    I really resonate with this, in the right environment I seem vastly more productive. I have a significant preference for low levels of control and oversight and in those environments I can take actions quickly with less discussion and often get to better answers quicker, but I hate not being able to do that and it impacts my performance disproportionately. Its one of those preferences for culture that seems vital to how I want to work and impacts productivity a great deal. Asking permission or high rigour for potentially "extra" work just grinds my gears!

    • By AnimalMuppet 2025-05-1917:38

      I don't think it's just "what our path of learning was", though that plays a role. I think that different personalities prefer different styles (functional vs procedural), different languages (static vs dynamic typing), and probably several other axes.

      This explains, for example, why one person sees functional programming as a massive revelation, where suddenly everything "just fits", and assumes that anyone who doesn't have the same reaction hasn't "gotten it" yet. And others, despite diligent trying, never have that reaction.

HackerNews