Anti-pattern
Encyclopedia
In software engineering
Software engineering
Software Engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software, and the study of these approaches; that is, the application of engineering to software...

, an anti-pattern (or antipattern) is a pattern
Design pattern (computer science)
In software engineering, a design pattern is a general reusable solution to a commonly occurring problem within a given context in software design. A design pattern is not a finished design that can be transformed directly into code. It is a description or template for how to solve a problem that...

 that may be commonly used but is ineffective and/or counterproductive in practice.

The term was coined in 1995 by Andrew Koenig
Andrew Koenig (programmer)
Andrew R. Koenig is a former AT&T and Bell Labs researcher and programmer. He is the author of C Traps and Pitfalls, co-author of Accelerated C++ & Ruminations on C++, and his name is associated with argument-dependent name lookup, also known as "Koenig lookup"...

,
inspired by Gang of Four's book Design Patterns, which developed the concept of design pattern
Design pattern
A design pattern in architecture and computer science is a formal way of documenting a solution to a design problem in a particular field of expertise. The idea was introduced by the architect Christopher Alexander in the field of architecture and has been adapted for various other disciplines,...

s in the software field. The term was widely popularized three years later by the book AntiPatterns
AntiPatterns
AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis is a book about anti-patterns: specific repeated practices in software architecture, software design and software project management that initially appear to be beneficial, but ultimately result in bad consequences that...

, which extended the use of the term beyond the field of software design and into general social interaction. According to the authors of the latter, there must be at least two key elements present to formally distinguish an actual anti-pattern from a simple bad habit
Habit (psychology)
Habits are routines of behavior that are repeated regularly and tend to occur subconsciously. Habitual behavior often goes unnoticed in persons exhibiting it, because a person does not need to engage in self-analysis when undertaking routine tasks...

, bad practice, or bad idea:
  • Some repeated pattern of action, process or structure that initially appears to be beneficial, but ultimately produces more bad consequences than beneficial results, and
  • A refactored solution exists that is clearly documented, proven in actual practice and repeatable.


Many anti-pattern ideas amount to little more than mistakes, rants, unsolvable problems, or bad practices to be avoided if possible. Sometimes called pitfalls or dark patterns, this informal use of the term has come to refer to classes of commonly reinvented bad solutions to problems. Thus, many candidate anti-patterns under debate would not be formally considered anti-patterns.

By formally describing repeated mistakes, one can recognize the forces that lead to their repetition and learn how others have refactored themselves out of these broken patterns.

Organizational anti-patterns

  • Analysis paralysis
    Analysis paralysis
    The term "analysis paralysis" or "paralysis of analysis" refers to over-analyzing a situation, so that a decision or action is never taken, in effect paralyzing the outcome. A decision can be treated as over-complicated, with too many detailed options, so that a choice is never made, rather than...

    : Devoting disproportionate effort to the analysis phase of a project
  • Cash cow
    Cash cow
    In business, a cash cow is a product or a business unit that generates unusually high profit margins: so high that it is responsible for a large amount of a company's operating profit...

    : A profitable legacy product that often leads to complacency about new products
  • Design by committee
    Design by committee
    Design by committee is a term referring to a style of design and its resultant output when a group of entities comes together to produce something , particularly in the presence of poor leadership...

    : The result of having many contributors to a design, but no unifying vision
  • Escalation of commitment
    Escalation of commitment
    Escalation of commitment was first described by Barry M. Staw in his 1976 paper, "Knee deep in the big muddy: A study of escalating commitment to a chosen course of action"...

    : Failing to revoke a decision when it proves wrong
  • Management by perkele
    Management by perkele
    Management by perkele is originally a Swedish expression for a Finnish leadership approach that, according to its proponents, takes required actions in a quick and swift way, instead of a prolonged pondering of all possible alternative approaches and points of view before actually getting anything...

    : Authoritarian style of management with no tolerance of dissent
  • Moral hazard
    Moral hazard
    In economic theory, moral hazard refers to a situation in which a party makes a decision about how much risk to take, while another party bears the costs if things go badly, and the party insulated from risk behaves differently from how it would if it were fully exposed to the risk.Moral hazard...

    : Insulating a decision-maker from the consequences of his or her decision
  • Mushroom management
    Mushroom management
    Mushroom Management is an allusion to a company's staff being treated like mushrooms: kept in the dark, covered with dung, and, when grown big enough, canned...

    : Keeping employees uninformed and misinformed; employees are described as being kept in the dark and fed manure, left to stew, and finally canned.
  • Stovepipe or Silos
    Stovepipe (organisation)
    A stovepipe organisation is one where the structure of the organisation largely or entirely restricts the flow of information within the organisation to up-down through lines of control but inhibits or prevents cross organisational communication. Many traditional, large, organisations are, or...

    : A structure that supports mostly up-down flow of data but inhibits cross organizational communication
  • Vendor lock-in
    Vendor lock-in
    In economics, vendor lock-in, also known as proprietary lock-in or customer lock-in, makes a customer dependent on a vendor for products and services, unable to use another vendor without substantial switching costs...

    : Making a system excessively dependent on an externally supplied component

