The Primacy of Developer Experience: Why Tooling Trumps Language Elegance
Why is this DeveloperExperience DX meme funny?
Level 1: Ease Over Elegance
Imagine you have two toy kits to build a little robot. One kit comes in a fancy box with shiny parts that look really cool, but uh oh – it has no instruction booklet and no proper screwdriver for the tiny screws. You’re excited at first, because the pieces are high-tech and awesome, but then you try to put them together and it’s super confusing. You’re on your own, and it stops being fun fast. Now the second kit doesn’t look as flashy; the pieces are simple. But it includes a clear step-by-step manual and all the tools you need – a screwdriver that fits just right, even a little tool to help hold pieces together. Building this one is a breeze, and you finish your robot happily, feeling proud. In the end, you’ll probably love the second kit more, right? Not because its pieces were cooler (they weren’t), but because it was easy and pleasant to build. That’s the joke of this meme: in programming, most people prefer the tools and setup that are easy to use over a language that’s fancy but hard to work with. It’s saying that making the developer’s life easy is more important than having a “beautiful” language that gives you a headache. Just like you’d pick the toy kit with the helpful instructions, developers pick languages with good tools so they can get things done and enjoy the process. The funny tweet lists different programming languages and basically shows how each one gives you a handy “instruction booklet or tool,” and that’s why they’re popular. Meanwhile, the super elegant nerdy stuff? It might be cool for some, but if it doesn’t come with a good screwdriver and manual, most people will leave it on the shelf.
Level 2: Tools vs Syntax
Let’s break this down in simpler terms, especially if you’re newer to the programming scene. The meme (a tweet by Dmitrii Kovanikov) is comparing programming languages and highlighting how tools and setup can matter more than the fancy design of a language itself. Here’s what each part means:
Functional Programming (FP): This means a style of coding where you mostly use functions and avoid changing state or mutable data. It’s like writing math equations – very elegant and clean in theory. Languages like Haskell or Lisp are big on FP, and they often boast about having a super strong type system (rules that catch errors in your code before you even run it). Sounds great, right? But FP languages aren’t very popular in mainstream jobs. Why? The tweet argues it’s because their tooling (the support you get from editors, debuggers, package managers, etc.) isn’t as good or easy as in other languages. Most developers care more about developer experience (DX) – basically how nice and smooth it is to get things done – than about having mathematically pure code.
“Tooling > Language”: This is the tweet’s way of saying that good tools are more important than the language’s theoretical niceties. Tooling includes things like IDEs (Integrated Development Environments) that help you write code, debuggers that help you find mistakes by letting you pause and inspect a running program, build systems, linters, testing frameworks – all the stuff that surrounds the language itself. When they put “>” (greater than), it’s like a cheeky math notation meaning “tooling is greater than language (design)”. So if a language has awesome tools, people will use it even if the language isn’t the fanciest. Conversely, a beautifully designed language with poor tooling won’t get much love outside of academic or hardcore hobby circles.
Java and the debugger: The tweet says, “In Java, I can jump into any codebase with a debugger and find my way out.” If you’re new, Java is a very common programming language, especially in big companies. One reason it’s so widespread is that it has mature tools. For example, a debugger is a tool that lets you run a program step-by-step. You can pause execution at any line, inspect variables (see what values they hold at that moment), and basically navigate through the code like you’re exploring a cave with a headlamp. Java’s ecosystem (things like IntelliJ IDEA or Eclipse) makes debugging straightforward: you hit a red dot next to a line (breakpoint), run the program, and it stops there so you can poke around. The tweet’s point is that with Java’s tooling, even if you drop into an unfamiliar project, the debugger is like your trusty map – it helps you not get lost. For a developer, that feeling of “I can always debug my way out” is super comforting. Junior dev perspective: If you’ve done any school projects in Java, you might have used an IDE that highlights errors and suggests fixes. That’s tooling at work making your life easier, more so than Java’s syntax or anything.
Rust and error messages: Rust is a newer systems programming language (kind of like a modern alternative to C++). It’s known for being safe and fast, but also a bit strict. The tweet highlights Rust’s compiler error messages: when your code has a mistake, Rust doesn’t just say “error at line 5.” It often gives a long, friendly explanation of what went wrong and even hints to fix it. For example, if you try to use a variable that’s moved, Rust will explain that you can’t use it because ownership was transferred, and might suggest cloning it. This is unusual because many language compilers are terse or cryptic (especially for beginners). Rust devs prides themselves on these helpful errors – it’s part of the developer experience focus. So for someone learning, Rust’s tough love is made easier by the fact the compiler is practically holding your hand with detailed feedback. The meme is saying that this kind of hand-holding is a big selling point; it keeps people coming back to Rust even if the language itself is complex. In short, error_message_quality matters a lot.
Go and easy dependencies: Go (or Golang) is another relatively new language (from Google) that became popular quickly, not because it reinvented programming, but because it made things simple and convenient. The tweet’s line on Go: “I can depend on just a GitHub repository, no need to deal with package managers at all.” Here’s the context: in many languages, if you want to use third-party code (libraries), you use a package manager (like NPM for JavaScript, Pip for Python, or Maven/Gradle for Java). These are tools that fetch and manage library versions, which can be a bit of a learning curve. Go initially said, “forget all that, just give me the code from source.” In practice, with Go you could run a command to fetch a library by its GitHub path and it would just download the code and compile it. It felt very lightweight. (Nowadays Go has a modules system that’s a bit more structured, but it’s still pretty straightforward.) For a newcomer, this means you didn’t have to learn a new tool just to use a library – if you know how to get code from GitHub, you’re set. No fuss. The tweet emphasizes how attractive that zero-friction setup is. Go also compiled super fast and produced standalone binaries easily, so deploying a Go program was a cinch. All these are tooling/DX factors that often trump whether the language has fancy features. In fact, Go purposely left out some complex features present in C++/Java to keep things simple. It’s a case of less is more, when less complexity means a smoother experience.
C++ and its... quirks: When the tweet lists “In C++” and then nothing, it’s actually a humorous way to say C++ doesn’t give you an obvious DX win (at least none that fit in one sentence!). C++ is a powerful language used in systems, games, etc., but it’s kind of infamous among developers for being really hard to set up and troubleshoot, especially for beginners. For instance, C++ doesn’t have one standard way to get libraries – there’s no single official package manager. You might have to manually download code or use third-party tools, and build processes can be complicated (Makefiles, anyone?). Also, the error messages from C++ compilers (especially for advanced code) can be very hard to read. If you made a mistake with templates, you might get a screen full of gibberish types. Debugging C++ can also be tricky: you often use generic debuggers like gdb or an IDE, but when things crash, you might just get a memory address or core dump which is not very newbie-friendly. The tweet’s blank after “In C++” is kind of saying, “nothing nice to report here 😅.” It’s exaggerating for comedic effect, of course – there are tools for C++ (IDEs, debuggers, etc.), but the learning curve to use them well is steeper, and there’s no unified, out-of-the-box, beginner-friendly experience. For a junior dev: if you’ve only used languages like Python or JavaScript, trying C++ can feel like being dropped in the wilderness with just a compass. You have to set up a compiler toolchain, link libraries, and the errors often assume you have a lot of low-level knowledge. That’s why this blank is both funny and a bit true.
JavaScript in a browser: The tweet says, “In JavaScript, I can start writing code by having just a browser.” This one is very straightforward. Just about every computer has a web browser (Chrome, Firefox, etc.), and that browser can run JavaScript out of the box. If you press F12 and go to the Console tab, you can literally write JavaScript code and execute it right there on any website or a blank tab. For example, you could type
alert("Hello!")and it’ll pop up an alert in your browser. That means anyone can start coding in JS with zero setup – you don’t need to download a programming environment or compiler. This is how a lot of people write their first lines of code! It’s incredibly accessible. Plus, with things like CodePen or JSFiddle (online editors), you don’t even need to save files on your computer – you can experiment in the cloud instantly. So JavaScript’s tooling advantage is accessibility and immediacy. The language itself historically had some odd quirks (like confusing equality rules, etc.), and until recently it didn’t even have types to catch errors, but none of that stopped it from becoming one of the most used languages in the world. Why? Because barrier to entry is super low and it’s everywhere (the web!). This epitomizes the “DX over language design” idea: making it easy to start often matters more than having the “perfect” language.“Devs care about DX, not aesthetics.”: Now, DX stands for Developer Experience, which means how it feels for a developer to use the language and its tools day-to-day. And “aesthetics” here refers to how elegant or theoretically nice the language is (like having pretty syntax or a very pure design). The tweet’s final message is that for most developers, it’s more important that their tools and languages be practical and comfortable rather than academically perfect. Think of it this way: a car might have a gorgeous design and a super advanced engine (that’s aesthetics and power), but if the steering wheel is in the backseat and the car runs on a fuel that’s hard to find, regular people won’t buy it. They’ll go for the car that’s easy to drive and refuel, even if it’s not as fancy. Similarly, a programming language could have an amazing type system that prevents errors (fancy!), but if it doesn’t have good documentation, easy debugging, and a supportive community, most devs will pass. DeveloperExperience_priority is a real thing in industry – teams choose languages and frameworks that help them ship products quickly and maintain them easily. So, the tweet is explaining why something like pure functional programming isn’t mainstream: it might be prettier in theory, but the average dev prioritizes how easy and enjoyable their day-to-day coding is. It’s a bit of tough love for language designers: don’t ignore DX!
In summary, each language mentioned is an example of how good tooling or low friction boosts popularity: Java (debuggers), Rust (great errors), Go (simple dependency handling), JavaScript (instant start in browser). And the omission for C++ playfully acknowledges that C++ is powerful but without those modern DX comforts. For a junior developer, the takeaway is that when you hear debates about programming languages (the classic LanguageWars on forums), remember to consider the ecosystem and tools, not just the language’s features. A language that seems “boring” but has great documentation, community, and tools can actually be a better experience than a “cool” language that leaves you to fend for yourself. That’s exactly what “Tooling > Language” means.
Level 3: Tooling Over Typing
This tweet lands a punch that seasoned devs feel in their gut: developer experience (DX) beats language purity. It humorously lists popular languages and the one thing each absolutely nails for DX, implicitly explaining why those languages thrive while purely functional ones stay niche. The author writes “Tooling > Language” as a bold thesis. Let’s unpack the examples, since each is a wink at a real-world truth:
Java – “I can jump into any codebase with a debugger and find my way out.” Java’s superpower isn’t sexy syntax; it’s the rock-solid tooling. Any enterprise Java dev has fired up an IDE like IntelliJ or Eclipse, set breakpoints, and literally walked through running code step by step. Have a production issue? Attach a debugger to the JVM, inspect variables in real time, and bam – you’re untangling a snarly legacy app like Ariadne in the labyrinth. This reliability and ubiquity of debugging tools make Java a comfort zone. Aesthetic language design (verbose, boilerplate-heavy) doesn’t matter at 3 PM when you’re knee-deep in a null-pointer bug – but a trusty debugger does. DX over aesthetics, in action.
Rust – “I have pretty and helpful error messages.” Ask anyone who’s tried Rust: the compiler is like a strict but kind teacher. Forget the stereotype of cryptic compilers; Rust’s errors read almost like a StackOverflow answer. You get clear descriptions of what went wrong and suggestions to fix it. For example, if you borrow a variable improperly, Rust might suggest “try adding
clone()here.” Seasoned C++ devs practically did a spit-take at Rust’s friendly guidance because they grew up deciphering templated error hieroglyphics from GCC. Rust’s creators understood that empowering developers with informative feedback is a killer feature. So even though Rust has a steep learning curve (the borrow checker can feel like a personal trainer yelling at you), those error messages keep you going instead of giving up. It’s a huge reason Rust gained popularity despite being as theoretically heavy as some FP languages – the error_message_quality is game-changing for DX.Go – “I can depend on just a GitHub repository, no need to deal with package managers at all.” This line pokes fun at how ridiculously easy Go made dependency fetching (especially in its early days). Traditional languages often require wrangling a package manager (Maven, NPM, Pip, you name it) or learning complex build configs. Go said “Nah, just give me the repo URL.” With a single
go get github.com/user/project, you’d pull the library code straight from source control like magic. No central registries, no version hell (well, until you need Go modules, but shh). The tweet exaggerates a bit (you still need proper versioning for serious Go projects), but the sentiment stands: Go was designed for minimal fuss in setup. No ceremony – you download a binary and start coding. Want a library? If it’s on GitHub, it’s basically yours. That kind of frictionless experience endeared Go to pragmatists. It’s not that Go’s syntax is revolutionary (quite the opposite: it’s deliberately simple, even terse in features like generics initially) – it’s that the overall experience of using Go felt easy and lightweight. In real terms, that means faster onboarding of new devs and fewer “it works on my machine” headaches. DeveloperExperience_DX was front and center, arguably more so than language theory.C++ – “In C++” … and then nothing. Just a forlorn, unfinished sentence. This blank is the joke that senior developers cackle at (perhaps while wiping away a tear). Why? Because C++ is infamous for its lack of simple, unified tooling or newbie-friendly DX. Where do we even start: Is it the lack of a standard package manager (every team has their own ritual of CMake, Makefiles, vcpkg, Conan, or manually vendoring libs)? Or the treasure-hunt of configuring compiler flags and dealing with linker errors that read like incantations? How about debugging a segfault in C++ without a safety net – you’ll often just get “Segmentation fault (core dumped)” and maybe a memory address, basically the compiler saying “Good luck, pal.” And don’t forget error messages: older C++ compilers would spit out templatized error stacks so horrifically long and cryptic, it spawned memes (“C++ error message haiku”, anyone?). The meme’s author coyly leaves C++’s line incomplete, implying there’s no easy mode here. It’s a pause where every experienced C++ dev fills in their own punchline: “In C++, I … have a headache setting up environment,” “In C++, I pray to the compiler gods,” or simply crickets. It’s savage, but it hits home because compared to Rust’s polish or Java’s plug-and-play debuggers, C++ feels like an uncarved block of stone – powerful, yes, but you’ll bleed carving it.
JavaScript – “I can start writing code by having just a browser.” Ah, JavaScript: the gateway drug of programming. This line highlights JS’s incredible approachability. You don’t need an SDK, a compiler, or any fancy setup. If you have Chrome, Firefox, Safari – any web browser – you already have a JS runtime ready to go. Pop open the browser’s DevTools console and you can type
console.log("Hello world");and see instant results. For a newcomer or a hobbyist, that instant gratification is gold. It’s one huge reason JavaScript conquered the world: the entry barrier is virtually zero. The language itself has quirks galore (as devs joke, “JavaScript is the world’s most misunderstood language”), and its syntax or type system (well, historically it had none!) won’t win any elegance contests. But that didn’t stop it from becoming ubiquitous, because convenience beats purity. Why do you think Node.js took off? It wasn’t just the language – it was that any web dev could reuse their JS knowledge on the server with minimal setup. Write once, run everywhere (well, everywhere that runs V8). The DX of “open and go” triumphed over more “perfect” server languages that required elaborate installs. The tweet’s point lands squarely here: it’s not about being the prettiest language; it’s about being the most accessible.
All these examples build up to the kicker: “It doesn’t matter if the syntax is elegant or if the type system is powerful for most devs. Devs care about DX, not aesthetics.” This closing line is the meme’s thesis statement. It resonates with senior engineers because it rings so true – and perhaps a tad bittersweet. We’ve all seen hyped technologies that were theoretically great falter due to poor UX/DX. (Remember that promising framework with no docs or that language you loved but abandoned because the debugger was non-existent?) The meme strikes a chord by distilling a hard-earned industry lesson: great DeveloperExperience often outlasts great theory. It’s a gentle jab at the FP purists and language snobs – a reminder that in the real world of deadlines and big teams, practical beats principled more often than we’d like to admit. And it’s undeniably funny to see each language’s culture summed up in one line. Seasoned devs share a knowing laugh because behind each line is a trove of war stories: the late-night debug sessions, the dependency hells, the compiler errors that broke our spirits, and the tools that saved our bacon. This tweet-meme captures an insider truth with sarcastic brevity, turning a LanguageComparison into a commentary on why “good enough tools” routinely win the LanguageWars. In the end, it’s saying: Don’t judge a language by its paradigm or purity – judge it by how it feels to get stuff done in it. And as any veteran dev will tell you, that feeling can make or break a technology’s fate.
Level 4: Monads vs Breakpoints
At the theoretical extreme, this meme highlights a classic clash between mathematical elegance and pragmatic tooling. Functional programming (FP) languages like Haskell are rooted in lofty principles – think lambda calculus and category theory. In theory, a language with a powerful type system (Haskell’s types, dependent types in Idris, etc.) can eliminate whole classes of bugs before the program even runs. A monad, for instance, is a beautifully abstract concept (formally, a monoid in the category of endofunctors, as category theorists chant). Such abstraction ensures purity and correctness: if your Haskell code compiles, it’s provably doing something coherent. But here’s the rub – none of that theory comforts you when you’re lost in a codebase at 2 AM. The tweet’s underlying point channels the famous “Worse is Better” software philosophy: a simpler environment with great tools beats a perfect language in an ivory tower. Historically, “the right thing” (e.g. Lisp machines with pure ideals) lost out to “good enough” C and Unix because the latter were easier to actually use. It’s the same story in modern LanguageWars: FP’s high-minded ideals often run aground on real-world needs. You can have monads handling side effects like a mathematical symphony, but if you can’t set a simple breakpoint or get a clear stack trace when something goes wrong, most developers will flee to friendlier shores. Even Rust, which borrows many FP concepts under the hood, succeeded by obsessing over developer experience – legendary error messages and top-notch tooling – effectively bridging theory and practice. In contrast, pure FP languages that tout elegant LanguageFeatures (like lazy evaluation or higher-kinded types) often lack those creature comforts out-of-the-box. The tweet humorously illustrates that discrepancy: it doesn’t matter how powerful your language’s abstractions are if the human using it is frustrated. In academic terms, all Turing-complete languages are equally powerful (thanks to Church-Turing), but in practical terms, a language with superb DeveloperExperience (DX) acts like it’s more powerful because it empowers the programmer. This is the category-theory-meets-real-world conundrum: you might design the perfect mathematical model of a car, but if it has no steering wheel, no one wants to drive it.
Description
A screenshot of a tweet from Dmitrii Kovanikov that presents an argument for why Functional Programming (FP) is not more popular. The core thesis, stated at the top, is 'Tooling > Language.' The tweet then lists several popular languages and the key aspect of their developer experience (DX) that makes them effective: Java has powerful debuggers, Rust provides helpful error messages, Go simplifies dependency management, and JavaScript has a low barrier to entry. The entry for C++ is conspicuously left blank, a subtle joke implying its notoriously poor developer experience. The tweet concludes that for most developers, practical DX is far more important than the aesthetic qualities of a language, such as elegant syntax or a powerful type system
Comments
79Comment deleted
The author tried to list the great tooling for C++, but the list itself resulted in a 3-page template metaprogramming error
“In C++…” - the tweet cuts off because the build’s still linking so someone can finally attach gdb. By the time it finishes, Go has self-formatted, Rust has apologized in verse, and JS is already in prod behind a feature flag. DX: 1, language elegance: segfault
After 20 years in the industry, I've learned that the most elegant monad in the world can't compete with 'right-click → Go to Definition' that actually works. We don't choose languages for their mathematical purity; we choose them because we can debug production at 3 AM without needing a PhD in category theory
The brutal truth about FP adoption: turns out developers would rather have IntelliJ autocomplete their way through a 10,000-line Java monolith at 3 AM than spend an afternoon proving their monad transformers are lawful. We didn't choose the imperative life because it's elegant - we chose it because when production breaks, 'just add a print statement' beats 'let me explain how the Reader monad would have prevented this' every single time
Java has F5, Rust has therapist‑grade errors, Go has git clone, JS has a tab; FP has a PDF
FP’s missing abstraction isn’t a new monad - it’s an IDE button that debugs, a compiler that teaches, and a package manager that survives corporate proxies; C++ is blank because the template error is still instantiating
FP: elegant types, eternal setup. Java: verbose boilerplate, instant debugger salvation
skill issues yet again Comment deleted
FP isn't popular because all FP cool features already implemented in most languages, but without FP limitations Comment deleted
what is FP? Comment deleted
Functional programming Comment deleted
I thought its Free Pascal.... Comment deleted
functional programming, Haskell, Clojure, etc Comment deleted
tco is almost never implemented in interpreted languages (yes, the two most popular ones), thus making recursion unviable, and currying in any c-like languages sucks FP is not about language features, it is about limitations and approach to programming. the limitations allow the language to be as abstract as you need while the compiler does heavy lifting with optimizations and makes your code run decently fast. the approach makes debugging almost redundant, and the remaining few bugs can easily be caught with repl Comment deleted
Tco compiles into loop, you don't need tco if you already have loop in language. Comment deleted
you can extend that logic further and get "you don't need loops if you already have goto", but that's not the way to have healthy discussions. tco is a great way to completely drop loops and is the minimum requirement that "a functional programming language" must have to be taken seriously. you can still use them (hell, ocaml lets you write pascal is you choose so), this is tangential to the functional programming if you're really interested, take some of your free time and try to dive deep into a primarily functional language. you might not like it at the end, but you'll gain a lot more understanding of how and when to use said "cool FP features" in most languages Comment deleted
What limitations? Comment deleted
they think that always having 1 argument and 1 return value and immutability is a limitation. while it's actually what makes the code reliable. Comment deleted
If only we have another way of write reliable code. Oh wait, we have Comment deleted
we have dozens. but each one of them IS a limitation to something. limitations create rules that you can rely on. you can write the C code with goto, but structural approach of repeating a defined scope while some condition is true, makes it easier to comprehend. then we face the problem of provability of computability — and replace the while loop with a for loop, because this one has a defined end. and so on. each of them is a limitation compared to goto Comment deleted
And at some point adding more limitations does more harm than profit. Btw all mutability problems is solvable without dropping mutability. Comment deleted
because you said so. and how exactly you are going to avoid mutability problems without limitations? Comment deleted
not without limitations, but with much less strict limitations. Comment deleted
then you will be solving another problems. Comment deleted
MVS? Comment deleted
And in the end most of the codes are complied to goto ☺️ Comment deleted
Its jmp, not goto😉 Comment deleted
What is the difference? Comment deleted
Goto doesn't exist in x86+ architectures Comment deleted
that's not really true FP has its share of problems, but saying it's integrated into most languages is very far from truth Comment deleted
IMO the main thing that wasn't integrated anywhere is lazy evaluation. Almost all modern FP languages have it, few others do. And that's like the core of modern FP Comment deleted
afaik even eg. some with dependent types aren't lazy Comment deleted
"In C++" Comment deleted
where is the text Comment deleted
Well. There isn't any, it's C++, aside from the compiler and the debugger, do you know any other tool? xD Comment deleted
there is debugger? Comment deleted
Cmake Comment deleted
🤮 Comment deleted
In c++ there is no standart way to do something, there always more than one options, different compilers/debuggers/package managers/build systems, so you sometimes spend hours to do things that most language ecosystem do in seconds Comment deleted
With great power comes great responsibility. And great ability to fuck up. Comment deleted
Even language itself offers 3 turing complete things c++ itself/define/template magic Comment deleted
I know right? I don't even know how to use it Comment deleted
debugging in real world: std::cout << 'anything' << std:endl; Comment deleted
Debugging in real world: My python code has nearly zero comments but logging.debug(...) statements everywhere. Just bump the loglevel in prod when you have an issue. Comment deleted
Anyway, when writing performance critical code you don't really care about how beautiful is your code what principles you use. When you have 100k cores 1% optimization can free 1k of them Comment deleted
Actually, you *do* care about how readable it is, because typical ugly performance-optimized code oh so often relies on undocumented assumptions that inevitably break the next time someone touches it Comment deleted
Been there, done that. Won't touch an optimized C++ codebase from someone who puts performance above readability with a ten foot pole Comment deleted
I mean, sometimes you have to resort to goto, which is not as "readable" as loops or conditionals, sometimes viewed as taboo, but when it works then it has to be used. C strings over str, etc. Comment deleted
Code with goto and C strings can be beautiful, I'm not arguing against that. I'm arguing against a 200 line function that uses every algorithm in existence just because it's fast Comment deleted
By all means, optimize your code as much as you want, but keep it readable and documented. The problem with codebases like GMP is they rely on barely documented assumptions for validity of optimized code Comment deleted
If that's not an option, at least keep the optimized code totally isolated and independent from the rest of the codebase, so that its correctness can be verified without cross-checking with other interfaces and implementation details Comment deleted
That where the problem lies. While trying to write optimal code, thinking about its readability is an extra burden, I can understand when people just don't do that. That's basically the very reason why people write thesis essays or forums exist Comment deleted
Unreadable optimal code deserves to be thrown away. By all means, experiment with it, make conclusions, but rewrite it before it hits prod Comment deleted
I've built a few projects based on the "optimal is better than readable" mantra. They're now barely maintainable. It's not really a bad ending, as they had limited scope and solved their problems, so there wasn't much need to touch them after finishing the project. But that's a rare case Comment deleted
these cases are as rare as cases when you have to use c++. Industry revolves around high level languages after all Comment deleted
Not when you need performance Comment deleted
bulk of the industry does not really need high performance. perf is really important in some nieches like embedded software or hft Comment deleted
bulk of the industry writes php btw Comment deleted
true, and its more than enough to move json payloads between the client and dbs, which is like 80% of the it Comment deleted
yep, json shuffling is the definition of a job for a web janitor Comment deleted
elitist rust developer “i use arch by the way” detected Comment deleted
you have probably meant "elixir dev on a nixos" But what I'm saying is true, isn't it? I don't imply any bad connotations, someone has to shuffle json Comment deleted
actually even that can become infinitely complex Comment deleted
observable real world is only finitely complex, why should json shuffling be infinitely complex? Comment deleted
ok. to put it more precisely it is always countable complex — but there can always be a more complex task. if you talk to some api and receive more data fields than expected, is it still correct data? you can receive the same fields but located elsewhere besides the branch you expected. metadata can affect complexity at any point. consistency between inner type representation and flattened JSON type system is also another pain point. yeah there are solutions to those problems, but usually if you have complete ownership over the whole communication. Comment deleted
oh, I just will ask my oracle machine about it Comment deleted
seriously though, ownership over whole communication is not realistic, and so is total determinism. I think there could be some formalizations of temporal logic via lenses for emitters and receivers as an effect system implementation, but really, do we even need this in php :^) Comment deleted
kinda yes. have you seen jsons from YouTube API? highly nested with lots of data duplication and its not even very stable, they change it whenever they like without properly describing what has changed. Comment deleted
thats a feature Comment deleted
Not what I argued against. I meant to say that "unmaintainable optimal code" is a niche within a niche Comment deleted
perhaps I do, but it is not up to me alone Comment deleted
any safe goto can be written as tail function call Comment deleted
"safe"? Comment deleted
that don't corrupt the stack Comment deleted
there is a forth dialect called factor, and it has stack effects Look at those monads: https://github.com/littledan/Factor/blob/master/extra/monads/monads.factor Comment deleted
how does github know how to highlight codes of this custom language ? Comment deleted
Github uses this lib for lang detection: https://github.com/github-linguist/linguist And judging by the Factor repo, this lang is not detected, so the highlighting is probably for the C++ or elisp instead Comment deleted
it is not a good definition for a safe goto, thats all I'm saying Comment deleted
i recently wrote program on clojure and want to say that, afaik, tooling is pretty nice. and it is written on java with good backward compatability so you can use all java things. but also it has built-in stuff like test framework which is not allways the case for older languages. so, problem is not that fp is bad, but that fp languages have older ecosystem and harder to learn. (btw, i still cannot understand why macroses in lisp are so special. looks like this is because syntax for language is so poor that macroses can look like native functions or something) Comment deleted