I found myself toiling on a programming assignment for days, while a classmate of mine spent a few hours on the same assignment. I thought to myself, “Man, that person must be a good programmer”. Then, it got me thinking…what does it mean to be a good programmer? Does it mean being a Javascript ninja? Or know everything about how an OS works? Or having the ability to put together a mobile app that is cleanly architected and maintainable? Or reason about complex algorithms? I struggled to answer. It’s hard to define a “good programmer”.
I asked many of my peers. And it usually comes down to two categories of what comprised of being a good programmer. Realizing that computer science is an incredibly broad field, some agreed that to being good you’re required to be a generalist, having large breadth knowledge. For example, being a to be a competent full stack developer you have to be able to know how to use a wide variety of technologies: HTML/CSS, Python, Django, PostgreSQL, JavaScript + jQuery, AngularJS, HTTP, networks/socket programming, distributed systems. On the other hand, some look at it as being a specialist, an expert in some specific areas of computer science. Maybe, it’s someone who is able to tell you the ins and outs of, say, writing an audio driver for Linux, the math principles behind cryptography algorithms, or the messaging queue about an asynchronous process in a web application.
Of course, there’s an infinite amount of possible programming-related knowledge out there. New knowledge keeps generating as the landscape of technology keeps changing. So, we need a nuanced understanding of skills. For me, a good programmer should be a mixture of being generalist and specialist. Software development requires all sorts of skills, coding is just one small part of it. We need design, communication, debugging, and other various skills. And in order to create high-quality product, we need to have depth in the relevant subjects about the product. And, I firmly believe that one can be nurtured into a good programmer.
I know a few programmers during that I have worked that I would call good. The traits I’ve observed from them so far are:
Lastly and most importantly, be curious, explore, learn, and hack.