SlideShare a Scribd company logo
Core Systems Transformation Solutions
Anti-patterns
April 16, 2015
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples
Confidential
• Questions: end of sections only
Our workflow
? ? ? ? ?
Confidential
• Discussions: end of training
Our workflow
? ? ? ? ?
?????
Confidential
• … a common response to a recurring problem that is usually
ineffective and risks being highly counterproductive.
Anti-pattern is…
• … a common response to a recurring problem that is usually
ineffective and risks being highly counterproductive.
Confidential
• Process, solution, actions — obvious, but ineffective
• Alternative solution — working and effective
Anti-pattern includes
Confidential
• Know your enemy
Goals
Confidential
• Use common terms
– as with patterns
Goals
Confidential
• Recognize problem early
Goals
Confidential
• Don’t “walk on known rakes”
Goals
Confidential
• Haste
Root causes
Confidential
• Ignorance
Root causes
Confidential
• Laziness
Root causes
Confidential
• Arrogance
Root causes
Confidential
• Summary:
“I don’t have time and I don’t feel like learning all that crap, I’ll do without!”
Root causes
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples
Confidential
• The way we code
Methodological anti-patterns
Confidential
• The name says it all
– just copy your code fragments
Copy & paste
Confidential
• Refactoring
– Extract method
– Use IDE tools
Copy & paste — solution
Confidential
• If all you have is a hammer, everything looks like a nail
– “Law of the instrument”
Golden hammer
Confidential
• Look at the problem from another point of view
• Look at another technology
• How many patterns do you remember?
Golden hammer — solutions
Confidential
• Learn more than one tool!
Golden hammer — solutions
Confidential
• Battle for the performance from start
– Repeat for every line you add
– Sacrifice the design if needed
– No need to measure with performance tests!
Premature optimization
Confidential
• A simple design is easier to optimize
• Measure your performance
• Optimize worst points first
• Mind the 80-20 rule
Premature optimization — solutions
Confidential
• Forget about that performance!
– Design is über alles
– Don’t bother caching
– Copy heavyweight containers
– …? (Add your option)
Premature pessimization
Confidential
Keep the balance!
Confidential
• Create your own solution for everything
– and be original…
Reinventing the square wheel
Confidential
• Be aware of existing solutions, libraries etc.
• Don’t be afraid of them
• But be sure you understand them
Reinventing the square wheel — solution
Confidential
• Copy & paste
• Golden hammer
• Premature optimization
• Premature pessimization
• Reinventing the square wheel
Methodological anti-patterns
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples
Confidential
• Our everyday “friends”
Coding anti-patterns
Confidential
• “Tactical” level
– but can affect project in general
Coding anti-patterns
Confidential
• Ongoing improvements
– “Keep your planet clean”
• “Clean code” approach
Coding anti-patterns
Confidential
Coding anti-patterns
Confidential
• Use unexplained numbers in code
• … or even unexplained strings
• … or explained only in javadocs
Magic numbers
Confidential
• Solution: Replace with constants
– Easier to read
– Easier to change
Magic numbers — solution
Confidential
• Add MORE complexity to the solution
– essential complexity: we have a hard problem
– accidental complexity: we have made a problem hard
Accidental complexity
Confidential
• Solution:
– Avoid “tricky code”
– Check yourself
– Keep cleaning your code
Accidental complexity — solution
Confidential
• Use patterns, technologies, frameworks
without understanding why
Cargo cult programming
Confidential
• Understand what you are doing
• Learn!
Cargo cult programming — solution
Confidential
• Guess the problem source
• Don’t use logs, stack traces, local bug reproducing
• Fix the symptoms only
Shot in the dark
Confidential
Shot in the dark
Confidential
Shot in the dark
Confidential
• Tactical: understand the problem before fixing
• Really fix it – not only cure the symptoms
Shot in the dark – solutions
Confidential
• Strategical: provide yourself with diagnostic tools
– Use logging
– Keep stacktrace
– Document steps
Shot in the dark – solutions
Confidential
• Just fix and commit: we have QA anyway, no need for self-testing
• Just use this class: there are hardly any restrictions
Blind faith
Confidential
• Aviation rule: Don’t assume — check!
Blind faith — solutions
Confidential
• Don’t remove any code!
You may need it… sometimes… probably…
Boat anchor
Confidential
• “Is this code working or obsolete?”
Boat anchor — consequences
Confidential
• “That ancient mess?! We’ll better write a new one!”
Boat anchor — consequences
Confidential
VCS.
Boat anchor — solution
Just use it.
Confidential
• Don’t even touch that code!
– It will take time…
– It can affect… something, we don’t even know what!
Lava flow
Confidential
• Things will get only worse by themselves
Lava flow — consequences
Confidential
• Write tests before refactoring
– And you will be more confident while cleaning
Lava flow — solutions
Confidential
• Remember?
Keep. Your. Planet. Clean.
Lava flow — solutions
Confidential
• Don’t tell user what’s happening
Error hiding
This should be enough.
Confidential
• Cause: desire to hide complexity
• Solution:
– simplified message for user
– detailed message in log
– show errors depending on environments
Error hiding — solutions
Confidential
• Just keep adding lines to the method
– Using labels made it even more spicy in olden days
– But you still can do it with IF’s just like that
Spaghetti code
Confidential
• “Clean code” practices
– E.g.: methods not longer than a screen
• Use metrics to stay warned!
Spaghetti code — solutions
Confidential
More food!
Ravioli code Lasagna code
Confidential
• Keep all configuration at hand: have it all in code!
– Usernames, passwords, hosts, paths…
Hard coding
Confidential
• Properties files
• User input
• External configuration
Hard coding — solutions
Confidential
• OK, OK, I got it. No more business logic in code!
– Let’s move everything to… database?
Soft coding
There’s definitely something wrong here…
Confidential
Smart coding!
Confidential
• Have a special code for every new special case
– Refactoring is for cowards!
Coding by exception
Confidential
• It is not about try-catch
• New case can be not-so-new
• Adapt your code
Coding by exception — details
Confidential
• Accidental complexity
• Cargo cult programming
• Shot in the dark
• Blind faith
• Boat anchor
• Lava flow
• Error hiding
• Spaghetti code
• Hard coding
• Soft coding
• Coding by exception
Coding anti-patterns
Confidential
• How to prevent?
Methodological & coding anti-patterns
Confidential
• Inspections
• Code reviews
• Metrics
• Mind your technical debt!
Methodological & coding anti-patterns
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples
Confidential
• The way the system is designed
– on classes level
Object-oriented design anti-patterns
Confidential
• Is circle an ellipse?
Circle-ellipse problem
Confidential
• No!
…says Liskov’s substitution principle
• Ellipse.stretchX()
– Can not be replaced with Circle!
Circle-ellipse problem
Confidential
• Return success/failure value; or raise an exception
– OperationNotSupportedException
• Return the new value (no change for Circle)
• Allow for a weaker contract
– stretchX() also calls stretchY() (Surprise!)
• Use immutable objects
• Question the hierarchy
– Circle.asEllipse()
Circle-ellipse problem — solutions
Confidential
• Let your modules depend on each other
– Enlarge your coupling!
Circular dependency
Confidential
• Acyclic Dependencies Principle
– Have a Directed Acyclic Graph of dependencies
Circular dependency — solution
Confidential
• Dependency Inversion Principle
Circular dependency — solution
Confidential
• When your domain objects contain little or no business logic
Anemic domain model
Confidential
• Any benefits?
• Clear separation between logic and data
• “Pure fabrication” pattern support
– “Service” classes
Anemic domain model
Confidential
• Liabilities?
Anemic domain model
• Not really object-oriented way
• Data can be inconsistent (no validation)
• Increased coupling
Confidential
• One class to rule them all
Monster object
Confidential
• Hard to maintain
• No “Single responsibility”
• Testability problems
Monster object — drawbacks
Confidential
• Beware of: …Driver, …Manager, …System
• Follow SRP
• Use testability as a problem detector
Monster object — solution
Confidential
• Extend a utility object to have access to its methods
– Bonus: strange hierarchy
– Bonus: unexpected internals
BaseBean
Confidential
• Use delegation
• “Composition over inheritance” principle
– Interfaces help decoupling
BaseBean — solution
Confidential
• A retro-style way of shortening constants
• Pollutes the class namespace
• Not a part of implementing class API
Constant interface
Confidential
• Do it modern style!
– Create a class with constants
– Use static imports
Constant interface — solution
Confidential
• When methods order is important
Sequential coupling
Hmm… or maybe?
Confidential
• Be suspicious about start…(), init…() methods
• Don’t reveal your class details
• Use “Template method” pattern
Sequential coupling — solution
Confidential
• Circle-ellipse problem
• Circular dependency
• Anemic domain model
• Monster object
• BaseBean
• Constant interface
• Sequential coupling
Object-oriented design anti-patterns
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples
Confidential
• The way the system is designed
– on architectural level
Software design anti-patterns
Confidential
• More features, less benefits
Software bloat
• Plug-ins (extensions, add-ons)
• Similar anti-patterns?
Confidential
• Architecture?
No time for this!
Big ball of mud
• Reasons:
– business pressure
– developers rotation
• Symptoms
– bugfixing as a main task
– maintenance nightmare
Confidential
• Everything can be improved
a bit more
– when should you stop?
Gold plating
• Efforts distribution
• Pareto principle (80/20)
Confidential
• Software bloat
• Big ball of mud
• Gold plating
• …
Software design anti-patterns
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples
Confidential
• Everyone knows the project is going to fail
– But the truth is hidden to prevent project cancellation
• Alternatively: unreasonable deadline
– And unnecessary overtime work
Death march
Confidential
• Rely on heroic efforts (of one or more persons)
– Even base estimates on them
Hero mode
• Solutions:
– Make honest estimates
– Distribute tasks
– Don’t reward heroic behavior
Confidential
• “No-no, we cannot do anything in this module without John!”
• “I don’t know about it. Ask Mary, she has written all this code.”
• “I like to work alone. It’s just my way of working.”
Lonely rider
• Solutions:
– If you have an irreplaceable person — replace him ASAP
– Knowledge sharing
– Peer reviews
– Mentoring to less experienced
developers
Confidential
• Pay too much attention to measurement data
– Due to your ignorance or on purpose
Metric abuse
• Solutions:
– Ensure that everyone understands metrics meanings
– Remember: metrics are means, not goals
Confidential
• Seagull manager
– flies in,
– makes a lot of noise,
– craps on everything
– and flies out again.
Seagull management
• Solutions:
– … show him this definition?
Confidential
• Death march
• Hero mode
• Lonely rider
• Metrics abuse
• Seagull management
• …
Project management anti-patterns
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples: Organizational APs
Confidential
• “Measure thrice and cut once”
– Some people prefer to measure even more times…
Analysis paralysis
• In software development: long phases of
– project planning
– requirements gathering
– program design
– …
Confidential
• “Two heads are better than one”
– The more heads, the better?
Design by committee
• Many contributors, but no unifying vision
Confidential
Escalation of commitment
• English proverb: “Throw good money after bad”
• Examples:
– Bidding wars (“Dollar auction”)
– Trying to revive the inevitably dying project
Confidential
• Use a vendor you can’t change without losses
Vendor lock-in
• Examples:
– SIM locking
– Gift certificates
– Sony Memory Stick
– External service or framework
• Solution:
– Isolation layer
Confidential
• Analysis paralysis
• Design by committee
• Escalation of commitment
• Vendor lock-in
Organizational anti-patterns
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples: UI APs
Confidential
• Use link text that does not correspond to the target
“Click here”
For downloading demo version, click here.
For reading the online documentation, click here.
You can download demo version
or read the online documentation,
Confidential
• Open your menu on hover, not on click
– And hide it once the cursor is out
– That will train visitors’ fine motor skills. And patience.
Hover menus
Confidential
• Make important icon/link too small
– Yes, fine motor skills again
Tiny targets
► Gadgets
► Buildings
► Food
▼ Transport
► DeLorean
► Hoverboard
Only bullets are clickable
Confidential
• Is it a switch or an indicator?
Mixing status and action
Confidential
• Let switch indicate its state:
Mixing status and action
Confidential
• Show all the power of your software at once!
Bloated interface
Confidential
• “Click here”
• Hover menus
• Tiny targets
• Mixing status and action
• Bloated interface
UI anti-patterns
Confidential
Agenda
• Introduction
– definitions
– reasons to learn
– root causes
• Methodological APs
• Coding APs
• OOD APs
• Software design APs
• Project Management APs
• Other AP examples
Confidential
One problem…
Conclusion
Confidential
Different layers…
Conclusion
Confidential
Different anti-patterns
Conclusion
Confidential
Any other examples?
Conclusion
Confidential
Hope for your feedbacks!
Thank you
Confidential
Thank you
Andrew I. Uvarov
Java developer
andrew.uvarov@returnonintelligence.com

