"Programmer" is an Overgeneralization
<i>Do you know why we have pointless language wars, and meaningless arguments about what is good in practice?</i><p>As a veteran language warrior, I resent the claim that my efforts are "pointless". There's a lot of terrible software out there, and one of the reasons for this is that inappropriate choices were made on the outset.<p>Now, I'll be the first to say that there isn't "one language to rule them all". I recently got into a debate over C++ (which I dislike) where I learned that there are people making judicious use of this language, which is still inappropriate for 90% of the purposes to which it is put, but seems to suit some needs perfectly in a way that neither a high level language nor C can.<p><i>Software engineering</i> is a generalist discipline: how to solve problems and add value to organizations using software. It applies whether you're writing performance-critical weather simulations or web apps. It has rules (such as "prefer immutable data and referentially transparent functions") which you must know to be a decent software engineer but that you will end up breaking 1 to 10 percent of the time, because to break said rule (e.g. using mutable state) will be the most tasteful decision.<p>I think skill as a software engineer is pretty easy to measure-- increasing scopes of contribution, reliable competence on harder architectural problems. Domain-specific programming skills are much harder to measures, and skill of that variety is n-dimensional without question.<p>Software engineering, I'd argue, is the liberal arts of programming. You need to know about algorithms, but not necessarily become an expert. Same with AI, programming languages, operating systems and databases. You study all these things to learn how to learn, so that if you find yourself, some years later, needing to tune a NoSQL database, you know how to find the knowledge, autonomously if necessary, and apply it.