Project management anti-patterns

  • Death march
    Death march (software development)
    In project management, a death march is any of several types of pathologic projects involving a dysphemistic, dark-humor analogy to real death marches, such as being gruelingly overworked, and being gruelingly overworked for ill-founded reasons on a project that is obviously at high risk of bad...

    : Everyone knows that the project is going to be a disaster – except the CEO – so the truth is hidden to prevent immediate cancellation of the project - (although the CEO often knows and does it anyway to maximize profit). However, the truth remains hidden and the project is artificially kept alive until the Day Zero finally comes ("Big Bang"). Alternative definition: Employees are pressured to work late nights and weekends on a project with an unreasonable deadline.
  • Groupthink
    Groupthink
    Groupthink is a psychological phenomenon that occurs within groups of people. It is the mode of thinking that happens when the desire for harmony in a decision-making group overrides a realistic appraisal of alternatives. Group members try to minimize conflict and reach a consensus decision without...

    : During groupthink, members of the group avoid promoting viewpoints outside the comfort zone of consensus thinking
  • Overengineering
    Overengineering
    Overengineering is when a product is more robust or complicated than necessary for its application, either to ensure sufficient factor of safety, sufficient functionality, or due to design errors...

    : Spending resources making a project more robust and complex than is needed
  • Smoke and mirrors
    Smoke and mirrors
    Smoke and mirrors is a metaphor for a deceptive, fraudulent or insubstantial explanation or description. The source of the name is based on magicians' illusions, where magicians make objects appear or disappear by extending or retracting mirrors amid a confusing burst of smoke...

    : Demonstrating unimplemented functions as if they were already implemented
  • Software bloat
    Software bloat
    Software bloat is a process whereby successive versions of a computer program include an increasing proportion of unnecessary features that are not used by end users, or generally use more system resources than necessary, while offering little or no benefit to its users.-Causes:Software developers...

    : Allowing successive versions of a system to demand ever more resources
  • Waterfall model
    Waterfall model
    The waterfall model is a sequential design process, often used in software development processes, in which progress is seen as flowing steadily downwards through the phases of Conception, Initiation, Analysis, Design, Construction, Testing, Production/Implementation and Maintenance.The waterfall...

    : An older method of software development that inadequately deals with unanticipated change

Analysis anti-patterns

  • Bystander apathy: When a requirement or design decision is wrong, but the people who notice this do nothing because it affects a larger number of people

