- Software engineering skills - these are the skills that allow a software person to transform a description of a system to a system and a project that can be controlled and maintained. These skills are:
- Distilling requirements from the needs of the client. This is a phase where a semantic description of a system is reduced to a syntactic description. Engineers need syntax, as it is possible to build tools that understand and analyze syntactic description of a system.
- Designing the system - both low and high level design
- Understanding regulations related to software (e.g., privacy constraints or accessibility rules)
- Knowledge of development processes - agile or not agile, TDD or testing at the end of each development phase
- Software coding skills - these are the skills that allow developers to take a description of a system and develop something that executes on a computer, these skills are:
- Programming language(s) - The vehicle that translates neural signals in the developer's brain to operations on the CPU. It is crucial to know at least one, but it is rarely enough. The fact that it is possible to use a certain language to code doesn't mean that it is the right language to choose, Turing completeness is not everything. Be versatile, know static and dynamic language, declarative and imperative, functional and OO ...
- Development tools - understand what your IDE can give you. Know all the features of your debugger, also all of its blind-spots (concurrency...)
- Development ecosystem - know the libraries, toolkits, and basically everything that is already done, correct and useful
- Problems avoiding - understand code smells. In my first course on software development the lecturer said "code that is written twice is written once too many" - follow this rule, learn to love refactoring and strive for code reusability
- Expertise in a technical domain - knowledge beyond coding. It can be machine learning or information retrieval, usability or DB design, security or concurrent programming. A software person must be knowledgeable in a technical domain, this what separates software person from a code monkey
- Understanding of a client's domain - this can be anything - from spacecraft aeronautics to medical devices, it is crucial to understand the client's domain in order to be able to provide a product that solves the client's problem. This knowledge is utilized throughout all the software construction life-cycle. From properly understanding the client's requirement, through giving proper names to variables all the way to building a system that is exactly what the client needs.
Only by having a proper combination of skills along these axis, a software person is able to solve the tough problems that the client is facing and provide a solution that works the way that the client needs (and not just the technical problems that the client doesn't really cares about).