More Related Content

What's hot

Introduction to monte-carlo analysis for software development - Troy Magennis...
Introduction to monte-carlo analysis for software development - Troy Magennis...Introduction to monte-carlo analysis for software development - Troy Magennis...
Introduction to monte-carlo analysis for software development - Troy Magennis...
Troy Magennis
 
Designing a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd productsDesigning a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd products
Julian Mazzitelli
 
Multi-Datacenter Kafka - Strata San Jose 2017
Multi-Datacenter Kafka - Strata San Jose 2017Multi-Datacenter Kafka - Strata San Jose 2017
Multi-Datacenter Kafka - Strata San Jose 2017
Gwen (Chen) Shapira
 
Integrating Black Duck into your Agile DevOps Environment
Integrating Black Duck into your Agile DevOps EnvironmentIntegrating Black Duck into your Agile DevOps Environment
Integrating Black Duck into your Agile DevOps Environment
Black Duck by Synopsys
 
2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...
2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...
2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...
Andrey Devyatkin
 
LMAX Disruptor - High Performance Inter-Thread Messaging Library
LMAX Disruptor - High Performance Inter-Thread Messaging LibraryLMAX Disruptor - High Performance Inter-Thread Messaging Library
LMAX Disruptor - High Performance Inter-Thread Messaging Library
Sebastian Andrasoni
 
