Why Software Development Is Like Martial Arts
Tags: softwaredevelopment, martialarts, practice, learn
Published: 2019-03-01 18:26:27

---
title: Why Software Development Is Like Martial Arts
published: true
description: I have a little fun describing how software development is similar to martial arts.
tags: software development, martial arts, practice, learn
---

I have had the inspiration to make this post for awhile, but was afraid it may be "too silly." Then the lovely Helen wrote a post of a similar topic and I knew it had to be done: 

{% link https://dev.to/helenanders26/why-a-database-is-like-a-dance-class-1dmi %}

Although I've only been practicing for about three years now, martial arts have become a significant portion of my life, and in that time I've seen a number of similarities between them and software development.

![Mastery](https://thepracticaldev.s3.amazonaws.com/i/97pefms9q41pol04lkyp.jpg)

Perhaps it isn't common knowledge, but within the world of martial arts it's generally accepted that a person will be practicing and honing their craft for the rest of their life. Even those who have reached the level of Grandmaster, Sifu, Kru, Sensei, etc. continues to move through their drills and takes on students for the next level of mastery.

I consider the level of Grandmaster to be similar to a Senior Architect, successful language creator, or someone held in high regard in the development community. For example, I would consider Bjarne Stroustrup to be the Grandmaster of C++. A software development Sensei may take on the responsibility of assisting junior developers, give talks around the world, or even find their self on a panel such as the C# Design Committee.

As Software Developers, technology is constantly growing and changing and we must be constantly honing our own craft to stay relevant in our careers, the job market, and just to keep up with the latest and greatest language additions. Thankfully programmers typically come with an insatiable hunger for continued learning, so we will happily take our journey in stride.

![Practice](https://thepracticaldev.s3.amazonaws.com/i/61tqiv3ga1kgz5hfcsz8.jpg)

Part of our journey will be never-ending practice. Sure, the basics come back "just like riding a bicycle" but one must regularly practice their skills to keep them sharp (as one would hone a knife to maintain its edge). As Bruce Lee said, he has greater fear for the man who has performed the same kick 10,000 times.

A significant portion of martial arts training is repetitive practice, especially for Muay Thai (Kickboxing) and traditional Boxing. You only have so many limbs, therefore the number of strikes you can perform is limited. After mastering the basics it is encouraged to drill individual moves with a partner or heavy bag to build muscle memory and eventually mastery. The body reacts by doing what it's been trained to do and the martial artist runs through drills hundreds of times to reprogram these reactions. Thais take it a step further and develop rock-hard shins and fierce mental conditioning by kicking down banana trees in their practice.

Perhaps we don't need rock-hard fingers to write the best lines of code, but we can see some benefit from training our own reactions when writing code. Software developers can set aside time to work through algorithmic problems on websites like [HackerRank](https://www.hackerrank.com/) or participate in local Hackathons, or they can read up on the latest news about their language of choice - for example the Microsoft Developer Newsletter for C# devs: [MSDN Newsletter](https://msdn.microsoft.com/en-us/aa940986.aspx).

![Teach](https://thepracticaldev.s3.amazonaws.com/i/0r4997aaetqiuxv86v3n.jpg)

We all have a unique perspective on everything we do; we all also have unique specialties. One of the best ways you can share this uniqueness and give back , not just in martial arts or software development, is to teach someone who is less-experienced than you in a particular area or skill. Not only will you do a new member to your community a service by raising them up, you are also refining your own skills as you interact with those connections in your mind in a unique new way.

The internet is lush with people teaching other people how to do things they were once taught how to do by other-other people (what?). A quick search on StackOverflow or Dev.to will reveal dozens of people with answers to software questions. There are also numerous videos breaking down concepts such as Linked Lists, Bubble Sorts, and Big O Notation. There are just as many videos, blogs, and books to be found teaching any martial art a person could want to learn.

![Learning Curve](https://thepracticaldev.s3.amazonaws.com/i/4ddlo4oo82rnqnckepds.jpg)

As any beginner knows all too well, there is a frustratingly slow curve when they just start out learning a new skill that picks up significantly as they begin to master the basics. Over time, this rapid increase in skill tapers off to a plateau where the practitioner stops seeing the major gains in ability they once did. This phenomenon was detailed very well for Muay Thai in this article: [The Muay Thai Learning Curve](http://muaythaipros.com/the-muay-thai-learning-curve-the-3-stages-of-development/#).

This curve will be similar for learning regardless of whether it's athletics, intellectual, or an art. Unless particularly gifted, a person will stumble a great deal as they begin, enter a long period of learning and growth, and eventually wind down into mastery.

![Many Arts](https://thepracticaldev.s3.amazonaws.com/i/na0oxar8xlubn13ahcyn.jpg)

There is a vast selection of martial arts to choose from - just as we have a vast number of programming languages - and in both cases there are certain languages (or martial arts) suited to particular situations.

In martial arts we have several unique styles of combat. We can decide whether we are fighting empty-hand, with one weapon, or two weapons. There are just as many weapon combinations with knives, swords, sticks, clubs, maces, bow and arrow, guns, etc. Also we can take into account whether our style of combat is fully stood up, fully on the ground, a combination of the two, or at long range in the outdoors. One will choose the best martial art for each situation based on their choice of weapon, the style/environment of combat, and any governing rules in the case of this being a competition.

A few examples:
<ul>
<li>Empty hand to hand combat in close quarters is a fine situation for Chinese Kung Fu and Wing Chun, as well as traditional Boxing. Muay Thai also does well as knees and elbows are devastating, but more space is required if roundhouse kicks are to be used to their fullest potential.</li>
<li>Filipino Kali, Escrima, or Arnis, also known more universally as Filipino Martial Arts (FMA), is most suited to one or two weapon combat in close to medium distance. Weapons can be used in combinations such as empty hand & knife, stick & knife, bo staff, double knife, or double stick.</li>
<li>Longer distance combat suits weapons with more reach such as the flail, mace, long sword, nunchucks, and chains. Some of these weapons are seen in FMA and there are many examples in Medieval European history.</li>
<li>Very long range requires ranged weapons. Here you'll see the use of bows, thrown weapons like knives or "ninja stars," guns, and even catapults or cannons. These weapons handle poorly if combat moves close-range, so many are used exclusively in battlefield-style combat or for hunting.</li>
</ul>

Software development has an equally infinite number of choices and scenarios which provide more merit to one language or framework over the other. Like martial arts, there is some overlap in weapons and what they are suited for best (and some people enjoy arguing about this thoroughly). The fact is most languages (and weapons) can solve most problems, it just may not be the optimal solution you would have liked it to be.

A few examples of languages and their strong suits:
<ul>
<li>Low-level software development (think drivers and microcontrollers) requires maximal control of the system itself. One must be able to manage memory allocation, garbage collection, and everything in between for the most reliable pacemakers or latest NVidia driver update. Languages that provide the necessary level of control into a system includes C and C++, as well as Machine Language/Machine Code if you REALLY need to dig deep.</li>
<li>Game Development has similar efficiency and low-lag requirements to the above and not surprisingly also lends itself well to C++ development. Unreal Engine is a popular game development engine using C++, but C# has also come onto the scene with Unity, another commonly used game-development engine.</li>
<li>When any kind of database management is required, SQL is the most common and well-known option for relational database development, but there is also NoSQL which may come in the form of MongoDB or Hadoop.</li>
<li>I'm not sure web development would be where it is today without Javascript - we would still be forced to write everything in HTML and nothing would be dynamic!</li>
</ul>

![Chopsticks](https://thepracticaldev.s3.amazonaws.com/i/bwe20rtss98bszatt9h1.JPG)