Rob Walling has posted an excellent article on How to become a programmer. I especially liked that he stresses the importance of apprenticeship, formal or not, if nothing else because that’s how I did. My first two years as a professional I played wing mate to Mr Gibara, which was in hind sight, extremely valuable. I also agree to his answer on the question “Is it necessary to know mathematics?”, although my answer is simpler but, if I read him correctly, amounts to the same thing: No, but in order to be a great programmer you need to be good at it should you apply yourself. In other words, you can be a good programmer in many fields without knowing maths, but I have yet to meet a great programmer who wasn’t at least in potentia good at maths too.
Other than that, two comments on his article prompted me to add my two cents to the stack:
Is programming an art?
No, it is not. Although “art” can be used as in “the art of driving a car” very few uses it, and mostly my impression is that the following definition is the most understood:
4 a : the conscious use of skill and creative imagination especially in the production of aesthetic objects; also : works so produced b (1) : FINE ARTS (2) : one of the fine arts (3) : a graphic art
But reading Merriam-Webster shows up a synonym which in my mind is much closer, that of the “craft” (m-w.com here). Programmers do not create art, the most important thing when programming isn’t to stimulate the mind, it is to produce working software. In fact, I think Wikipedia actually nails it:
For example, a painting may be a pure art, while a chair, though designed to be sat in, may include artistic elements. Art that has less functional value or intention may be referred to as fine art, while objects of artistic merit but serve a functional purpose may be referred to as craft.
Bingo. If you can’t sit in the chair you aren’t a craftsman, but you may still be an artist. There are also other stimulating similarities between a craftsman and a programmer, we have our tools and our toolbox. Craftsmen of old often traveled to were they were needed. A craftsman, at least in my imagination, has pride (and to me, pride is a vital component if you want to be a great programmer). Etc.
Do not forget: programming is a task that can be learned much learning a foreign language, or how to refurbish a bathroom. In many fields you can be a good programmer indeed without the slightest bit of creativity, curiosity or mathematical abilities. The difference between the master and the merely very good isn’t necessarily about artistic abilities, it is all about how good [insert definition here to your own liking] the end product is.
Is programming engineering?
No, it is not. In some fields, like aviation control or satellite navigation, it may come quite close, but I wager it isn’t there either. There are many reasons for this, but merely asserting “if only programming was more like engineering” is like wishing for cold fusion: it would be nice to have, but we have no idea how it would work. Many smarter persons than me have discarded this notion so I’ll leave it as this.