2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?
2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?
2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?
Miles Chou
 
Minimum Viable Architecture -- Good Enough is Good Enough in a Startup
Minimum Viable Architecture -- Good Enough is Good Enough in a StartupMinimum Viable Architecture -- Good Enough is Good Enough in a Startup
Minimum Viable Architecture -- Good Enough is Good Enough in a Startup
Randy Shoup
 
Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...
Bilgin Ibryam
 
Lessons from managing a Pulsar cluster (Nutanix)
Lessons from managing a Pulsar cluster (Nutanix)Lessons from managing a Pulsar cluster (Nutanix)
Lessons from managing a Pulsar cluster (Nutanix)
StreamNative
 
Improving go-git performance
Improving go-git performanceImproving go-git performance
Improving go-git performance
source{d}
 
Microservices Part 3 Service Mesh and Kafka
Microservices Part 3 Service Mesh and KafkaMicroservices Part 3 Service Mesh and Kafka
Microservices Part 3 Service Mesh and Kafka
Araf Karsh Hamid
 
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
Carlos Buenosvinos
 
The Four Keys - Measuring DevOps Success
The Four Keys - Measuring DevOps SuccessThe Four Keys - Measuring DevOps Success
The Four Keys - Measuring DevOps Success
Dina Graves Portman
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelines
Lalit Kale
 
Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...
Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...
Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...
HostedbyConfluent
 
Feature flags to speed up & de risk development
Feature flags to speed up & de risk developmentFeature flags to speed up & de risk development
Feature flags to speed up & de risk development
LaunchDarkly
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
Mattia Battiston
 
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Carlos Buenosvinos
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking VN
 

What's hot (20)

Introduction to monte-carlo analysis for software development - Troy Magennis...
Introduction to monte-carlo analysis for software development - Troy Magennis...Introduction to monte-carlo analysis for software development - Troy Magennis...
Introduction to monte-carlo analysis for software development - Troy Magennis...
 
Designing a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd productsDesigning a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd products
 
Multi-Datacenter Kafka - Strata San Jose 2017
Multi-Datacenter Kafka - Strata San Jose 2017Multi-Datacenter Kafka - Strata San Jose 2017
Multi-Datacenter Kafka - Strata San Jose 2017
 
Integrating Black Duck into your Agile DevOps Environment
Integrating Black Duck into your Agile DevOps EnvironmentIntegrating Black Duck into your Agile DevOps Environment
Integrating Black Duck into your Agile DevOps Environment
 
2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...
2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...
2020-02-20 - HashiCorpUserGroup Madring - Integrating HashiCorp Vault and Kub...
 
LMAX Disruptor - High Performance Inter-Thread Messaging Library
LMAX Disruptor - High Performance Inter-Thread Messaging LibraryLMAX Disruptor - High Performance Inter-Thread Messaging Library
LMAX Disruptor - High Performance Inter-Thread Messaging Library
 
2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?
2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?
2019/7/27 先別開 Branch 了,你聽過 Feature Toggle 嗎?
 
Minimum Viable Architecture -- Good Enough is Good Enough in a Startup
Minimum Viable Architecture -- Good Enough is Good Enough in a StartupMinimum Viable Architecture -- Good Enough is Good Enough in a Startup
Minimum Viable Architecture -- Good Enough is Good Enough in a Startup
 
Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...
 
Lessons from managing a Pulsar cluster (Nutanix)
Lessons from managing a Pulsar cluster (Nutanix)Lessons from managing a Pulsar cluster (Nutanix)
Lessons from managing a Pulsar cluster (Nutanix)
 
Improving go-git performance
Improving go-git performanceImproving go-git performance
Improving go-git performance
 
