I was recently asked
Which languages [and tools] do you consider a competent/experienced and useful programmer would have ability to programme in these days. Especially for personal computers, tablets and/or smart phones.
That’s an interesting question and I gave it some thought, before replying. It’s not just languages that are important, though they do influence how programmers think about solving a problem. The architecture they are used in is also very important eg event driven, single thread or threaded. Plus, as the question indicates, so are tool chain and workflow experience. Team development experience and deep and prolonged use of at least one language solving real design issues are the hallmarks of a good developer.
I think the specific problem domain is less important but some do require specific skills – eg Real time telemetries. However certain experiences are all very desirable eg UI, various client-server splits and database. Some platforms require specific languages, eg iOS needs Objective-C but good skills are transferable so a decent developer can take a running start, especially if experience in C or Java.
Another requirement is knowledge of the platform APIs or frameworks which can be very large and take a time to become well experienced in. Again a good developer will soon learn his way around as needed. Indeed someone said
The key to being a good developer is to be able to find your answer as quickly as possible, without learning anything else.
That said, a good, solid grounding is irreplaceable.
So here’s an attempt at listing some key languages, tools and skills in demand today:
- Without a doubt web technologies and especially the triad of HTML(5), CSS and Javascript. This covers web apps, mobile apps, and now server too (node).
- Not a language, but an appreciation of the REST architectural style is vital.
- Modular, object-oriented, and block structured compiled languages like Java, C++ (C at a pinch). This covers native mobile apps, Desktop OS systems programming and also server side
- Python is also an excellent alternative to Java / C++ even though is not strictly compiled.
Closely following these core competencies are:
- Server side languages for web app such as PHP, Ruby, Java, Javascript (node) or .NET/C# (or perhaps Python) as web apps almost always require some server-side support.
- SQL, though noSQL use is also valuable
- Shell scripting experience with bash or cmd can be very useful, especially for build but deep knowledge is often more a system administrators bag
Of course I think every programmer would benefit from a good understanding of Assembler 🙂
In terms of generic tool chains supporting team work
- Version control, especially distributed like git
- Issue/bug tracker
- A good IDE or equivalent tools eg Eclipse, VisualStudio, browser debug tools
- Build tools
These are closely followed by the equally important
- Unit testing tools
- Continuous integration tools
- Accessibility test tools and assistive technology
Finally, and perhaps most important – any solid opensource community experience is a major plus.
So what do you think? Have I missed anything critical? I’m not interested in ‘me too’ language nominations or raw DOM verses jQuery flames. I’m after what core experience a ‘competent/experienced and useful programmer’ could be expected to have?