Software design anti-patterns

  • Abstraction inversion
    Abstraction inversion
    In computer programming, abstraction inversion is an anti-pattern arising when users of a construct need functions implemented within it but not exposed by its interface...

    : Not exposing implemented functionality required by users, so that they re-implement it using higher level functions
  • Ambiguous viewpoint
    Ambiguous viewpoint
    Object Oriented Analysis and Design models are often presented without clarifying the viewpoint represented by the model. By default, these models denote an implementation viewpoint that visualises the structure of a computer program...

    : Presenting a model (usually Object-oriented analysis and design
    Object-oriented analysis and design
    Object-oriented analysis and design is a software engineering approach that models a system as a group of interacting objects. Each object represents some entity of interest in the system being modeled, and is characterised by its class, its state , and its behavior...

     (OOAD)) without specifying its viewpoint
  • Big ball of mud
    Big ball of mud
    In computer programming, a big ball of mud is a system or computer program that appears to have no distinguishable architecture.-In computer programs:...

    : A system with no recognizable structure
  • Database-as-IPC
    Database-as-IPC
    In computer programming, Database-as-IPC is an anti-pattern where a database is used as the message queue for routine interprocess communication in a situation where a lightweight IPC mechanism such as sockets would be more suitable...

    : Using a database as the message queue for routine interprocess communication
    Inter-process communication
    In computing, Inter-process communication is a set of methods for the exchange of data among multiple threads in one or more processes. Processes may be running on one or more computers connected by a network. IPC methods are divided into methods for message passing, synchronization, shared...

     where a much more lightweight mechanism would be suitable
  • Gold plating
    Gold plating (analogy)
    Gold plating in software engineering refers to continuing to work on a project or task well past the point where the extra effort is worth the value it adds...

    : Continuing to work on a task or project well past the point at which extra effort is adding value
  • Inner-platform effect
    Inner-platform effect
    The inner-platform effect is the tendency of software architects to create a system so customizable as to become a replica, and often a poor replica, of the software development platform they are using...

    : A system so customizable as to become a poor replica of the software development platform
  • Input kludge
    Input kludge
    In computer programming, an input kludge is type of failure in software where simple user input is not handled. For example, if a computer program accepts free text input from the user, an ad hoc algorithm will mishandle many combinations of legal and illegal input strings...

    : Failing to specify and implement the handling of possibly invalid input
  • Interface bloat
    Interface bloat
    In software design, interface bloat is a term used to describe interfaces that try to incorporate all possible operations on some data into an interface, only to find that most of the objects cannot perform the given operations.One might consider using visitor pattern, Adapter Pattern, or...

    : Making an interface so powerful that it is extremely difficult to implement
  • Magic pushbutton
    Magic pushbutton
    The magic pushbutton is a common anti-pattern in graphical user interfaces.http://www.scribd.com/doc/99553/AntiPattern-by-Indranil-Nandy-IIT-Kharagpur...

    : Coding implementation
    Implementation
    Implementation is the realization of an application, or execution of a plan, idea, model, design, specification, standard, algorithm, or policy.-Computer Science:...

     logic directly within interface
    Interface (computer science)
    In the field of computer science, an interface is a tool and concept that refers to a point of interaction between components, and is applicable at the level of both hardware and software...

     code, without using abstraction
    Abstraction (computer science)
    In computer science, abstraction is the process by which data and programs are defined with a representation similar to its pictorial meaning as rooted in the more complex realm of human life and language with their higher need of summarization and categorization , while hiding away the...

  • Race hazard: Failing to see the consequence of different orders of events
  • Stovepipe system
    Stovepipe system
    In engineering and computing, a stovepipe system is a system that is an assemblage of inter-related elements that are so tightly bound together that the individual elements cannot be differentiated, upgraded or refactored. The stovepipe system must be maintained until it can be entirely replaced by...

    : A barely maintainable assemblage of ill-related components