Microservices Part 3 Service Mesh and Kafka
Microservices Part 3 Service Mesh and KafkaMicroservices Part 3 Service Mesh and Kafka
Microservices Part 3 Service Mesh and Kafka
 
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
 
The Four Keys - Measuring DevOps Success
The Four Keys - Measuring DevOps SuccessThe Four Keys - Measuring DevOps Success
The Four Keys - Measuring DevOps Success
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelines
 
Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...
Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...
Fan-out, fan-in & the multiplexer: Replication recipes for global platform di...
 
Feature flags to speed up & de risk development
Feature flags to speed up & de risk developmentFeature flags to speed up & de risk development
Feature flags to speed up & de risk development
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKI
 

Viewers also liked

El Valor de la Semilla en el Mundo Andino
El Valor de la Semilla en el Mundo AndinoEl Valor de la Semilla en el Mundo Andino
El Valor de la Semilla en el Mundo Andinosemillasdediversidad
 
Desarrollo humano sustentable.
Desarrollo humano sustentable.Desarrollo humano sustentable.
Desarrollo humano sustentable.
Yakari Castillo
 
Tracking Family Planning Spending Using the System of Health Accounts Framework
Tracking Family Planning Spending Using the System of Health Accounts FrameworkTracking Family Planning Spending Using the System of Health Accounts Framework
Tracking Family Planning Spending Using the System of Health Accounts Framework
HFG Project
 
Mentorprise presentation 2013 nederlands online
Mentorprise presentation 2013 nederlands   onlineMentorprise presentation 2013 nederlands   online
Mentorprise presentation 2013 nederlands online
Marleen Smekens
 
Psicofisiologia mapa mental
Psicofisiologia mapa mentalPsicofisiologia mapa mental
Psicofisiologia mapa mental
angeloxdvlp
 
Campagne Cuisine Home Store
Campagne Cuisine Home StoreCampagne Cuisine Home Store
Campagne Cuisine Home Store
Christophe Zencom
 
26 provervios 26 fruto de la necedad
26 provervios 26 fruto de la necedad26 provervios 26 fruto de la necedad
26 provervios 26 fruto de la necedad
Comparte la Biblia
 
Corporate Brief_WOXI
Corporate Brief_WOXICorporate Brief_WOXI
Corporate Brief_WOXISandeep Patil
 
Flashmob Choregraphy
Flashmob ChoregraphyFlashmob Choregraphy
Flashmob Choregraphy
gsujan
 
Definicion psicofisiologia
Definicion psicofisiologiaDefinicion psicofisiologia
Definicion psicofisiologia
Anais Hartmann
 
Sistema Científico Tecnológico de Venezuela
Sistema Científico Tecnológico de Venezuela Sistema Científico Tecnológico de Venezuela
Sistema Científico Tecnológico de Venezuela
Hiawatha Armenante
 
Exploration and production policies Of Oil & Gas in Norway
Exploration and production policies Of Oil & Gas in NorwayExploration and production policies Of Oil & Gas in Norway
Exploration and production policies Of Oil & Gas in Norway
Abhishek Rajvanshi
 

Viewers also liked (15)

El Valor de la Semilla en el Mundo Andino
El Valor de la Semilla en el Mundo AndinoEl Valor de la Semilla en el Mundo Andino
El Valor de la Semilla en el Mundo Andino
 
Desarrollo humano sustentable.
Desarrollo humano sustentable.Desarrollo humano sustentable.
Desarrollo humano sustentable.
 
Tracking Family Planning Spending Using the System of Health Accounts Framework
Tracking Family Planning Spending Using the System of Health Accounts FrameworkTracking Family Planning Spending Using the System of Health Accounts Framework
Tracking Family Planning Spending Using the System of Health Accounts Framework
 
Mentorprise presentation 2013 nederlands online
Mentorprise presentation 2013 nederlands   onlineMentorprise presentation 2013 nederlands   online
Mentorprise presentation 2013 nederlands online
 
Psicofisiologia mapa mental
Psicofisiologia mapa mentalPsicofisiologia mapa mental
Psicofisiologia mapa mental
 
Campagne Cuisine Home Store
Campagne Cuisine Home StoreCampagne Cuisine Home Store
Campagne Cuisine Home Store
 
AMC
AMCAMC
AMC
 
26 provervios 26 fruto de la necedad
26 provervios 26 fruto de la necedad26 provervios 26 fruto de la necedad
26 provervios 26 fruto de la necedad
 
Comapny Presentation
Comapny PresentationComapny Presentation
Comapny Presentation
 
Corporate Brief_WOXI
Corporate Brief_WOXICorporate Brief_WOXI
Corporate Brief_WOXI
 
4.02.14 red 3
4.02.14   red  34.02.14   red  3
4.02.14 red 3
 
Flashmob Choregraphy
Flashmob ChoregraphyFlashmob Choregraphy
Flashmob Choregraphy
 
Definicion psicofisiologia
Definicion psicofisiologiaDefinicion psicofisiologia
Definicion psicofisiologia
 
Sistema Científico Tecnológico de Venezuela
Sistema Científico Tecnológico de Venezuela Sistema Científico Tecnológico de Venezuela
Sistema Científico Tecnológico de Venezuela
 
Exploration and production policies Of Oil & Gas in Norway
Exploration and production policies Of Oil & Gas in NorwayExploration and production policies Of Oil & Gas in Norway
Exploration and production policies Of Oil & Gas in Norway
 

Similar to Anti-patterns

ScalaClean at ScalaSphere 2019
ScalaClean at ScalaSphere 2019ScalaClean at ScalaSphere 2019
ScalaClean at ScalaSphere 2019
Rory Graves
 
Technical Excellence Doesn't Just Happen--Igniting a Craftsmanship Culture
Technical Excellence Doesn't Just Happen--Igniting a Craftsmanship CultureTechnical Excellence Doesn't Just Happen--Igniting a Craftsmanship Culture
Technical Excellence Doesn't Just Happen--Igniting a Craftsmanship Culture
Allison Pollard
 
Automation: from local test to production deploy - 2020-11-05
Automation: from local test to production deploy - 2020-11-05Automation: from local test to production deploy - 2020-11-05
Automation: from local test to production deploy - 2020-11-05
Alessandra Bilardi
 
Puppet101
Puppet101Puppet101
Puppet101
Puppet
 
The business case for contributing code
The business case for contributing codeThe business case for contributing code
The business case for contributing code
Zivtech, LLC
 
Component-first Applications
Component-first ApplicationsComponent-first Applications
Component-first Applications
Miguelangel Fernandez
 
Why puppet? Why now?
Why puppet? Why now?Why puppet? Why now?
Why puppet? Why now?
Server Density
 
Kylin Engineering Principles
Kylin Engineering PrinciplesKylin Engineering Principles
Kylin Engineering Principles
Xu Jiang
 
5 Steps on the Way to Continuous Delivery
5 Steps on the Way to Continuous Delivery5 Steps on the Way to Continuous Delivery
5 Steps on the Way to Continuous Delivery
XebiaLabs
 
Staging and Deployment
Staging and DeploymentStaging and Deployment
Staging and Deployment
heyrocker
 
Anti-patterns
Anti-patternsAnti-patterns
Anti-patterns
Return on Intelligence
 
Clean code, Feb 2012
Clean code, Feb 2012Clean code, Feb 2012
Clean code, Feb 2012cobyst
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
Alan Christensen
 
Large Scale Architecture -- The Unreasonable Effectiveness of Simplicity
Large Scale Architecture -- The Unreasonable Effectiveness of SimplicityLarge Scale Architecture -- The Unreasonable Effectiveness of Simplicity
Large Scale Architecture -- The Unreasonable Effectiveness of Simplicity
Randy Shoup
 
Scaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHPScaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHP
120bi
 
Scaling High Traffic Web Applications
Scaling High Traffic Web ApplicationsScaling High Traffic Web Applications
Scaling High Traffic Web Applications
Achievers Tech
 
Leandro Melendez - Switching Performance Left & Right
Leandro Melendez - Switching Performance Left & RightLeandro Melendez - Switching Performance Left & Right
Leandro Melendez - Switching Performance Left & Right
Neotys_Partner
 
Babysitting your orm essenmacher, adam
Babysitting your orm   essenmacher, adamBabysitting your orm   essenmacher, adam
Babysitting your orm essenmacher, adamAdam Essenmacher
 
DCDNUG 10/16/2012 Automated testing obstacles pitfalls dangers
DCDNUG 10/16/2012 Automated testing obstacles pitfalls dangersDCDNUG 10/16/2012 Automated testing obstacles pitfalls dangers
DCDNUG 10/16/2012 Automated testing obstacles pitfalls dangersStephen Ritchie
 

Similar to Anti-patterns (20)

ScalaClean at ScalaSphere 2019
ScalaClean at ScalaSphere 2019ScalaClean at ScalaSphere 2019
ScalaClean at ScalaSphere 2019
 
Technical Excellence Doesn't Just Happen--Igniting a Craftsmanship Culture
Technical Excellence Doesn't Just Happen--Igniting a Craftsmanship CultureTechnical Excellence Doesn't Just Happen--Igniting a Craftsmanship Culture
Technical Excellence Doesn't Just Happen--Igniting a Craftsmanship Culture
 
Automation: from local test to production deploy - 2020-11-05
Automation: from local test to production deploy - 2020-11-05Automation: from local test to production deploy - 2020-11-05
Automation: from local test to production deploy - 2020-11-05
 
Puppet101
Puppet101Puppet101
Puppet101
 
The business case for contributing code
The business case for contributing codeThe business case for contributing code
The business case for contributing code
 
Component-first Applications
Component-first ApplicationsComponent-first Applications
Component-first Applications
 
Why puppet? Why now?
Why puppet? Why now?Why puppet? Why now?
Why puppet? Why now?
 
Kylin Engineering Principles
Kylin Engineering PrinciplesKylin Engineering Principles
Kylin Engineering Principles
 
5 Steps on the Way to Continuous Delivery
5 Steps on the Way to Continuous Delivery5 Steps on the Way to Continuous Delivery
5 Steps on the Way to Continuous Delivery
 
Testing gone-right
Testing gone-rightTesting gone-right
Testing gone-right
 
Staging and Deployment
Staging and DeploymentStaging and Deployment
Staging and Deployment
 
Anti-patterns
Anti-patternsAnti-patterns
Anti-patterns
 
Clean code, Feb 2012
Clean code, Feb 2012Clean code, Feb 2012
Clean code, Feb 2012
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
 
Large Scale Architecture -- The Unreasonable Effectiveness of Simplicity
Large Scale Architecture -- The Unreasonable Effectiveness of SimplicityLarge Scale Architecture -- The Unreasonable Effectiveness of Simplicity
Large Scale Architecture -- The Unreasonable Effectiveness of Simplicity
 
Scaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHPScaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHP
 
Scaling High Traffic Web Applications
Scaling High Traffic Web ApplicationsScaling High Traffic Web Applications
Scaling High Traffic Web Applications
 
Leandro Melendez - Switching Performance Left & Right
Leandro Melendez - Switching Performance Left & RightLeandro Melendez - Switching Performance Left & Right
Leandro Melendez - Switching Performance Left & Right
 
Babysitting your orm essenmacher, adam
Babysitting your orm   essenmacher, adamBabysitting your orm   essenmacher, adam
Babysitting your orm essenmacher, adam
 
DCDNUG 10/16/2012 Automated testing obstacles pitfalls dangers
DCDNUG 10/16/2012 Automated testing obstacles pitfalls dangersDCDNUG 10/16/2012 Automated testing obstacles pitfalls dangers
DCDNUG 10/16/2012 Automated testing obstacles pitfalls dangers
 

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
 
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
 
Enterprise service bus part 2
Enterprise service bus part 2Enterprise service bus part 2
Enterprise service bus part 2
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
 
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
 
