Name: ManagingProjectComplexity
Context: You are developing a complex system, or have inherited a complex legacy system. SoftwareDevelopmentComplexity? / ComplexityHasToGoSomewhere / AccidentalComplexity / RefactoringLegacyCode
The natural result of naive software development is mentally unmanageable complexity because software development results in AccidentalComplexity results in EmergentBehavior is often considered a defect but can be reduced by using abstractions that are handled by Heuristics which are used in Automation which is used in all software development and increases complexity(run-on sentence used to illustrate circular nature of automation problem)
Principles
1) Complexity is the enemy.
3) Mental power is extremely precious
8) Users are aliens. (TeachMeToSmoke)
10) Only understood rules should be broken
Theories
ReconciledProgramming? - Practical balancing of factors. TheyreJustRules and RulesAreMadeToBeBroken
Tactical/InterceptiveProgramming? - Programming based on "critical points" in the software
PanopticAnalysis? - Slicing a project many ways to increase understanding
ReconciledRefactoring? - Making the complex manageable after balancing with other factors
CriticalMass - Treat the "solved" system as a power plant, providing functionality, features, and a code library
TerminalComplexity? - The point at which a system cannot become more complex and continue to function.
Related: RepresentingDesignAspects BigBallOfMud AmorphousBlobOfHumanInsensitivity ExtremeHarmony DesignAsHarmony HereticalProgramming AirplaneRule
Mental Context: InTheZone, MentalStateCalledFlow
Kind of unfocused, trying to aggregate techniques for managing project complexity(not algorithmic complexity)
I suppose a page about managing complexity would start overly-complex and need to be managed!
Heading out of work, won't be doing it myself, perhaps name this page to ManagingProjectComplexity? Done.
"Refactored mud is more valuable than new code."
I just can't disagree with this statement more strongly. Just because there is code that "does something" doesn't mean the existing code base is valuable or has lasting merit. Too many times I have been dropped into a project that had all kinds of effort invested -- sometimes man years -- but had no chance of succeeding. Code that simply can't perform need not be refactored. It can be scrapped.
That's definitely debatable. See the discussion for OldCodeRusts. My point was to treat too-complex projects as a BigBallOfMud. In that context, refactoring is the only real option. Otherwise you'd have to completely rewrite a very complex project - then you aren't managing project complexity, just restarting it. So the gestalt is that properly refactored mud is valuable because it contains logic that probably evolved that way for a reasons, and because after refactoring it doesn't need rewriting.
SoftwareEngineering needs: