SlideShare a Scribd company logo
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

More Related Content

What's hot

optimizing code in compilers using parallel genetic algorithm
optimizing code in compilers using parallel genetic algorithm optimizing code in compilers using parallel genetic algorithm
optimizing code in compilers using parallel genetic algorithm
Fatemeh Karimi
 
CNUG TDD June 2014
CNUG TDD June 2014CNUG TDD June 2014
CNUG TDD June 2014
Mayank Srivastava
 
Static Analysis Techniques For Testing Application Security - Houston Tech Fest
Static Analysis Techniques For Testing Application Security - Houston Tech FestStatic Analysis Techniques For Testing Application Security - Houston Tech Fest
Static Analysis Techniques For Testing Application Security - Houston Tech Fest
Denim Group
 
Building trust within the organization, first steps towards DevOps
Building trust within the organization, first steps towards DevOpsBuilding trust within the organization, first steps towards DevOps
Building trust within the organization, first steps towards DevOps
Guido Serra
 
Programming languages and techniques for today’s embedded andIoT world
Programming languages and techniques for today’s embedded andIoT worldProgramming languages and techniques for today’s embedded andIoT world
Programming languages and techniques for today’s embedded andIoT world
Rogue Wave Software
 
Software Engineering - chp7- tests
Software Engineering - chp7- testsSoftware Engineering - chp7- tests
Software Engineering - chp7- tests
Lilia Sfaxi
 
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
RootedCON
 
Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...
Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...
Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...
Christian Schneider
 

What's hot (9)

optimizing code in compilers using parallel genetic algorithm
optimizing code in compilers using parallel genetic algorithm optimizing code in compilers using parallel genetic algorithm
optimizing code in compilers using parallel genetic algorithm
 
CNUG TDD June 2014
CNUG TDD June 2014CNUG TDD June 2014
CNUG TDD June 2014
 
Static Analysis Techniques For Testing Application Security - Houston Tech Fest
Static Analysis Techniques For Testing Application Security - Houston Tech FestStatic Analysis Techniques For Testing Application Security - Houston Tech Fest
Static Analysis Techniques For Testing Application Security - Houston Tech Fest
 
Building trust within the organization, first steps towards DevOps
Building trust within the organization, first steps towards DevOpsBuilding trust within the organization, first steps towards DevOps
Building trust within the organization, first steps towards DevOps
 
Automation and Technical Debt
Automation and Technical DebtAutomation and Technical Debt
Automation and Technical Debt
 
Programming languages and techniques for today’s embedded andIoT world
Programming languages and techniques for today’s embedded andIoT worldProgramming languages and techniques for today’s embedded andIoT world
Programming languages and techniques for today’s embedded andIoT world
 
Software Engineering - chp7- tests
Software Engineering - chp7- testsSoftware Engineering - chp7- tests
Software Engineering - chp7- tests
 
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
 
Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...
Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...
Security DevOps - Staying secure in agile projects // OWASP AppSecEU 2015 - A...
 

Similar to Anti patterns part 2

Anti patterns part 2
Anti patterns part 2Anti patterns part 2
Anti patterns part 2
Return on Intelligence
 
Growing as a software craftsperson (part 1) From Pune Software Craftsmanship.
Growing as a software craftsperson (part 1)  From Pune Software Craftsmanship.Growing as a software craftsperson (part 1)  From Pune Software Craftsmanship.
Growing as a software craftsperson (part 1) From Pune Software Craftsmanship.
Dattatray Kale
 
Dev buchan 30 proven tips
Dev buchan 30 proven tipsDev buchan 30 proven tips
Dev buchan 30 proven tipsBill Buchan
 
CS101- Introduction to Computing- Lecture 44
CS101- Introduction to Computing- Lecture 44CS101- Introduction to Computing- Lecture 44
CS101- Introduction to Computing- Lecture 44
Bilal Ahmed
 
Code coverage
Code coverageCode coverage
Code coverage
Return on Intelligence
 
10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware Programming10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware Programming
PostSharp Technologies
 
Performance tuning Grails applications SpringOne 2GX 2014
Performance tuning Grails applications SpringOne 2GX 2014Performance tuning Grails applications SpringOne 2GX 2014
Performance tuning Grails applications SpringOne 2GX 2014
Lari Hotari
 
How to really obfuscate your pdf malware
How to really obfuscate   your pdf malwareHow to really obfuscate   your pdf malware
How to really obfuscate your pdf malwarezynamics GmbH
 
How to really obfuscate your pdf malware
How to really obfuscate your pdf malwareHow to really obfuscate your pdf malware
How to really obfuscate your pdf malwarezynamics GmbH
 
Software Project management
Software Project managementSoftware Project management
Software Project management
sameer farooq
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agilityelliando dias
 
Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...
Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...
Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...
Zhen Huang
 
Slides for Houston iPhone Developers' Meetup (April 2012)
Slides for Houston iPhone Developers' Meetup (April 2012)Slides for Houston iPhone Developers' Meetup (April 2012)
Slides for Houston iPhone Developers' Meetup (April 2012)lqi
 
OOP 2014 - Lifecycle By Design
OOP 2014 - Lifecycle By DesignOOP 2014 - Lifecycle By Design
OOP 2014 - Lifecycle By Design
Wolfgang Gottesheim
 
CQRS recepies
CQRS recepiesCQRS recepies
CQRS recepies
Francesco Garavaglia
 
How to write good quality code
How to write good quality codeHow to write good quality code
How to write good quality code
Hayden Bleasel
 
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
Emerasoft, solutions to collaborate
 
From silex to symfony and viceversa
From silex to symfony and viceversaFrom silex to symfony and viceversa
From silex to symfony and viceversa
Ronny López
 
The View - 30 proven Lotuscript tips
The View - 30 proven Lotuscript tipsThe View - 30 proven Lotuscript tips
The View - 30 proven Lotuscript tipsBill Buchan
 

Similar to Anti patterns part 2 (20)

Anti patterns part 2
Anti patterns part 2Anti patterns part 2
Anti patterns part 2
 
Growing as a software craftsperson (part 1) From Pune Software Craftsmanship.
Growing as a software craftsperson (part 1)  From Pune Software Craftsmanship.Growing as a software craftsperson (part 1)  From Pune Software Craftsmanship.
Growing as a software craftsperson (part 1) From Pune Software Craftsmanship.
 
Dev buchan 30 proven tips
Dev buchan 30 proven tipsDev buchan 30 proven tips
Dev buchan 30 proven tips
 
CS101- Introduction to Computing- Lecture 44
CS101- Introduction to Computing- Lecture 44CS101- Introduction to Computing- Lecture 44
CS101- Introduction to Computing- Lecture 44
 
Code coverage
Code coverageCode coverage
Code coverage
 
10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware Programming10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware Programming
 
Performance tuning Grails applications SpringOne 2GX 2014
Performance tuning Grails applications SpringOne 2GX 2014Performance tuning Grails applications SpringOne 2GX 2014
Performance tuning Grails applications SpringOne 2GX 2014
 
How to really obfuscate your pdf malware
How to really obfuscate   your pdf malwareHow to really obfuscate   your pdf malware
How to really obfuscate your pdf malware
 
How to really obfuscate your pdf malware
How to really obfuscate your pdf malwareHow to really obfuscate your pdf malware
How to really obfuscate your pdf malware
 
Software Project management
Software Project managementSoftware Project management
Software Project management
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
 
Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...
Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...
Talos: Neutralizing Vulnerabilities with Security Workarounds for Rapid Respo...
 
Slides for Houston iPhone Developers' Meetup (April 2012)
Slides for Houston iPhone Developers' Meetup (April 2012)Slides for Houston iPhone Developers' Meetup (April 2012)
Slides for Houston iPhone Developers' Meetup (April 2012)
 
OOP 2014 - Lifecycle By Design
OOP 2014 - Lifecycle By DesignOOP 2014 - Lifecycle By Design
OOP 2014 - Lifecycle By Design
 
CQRS recepies
CQRS recepiesCQRS recepies
CQRS recepies
 
How to write good quality code
How to write good quality codeHow to write good quality code
How to write good quality code
 
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
 
From silex to symfony and viceversa
From silex to symfony and viceversaFrom silex to symfony and viceversa
From silex to symfony and viceversa
 
The View - 30 proven Lotuscript tips
The View - 30 proven Lotuscript tipsThe View - 30 proven Lotuscript tips
The View - 30 proven Lotuscript tips
 
5 software design
5 software design5 software design
5 software design
 

More from Return on Intelligence

Clean Code Approach
Clean Code ApproachClean Code Approach
Clean Code Approach
Return on Intelligence
 
Code Coverage
Code CoverageCode Coverage
Code Coverage
Return on Intelligence
 
Effective Communication in english
Effective Communication in englishEffective Communication in english
Effective Communication in english
Return on Intelligence
 
Anti-patterns
Anti-patternsAnti-patterns
Anti-patterns
Return on Intelligence
 
Conflicts Resolving
Conflicts ResolvingConflicts Resolving
Conflicts Resolving
Return on Intelligence
 
Database versioning with liquibase
Database versioning with liquibaseDatabase versioning with liquibase
Database versioning with liquibase
Return on Intelligence
 
Effective Feedback
Effective FeedbackEffective Feedback
Effective Feedback
Return on Intelligence
 
English for Negotiations 2016
English for Negotiations 2016English for Negotiations 2016
English for Negotiations 2016
Return on Intelligence
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software Development
Return on Intelligence
 