Object-oriented design anti-patterns

  • Anemic Domain Model
    Anemic Domain Model
    Anemic domain model is a term used to describe the use of a software domain model where the business logic is implemented outside the domain objects.-Overview:...

    : The use of domain model
    Domain model
    A domain model in problem solving and software engineering can be thought of as a conceptual model of a domain of interest which describes the various entities, their attributes, roles and relationships, plus the constraints that govern the integrity of the model elements comprising that problem...

     without any business logic
    Business logic
    Business logic, or domain logic, is a non-technical term generally used to describe the functional algorithms that handle information exchange between a database and a user interface.- Scope of business logic :Business logic:...

    . The domain model's objects cannot guarantee their correctness at any moment, because their validation and mutation logic is placed somewhere outside (most likely in multiple places).
  • BaseBean
    BaseBean
    In object-oriented programming, a BaseBean is a utility object from which concrete entities are derived . Proper design suggests that the inherited functionality should be provided via delegation instead...

    : Inheriting functionality from a utility class
    Utility class
    In computer programming, a utility class is a class that defines a set of methods that perform common, often re-used functions. Most utility classes define these common methods under static scope...

     rather than delegating to it
  • Call super: Requiring subclasses to call a superclass's overridden method
  • Circle-ellipse problem
    Circle-ellipse problem
    The circle-ellipse problem in software development illustrates a number of pitfalls which can arise when using subtype polymorphism in object modelling...

    : Subtyping
    Subtype
    In programming language theory, subtyping or subtype polymorphism is a form of type polymorphism in which a subtype is a datatype that is related to another datatype by some notion of substitutability, meaning that program constructs, typically subroutines or functions, written to operate on...

     variable-types on the basis of value-subtypes
  • Circular dependency
    Circular dependency
    In software engineering, a circular dependency is a relation between two or more modules which either directly or indirectly depend on each other to function properly.-Overview:...

    : Introducing unnecessary direct or indirect mutual dependencies between objects or software modules
  • Constant interface
    Constant interface
    In the Java programming language, the constant interface pattern describes the use of an interface solely to define constants, and having classes implement that interface in order to achieve convenient syntactic access to those constants....

    : Using interfaces to define constants
  • God object
    God object
    In object-oriented programming, a God object is an object that knows too much or does too much. The God object is an example of an anti-pattern....

    : Concentrating too many functions in a single part of the design (class)
  • Object cesspool: Reusing objects whose state does not conform to the (possibly implicit) contract for re-use
  • Object orgy
    Object orgy
    In computer programming, object orgy is a term, common in the Perl programming community, describing a common failure in object-oriented design or programming...

    : Failing to properly encapsulate objects permitting unrestricted access to their internals
  • Poltergeist
    Poltergeist (computer science)
    In computer programming, a poltergeist is a short-lived, typically stateless object used to perform initialization or to invoke methods in another, more permanent class. It is considered an anti-pattern...

    s: Objects whose sole purpose is to pass information to another object
  • Sequential coupling
    Sequential Coupling
    In object-oriented programming, sequential coupling refers to a class that requires its methods to be called in a particular sequence. This may be an anti-pattern, depending on context.Methods whose name starts with Init, Begin, Start, etc...

    : A class that requires its methods to be called in a particular order
  • Yo-yo problem
    Yo-yo problem
    In computer science, the yo-yo problem is an anti-pattern that occurs when a programmer has to read and understand a program whose inheritance graph is so long and complicated that the programmer has to keep flipping between many different class definitions in order to follow the control flow of...

    : A structure (e.g., of inheritance) that is hard to understand due to excessive fragmentation

Programming anti-patterns

  • Accidental complexity
    Accidental complexity
    Accidental complexity is complexity that arises in computer programs or their development process which is non-essential to the problem to be solved...

    : Introducing unnecessary complexity into a solution
  • Action at a distance
    Action at a distance (computer science)
    Action at a distance is an anti-pattern in which behavior in one part of a program varies wildly based on difficult or impossible to identify operations in another part of the program....

    : Unexpected interaction between widely separated parts of a system
  • Blind faith
    Blind faith (computer science)
    In computer programming blind faith is a situation whereby a programmer develops a solution or fixes a computer bug and deploys it without ever testing his creation...

    : Lack of checking of (a) the correctness of a bug fix or (b) the result of a subroutine
  • Boat anchor
    Boat anchor
    In amateur radio and computing, boat anchor is a slang term used to describe something obsolete, useless, and cumbersome - so-called because metaphorically its only productive use is to be thrown into the water as a boat mooring.-Hardware:...

    : Retaining a part of a system that no longer has any use
  • Busy waiting
    Busy waiting
    In software engineering, busy-waiting or spinning is a technique in which a process repeatedly checks to see if a condition is true, such as whether keyboard input is available, or if a lock is available. Spinning can also be used to generate an arbitrary time delay, a technique that was necessary...

    : Consuming CPU while waiting for something to happen, usually by repeated checking instead of messaging
  • Caching failure
    Caching failure
    In computer programming, negative cache is a cache that also stores "negative" responses, i.e. failures. This means that a program remembers the result indicating a failure even after the cause has been corrected. Usually negative cache is a design choice, but it can also be a software...

    : Forgetting to reset an error flag when an error has been corrected
  • Cargo cult programming
    Cargo cult programming
    Cargo cult programming is a style of computer programming that is characterized by the ritual inclusion of code or program structures that serve no real purpose...

    : Using patterns and methods without understanding why
  • Coding by exception
    Coding by exception
    Coding by exception is an anti-pattern where software quickly degrades in performance and maintainability because it evolves by having special case functionality added piecemeal. This typically happens because an existing piece of software is extended to cover requirements that were not previously...

    : Adding new code to handle each special case as it is recognized
  • Error hiding
    Error hiding
    Error hiding is an anti-pattern in computer programming. The programmer hides error messages by overriding them with exception handling. As a result of this the root error message is hidden from the user and so they will not be told what the actual error is...

    : Catching an error message before it can be shown to the user and either showing nothing or showing a meaningless message
  • Hard code
    Hard code
    Hard coding refers to the software development practice of embedding what may, perhaps only in retrospect, be regarded as input or configuration data directly into the source code of a program or other executable object, or fixed formatting of the data, instead of obtaining that data from external...

    : Embedding assumptions about the environment of a system in its implementation
  • Lava flow
    Lava flow (programming)
    In computer programming jargon, lava flow is a problem in which computer code written under sub-optimal conditions is put into production and added to while still in a developmental state....

    : Retaining undesirable (redundant or low-quality) code because removing it is too expensive or has unpredictable consequences
  • Loop-switch sequence
    Loop-switch sequence
    A loop-switch sequence is a programming antipattern where a clear set of steps is implemented as a switch-within-a-loop. The loop-switch sequence is a specific derivative of spaghetti code....

    : Encoding a set of sequential steps using a switch within a loop statement
  • Magic numbers: Including unexplained numbers in algorithms
  • Magic strings: Including literal strings in code, for comparisons, as event types etc.
  • Repeating yourself
    Don't repeat yourself
    In software engineering, Don't Repeat Yourself is a principle of software development aimed at reducing repetition of information of all kinds, especially useful in multi-tier architectures...

    : Writing code which contains repetitive patterns and substrings over again; avoid with once and only once (abstraction principle)
  • Soft code
    Softcoding
    Softcoding is a computer coding term that refers to obtaining a value or function from some external resource, such as a preprocessor macro, external constant, configuration file, command line argument or database table...

    : Storing business logic in configuration files rather than source code
  • Spaghetti code
    Spaghetti code
    Spaghetti code is a pejorative term for source code that has a complex and tangled control structure, especially one using many GOTOs, exceptions, threads, or other "unstructured" branching constructs. It is named such because program flow tends to look like a bowl of spaghetti, i.e. twisted and...

    : Programs whose structure is barely comprehensible, especially because of misuse of code structures

