This article is not a formal English article, it is an attempt at a description of heuristic process. I was asked by a non-developer technical person, how to design a system. Background points:

  • Always use version control on your source code. This allows you to reverse decisions if you later feel they are wrong. I would suggest git, as it is widely supported by tools.
  • Before one writes something, work out how to test it. If one doesn't know how to test an item, don't assume you can write it correctly.
  • Where possible use libraries, a solution to a problem covers many hours work. Using tools and libraries allows one to avoid this work.
  • Only use relevent tools/libraries. Using a thing that isn't relevant to your problem will slow you down.
  • Don't do everything different task in one go. Different tasks require different bits of your brain, and it is hard to provide good solution on each skillset. A few minutes break is all that is required, for example looking at other solutions.
  • Use 1 set of formatting rules for the whole project. Some common ones K n R ZF2 Symfony3 NPM jQuery
  • Remember that you are paid for results; not typing, or squinting at the keyboard.

Specifics on software design.

This is not the same as UX or requirements analysis.

  • Read all the design patterns, but for commercial work don't get constrained by them.
  • Understand IoC, DI, SOLID and all my notes on test stuff.
  • Write a paragraph (in normal English) of what you are trying to achieve.
  • Split all the sentences up. For each sentence:
    • Each noun is an Object in your solution.
    • Each verb is a message to that Object.
  • If you have a Noun/ Object without any verbs/ messages, work out if it is needed in the solution
  • Add extra sentences in English, where your first paragraph lacked detail.
  • If one noun/ Object has all the verbs/ messages (e.g. more than eight), think about splitting it to two more precise nouns.
  • None of these words in the English should be technology solution specific.
  • Extract all the nouns into a list.
  • Work out which nouns relate to each other, should they inherit, or depend on each other?
  • Mark each noun, does this behave like a common language structure (e.g. an Iterator)

Practice implementation

  • Most IDEs will supply tools to generate class templates, use these to build your above noun/ verb suggestions.
  • By hand, pretend to be the computer, and walk through your class outlines. Doing this this will make you spot any further details that you omitted.
  • Assuming you can do the entire process, start writing your tests.
  • More to be added.