Enterprise service bus part 2
Enterprise service bus part 2Enterprise service bus part 2
Enterprise service bus part 2
 

Recently uploaded

Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
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
 
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
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
Ortus Solutions, Corp
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
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
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
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
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
timtebeek1
 
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
 
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
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
abdulrafaychaudhry
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
Game Development with Unity3D (Game Development lecture 3)
Game Development  with Unity3D (Game Development lecture 3)Game Development  with Unity3D (Game Development lecture 3)
Game Development with Unity3D (Game Development lecture 3)
abdulrafaychaudhry
 

Recently uploaded (20)

Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
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
 
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
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
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
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
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
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
 
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
 
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
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
Game Development with Unity3D (Game Development lecture 3)
Game Development  with Unity3D (Game Development lecture 3)Game Development  with Unity3D (Game Development lecture 3)
Game Development with Unity3D (Game Development lecture 3)
 

Anti-patterns

Editor's Notes

  1. Добрый день, меня зовут Андрей Уваров, я Java-разработчик в компании Return on Intelligence. Приветствую вас на вебинаре про антипаттерны в разработке ПО. ==00:05==
  2. Пара слов о том, чем мы сегодня займёмся: Начнём мы, естественно, с того, что -- дадим определение, что же это такое, антипаттерны -- выясним, для чего их вообще изучать -- поймём, что приводит к их появлению И потом разберём примеры наиболее часто встречающихся АП Их много, как и паттернов, но можно выделить группы Пойдём, поднимаясь по иерархии, от низких уровней к более высоким От написания кода и до управления проектами Немного обсудим вопросы, которые у нас обязательно возникнут
  3. Теперь ещё буквально пара слов о том, как будет построен вебинар Довольно большой объём информации, и чтобы эффективнее использовать наше время, я попрошу записывать вопросы и задавать их в конце раздела
  4. В конце вебинара у нас специально запланировано время на обсуждения и любые вопросы по всему материалу Итак, начнём с определения, что такое АП...
  5. Антипаттерн – этоооооо... Часто встречающееся плохое решение известных проблем. Например Мы слушаем тренинг Открывается новый слайд Читаем его, пропуская то, что говорит ведущий Не получается толком ни то, ни другое Это и есть антипаттерн Можно и иначе – готовим тренинг пишем на слайде много-много текста потом читаем его или, наоборот, рассчитываем, что написанное уже всяко доведено до слушателей, и говорим совсем другое всё равно неудачно получается Шаблон поведения, вроде бы естественный, напрашивающийся, но на самом деле приводящий к ухудшению ситуации. Мы все знаем про паттерны – это когда у нас есть проблема, и мы делаем что-то, чтобы её решить. А антипаттерн – это когда есть проблема, мы делаем что-то, чтобы её решить, а получается только хуже.
  6. Описание АП включает -- некий кажущийся очевидным ответ на проблему, в лучшем случае бесполезный, а то и вредный -- альтернативное решение, работающее и доказавшее свою эффективность -- Говорить про паттерны мы будем в виде вредных советов, паучок на слайде как раз и будет нам их давать.
  7. Для чего изучать АП? «Знать врага в лицо» Понимать, что некая ситуация является известной проблемой, сложной или простой, но, как правило, решаемой.
  8. «Говорить на одном языке» Использовать одну и ту же терминологию при обсуждениях, поиске информации, обмене опытом. Достаточно сказать «у нас тут образовались магические числа», и собеседник понимает, о чём речь. Аналогично с паттернами.
  9. «Вовремя распознать проблему»
  10. «Не наступать на известные грабли» В своей работе мы и так достаточно часто встречаемся с «граблями» -- неожиданно возникающими проблемами. Хорошо бы вовремя заметить хотя бы те, по которым уже потоптались до нас.
  11. Что вообще приводит к такому шаблонному и ошибочному поведению? Спешка Помните его девиз? «И так сойдёт»
  12. Невежество, незнание
  13. Лень
  14. Самонадеянность
  15. «Мне некогда и неохота что-то там учить, справлюсь и так»
  16. ==00:10== Со вводной частью мы закончили, давайте перейдём непосредственно к примерам конкретных антипаттернов Начнём с группы, условно названной «методологические»
  17. Способы, приёмы нашей работы Именно методология программирования
  18. Начну с самого, самого известного и самого всеми любимого антипаттерна – «копипаст» Паучок даёт вредный совет: просто копипастите нужный фрагмент кода туда, где он тоже требуется Известный АП, все мы знаем, что так делать плохо... А, собственно, почему? Если вкратце, в двух словах сформулировать? -- сложность поддержки кода
  19. Посмотреть на проблему с другой точки зрения – может, там хоть резьбу увидите? Подумать про другую технологию – пересмотреть свой ящик с инструментами (у вас ведь ящик? Не один только молоток?) Ближайший пример: вы знаете много паттернов? Если их считанные единицы, вы и будете применять в основном их
  20. Закону инструмента легче противостоять, если инструментов в арсенале много Чем больше, тем лучше
  21. Преждевременная оптимизация Займёмся ею с самого начала Добавили строчку – стали думать, как оптимизировать Если нужно, пожертвуем и дизайном, лишь бы ускорить А раз оптимизируем всё и сразу – то не нужны и пифоманс тесты
  22. Проще дизайн – проще оптимизировать Прежде всего измерения, не надо вслепую Если уж оптимизируем, то сначала там, где особо нужно 80/20
  23. Иногда можно уйти в другую крайность Дизайн превыше всего Кэширование никому не нужно Копируем объекты не задумываясь ...ещё варианты? Как можно ухудшить пифоманс?
  24. Кот как бы говорит нам: соблюдаем баланс Не бросаемся в крайности
  25. Изобретение квадратного колеса Два аспекта – и то, что изобретаем уже существующее, и то, что оно получается хуже
  26. Знать о существующих решениях Не бояться применять (+ АП «Сделано не здесь») Но понимать, что именно делаешь (+ «Карго-культ»)
  27. Закончим на этом с примерами методологических АП Если у вас возникли какие-то вопросы по уже услышанному – самое время их задать, я постараюсь ответить
  28. Подстерегают нас, разработчиков, буквально каждый день во время нашей работы
  29. Самый «низкий» уровень, но проблемы здесь могут влиять на проект целиком.
  30. Как им противостоять? Только постоянным стремлением к улучшению Баобабы проблем лучше выкорчёвывать, пока они маленькие Идеология «Чистого кода» (Роберт Мартин) Предлагает улучшать код понемногу, в процессе работы над задачами проекта. Следите за чистотой кода
  31. Разберём некоторые наиболее популярные антипаттерны Не стоит вглядываться в этот код, это пока ещё не антипаттерн, а просто ретро-картинка про кодирование
  32. Например: double total = 1.13 * price;
  33. Вместо этого: public static final double TAX_RATE = 1.08; (…) double total = TAX_RATE * price; Причём тут надо очень строго оценивать необходимость константы, при малейших сомнениях – лучше определять её. Этой ошибки, кстати, не избежал даже Роберт Мартин в «Чистом коде». «Число 5280 – количество футов в миле – настолько хорошо известно и уникально, что читатель сразу узнает его, даже если оно будет располагаться вне какого-либо контекста.» Забавно, да? Вот в следующий раз, когда вам захочется использовать 86400 прямо в коде, без константы – вспомните этот пример.
  34. Видели такой код, правда? Перед вами антипаттерн «Искусственная сложность» В отличие от essential complexity, естественной Причины: Например, изменившиеся бизнес-требования. Было многоступенчатое ветвление, часть веток стала неактуальной. При исправлениях ограничились формальными точечными изменениями. А дерево решений на самом деле уже можно упростить до простого if-else.
  35. Решения: * Избегать «хитрого» кода (замысловатого) (помните, может, в программистской юности высшим шиком считалось написать такой код, чтоб был коротким, совершенно непонятным, но делал сразу кучу вещей) Все время спрашивать себя: а то ли я делаю «Чистый код», опять же
  36. Программирование методом карго-культа (использование без понимания) Пример: юнит-тест на простейшие сеттеры и геттеры, или на возврат замоканных данных. Технологии «для резюме» Популярная разновидность сегодня: Found on Internet («скопипастил со стэковерфлоу») Думаю, большинство из вас знает, что такое карго-культ, но на всякий случай вкратце расскажу...
  37. Ну, какое тут может быть решение? Только одно – эволюционировать, для начала из coding-monkey хотя бы в Гомера
  38. Выстрел наугад Пытаемся угадать источник проблемы Не используем логи, стектрейсы, не пытаемся воспроизвести у себя Лечим симптомы -> например...
  39. Пришли неожиданные данные на вывод – подправить их и показать что-нибудь осмысленное, не разбираясь, откуда неожиданность А неожиданность, например – от заглушенной ошибки в предыдущей обработке (пустой catch)
  40. Не надо так!
  41. Выстрел наугад Два аспекта решений: -- тактический: понять суть проблемы перед тем, как бросаться решать. Устранять корень ошибки, а не «заметать пыль под коврик».
  42. Выстрел наугад Два аспекта решений: -- стратегический: обеспечить себя инструментами диагностики Логирование Анализ стектрейсов Документирование шагов, приведших к ошибке
  43. Слепая вера -- в свои силы как программиста: «да должно заработать, там же всё очевидно» -- в силы других программистов: «ну, метод же вроде делает примерно то, что мне нужно, какие там ещё особенности»
  44. На веру ничего не принимаем, если нам нужно, чтобы что-то было в определённом состоянии – убеждаемся, что так и есть
  45. Непонятно, рабочий это код или уже никем не используемый
  46. Даже если до этого куска кода дойдут руки – скорее всего, к тому времени он уже устареет, рассинхронизировавшись с остальным проектом. Чаще всего окажется проще выкинуть его и написать свежий.
  47. Поток лавы Масштабная подсистема, модуль, функциональность, на которую постоянно натыкаются, но которую боятся тронуть, потому что непонятно, сколько это займёт и на что повлияет.
  48. Само всё обычно только ухудшается
  49. Конечно, переделать – избавиться, отрефакторить, оптимизировать. Снизить риски можно тестами
  50. Картинка Этого д.б. достаточно
  51. * Причина: желание скрыть сложность Крайности – не самый хороший вариант. Не нужно вываливать на юзера дампы памяти (помните в Win95 сообщение об ошибке с кнопкой Details?). * Но хоть указать проблемную область стоит. Например: «не получилось создать файл по такому-то пути», и юзер уже примерно понимает, что можно сделать. А вот стектрейсы ему не нужны, в отличие от вас. Так что логи наше всё. А ещё можно по-разному показывать ошибки на прод и девел энвайрноментах.
  52. Чистый код, практики – метод не длиннее страницы, например Метрики для предупреждения
  53. Про что это, как считаете?
  54. Properites files Спросить у пользователя Внешняя конфигурация – сервер с конфигом
  55. Вынесем все правила бизнес-логики в конфигурацию.. В БД, например... Получаем чуть ли не новый язык программирования, чтоб заставить программу работать * что-то тут не так
  56. Соблюдаем разумный баланс
  57. Программирование через особые ситуации (это не про эксепшны) Новое изменение в требованиях – дописываем код, не глядя на то, что было Рефакторингом не занимаемся Получаем подобные паровозики Ифов Помните, говорили про искусственную сложность?
  58. Не про трай-кетч Получив новое условие, проверяем, насколько оно новое – вдруг есть что-то общее с уже существующими Меняем код как целое, адаптируем не только отдельные детали, если нужно
  59. Вопросы?
  60. Составляем список на доске: Inspections Code reviews Metrics
  61. Понятие технического долга – объяснить, если надо
  62. ==00:40==
  63. То, как система спроектирована На уровне классов – «конкретных деталей»
  64. Принцип подстановки (замещения) Кто-нибудь может сформулировать? «если S является подтипом T, тогда объекты типа T в программе могут быть замещены объектами типа S без каких-либо изменений» Барбара Лисков :)
  65. Сигнализировать о невозможности операции Возвращать новый тип данных (старый не меняем) Ослабляем контракт, если возможно Используем неизменяемые объекты Пересматриваем иерархию (независимые классы, возможность конвертации)
  66. Инверсия зависимости Говорим, что провода из стены должны предоставляться в определённом виде – то есть сервис должен иметь определённый интерфейс Тогда тем, кто его использует, достаточно знать об этом интерфейсе и зависеть уже от него Вроде бы усложнение, но на самом деле жить становится проще
  67. Использование объектов, не содержащих бизнес-логики (или мало) * Пример – JavaBeans Это плохо? Можно заметить, что паучка нет. Тонкий приём, имеющий и достоинства, и недостатки, и то и другое надо понимать. Давайте подробнее рассмотрим.
  68. * Чёткое разделение данных и логики, возможность отделить данные от их обработки * Класс -«сервис» -- воплощение «бизнес-логики», которому можно передать чистые данные, чтобы он провёл какие-то операции над ними. Объединять эти операции с данными не всегда целесообразно (напр., работа с БД)
  69. Недостатки? * Отход от принципов ООП (когда данные знают, как должны быть обработаны) * Может нарушиться непротиворечивость данных (ввели дату смерти, а флаг «умер» не поставили) * Увеличение связности (через объекты данных)
  70. «И один, всесильный...»
  71. Сложно поддерживать Отход от принципа «одной ответственности» Проблемы с тестированием
  72. Осторожно с ... Следуем принципу одной ответственности Проблемы с тестированием как индикатор
  73. Пишем утилитный объект, просто предоставляющий функционал Наследуемся от него просто чтобы получить доступ Нелогичная иерархия Неожиданные побочные эффекты и особенности реализации Теперь у машины есть функционал «собирать стряхиваемый пепел» Не надо так!
  74. Делегирование Предпочитаем композицию, а не наследование В этом помогают интерфейсы Так-то лучше! Теперь внутри машины есть модуль, работающий с пеплом
  75. Загрязняет неймспейс Не является частью API
  76. Привязка к последовательности
  77. Осторожно с... Не раскрывайте детали реализации Используйте метод-шаблон
  78. Вопросы?
  79. ==01:00==
  80. То, как система спроектирована На уровне модулей, подсистем, их взаимодействий Архитектура
  81. Раздутое ПО Ваши примеры? Word (+HTML редактор, +веб-инструменты) ICQ (смайлы, реклама, ...) * решения: плагины * similar AP: Spaghetti code Monster object
  82. Ком грязи (отсутствие внятной архитектуры) Причины Давление заказчика Текучка кадров Симптомы Багфикс как основная работа Адовая поддержка
  83. Бесконечные улучшения, «вылизывания» Это, если кто не разглядел, вертолёт Решения? * Рациональное распределение усилий * Принцип Парето
  84. Input kludge (непроверка входных данных) Stovepipe system (дымоходы – каждый дом со своей системой – создание своей авторизации, например) Database-as-IPC (interprocess communication) -- БД для межпроцессной коммуникации
  85. ==01:05==
  86. Марш смерти Все знают, что проект обречён, но не хотят, чтоб его закрыли Как вариант: нереальный дедлайн, но никто не говорит вслух; ненужные переработки и т.п.
  87. Режим супергероя Решения Честные оценки Распределение задач Не поощрять подвиги
  88. Одинокий рыцарь *** Отдельный работник становится незаменимым Решения Скорее заменить Распределять знания, не допускать уникальных хранителей Ревью – поощрять общение Обучение внутри команды
  89. Придавать слишком большое значение метрикам, метрики как самоцель * По незнанию или намеренно Вопрос: когда злоупотребление метриками может быть намеренным? (с какой целью?) Когда acceptance criteria (95% покрытие кода) Решения Убедиться, что все понимают назначение и смысл Метрики – средство, а не цель
  90. Чайка-менеджмент Прилетает Поднимает много шума Гадит на всех Улетает решение Показать ему это определение?
  91. … Groupthink Smoke and mirrors
  92. ==01:15==
  93. Семь раз отмерь, один отрежь Иногда измерения затягиваются... * В разработке ПО: слишком долгие этапы...
  94. «Разработка комитетом» Одна голова хорошо, а две лучше А три? А пять? Участников много, но нет общего видения Причины Плохое архитектурное руководство Самолюбие программистов, гордыня (принцип «изобретено не здесь») Недостаток знаний Пренебрежение стандартами (споры вокруг того, что уже можно принять как готовое, то, с чем все согласятся)
  95. Продолжение вложений (сверх разумного) Примеры Долларовый аукцион Попытка реанимировать обречённый проект («марш смерти», ага)
  96. Привязка к поставщику Примеры Привязка сим-карты Подарочные сертификаты Закрытый протокол ICQ – периодические проблемы у сторонных клиентов при смене протокола Карты памяти для техники Sony Сторонний фреймворк в вашей программе Решение Промежуточный слой доступа
  97. … Cash cow Mushroom management (kept in dark, covered with dung, picked up when grown big enough) (Содержать во тьме, подкармливать навозом, срезать, как только подрастут)
  98. ==01:25==
  99. Открывать меню по наведению, а не нажатию И прятать, когда курсор уходит Тренируем мелкую моторику и терпение
  100. Какие пользователи активны?
  101. Картинка, конечно, не совсем честна по отношению к Ворду
  102. ==01:35==
  103. Можно заметить, что одна и та же проблема...
  104. ...На разных уровнях, слоях...
  105. ...проявляется в виде разных АП Искусственная сложность Монстр-объект Раздутое ПО
  106. Я очень надеюсь, что вы напишете свои отзывы по результатам вебинара Буду очень рад, если вы поможете мне улучшить вебинар и напишете, что понравилось и что можно улучшить Я очень благодарен вам за ваше время, надеюсь, мы провели его с пользой
  107. Ещё раз спасибо, теперь я готов ответить на ваши вопросы