Spotting where problems are in software, in code, in tests, in systems, in processes and procedures.
Collaborating with others to propose or identify or create solutions.
Needing to have a mental picture and idea of the whole product environment in order to understand technical possibilities and limitations.
Being able to follow if not run the full release cycle, usually with other's involvement and help, to produce a workable copy of the software and operate it.
There are whole specialisms and domains of knowledge that you need to be aware of if not expert in, for example:
- Creating digital media including but not limited to; graphics, video, audio, fonts, text, formatted text, electronic books, styles, models, and many more.
- Programming in various computer languages. Knowing the distinction between interpretable and executable software, between scripts, byte code and machine code, the necessary extras (libraries) that allow the software to run.
- Wireframes, prototyping, paper prototypes, incremental and iterative development.
- Testing, as a of broad specialism that also includes programming.
- Source code control systems and document versions using github or subversion or cvs or other systems.
- Packaging, installation, and package management.
- Issues of legacy systems; in one way anything becomes a legacy system the moment it gets released. This area can be approached in different ways, data versus execution or running environments.
- Localisation (aka l10n) and Internationalisation (i18n) are really important areas, unless of course you want to ignore international customers/users. Localisation is highly specialised but increasingly easier to address through the enhanced support offered by software development environments. So no more need to 'hard code' translations or language rules, these are now provided for by standard development libraries. So to, it is now a commonplace for computer fonts and character sets to support extended and unicode character sets allowing the display and use of text in any language, type, and linguistic framework. For example, left to right, right to left, top bottom, sentence patterns used in european, middle east and asian languages.
- Online help systems including pop-up and context sensitive help, often the first and only documentation provided with software.
- The components of and services provided by operating systems.
- Managing vendors and other third party contributions.
- Data visualisation.
- Help desk and frontline support systems.
- Sales and customer relationship management.
- Quality management systems; not usually an area that software development prides itself on but essential and necessary nonetheless.
- General technological infrastructure like internet protocol, ip addresses, networks, network protocols, subnets, routers, switches, wired and wireless, firewalls, packets, packet sniffing, shared drives, cloud storage, routers, domain control, ftp, port management, virtual machines, password managers.
- Web hosting, website builders, domain registration and management, email server setup and settings, canonical name record (CNAME) and the Domain Name System (DNS) and IP addresses.
- Content management systems, workflow and web services (things like Wikis, Wordpress, Joomla, Drupal and many others).
- Databases, ranging over flat file, to relational, sql, object databases and post-relational databases.
- Web services, evolving capabilities of HTML, REST, and other important API services.
- LAMP architecture (i.e. Linux, Apache, MySQL and PHP)
- MEAN architecture (i.e. MongoDB, Express, AngularJS, Node.js)