Back in the day, a programmer was expected to be able to turn more or less concrete requirements into code that mostly worked. That was mostly it. It was a long time ago. Life was simple. Computers were simple. Programs were made of spaghetti.
Things have changed. Especially in the world of free software, much more is expected from those who develop the software, either from each person or from the development team as a whole. There's no official list, but here's an opinionated, aspirational one.
A programmer should be good at…
…communication. It can't be emphasised enough how important communication is.
…using version control, and using it well. Most programmers in the world still don't use any version control, so using anything is already being ahead of the majority. The free software developing and using community requires more than that. If your free software isn't in a public repository, you're making it harder for others to collaborate with you.
…automated testing of various kinds.
- Unit testing.
- Integration testing.
- System testing.
- UI testing.
- Benchmarking.
- Static code analysis and other checking tools.
- Basically, given how widespread use free software can easily get, and the impact of it not working properly, it's in the developer's best self-interest to raise quality as high as possible.
…communication. You know what I mean.
…the use of continuous integration and delivery. In general, automating as much mundane, repetitive work as possible makes developers much more productive.
…producing (at least rudimentary) documentation, including web site development. It doesn't have to be pretty or complete, but it needs to be clear.
…using, and providing, build systems. Free software is primarily delivered as source code, and if it's difficult to build it, it's hard to install or support it. This includes support by, say, Linux distribution security teams, who will need to build the software to release a security update.
…being friendly to packaging for various operating systems, etc. This includes being at least somewhat stable as far as interfaces, file formats, etc, so that upgrades from one version to another are plausible. Also, making and supporting releases. Also, managing one's dependencies.
…communication. This should not be forgotten.
…managing their own systems, including development systems, in a reasonable manner. Automating that in some suitable way is preferable.
…being helpful and supportive when users need help. This includes being able to adopt a customer service attitude, but additionally requires a debugging mentality for situations where you can't look at the misbehaving program yourself, and need to extract the information you need from the user, who is already annoyed by things not working.
…understanding that culture is not universal, and either translating and adapting software and documentation to various languages and cultures or, at least, making the software so that this is possible.
…communication. You don't have to be a world-class speaker. If you're prompt, frequent, open, and friendly, people will forgive most things, including the sin being too repetitive.
…working in a team. It's an entirely different way of doing things than working alone. A good team can be a big productivity booster, but it requires everyone to work together well.
…appreciating the security process enough to avoid the worst and most obvious problems. Depending on what one does, this may require quite deep understanding, but all developers now need to understand at least the basics.
…understanding and appreciating any privacy implications of what one is doing.
…communication. I mention it last, but it is by far not the least of the skills.
This is, of course, at the same time an incomplete list and a list that in itself is already nearly impossible for one person to meet. Take from it what you will, but what do you think is missing from the list?