A while back I came across a concept called TRIZ. Concepts and techniques that are used in non-English speaking countries sometimes do not get translated quickly into use in our insular English worldview.
Triz is a Russian Engineering tool that has been used for some time. It is apparently a definitive list of design trade-offs that should be considered in any engineering design. It Consists of 39 Features of any solution and 40 Principles that may be applied to address trade-offs of those Features.
see: http://www.triz-journal.com/
and
http://www.innovation-triz.com/
So the 39 Features are placed on both the X and Y axes of a matrix and when you need to optimize one of them you will find the list of principles (from the 40 possible principles) to apply, at the intersection point of the potentially contradictory Features. Typically the method is to place the features you intend to improve as rows in the matrix, and the features you anticpate worsening as columns in the matrix, and then finding the principles to apply at the relevant intersections that you hope to manage. I won’t place the matrix here as that has been done on the sites listed above. (These 39 Features have been variously and severally translated into Software System analogs, but I haven’t seen a version I agree with fully yet.)
Some proponents of TRIZ found that in software system design these engineering and innovation principles can be applied by simply shifting the terminology from engineering terms to Systems Terms. The 40 Principles of TRIZ for software are listed here: http://www.triz40.com/aff_Principles_TRIZ.php
I hope to help clarify when a solution architect or systems designer needs to apply these principles. I have created a slant on these 40 principles that may be more useful to a solutions architect by abstracting some of the principles slightly (others are left intact as per the TRIZforSoftware site). (Note: this list now includes suggested changes as per Dr Claude Meylan’s comment) :
- Segmentation – Selecting an appropriate degree of Segmentation. Some problems require a Unique approach to segmentation.
- Interference – Will this affect other Systems or will other Systems interfere with this system
- Local Quality – Will we have to make special exceptions to our standards to improve the quality of the solution for this specific instance?
- Load Balancing / Resource Utilization – Is the design making optimal use of resources as well as appropriate use of load balancing/ parallel processing
- Consolidation – Sometimes it is appropriate to perform multiple functions in a single module or sometimes processes are so similar it would make sense to consolidate them
- Universality (mulitfunction or Personalisation) – It may be appropriate to build a module or system in a way that it can be personalized or that it can serve multiple purposes.
- Nesting (classes within classes) – Nesting of Classes can add to reuse
- Multi-Context (reuse within multiple contexts) – sometimes a system or module built for another purpose is actually reusable within a different context altogether
- Pre-Processing
- Just in Time action without lag – is every module aware of when it can start processing to avoid slack or unnecessary load.
- Pre-compensation for reliability problems – what periodic procedures can ensure a greater degree of reliability or stability.
- Equipotentiality – Various modules within a system must be equally scaled
- Ability to Rollback – The system must be able to rollback transactions that cannot be fully processed.
- Abstract / complex Data structures – Does the system really require the flexibility of Abstract data-structures or will straightforward design suffice. Is it futureproof without these? Will it be replaced anyway?
- Optimal Operating Conditions –
- What if the system fails half-way or does too much – Will it be possible to interrogate the system / data-artefacts and determine what happened / how to fix it – or is the system intelligent enough to roll back/forward to a valid state.
- Affecting other Systems, Data or layers
- Rate of Operation – How fast does the system need to operate? What is the potential future requirement.
- Scheduling – When will the system need to run? Is Self-Scheduling part of the design?
- Idle Time – optimal load – Is the system Idle for stretches of time and then overloaded for others?
- Burst mode / peak load – how will the system cope with peaks in load?
- Convert harm into benefit – Is there some inherent problem in the process that we can use to our benefit or at least be alerted of should the event occur.
- Feedback – How much Feedback does the system need to give? Too much will slow it down, too little will leave operators wondering if it is functioning properly.
- Intermediary Layers : middleware – Required? What about SOA?
- Self-servicing (built in updating / alerting) – Does the system automatically raise alerts or check for a newer version of itself or at least submit traps to a monitoring system.
- Copying – how easy to deploy elsewhere?
- Disposal – will it be easy to replace or dispose of? Is the data migrateable and is the level of loose-coupling appropriate so that other systems feeding off it can be converted to talk to the replacement system easily.
- Alternatives to this process (What if we did the whole process another way?)
- DMA or Meta-Data structures – Are there parameters in the system that will restrict us going forward that we could address by a dynamic design.
- Wrapper Objects – Are there existing objects we could wrap to use in the project, or will the new ones be more widely usable with some for of wrapper.
- Required to be less than optimal – e.g. chess: beginner levels. See Equipotentiality – a system feeding another system may need to operate less-than-optimally.
- User Interface appearance & usability
- Homogeneity – Container Objects – Is it all implemented “The way we do it”
- Code self-healing / intelligence & Garbage Collection – Are appropriate clean-up processes designed-in?
- Transformation properties – Multi-role objects – Some objects may be reusable
- Phase transition – unexpected behaviour
- Storage or Memory utilisation during operational cycles
- Encryption – required? Appropriate level.
- Not affecting the live environment during testing – Test Harness
- Use mulitple methods to attack the bigger problem
(adapted from TRIZ for Software: 40 engineering principles.)
This may be a useful checklist for a solution architect to check their design and optimise the proposed solution.
My translation of the 39 features of Triz are listed here: http://www.sobercounsel.com/2015/02/25/39-triz-features-long-overdue/ ?
Good luck. Have fun. Any comments welcome.

Thanks Claude
I will amend accordingly….and I need to get around to those 39 Features someday soon.
Malcolm
Excellent!
With exception of this detail: I think “modularisation” is more related to “multifunctions” (or “multi-context”) than to “segmentation”. As “solutions architect”, if you replaced your first principle by …”segmentation”, there is surely a lot of useful examples!
Kind regards,
Claude