brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
code-templatingTurns something built once into a reusable template, generator, or starter — extracting what varies, parameterising it, and keeping it from rotting. Use this whenever the user says they keep writing the same thing, wants a boilerplate, starter, cookiecutter, scaffold generator, or code generator, or is copy-pasting a previous project or module as a starting…
Independent GitHub snapshot · Automated classification · Original documentation governs
A template is an abstraction over things that do not exist yet, which makes it the easiest kind of abstraction to get wrong. Two costs are usually underestimated: templates rot silently while their generated children live on, and a wrong parameterisation is worse than copy-paste, because everyone inherits it.
The honest bar: three real instances before you templatize. Two examples cannot tell you what varies — with two, every difference looks essential and every similarity looks universal. The third instance is what separates them.
Diff them. Literally, not from memory:
diff -ru project-a/ project-b/ | head -100
Sort every difference into one of three piles:
The second pile is where the value is. Most "differences" between similar projects are drift, and turning drift into a parameter permanently enshrines a mistake.
Done when: every difference is classified, and the accidental ones have a chosen winner.
Every parameter is a question the user must answer and a branch you must maintain. A generator with fifteen prompts is slower than copying a directory.
Reject any parameter that switches architecture. --with-database producing two structurally
different outputs means you have two templates wearing one name, and both will be undertested.
Done when: each parameter is justified by a real difference across your three instances.
The generated output must run, build, and pass its own tests before a human touches it. A template whose output needs three manual fixes is a template nobody trusts, and they will fall back to copying a real project, which at least works.
Include, generated and working:
{{name}}Done when: generate → install → test passes with zero manual edits.
In increasing order of power and cost:
Do not build level 3 when level 1 would do. Most internal "boilerplate problems" are solved by one good example plus a README.
Done when: the mechanism matches the complexity you actually have.
This is the part that gets skipped, and it is why most internal templates are abandoned.
Done when: CI generates and tests the output, and the version is recorded in the output.
Say so plainly in these cases — the alternative is usually better:
That last distinction is the one most worth getting right, and it is decided by a single question: when this code has a bug, should every user get the fix automatically?