Krishna Kumar is a software development manager from New Hampshire. He writes on topics related to software development, programming, project management, and business management. Krishna is a DZone MVB and is not an employee of DZone and has posted 41 posts at DZone. You can read more from them at their website. View Full User Profile

Programming is Easy, Software Development is Hard

  • submit to reddit

David Brooks has a great essay on which skills are difficult to master:

She’s protecting them from the most intellectually demanding activities because she doesn’t understand what’s cognitively difficult and what isn’t.

Practicing a piece of music for four hours requires focused attention, but it is nowhere near as cognitively demanding as a sleepover with 14-year-old girls. Managing status rivalries, negotiating group dynamics, understanding social norms, navigating the distinction between self and group — these and other social tests impose cognitive demands that blow away any intense tutoring session or a class at Yale. [...]

Participating in a well-functioning group is really hard. It requires the ability to trust people outside your kinship circle, read intonations and moods, understand how the psychological pieces each person brings to the room can and cannot fit together.

In the same vein, I have always been puzzled by people who say that math is hard. In my opinion, your understanding of most math that you need is directly proportional to the effort you put in, and less to do with your intelligence. It is like a ladder. Once you master each step, the next step is easy as long as you put in the effort. In fact, most of school is just that: put greater effort, reap better rewards. Through enough investment of time and effort, you can increase your scores at even exams like the GMAT that purport to measure intelligence and capability.

But there are many other areas in life where this dynamic doesn’t work because they are not one-dimensional. Dealing with other human beings is one such scenario. You have to use different tactics (kindness / toughness / incentives / self-abasement, etc.) to get other people to do what you want. Getting a bunch of people to work towards the same goals means learning not only to deal with each person individually, but also how those people interact with each other. For example, how giving one person more responsibility in the team will affect the ego and motivations of other persons in the same team.

Programming is a learnable skill. The more you work on it, the better you become. You can master the intricacies of a language, understand different patterns of building software, acquire the knowledge of useful algorithms. Practice keeps your skills sharp. There will always be edge cases which are beyond you, but for most mundane programming tasks, if you are willing to improve yourself, you can do the job. In this regard, programming is just like math. In math, 1 + 2 = 3 always (unless you are in some weird alternate universe). Your program is either right or wrong. And you have metrics about performance, program size, etc.

But let us take software development. I am making perhaps an arbitrary distinction between “programming” and “software development”. So let me be clear. Programming is solving a well-defined problem. Software development is defining the problem in the first place. Once you have a question, it is usually easy to solve it once you have the tools and the knowledge to use them. If you don’t know the question, things become a lot harder.

Software development is about that tricky part. It is about understanding your customer, sometimes talking to them and sometimes not knowing them and only understanding them through observation. It is also about working with multiple people to build a coherent quality system. It happens in the real world where things can go wrong and frequently do. I don’t need to elaborate because you know what I am talking about. It is far easier for a single programmer to pick a problem and solve it than for a huge team to define the problem and set about to find a solution to it.

As a related example, I was recently intrigued by all those YouTube videos of world records by Rubik’s Cube solvers (< 10 seconds!). Wow, those guys must be so intelligent! Anyway, so I bought a Rubik’s Cube and found that there are well-defined steps to solving any Rubik’s Cube. And if you are sufficiently advanced, you can actually solve any Rubik’s Cube in 20 moves. So practice, practice until you get there. Maybe you cannot do it in 10 seconds, but even 30 seconds will impress friends who don’t know this.

Similarly, programming looks like some supernatural act to those who don’t know programming. And some nerds like to encourage that. But in reality, if you have the programming skills, most of what you do is incredibly banal. Good programmers recognize this, seek out greater challenges beyond what they know and push themselves. But doing what you already know is not such a big deal.



Published at DZone with permission of Krishna Kumar, author and DZone MVB.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)



Andrew McVeigh replied on Mon, 2011/01/24 - 5:16am

you have written a relevant and interesting post, but it's worth giving a bit of context to the first article you've cited.

for those not in the loop, it's a follow on article from the original "tiger mother" article by Amy Chua in the NY times.  amy argued that chinese mothers produce such academically superior kids because they push them to study constantly and control every aspect of their lives.  the follow up article (quoted) said this was a "cop out" and although the kids are academically achieving, they are missing mastery of the "hard" bits of life such as fitting into a social group and navigating social hierarchies.

Scott Hickey replied on Mon, 2011/01/24 - 9:34am

I find your desire to emphasize the importance of human interaction in successful projects is admirable and to some degree valid.

However, I find your view about programming skill incredibly naive. The attitude that you take towards programming is the same one I see in many of the "average" programmers I've worked with over the years who create acceptable, but unexceptional, working code. On large software projects, as a profession, we are great at creating large code bases of working code that is expensive to build and even more expensive to maintain. But it works, so both management and the programming teams feel satisfied that we did our job.

In my opinion, the impact that an expert programmer has on the final work product is way under-appreciated. An expert programmer can simplify complex problems and remove large chuncks of architectual noise from large systems. This has a huge impact on the success of the project in meeting project deadlines, ease of maintainence and the life-span of the system.

Many developers and managers view building software like builing tract houses - cookie-cutter application of best practices. These masters of best practices are, at best, only half-way towards becoming an expert in their field. It takes really hard work to move beyond that and, just like advanced math, most people lack the intestinal fortitude to the tackle aquiring the expertise beyond best practices. As described so well in Paul Graham's article "Beating the Average", even the successful "blub" progammers don't know what it is that they don't know.

Nicolas Seyvet replied on Mon, 2011/01/24 - 3:17pm

I agree with Scott.

King Sam replied on Fri, 2012/02/24 - 9:11am

Completely agree. In fact you have to be able to interpret what the customer is saying. Many times I find they don’t actually know what they want or how to explain it. You have to be able to lead them through that part.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.