Unit Tests? It is Very Simple and Easy!
Unit Tests? It is Very Simple and Easy!Unit Tests? It is Very Simple and Easy!
Unit Tests? It is Very Simple and Easy!
Return on Intelligence
 
Quick Start to AngularJS
Quick Start to AngularJSQuick Start to AngularJS
Quick Start to AngularJS
Return on Intelligence
 
Introduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.jsIntroduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.js
Return on Intelligence
 
Types of testing and their classification
Types of testing and their classificationTypes of testing and their classification
Types of testing and their classification
Return on Intelligence
 
Introduction to EJB
Introduction to EJBIntroduction to EJB
Introduction to EJB
Return on Intelligence
 
Enterprise Service Bus
Enterprise Service BusEnterprise Service Bus
Enterprise Service Bus
Return on Intelligence
 
Apache cassandra - future without boundaries (part3)
Apache cassandra - future without boundaries (part3)Apache cassandra - future without boundaries (part3)
Apache cassandra - future without boundaries (part3)
Return on Intelligence
 
Apache cassandra - future without boundaries (part2)
Apache cassandra - future without boundaries (part2)Apache cassandra - future without boundaries (part2)
Apache cassandra - future without boundaries (part2)
Return on Intelligence
 
Apache cassandra - future without boundaries (part1)
Apache cassandra - future without boundaries (part1)Apache cassandra - future without boundaries (part1)
Apache cassandra - future without boundaries (part1)
Return on Intelligence
 
Career development in exigen services
Career development in exigen servicesCareer development in exigen services
Career development in exigen services
Return on Intelligence
 
Introduction to selenium web driver
Introduction to selenium web driverIntroduction to selenium web driver
Introduction to selenium web driver
Return on Intelligence
 

More from Return on Intelligence (20)

Clean Code Approach
Clean Code ApproachClean Code Approach
Clean Code Approach
 
Code Coverage
Code CoverageCode Coverage
Code Coverage
 
Effective Communication in english
Effective Communication in englishEffective Communication in english
Effective Communication in english
 
Anti-patterns
Anti-patternsAnti-patterns
Anti-patterns
 
Conflicts Resolving
Conflicts ResolvingConflicts Resolving
Conflicts Resolving
 
Database versioning with liquibase
Database versioning with liquibaseDatabase versioning with liquibase
Database versioning with liquibase
 
Effective Feedback
Effective FeedbackEffective Feedback
Effective Feedback
 
English for Negotiations 2016
English for Negotiations 2016English for Negotiations 2016
English for Negotiations 2016
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software Development
 
Unit Tests? It is Very Simple and Easy!
Unit Tests? It is Very Simple and Easy!Unit Tests? It is Very Simple and Easy!
Unit Tests? It is Very Simple and Easy!
 
Quick Start to AngularJS
Quick Start to AngularJSQuick Start to AngularJS
Quick Start to AngularJS
 
Introduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.jsIntroduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.js
 
Types of testing and their classification
Types of testing and their classificationTypes of testing and their classification
Types of testing and their classification
 
Introduction to EJB
Introduction to EJBIntroduction to EJB
Introduction to EJB
 
Enterprise Service Bus
Enterprise Service BusEnterprise Service Bus
Enterprise Service Bus
 
Apache cassandra - future without boundaries (part3)
Apache cassandra - future without boundaries (part3)Apache cassandra - future without boundaries (part3)
Apache cassandra - future without boundaries (part3)
 
Apache cassandra - future without boundaries (part2)
Apache cassandra - future without boundaries (part2)Apache cassandra - future without boundaries (part2)
Apache cassandra - future without boundaries (part2)
 
Apache cassandra - future without boundaries (part1)
Apache cassandra - future without boundaries (part1)Apache cassandra - future without boundaries (part1)
Apache cassandra - future without boundaries (part1)
 
Career development in exigen services
Career development in exigen servicesCareer development in exigen services
Career development in exigen services
 
Introduction to selenium web driver
Introduction to selenium web driverIntroduction to selenium web driver
Introduction to selenium web driver
 

Recently uploaded

First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
e20449
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Pro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp BookPro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp Book
abdulrafaychaudhry
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi ArabiaTop 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
Yara Milbes
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 

Recently uploaded (20)

First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Pro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp BookPro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp Book
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi ArabiaTop 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 

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 Part 1 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 6 www.ExigenServices.com 6
  • 7. 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. 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
  • 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 Hard coding • 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 18 www.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: 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
  • 21. 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
  • 22. 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
  • 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
  • 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 Part 2 Methodological anti-patterns 28
  • 29. 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
  • 30. 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
  • 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 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
  • 40. 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. 41 www.ExigenServices.com Part 3 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
  • 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