Methodological anti-patterns

  • Copy and paste programming
    Copy and paste programming
    Copy and paste programming is a pejorative term to describe highly repetitive computer programming code apparently produced by copy and paste operations...

    : Copying (and modifying) existing code rather than creating generic solutions
  • Golden hammer
    Golden hammer
    The concept known as the law of the instrument, Maslow's hammer, or a golden hammer is an over-reliance on a familiar tool; as Abraham Maslow said in 1966, "It is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail."-History:The first recorded statement of the...

    : Assuming that a favorite solution is universally applicable (See: Silver Bullet
    Silver Bullet
    A silver bullet is a method to kill mythical creatures such as werewolves or a metaphor for any solution of extreme effectiveness.Silver Bullet may also refer to:* Silver Bullet , a 1985 American film based on a Stephen King novella...

    )
  • Improbability factor
    Improbability factor
    In computer programming the improbability factor is a situation where a problem exists in a system. Frequently, the programmers are aware of the problem, but they are not allowed to fix the problem, solely because the chances of the problem ever surfacing are supposedly negligible compared to other...

    : Assuming that it is improbable that a known error will occur
  • Not Invented Here (NIH) syndrome: The tendency towards reinventing the wheel
    Reinventing the wheel
    To reinvent the wheel is to duplicate a basic method that has already previously been created or optimized by others.The inspiration for this idiomatic metaphor lies in the fact that the wheel is the archetype of human ingenuity, both by virtue of the added power and flexibility it affords its...

    (Failing to adopt an existing, adequate solution)
  • Premature optimization: Coding early-on for perceived efficiency, sacrificing good design, maintainability, and sometimes even real-world efficiency
  • Programming by permutation
    Programming by permutation
    Programming by permutation, sometimes called "programming by accident", is an approach to software development wherein a programming problem is solved by iteratively making small changes and testing each change to see if it behaves as expected...

     (or "programming by accident"): Trying to approach a solution by successively modifying the code to see if it works
  • Reinventing the wheel
    Reinventing the wheel
    To reinvent the wheel is to duplicate a basic method that has already previously been created or optimized by others.The inspiration for this idiomatic metaphor lies in the fact that the wheel is the archetype of human ingenuity, both by virtue of the added power and flexibility it affords its...

    : Failing to adopt an existing, adequate solution
  • Reinventing the square wheel: Failing to adopt an existing solution and instead adopting a custom solution which performs much worse than the existing one
  • Silver bullet
    No Silver Bullet
    "No Silver Bullet — Essence and Accidents of Software Engineering" is a widely discussed paper on software engineering written by Fred Brooks in 1986...

    : Assuming that a favorite technical solution can solve a larger process or problem
  • Tester Driven Development
    Tester Driven Development
    Tester-driven development is an anti-pattern in software development. It should not be confused with test-driven development. It refers to any software development project where the software testing phase is too long. The testing phase is so long that the requirements may change radically during...

    : Software projects in which new requirements are specified in bug reports

