I am not a programmer or a coder. I am a software developer.

A software developer is a specialist in software engineering who must handle architecture, analysis (including estimations), interface design, programming (coding), quality control, deliveries, production diagnostics, operations, and system administration.

About 50 years ago, the separation between analysts and programmers was established to help organize large development projects. The idea was that the programmer (or coder) only had to implement what the analyst had prepared. But it was the birth of software engineering, and computer systems were used only by very large companies. Things like the Waterfall methodology was taking shape.

Software engineering is now rapidly evolving. Alternative methodologies are proving themselves. This rapid evolution has caused some to keep old paradigm, like “developer = coder”.

The diversity of today’s projects sometimes requires developers to assume all these roles within a single project. It happens a lot for mobile phone apps. Usually, major projects allow for specialization and collaboration between different roles. However, organizing these roles is a constant challenge.

There is the seemingly simple case of the developer who super-specializes in a single role (architecture, quality control, etc.). In fact, it is not so simple because even the most specialized developers roles are multi-faceted. in short, the daily life of most developers is composed of tasks and methodologies that were unimaginable 30 years ago.

Computing is now ubiquitous (in our phones, hospitals, cars, …), and the reliability of systems has quickly been taken for granted everywhere (surprisingly!). By accepting the immaturity of our profession, we can more easily maintain our vigilance to produce quality systems.

That being said, the best solutions revolve around three points:

  • Choosing developers is as important as the casting of a movie. Sometimes, not always, the chemistry is just right and the resulting synergy creates great solutions.
  • Producing small deliverables quickly, tested both technically and functionally.
  • Generating metrics and being ready to partially or completely review any weak component.