Anti-patterns part 2 
Dmitriy Kochergin, Developer 
Dnepropetrovsk, 2012 
December 12, 2014 www.ExigenServices.com
2 www.ExigenServices.com 
Content 
• Programming anti-patterns 
• Methodological anti-patterns 
• Configuration management anti-patterns 
2
3 www.ExigenServices.com 
Part 1 
Programming anti-patterns 
3
Accidental complexity 
• Accidental complexity: Introducing unnecessary complexity 
4 www.ExigenServices.com 
into a solution 
• While essential complexity is inherent and unavoidable, 
accidental complexity is caused by the approach chosen to 
solve the problem 
– essential complexity: we have a hard problem 
– accidental complexity: we have made a problem hard 
– KISS principle 
4
Accidental complexity 
– Focus on the essential complexity 
– Avoid “tricky code” 
– After implementation check if your solution follow business problem 
5 www.ExigenServices.com 
• Solution: 
5
Accidental complexity 
6 www.ExigenServices.com 
6
7 www.ExigenServices.com 
Blind faith 
• Blind faith (or blind programming): programmer develops a 
solution or fixes a computer bug and deploys it without 
testing 
• The programmer has blind faith in his abilities 
• Another form of blind faith is when a programmer calls a 
subroutine without checking the result (e.g. for null) 
7
8 www.ExigenServices.com 
Boat anchor 
• Boat anchor refers to an unused piece of code that is left in 
code, typically for the reason "In case we need it later” 
• Problem: 
– hard to differentiate between obsolete code and working code 
– later it usually easier to rewrite method 
– uncommenting code can cause bugs 
• Use VCS to get old version if needed 
8
Cargo cult programming 
• Cargo cult originally referred to aboriginal religions which 
9 www.ExigenServices.com 
grew up in the South Pacific after World War II 
• Cargo cult programming: Using patterns, technologies, 
frameworks without understanding why 
9
Cargo cult programming 
10 www.ExigenServices.com 
10
Coding by exception 
• Coding by exception: Adding new code to handle each special 
11 www.ExigenServices.com 
case when it appears 
• Typically happens due to covering new requirements 
• 'One-off' solutions decrease performance and maintainability 
• Try to generalize the special case first 
• Well designed software projects contain 
very few corner cases 
11
• Error hiding: catching an error message before it can be shown 
to the user and either showing nothing or showing a 
meaningless message 
• Cause: desire to hide complexity from the user 
• Solution: Raise an exception to the user with simplified error 
message, and save the full error message to an error log 
• User should understand what to do from error message, 
12 www.ExigenServices.com 
Error hiding 
provide possible solutions 
12
• Hard coding: storing configuration data in source code rather 
• Program could work correctly only in certain environment (on 
• Every new environment (including build servers) should be tuned 
13 www.ExigenServices.com 
Hard coding 
than configuration files 
– configuration file path 
– mail server name 
– remote hosts 
– … other system environment variables 
developer machine) 
to comply with hardcoded (predefined) structure 
13
14 www.ExigenServices.com 
Hard coding 
• Solution: 
– obtain data from external sources 
– generate data 
– take it from user input 
– pass data through command line or system property 
14
• Soft coding: storing business logic in external resources rather 
• Example: storing business rules in DB 
• Reason: fear that the code we write will have to be changed as a 
15 www.ExigenServices.com 
Soft coding 
than in source code 
result of a business rule change 
• Solution: avoid Hard Coding and Soft Coding 
15
Magic numbers 
• Magic numbers: Including unexplained numbers in algorithms 
16 www.ExigenServices.com 
• Replace them with constants: 
• it is easier to read and understand 
• it is easier to alter the value of the number, as it is 
not duplicated 
• it helps detect typos 
16
Spaghetti code 
• Spaghetti code: code that has a complex and tangled control 
structure, especially one using many GOTOs, exceptions, threads, 
or other "unstructured" branching constructs 
17 www.ExigenServices.com 
• Now term is used to describe any 
code with tangled and twisted 
logic, lots of branching, 
polymorphic behavior etc 
17
Spaghetti code 
18 www.ExigenServices.com 
Un-structured code 
is a liability 
18 
Well-structured code 
is an investment
Spaghetti code 
• Structured programming greatly decreased the 
incidence of spaghetti code: extensive use of 
subroutines, block structures and for and while loops 
19 www.ExigenServices.com 
• Functions not more than 10-20 rows 
• Use metrics to find spaghetti methods, e.g. 
cyclomatic complexity, method length. 
19
Spaghetti code: Other related 
• Ravioli code: program structure is characterized by a number of 
• While generally desirable from a coupling and cohesion 
perspective, overzealous separation and encapsulation of code 
can bloat call stacks and make navigation through the code more 
difficult 
20 www.ExigenServices.com 
terms 
small and (ideally) loosely-coupled components 
20
Shotgun surgery 
21 www.ExigenServices.com 
• Shotgun surgery: features are added to several 
places simultaneously, usually by copy-pasting 
with slight variations 
• Solution: Aspect oriented programming (AOP) 
21
Shot in the Dark 
• Shot in the Dark: production (or test) environment poor track 
record leads to developers are guessing possible problems 
• “We can’t reproduce the problem in QA but I think it is caused 
22 www.ExigenServices.com 
by feature “X”” 
• Solution: Measure, Don’t Guess 
– local bug reproducing 
– error stack trace 
– profiler 
22
Incorrect exceptions usage 
• Incorrect exceptions usage: normal program flow 
• Using exceptions to control program flow adds ambiguity 
• Solution: use exception only to inform program about 
errors. Checked – for recoverable errors, unchecked – for 
unrecoverable errors 
23 www.ExigenServices.com 
implemented using exceptions 
– exit from block using exception 
– similar to goto statement 
23
Incorrect data 
• Incorrect data: could cause errors anytime during program 
• In contrast to program flow errors data errors are hardly 
exposed because data could be corrupted any stage earlier 
– check data as early as possible 
– check input data of methods (design by contract and firewalls) 
24 www.ExigenServices.com 
execution 
• Solution: 
24
• Lava flow: Retaining undesirable (redundant or low-quality) 
code because removing it is too expensive or has 
unpredictable consequences 
25 www.ExigenServices.com 
Lava flow 
• If you leave tricky code – 
describe your solution in 
javadoc or comments 
• Write tests – then you will 
be confident in refactoring 
25
26 www.ExigenServices.com 
Lava flow 
26
Other programming anti-patterns 
• Busy waiting: consuming CPU while waiting for something 
to happen, usually by repeated checking instead of 
messaging 
• Negative cache is a cache that also stores "negative" 
responses (result indicating error). 
– e.g. when network was unavailable – cache error result, and 
27 www.ExigenServices.com 
return it even after network is back up. 
27
28 www.ExigenServices.com 
Part 2 
Methodological anti-patterns 
28
Copy and paste programming 
• Copy-paste programming: describe highly repetitive code 
apparently produced by copy and paste operations 
29 www.ExigenServices.com 
• Use extract method refactoring 
29
Copy and paste programming 
• modification of any element does not require a changes in 
30 www.ExigenServices.com 
• Follow Don't Repeat Yourself (DRY) principle 
other logically-unrelated elements 
30
Golden hammer 
instrument): assuming that a favorite solution is universally 
applicable 
• “If all you have is a hammer, everything looks like a nail" 
31 www.ExigenServices.com 
• Golden hammer (Maslow's hammer, law of the 
31 
Abraham Maslow, 1966
Golden hammer 
– look at the problem from different points of view 
– choose technology (concept, framework or tool) that better suits 
– previous means you have o know at least on more solution to 
– There are 191 fundamental software patterns (23 Gamma 
Patterns + 17 Buschmann Patterns + 72 Analysis Patterns + 38 
CORBA Design Patterns + 42 AntiPatterns) 
32 www.ExigenServices.com 
• Solution: 
to solve the problem 
problem (learn it if needed) 
– [4] describes 140 antipatterns 
32
Improbability factor 
• Improbability factor: assuming that known error is improbable 
to occur 
– programmers are aware of the problem 
– they are not allowed to fix the problem 
– because the chances of the problem ever appearing are supposedly 
negligible compared to other problems that could be solved with the 
programmers' time and money 
33 www.ExigenServices.com 
33
Improbability factor 
• As a result, the problem may still occur and do heavy damage due 
34 www.ExigenServices.com 
to Murphy's law 
• Murphy's law typically stated as: 
"Anything that can go wrong, will go wrong” 
34
Premature optimization 
• Premature optimization: Coding early-on for perceived efficiency, 
sacrificing good design, maintainability, and sometimes even real-world 
efficiency 
• "We should forget about small efficiencies, say about 97% of the time: 
35 www.ExigenServices.com 
premature optimization is the root of all evil" 
35 
Donald Knuth, 1974 
• A simple and elegant design is often easier to optimize 
• In practice, it is often necessary to keep performance goals in mind when 
first designing software, but the programmer balances the goals of design 
and optimization
Premature pessimization 
• Premature pessimization: Coding early-on for good design, leaving 
36 www.ExigenServices.com 
performance intentionally low 
– multiple copying heavyweight container 
– recalculating rather than caching 
– etc 
• Solution should be optimal (not optimized) for task 
36
Programming by permutation 
• Programming by permutation (or "programming by accident"): 
trying to find a solution by making small changes (permutations) 
to see if it works 
– programmer does not fully understand the code or even don’t want to 
37 www.ExigenServices.com 
• Programmer trying to guess: 
– calls and order of procedures 
– parameters' values 
– etc. 
• Reason: 
understand it 
– external module API is insufficiently documented 
37
Programming by permutation 
– new bugs can be introduced, leading to a "solution" that is even less 
– it’s usually impossible to tell whether the solution will work for all cases 
– programming by permutation gives little or no assurance about the 
38 www.ExigenServices.com 
• Problems: 
correct than the starting point 
quality of the code produced 
38
Reinventing the square wheel 
• Reinventing the square wheel: Failing to adopt an existing, 
adequate solution and instead creating a custom solution 
(reinventing the wheel) which performs much worse than the 
existing one (a square wheel). 
39 www.ExigenServices.com 
• Reason: 
– engineer doesn’t know the standard solution 
– engineer doesn’t like the standard solution 
– second-system effect 
39
Reinventing the square wheel 
40 www.ExigenServices.com 
• Problems: 
– anyone starting from scratch, ignoring 
the prior art, will naturally face same 
old problems again 
– wasted development time, delaying a 
task 
– developers will have to support their 
solution, fixing bugs and adding new 
features 
40
41 www.ExigenServices.com 
Part 3 
Configuration management anti-patterns 
41
Dependency hell 
• Dependency hell (DLL hell, JAR hell): problems with versions of 
42 www.ExigenServices.com 
required products 
• Problems: 
– many dependencies 
• high coupling 
– long chains of dependencies 
– conflicting dependencies 
• if different versions of lib 
cannot be simultaneously 
installed 
– circular dependencies 
• you can’t separate units 
by level of abstraction 
42
Dependency hell 
– software appliances (encapsulate dependencies in a one unit) 
– portable applications 
43 www.ExigenServices.com 
• Solutions: 
– version numbering (major and minor versions) 
– smart package management (e.g. in Linux) 
• repository-based package management systems 
43
THANKS FOR COMING!!! 
44 www.ExigenServices.com 
• My contacts: 
– e-mail: dmitriy.kochergin@exigenservices.com 
– Skype: dmitry.kochergin 
44
45 www.ExigenServices.com 
Questions 
Questions? 
45
46 www.ExigenServices.com 
Links 
Nr. Document Author, Date, Location 
[1] Anti-patterns wiki •http://en.wikipedia.org/wiki/Anti-patterns 
[2] AnemicDomainModel •http://www.martinfowler.com/bliki/AnemicDomainModel.html 
[3] AntiPatterns •http://www.antipatterns.com/briefing/sld001.htm 
[4] AntiPatterns catalog •http://c2.com/cgi-bin/wiki?AntiPatternsCatalog 
[5] Supported by the Antipattern template •http://c2.com/cgi-bin/wiki?AntiPatternTemplate 
[6] AntiPatterns: Refactoring Software, 
Architectures, and 
Projects in Crisis by William J. Brown 
et.al. (Wiley) 
[7] AntiPatterns •http://sourcemaking.com/antipatterns 
46

Anti patterns part 2

  • 1.
    Anti-patterns part 2 Dmitriy Kochergin, Developer Dnepropetrovsk, 2012 December 12, 2014 www.ExigenServices.com
  • 2.
    2 www.ExigenServices.com Content • Programming anti-patterns • Methodological anti-patterns • Configuration management anti-patterns 2
  • 3.
    3 www.ExigenServices.com Part1 Programming anti-patterns 3
  • 4.
    Accidental complexity •Accidental complexity: Introducing unnecessary complexity 4 www.ExigenServices.com into a solution • While essential complexity is inherent and unavoidable, accidental complexity is caused by the approach chosen to solve the problem – essential complexity: we have a hard problem – accidental complexity: we have made a problem hard – KISS principle 4
  • 5.
    Accidental complexity –Focus on the essential complexity – Avoid “tricky code” – After implementation check if your solution follow business problem 5 www.ExigenServices.com • Solution: 5
  • 6.
    Accidental complexity 6www.ExigenServices.com 6
  • 7.
    7 www.ExigenServices.com Blindfaith • Blind faith (or blind programming): programmer develops a solution or fixes a computer bug and deploys it without testing • The programmer has blind faith in his abilities • Another form of blind faith is when a programmer calls a subroutine without checking the result (e.g. for null) 7
  • 8.
    8 www.ExigenServices.com Boatanchor • Boat anchor refers to an unused piece of code that is left in code, typically for the reason "In case we need it later” • Problem: – hard to differentiate between obsolete code and working code – later it usually easier to rewrite method – uncommenting code can cause bugs • Use VCS to get old version if needed 8
  • 9.
    Cargo cult programming • Cargo cult originally referred to aboriginal religions which 9 www.ExigenServices.com grew up in the South Pacific after World War II • Cargo cult programming: Using patterns, technologies, frameworks without understanding why 9
  • 10.
    Cargo cult programming 10 www.ExigenServices.com 10
  • 11.
    Coding by exception • Coding by exception: Adding new code to handle each special 11 www.ExigenServices.com case when it appears • Typically happens due to covering new requirements • 'One-off' solutions decrease performance and maintainability • Try to generalize the special case first • Well designed software projects contain very few corner cases 11
  • 12.
    • Error hiding:catching an error message before it can be shown to the user and either showing nothing or showing a meaningless message • Cause: desire to hide complexity from the user • Solution: Raise an exception to the user with simplified error message, and save the full error message to an error log • User should understand what to do from error message, 12 www.ExigenServices.com Error hiding provide possible solutions 12
  • 13.
    • Hard coding:storing configuration data in source code rather • Program could work correctly only in certain environment (on • Every new environment (including build servers) should be tuned 13 www.ExigenServices.com Hard coding than configuration files – configuration file path – mail server name – remote hosts – … other system environment variables developer machine) to comply with hardcoded (predefined) structure 13
  • 14.
    14 www.ExigenServices.com Hardcoding • Solution: – obtain data from external sources – generate data – take it from user input – pass data through command line or system property 14
  • 15.
    • Soft coding:storing business logic in external resources rather • Example: storing business rules in DB • Reason: fear that the code we write will have to be changed as a 15 www.ExigenServices.com Soft coding than in source code result of a business rule change • Solution: avoid Hard Coding and Soft Coding 15
  • 16.
    Magic numbers •Magic numbers: Including unexplained numbers in algorithms 16 www.ExigenServices.com • Replace them with constants: • it is easier to read and understand • it is easier to alter the value of the number, as it is not duplicated • it helps detect typos 16
  • 17.
    Spaghetti code •Spaghetti code: code that has a complex and tangled control structure, especially one using many GOTOs, exceptions, threads, or other "unstructured" branching constructs 17 www.ExigenServices.com • Now term is used to describe any code with tangled and twisted logic, lots of branching, polymorphic behavior etc 17
  • 18.
    Spaghetti code 18www.ExigenServices.com Un-structured code is a liability 18 Well-structured code is an investment
  • 19.
    Spaghetti code •Structured programming greatly decreased the incidence of spaghetti code: extensive use of subroutines, block structures and for and while loops 19 www.ExigenServices.com • Functions not more than 10-20 rows • Use metrics to find spaghetti methods, e.g. cyclomatic complexity, method length. 19
  • 20.
    Spaghetti code: Otherrelated • Ravioli code: program structure is characterized by a number of • While generally desirable from a coupling and cohesion perspective, overzealous separation and encapsulation of code can bloat call stacks and make navigation through the code more difficult 20 www.ExigenServices.com terms small and (ideally) loosely-coupled components 20
  • 21.
    Shotgun surgery 21www.ExigenServices.com • Shotgun surgery: features are added to several places simultaneously, usually by copy-pasting with slight variations • Solution: Aspect oriented programming (AOP) 21
  • 22.
    Shot in theDark • Shot in the Dark: production (or test) environment poor track record leads to developers are guessing possible problems • “We can’t reproduce the problem in QA but I think it is caused 22 www.ExigenServices.com by feature “X”” • Solution: Measure, Don’t Guess – local bug reproducing – error stack trace – profiler 22
  • 23.
    Incorrect exceptions usage • Incorrect exceptions usage: normal program flow • Using exceptions to control program flow adds ambiguity • Solution: use exception only to inform program about errors. Checked – for recoverable errors, unchecked – for unrecoverable errors 23 www.ExigenServices.com implemented using exceptions – exit from block using exception – similar to goto statement 23
  • 24.
    Incorrect data •Incorrect data: could cause errors anytime during program • In contrast to program flow errors data errors are hardly exposed because data could be corrupted any stage earlier – check data as early as possible – check input data of methods (design by contract and firewalls) 24 www.ExigenServices.com execution • Solution: 24
  • 25.
    • Lava flow:Retaining undesirable (redundant or low-quality) code because removing it is too expensive or has unpredictable consequences 25 www.ExigenServices.com Lava flow • If you leave tricky code – describe your solution in javadoc or comments • Write tests – then you will be confident in refactoring 25
  • 26.
  • 27.
    Other programming anti-patterns • Busy waiting: consuming CPU while waiting for something to happen, usually by repeated checking instead of messaging • Negative cache is a cache that also stores "negative" responses (result indicating error). – e.g. when network was unavailable – cache error result, and 27 www.ExigenServices.com return it even after network is back up. 27
  • 28.
    28 www.ExigenServices.com Part2 Methodological anti-patterns 28
  • 29.
    Copy and pasteprogramming • Copy-paste programming: describe highly repetitive code apparently produced by copy and paste operations 29 www.ExigenServices.com • Use extract method refactoring 29
  • 30.
    Copy and pasteprogramming • modification of any element does not require a changes in 30 www.ExigenServices.com • Follow Don't Repeat Yourself (DRY) principle other logically-unrelated elements 30
  • 31.
    Golden hammer instrument):assuming that a favorite solution is universally applicable • “If all you have is a hammer, everything looks like a nail" 31 www.ExigenServices.com • Golden hammer (Maslow's hammer, law of the 31 Abraham Maslow, 1966
  • 32.
    Golden hammer –look at the problem from different points of view – choose technology (concept, framework or tool) that better suits – previous means you have o know at least on more solution to – There are 191 fundamental software patterns (23 Gamma Patterns + 17 Buschmann Patterns + 72 Analysis Patterns + 38 CORBA Design Patterns + 42 AntiPatterns) 32 www.ExigenServices.com • Solution: to solve the problem problem (learn it if needed) – [4] describes 140 antipatterns 32
  • 33.
    Improbability factor •Improbability factor: assuming that known error is improbable to occur – programmers are aware of the problem – they are not allowed to fix the problem – because the chances of the problem ever appearing are supposedly negligible compared to other problems that could be solved with the programmers' time and money 33 www.ExigenServices.com 33
  • 34.
    Improbability factor •As a result, the problem may still occur and do heavy damage due 34 www.ExigenServices.com to Murphy's law • Murphy's law typically stated as: "Anything that can go wrong, will go wrong” 34
  • 35.
    Premature optimization •Premature optimization: Coding early-on for perceived efficiency, sacrificing good design, maintainability, and sometimes even real-world efficiency • "We should forget about small efficiencies, say about 97% of the time: 35 www.ExigenServices.com premature optimization is the root of all evil" 35 Donald Knuth, 1974 • A simple and elegant design is often easier to optimize • In practice, it is often necessary to keep performance goals in mind when first designing software, but the programmer balances the goals of design and optimization
  • 36.
    Premature pessimization •Premature pessimization: Coding early-on for good design, leaving 36 www.ExigenServices.com performance intentionally low – multiple copying heavyweight container – recalculating rather than caching – etc • Solution should be optimal (not optimized) for task 36
  • 37.
    Programming by permutation • Programming by permutation (or "programming by accident"): trying to find a solution by making small changes (permutations) to see if it works – programmer does not fully understand the code or even don’t want to 37 www.ExigenServices.com • Programmer trying to guess: – calls and order of procedures – parameters' values – etc. • Reason: understand it – external module API is insufficiently documented 37
  • 38.
    Programming by permutation – new bugs can be introduced, leading to a "solution" that is even less – it’s usually impossible to tell whether the solution will work for all cases – programming by permutation gives little or no assurance about the 38 www.ExigenServices.com • Problems: correct than the starting point quality of the code produced 38
  • 39.
    Reinventing the squarewheel • Reinventing the square wheel: Failing to adopt an existing, adequate solution and instead creating a custom solution (reinventing the wheel) which performs much worse than the existing one (a square wheel). 39 www.ExigenServices.com • Reason: – engineer doesn’t know the standard solution – engineer doesn’t like the standard solution – second-system effect 39
  • 40.
    Reinventing the squarewheel 40 www.ExigenServices.com • Problems: – anyone starting from scratch, ignoring the prior art, will naturally face same old problems again – wasted development time, delaying a task – developers will have to support their solution, fixing bugs and adding new features 40
  • 41.
    41 www.ExigenServices.com Part3 Configuration management anti-patterns 41
  • 42.
    Dependency hell •Dependency hell (DLL hell, JAR hell): problems with versions of 42 www.ExigenServices.com required products • Problems: – many dependencies • high coupling – long chains of dependencies – conflicting dependencies • if different versions of lib cannot be simultaneously installed – circular dependencies • you can’t separate units by level of abstraction 42
  • 43.
    Dependency hell –software appliances (encapsulate dependencies in a one unit) – portable applications 43 www.ExigenServices.com • Solutions: – version numbering (major and minor versions) – smart package management (e.g. in Linux) • repository-based package management systems 43
  • 44.
    THANKS FOR COMING!!! 44 www.ExigenServices.com • My contacts: – e-mail: dmitriy.kochergin@exigenservices.com – Skype: dmitry.kochergin 44
  • 45.
  • 46.
    46 www.ExigenServices.com Links Nr. Document Author, Date, Location [1] Anti-patterns wiki •http://en.wikipedia.org/wiki/Anti-patterns [2] AnemicDomainModel •http://www.martinfowler.com/bliki/AnemicDomainModel.html [3] AntiPatterns •http://www.antipatterns.com/briefing/sld001.htm [4] AntiPatterns catalog •http://c2.com/cgi-bin/wiki?AntiPatternsCatalog [5] Supported by the Antipattern template •http://c2.com/cgi-bin/wiki?AntiPatternTemplate [6] AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis by William J. Brown et.al. (Wiley) [7] AntiPatterns •http://sourcemaking.com/antipatterns 46