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)
- 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.