Are we the programming equivalent of "fake" martial arts?

I recently fell down a particular YouTube rabbit hole (as one does) about “fake” martial arts (as one might do). Particular schools or teachers create an isolated environment that limits questioning and causes students and masters alike to believe they are capable of supernatural feats. To earn attention, fame, and money they sometimes challenge MMA fighters who end up wrecking them.

The video is linked below if anyone’s interested. Mild content warning: actual fights are depicted in agreed upon, competitive matches.

This got me thinking: What if we’re learning the programming equivalent of a “fake” martial art? How would we know?

What if using Clojure feels good, just like learning a psychic, no-touch martial art would likely feel good to learn, but then the work we actually produce doesn’t really hold up?

At which point does loyalty to a language\community\framework\tool get in the way of personal development?

Lastly, does the “fake” martial art programming language, framework, or tool start out that way and stay that way? Or does it start out grounded and practical and get twisted into something less effective over time?

Maybe there’s a cycle where an initially well-intentioned leader creates their own style\language\framework\tool as a response to what’s out there? It builds up a fervor due to how different is, then the leader slowly loses touch with the world at large. At that point, they are no longer aware that they took the base of what exists and improved upon it but now see themselves as an originator. They then try to produce more. Kind of like claiming you write the best code but you’ve never written a test or endured a code review.

Where leaders succeed is by accepting challenges from others in the space, learning of the shortcomings in their technique, then the cycle starts anew as they incorporate new developments into their practice.

The other possibility is that this is more like the feudal-era of programming languages where the majority of people spend their lives learning a particular school’s techniques and miss out on what the other, lesser-known languages can offer. For example, a lot of schools really focus on OOP techniques.

This has been on my mind a bit lately and I thought it would be interesting to explore. Any thoughts on this or am I connecting unrelated dots due to the lack of concrete links and an abundance of YouTube time on my hands?

2 Likes

I think our 76,000 lines of production Clojure code would disagree with you, serving as it does 40+ web sites with millions of customers worldwide 24x7 :slight_smile:

11 Likes

That’s actually pretty impressive! For the sake of discussion and advocating the :smiling_imp:, does an MMA fighter who wins a match by using a Wing-Chung technique legitimize the style? Or is it that they’re a good fighter, just as you and your team are good engineers, that can make just about anything work?

1 Like

Well, much as it might be nice to think we are unusually good engineers and could build this, and add new functionality this fast, with any other language… I don’t think that’s actually the case. I’ve built production systems with dozens of languages over the decades and I’m finding I can build stuff that is more robust and I can change it and add new functionality faster with Clojure than with any other language I’ve used. Now, of course, you could argue that I can do that better now because of the accumulation of my career’s experience, but I don’t believe that is the whole answer: if it were true, I should have found each successive language I used to be more productive than the previous one (nope!).

8 Likes

hmm… to me a language is fundamentally just a tool… now… what is the right / best
tool you ask… well… IT DEPENDS!!! :slight_smile:

so… yeah… one important factor will be the skills / training of the people
wielding it…

another important factor will be the nature of the job…

say you wanna get a discussion forum like clojureverse or ask-clojure
up and running… would you build it using clojure?.. well… maybe… maybe not…
you see… IT DEPENDS!!! :slight_smile:

p.s. look… just as with the current corona situation… people yearn
for a simple solution / answer… i can understand that… yet because
of the inherent complexity involved… no respectable person can provide such a thing, because… well… because there is no such thing! :slight_smile:

p.p.s. … also… you know… and for example… try to define success: Spaceflight-programs and software-projects

I had a roommate who did MMA. I asked him why no one uses Kung Fu in MMA. He said Kung Fu is meant to fight wars, designed to break bones, gouge eyes, tear muscles, bust balls, pierce throats, it makes liberal use of weapons of all kinds, fighting multiple enemies at ounce. It just doesn’t really make sense for MMA.

I have no idea if he’s right or wrong about that, but it shows that the context really matters when evaluating different options.

I also think it can show how sometimes the game is rigged towards certain measures. For example, I often see:

Clojure cons:

  • Lack of static types

Which feels like rigging the game. Obviously if you make one of the criteria having or not static types, you make Clojure lose on it by default.

In the MMA circle, I’ve similarly heard this rethoric a lot. Some of the restrictions kind of make certain martial arts not be effective for it by default.

The good news is, we have a much better playing field. We can attempt to make programs for the same use case with the same set of requirement and compare and contrast. Now, some people will say that the hardware itself is rigged towards imperative languages with manual memory management, but I’ll put that aside for now.

When it comes to Clojure for me, there’s only two things I consider:

  1. How much I enjoy using it.
  2. How successful I am at delivering software with it.