Configuration management anti-patterns

  • Dependency hell
    Dependency hell
    Dependency hell is a colloquial term for the frustration of some software users who have installed software packages which have dependencies on specific versions of other software packages. This was mainly attributable to old Linux package managers...

    : Problems with versions of required products
  • DLL hell
    DLL hell
    In computing, DLL Hell is a term for the complications that arise when working with dynamic link libraries used with Microsoft Windows operating systems, particularly legacy 16-bit editions which all run in a single memory space....

    : Inadequate management of dynamic-link libraries (DLLs), specifically on Microsoft Windows
    Microsoft Windows
    Microsoft Windows is a series of operating systems produced by Microsoft.Microsoft introduced an operating environment named Windows on November 20, 1985 as an add-on to MS-DOS in response to the growing interest in graphical user interfaces . Microsoft Windows came to dominate the world's personal...

  • Extension conflict
    Extension conflict
    Extension conflicts were sometimes a problem on Apple Macintosh computers running versions of Mac OS prior to X, especially System 7. Extensions were bundles of code that extended the operating system's capabilities by directly patching OS calls, thus receiving control instead of the operating...

    : Problems with different extensions to pre-Mac OS X
    Mac OS X
    Mac OS X is a series of Unix-based operating systems and graphical user interfaces developed, marketed, and sold by Apple Inc. Since 2002, has been included with all new Macintosh computer systems...

     versions of the Mac OS
    Mac OS
    Mac OS is a series of graphical user interface-based operating systems developed by Apple Inc. for their Macintosh line of computer systems. The Macintosh user experience is credited with popularizing the graphical user interface...

     attempting to patch the same parts of the operating system
  • JAR hell: Overutilization of the multiple JAR
    JAR (file format)
    In software, JAR is an archive file format typically used to aggregate many Java class files and associated metadata and resources into one file to distribute application software or libraries on the Java platform.JAR files are built on the ZIP file format and have the .jar file extension...

     files, usually causing versioning and location problems because of misunderstanding of the Java class loading
    Java Classloader
    The Java Classloader is a part of the Java Runtime Environment that dynamically loads Java classes into the Java Virtual Machine. Usually classes are only loaded on demand. The Java run time system does not need to know about files and file systems because of class loaders...

     model

See also

  • Code smell
    Code smell
    In computer programming, code smell is any symptom in the source code of a program that possibly indicates a deeper problem.Often the deeper problem hinted by a code smell can be uncovered when the code is subjected to a short feedback cycle where it is refactored in small, controlled steps, and...

     – symptom of unsound programming
  • List of software development philosophies – approaches, styles, maxims and philosophies for software development
  • Software Peter principle
    Software Peter principle
    The software Peter principle is used in software engineering to describe a dying project which has little by little become too complex to be understood even by its own developers....


Further reading


    1. External links

      • Anti-pattern at WikiWikiWeb
        WikiWikiWeb
        WikiWikiWeb is a term that has been used to refer to four things: the first wiki, or user-editable website, launched on 25 March 1995 by Ward Cunningham as part of the Portland Pattern Repository ; the Perl-based application that was used to run it, also developed by Cunningham, which was the first...

      • Anti-patterns catalog
      • AntiPatterns.com Web site for the AntiPatterns
        AntiPatterns
        AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis is a book about anti-patterns: specific repeated practices in software architecture, software design and software project management that initially appear to be beneficial, but ultimately result in bad consequences that...

        book
      • Patterns of Toxic Behavior
      The source of this article is wikipedia, the free encyclopedia.  The text of this article is licensed under the GFDL.
 
x
OK