Number 1 matters a lot in my opinion. You spoke of:

Now I tend to believe the fighter is more important than the martial art, same with programming. So if you take a programmer at random, and wanted to maximize the output of the software they write? What would you do? Would you force them to use Haskell because it claims to be the safest language? Would you force them to use C because it claims to be the fastest language? I don’t think so, you’d let them pick their favourite language for themselves, because they’ll be at their best using their tool of choice that motivates and inspires them most.

Number 2 is just as important, because if I enjoy programming best in some language, but it really hurts the outcome, because maybe it just lacks the tools, libraries, maturity, performance, scale, etc. that I need. Well it’s no good.

For Clojure, well I managed to rewrite large multi-tiered systems that handle thousands of requests per second in it, which have been running for more then a year now, had multiple changes made to them afterwards, not just by me, but other programmers, including juniors who picked up the language on the team, and it’s all running pretty well. Now, it’s hard to quantify this, but we definitely saw a reduction in issue count, and an improvement in velocity compared to the prior Java based implementation. The only bias is that the Java application had not been designed and written by me, and it was more legacy. I also was able to learn from the mistakes of the original Java one. So had I redesigned and rewritten it in Java, would it have performed as well or better then the Clojure one I wrote, hard to say beyond my gut feeling. I know that #1 would have played a role, I would have not had as much fun rewriting it in Java, so that would have probably meant I would have spent less effort and time and energy on it.

2 Likes

That’s a fair point. Forums are commodities and I would want a commodity solution for that, which I could just stand up, configure, and run with. I don’t build stuff like that. Everything I’ve ever been paid to work on has been custom, mostly from the ground up, although a few projects have been built on top of frameworks (mostly commercial frameworks).

2 Likes

I see your point, but at the same time is a language really just a tool? Do they offer college courses to learn about screwdrivers? Are people hired because they know how to use the language like a tool, or what their use of the languages can bring them? Do they have international conferences for drills? Where does functional programming fit in?

Also with that, I agree that trying to determine which language is best or right is dependent on an incalculably large number of factors, but when it comes to a skill or the application of a tool, can we not rate and compare the effectiveness of it?

In the case of forum software, is it that Clojure doesn’t lend itself well to that kind of problem? Or is it that adequate forum experiences already exist in other langauges?

How do we tell if our sales pitches measure up to the actual experience?

1 Like

Another good question, in my opinion: is it just a tool if it changes the way you think?

Language shapes thinking – in both human languages and in computer languages. Sure, not all languages will change how you think but there are several language families worth learning that many people say will change how you think: Lisp, APL, Prolog. I’d add Haskell, Smalltalk, and Forth. Even within the broader C-family, I’d say Rust qualifies, and perhaps an old classic: Algol 68. I’ve programmed in all of those – not all in production, admittedly – and I’m always looking for interesting new languages that challenge my thinking. I loved Seven Languages in Seven Weeks and the various follow-up books because of that (and Io blew my mind – but I have not yet successfully programmed anything worthwhile in it!).

4 Likes

I’m no expert either. However, if it is that circumstantial how effective can it really be? Would footwork, managing your energy, throwing powerful attacks, reading your opponent, and all the associated skills required to compete in the MMA not be useful in any other context?

In which case, what is Clojure great for and what is it not suited for?

As for lacking static types, to us that may seem unnecessary, but is it like learning a martial art that doesn’t use punches to the majority of developers out there?

Is only comparing Java to Clojure a fair comparison? I think we can agree that Clojure is extremely advantageous in most cases compared to Java. Isn’t that like saying traditional, Chinese Kung Fu is great because it’s better than the Karate class I took at the rec center when I was 8?

lucky you!

look… what i am saying is that there are problems… and people trying to solve them using tools… hence to discuss the merit of a certain tool without taking the nature of the problem and / or the dexterity of the people involved into account… that’s feels a bit like an ivory tower debate…

also… as far as comparing things like… how much money / time / people etc. did it take to build something… or how maintainable / extensible is something… i have grown kind of wary / weary of these arguments… since where do those numbers really come from… and what do they really mean?!..

for example i am not even convinced that there are always clear incentives rewarding “good” software… or to put it differently… sometimes people / companies building software that is hard to maintain, extend etc. may actually fair pretty well… point is it is complicated…

bottom line… seams to me you are searching for a clear / easy one size fits all answer / solution… when there really is no such thing…

again… IT ALL DEPENDS… i know that is probably not very satisfactory… but … you know… that’s life… deal with it! :smile:

2 Likes

i just have to say… :smile: … time and time again… what you write somehow deeply resonates with my own thinking… kinda spooky!.. KEEP IT UP!!!

1 Like

So it’s funny you’ve fallen down this rabbit hole, because this is a long-standing interest of mine. I don’t like bringing it up in programming contexts, but I used to train martial arts that don’t work. Then I discovered precisely this rabbit hole and now (pre-coronavirus) I train combat sports like judo, Brazilian jiujitsu, and occasionally a session or two of boxing or MMA. So those are my credentials on this topic.

The analogy is ill-fitting, and Clojure really doesn’t fill the role of bullshido. The short version is that Sean is right.

The long version is that there are, broadly speaking, two kinds of fake martial arts. Let’s call the first one Total Charlatans – they’re the cult leaders whose deluded students fly and spasm in “no-touch knockout” demonstrations. Often the leader is deluded themselves, because their “does this technique work?” feedback loops were long ago poisoned by students who figured out the rhythm of a technique demonstration, and who would fall over when the teacher applies it – whether it works or not. Both teacher and student end up reinforcing a cycle of fakery.

Clojure being used in production proves this isn’t the case. When it was first released, Clojure had a high proportion of hobbyist users, but now it’s firmly a practical, professional language. People have a business problem, they solve it with software systems built in Clojure. There’s no denying that. It doesn’t just feel good, the effectiveness is proven over and over by fulfilling requirements.

The second kind of fake martial art is just training ineffectively, for fun, never testing oneself in hard sparring or fights. This can be fine if they’re just doing it for fun; there’s no inherent reason that an iaido school needs to really test themselves against opponents with sharp swords, and a family doesn’t need to punch each other in the face if their goal is to train some Okinawan dances together to stay fit. The problem arises when such a light-contact school (like I used to train at) claims that they’re soooo much better than those fools who actually train with hard sparring and test themselves in MMA or challenge matches.

Again, the proof is in the pudding: Clojure does get used for actual projects with actual requirements. It’s not just for fun; Clojure backs it up with deployments.

The correct analogous situation is a language inventor with no project experience and who has never built and deployed a production system at scale. If their invented language is just for them, no problem! If they say their app idea written in their toy language is going to beat the FAANG companies, then ask them to prove it.

(The “for fun” aspect does bear truth, to some extent. There are projects for which language choice is just not that important – some things could be built with Java or TypeScript or Haskell or Python or Clojure, and they’re all valid because the requirements just aren’t that stringent and it comes down to personal preference. The analogous situation is someone who trains serious kickboxing for fun. It’s an effective art, and they’re training effectively, but it just doesn’t matter because they don’t care about self-defense. The effectiveness is there, but it’s moot.)

am I connecting unrelated dots due to the lack of concrete links and an abundance of YouTube time on my hands?

Yes, you’re connecting unrelated dots. :slight_smile: For your next rabbit hole, you might enjoy diving into Matt Thornton’s videos. He talks about fake martial arts with concepts that may might help you distinguish between “some things are fake, so how do I know X isn’t fake!?” and “X is provably effective in domain Y, so we know it’s not like Q, which repeatedly fails in Y”. Remember that there are objective measures of expressiveness and features in programming languages. It’s true, these features have trade-offs, but most use cases benefit from things like first-class functions, higher order functions, immutability by default, extensibility, easy access to Java(Script) libraries, and so on.

5 Likes

Are we discussing the martial arts or Clojure now :dizzy_face:

To be honest, I wonder how much boxing can help when the other person has a sword. Or how easily you can get out of a grapple if you can just gauge the other person’s eyes out or crush their groins. Lots of MMA ends up in grappling, and I feel if there’s a war and you grapple the enemy, you also make yourself vulnerable to all the other fighters on the battlefield to attack you, so I don’t know, I think it could be very different.

As for Clojure, I didn’t totally mean that it’s good for X and not Y. More that you need to describe the opponent and the rules of the fight in order to actually come up with specifics.

Like you say, when comparing to Java we can come up with a lot. That’s the classic scenario. Similarly it’s interesting to discuss it against say Python for doing a rest API backend. Or against Lua for embedding as a scripting language inside your application. In the abstract, otherwise, I feel we’re just creating more confusion.

Boxing doesn’t use kicks, and it seems to be regarded as a pretty good martial arts. Lots of martial arts don’t use a lot of elbow or knee attacks. I guess I just find it’s a bit of a circular rational. The question should be oriented towards the concrete goals, say, better program safety, reduced defects, higher productivity, etc.

1 Like

Long-time martial artist and combat sport competitor here :wave:t2: Everything @dave.liepmann said above is absolutely correct.

The USMC close quarters combat program is MMA. Historically, every culture in which people killed each other with swords, spears and bows trained grappling in preparation for war (see: Japanese jujutsu, Western swordfighting manuals from the 1600s, Mongolia’s Three Manly Arts – horse, bow and wrestling, Ancient Greek physical culture included boxing, wrestling and MMA, etc).

As for Chinese gōngfu being too deadly for MMA, Zhang Weili (the current straw weight UFC champion) trained shuāijiāo and sàndǎ prior to competing in MMA. If someone’s art doesn’t work in sport, it doesn’t work.

3 Likes

With martial arts, different arts were designed for different situations. As a thought experiment, take every fighter scheduled for a UFC event. Instead of pairing them up and having them fight one on one, empty handed, put them all out on a football field with the primitive weapon of their choice and the last one standing wins. I can guarantee the winner won’t be because of their grappling skills. BJJ is the only martial art designed in, and for, sparring. It’s a good supplemental system, and I think one that women should learn, but isn’t a good primary system unless you’re specifically training for sport fighting.

I wouldn’t say that Clojure is the equivalent of fake martial arts. Fake martial arts are ones that sound good on paper and are sold with smoke and mirrors demonstrations, but don’t actually work. The only thing I can think of right now that might fit in that category would be quantum computing. Clojure is more like the difference between karate, kung-fu, kali, muy-thai, etc. All can be effective and are just different approaches to the same problem.

1 Like

Haha sorry about that. I didn’t communicate why it connects to Clojure, and I’m going to blame that on my 2AM brain.

Is Clojure’s effectiveness highly dependent on context? Does it work only given a lot of "if"s? If so, it sounds a lot like one of those martial artists in that video suggesting the skeptic cannot be knocked out if one toe is pointed up and another is pointed down.

The connecting thread is that the more effective, combat driven arts seem to offer solid skills that adapt to many situations that you can take with you to other disciplines. Does learning Clojure develop skills that can solve many kinds of problems and its concepts can be applied to other languages? Or is it only good for small, write-once projects, with small teams, for web apps, when it’s raining, but only on Tuesdays?

EDIT: Reread your post and saw:

If I may back up: If languages have their specialties that determine their effectiveness for certain measures, is it worth comparing them at all, or is it like comparing apples to oranges or uh muay-thai to capoeira? Maybe the trick is to learn as many as you can and take what works and not treat it like it’s an objective science?

Right, I think boxing is incredibly effective. But to my knowledge, there are no competitive martial arts that only use kicks. They might favor kicks, or limit all striking, but they wouldn’t throw out punches. My point being that the punch or at least punch defense is considered too critical to ignore. So what if devs feel static types are too critical to ignore?

First, that’s an awesome background! I’m glad you’re here sharing your experience, even if you’re going directly for the solar plexus of my inquiry here.

That was exactly the cycle I was wondering about! Can that happen in software too? Can they start out practical, then over time fall into that feedback trap?

Fair enough, it’s not a perfect analogy and may be reaching, but does that mean there are no parallels at all? Perhaps at a language and community level, we can see Clojure on its own is not like Bullshido. However, what about at an individual level? How can we make sure what we’ve chosen to work with is effective for our needs so we don’t create our own bullshido around it?

I was about to ask, “Doesn’t every language claim to be the fastest, easiest, simplest, and make the most money?” But after thinking about it, no, I don’t think any language claims that. Fans of that language do, or at least imply that. I bet that happens with fighting styles vs. practitioners as well right? The answer is probably to compete and spar with others of mixed styles to confirm or deny that. Is there a way to individually contest that for ourselves in software development?

How do you objectively measure the expressiveness and features of programming languages?

Thanks. I’ll check that out.

This is a fun Gedankenexperiment. I’d love to hear from programming historians and old-timers.

The history of object orientation comes to mind. Creating hierarchies and classes became the master rather than the tool. The thing to ask yourself as the tower of abstraction is built taller is, do these help me solve the problem faster and more effectively, or am I spending my time fixing their leaks? The former is staying practical, the latter is a sign that you chose the wrong abstraction(s).

I want to propose XML as another example, but I don’t actually know enough about the history to know if it was a good solution that was perverted into SOAP and so on, or if it simply fell victim to known consequences of early design decisons.

Avoid fandom. Solve real problems. Deploy. Review your work, self-critique. Read computer science papers, programming history, and news from other proglangs. Try out other languages regularly, with the intent to see their good side.

Small caveat: I’ve carelessly used a term that has a strict CS meaning and a loose colloquial meaning. By “objective” I don’t mean any sort of mathematical proof :smiley: but in the colloquial sense of programming language expressiveness, the language with first-class functions wins over the ones that don’t. Same with higher-order functions, macros, reader literals, reader macros (which Rich decided not to include) and so on. All things being equal (and for most people it usually is), you want the language where you can express yourself with those things.

4 Likes