Antimönster
Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från
versionen som granskades den 29 maj 2022; verifiering kräver
1 redigering .
Ett antimönster är ett vanligt tillvägagångssätt för att lösa en klass av vanliga problem som är ineffektiva, riskfyllda eller improduktiva [1] . Till skillnad från ett designmönster innefattar övervägandet av ett antimönster både en felaktig lösning på ett problem med dess tecken och konsekvenser, och en väg ut ur situationen [2] .
Termen kommer från datavetenskap , från Gang of Four-boken " Design Patterns ", som gav exempel på bra programmeringsmetoder. Författarna har kallat dessa goda metoder för "mönster" och motsatsen till dem är "anti-mönster". En del av god programmeringspraxis är att undvika antimönster. Innan termen dök upp kallades alla problem för fällor ( fallgropar ) . Således är antimönster de vanligaste fällorna, men inte alla fällor kommer att vara antimönster.
Antimönster liknar konceptuellt mönster genom att de dokumenterar repetitiva lösningar på vanliga problem. De är kända som antimönster eftersom deras användning (eller missbruk) har negativa konsekvenser [3] .
Historik
Med utvecklingen av IT-branschen växte omfattningen av mjukvaruprojekt och kostnaden för resurser för dem snabbt, vilket gav upphov till ett stort antal problem som ställdes inför programmerare. De flesta av dessa problem var typiska och förekom i nästan alla större projekt. I början av 90-talet fick kataloger med designmönster , "mönster" ( eng. designmönster ) - eleganta och beprövade sätt att lösa typiska problem avsevärd popularitet. Mönster är fortfarande kraftfulla och extremt populära idag, men många utvecklare som använder populära mönster i situationer som de inte var avsedda för skapade fler problem än de löste. Dessutom kan IT-ingenjörer, precis som arbetare inom alla andra verksamhetsområden, identifiera typiska misstag som görs på grund av otillräcklig kunskapsbas eller brist på erfarenhet, brådska och press på grund av projektdeadlines, ekonomiska begränsningar och annat.
För första gången användes termen "antimönster" i betydelsen en generaliserad beskrivning av en typisk misslyckad lösning 1996 av Michael Akroyd vid Object World West Conference, tillägnad aspekter av objektorienterad programmering . [4] I sin presentation Anti-Patterns: Preventing Object Misuse uppmärksammade Aykroyd skadliga men vanliga programmeringskonstruktioner, särskilt de som går emot principerna för OOP. Dessutom, för varje sådan design, erbjöd han en effektiv ersättare.
Termen i betydelsen "dålig idé" förekom före Aykroyd, men publicerades inte och var inte särskilt populär. Och ändå är det inte värt att tillskriva författarskap till en person. Enligt William Brown, författare till Antipatterns: Refactoring Applications, Architectures and Projects, är ett antimönster ett steg i utvecklingen av konceptet med ett designmönster, en förlängning av deras modell.
Klassificering
William Brown särskiljer antimönster ur tre synvinklar: utvecklare , arkitekt och chef :
- Utvecklingsantimönster ⇨ ]
- Arkitektoniska antimönster [ ]
- Organisatoriska antimönster ( ledningsmotmönster )
Neil och Laplante ger en fjärde typ [5] [6] :
Dessutom har antimönster beskrivits för individuella informationsteknologier som [6] :
Utvecklingsantimönster
Tekniska problem och lösningar som programmerare hanterar [6] :
Antimönster i objektorienterad programmering
- Basverktygsklass (BaseBean [12] ): Ärv funktionalitet från verktygsklassen istället för att delegera till den.
- Anemic Domain Model [12] - rädsla för att placera logik i domänobjekt.
- Att anropa en förfader (Call super): För att implementera applikationsfunktionalitet måste en metod av en descendant-klass nödvändigtvis anropa samma metoder som förfaderklassen.
- Empty subclass failure: Skapar en klass (i Perl ) som inte klarar "Empty Subclass Test" på grund av annorlunda beteende jämfört med en klass som ärver från den oförändrad.
- Guds objekt: Koncentrationen av för många funktioner i en del av systemet (klassen).
- Objektavloppsvatten : Återanvänd objekt som är i ett oanvändbart tillstånd.
- Poltergeist 13] :Objekt vars enda syfte är att överföra information till andra objekt.
- Jojo -problem (jojo-problem): Överdriven suddighet av tätt kopplad kod (till exempel exekveras i ordning) längs klasshierarkin.
- Ensamhet (Singletonitis): Olämplig användning av singelmönster .
- Vänzon : Olämplig användning av vänklasser och vänfunktioner i C++.
- Gränssnittssoppa [ 14] : Kombinera flera gränssnitt separerade enligt principen om gränssnittsisolering (gränssnittssegregation) till ett.
- Dingelslut : Ett gränssnitt vars de flesta metoder är meningslösa och implementeras av "dummy".
- Stub: Ett försök att "dra" ett redan existerande gränssnitt som har liten betydelse i betydelse till ett objekt, istället för att skapa ett nytt.
Antimönster när du skriver kod
- Oavsiktlig komplexitet : Lägger till onödig komplexitet till en lösning.
- Handling på avstånd En oväntad interaktion mellan vitt åtskilda delar av ett system.
- Ackumulera och avfyra: Ställ in subrutinparametrar i en uppsättning globala variabler.
- Blind faith : Otillräcklig verifiering av korrektheten av felkorrigeringen eller resultatet av subrutinen.
- Boat anchor (Boat anchor) [13] : Sparar en del av systemet som inte längre används.
- Busy spin, busy waiting : Förbrukar CPU- resurser processortid) medan du väntar på en händelse, vanligtvis genom att ständigt upprepa kontroll, istället för att använda asynkron programmering (t.ex. meddelande eller händelsesystem).
- Cachningsfel : Glömde att återställa felflaggan efter att ha hanterat den.
- Blöjemönstret stinker: Återställ felflaggan utan att hantera den eller skicka den till en uppströmshanterare.
- Kontrolltyp istället för medlemskap, Kontrolltyp istället för gränssnitt: Kontrollera att ett objekt är av en specifik typ vid en tidpunkt då endast ett specifikt gränssnitt krävs.
- Kodmomentum: Överbegränsa en del av ett system genom att ständigt antyda dess beteende i andra delar av systemet .
- Kodning med undantag : Lägger till ny kod för att stödja varje identifierat specialfall.
- Kryptisk kod : Användning av förkortningar istället för mnemoniska namn.
- Hård kodning : Injicera antaganden om ett systems miljö i för många implementeringspunkter.
- Mjuk kodning : En patologisk rädsla för hård kodning som leder till att allt konfigureras, medan konfigurering av själva systemet förvandlas till programmering.
- Lavaflöde 13 ] : Att behålla oönskad (överflödig eller låg kvalitet) kod eftersom den är för dyr att ta bort eller kommer att få oförutsägbara konsekvenser.
- Magiska tal: Använda numeriska konstanter utan att förklara deras innebörd.
- Procedurkod : När ett annat paradigm är lämpligare.
- Spaghettikod (ibland "pasta") [13] : Kod med en alltför förvirrande ordningsföljd.
- Lasagniakod (Lasagnekod, eller "lök" (lök)): Överdriven koppling mellan lager av abstraktion, vilket leder till oförmågan att ändra en nivå utan att ändra de andra.
- Ravioli-kod (eller "dumplings"): Föremål är så "limmade" ihop att de praktiskt taget inte tillåter refactoring.
- Såpbubbla : Ett objekt initierat med skräp låtsas innehålla vissa data så länge som möjligt.
- Mutex helvete: Injicera för många synkroniseringsobjekt mellan trådar.
- (Meta-)Mallcancer: Den utbredda användningen av mallar (mest C++), inklusive där användningen inte är motiverad. Detta minskar förståelsen och underhållet av koden och saktar ner kompileringen.
Metodologiska antimönster
- Kopiera och klistra in programmering [13] : Kopiera (och lätt modifiera) befintlig kod istället för att skapa generiska lösningar.
- Defactoring : Processen att förstöra funktionalitet och ersätta den med dokumentation.
- Guldhammare [ 13] : En stark övertygelse om att en favoritlösning är universellt användbar. Namnet kommer från talesättet "när du håller en hammare ser alla problem ut som spikar".
- Osannolikhetsfaktor : Antagandet att det är omöjligt för ett känt fel att utlösa.
- För tidig optimering : En optimering i designstadiet av ett kodsegment som gör det mer komplext eller skadat.
- Programmering genom permutation: Ett förhållningssätt till mjukvaruutveckling med små förändringar.
- Återuppfinna hjulet [ 13] : Bygg från grunden istället för att använda en bra hylllösning.
- Återuppfinna det fyrkantiga hjulet : Skapa en dålig lösning, med tanke på att en mer känd lösning redan finns.
- Självförstörelse : Ett fatalt fel eller icke-standardiserat programbeteende som leder till ett överbelastningsskydd som är ett resultat av ett annat mindre allvarligt fel. Till exempel, när ett fel uppstår, börjar applikationen skriva till loggen mycket snabbt och skriver mycket till loggen, vilket gör att hårddiskutrymmet tar slut snabbare än vad övervakningen upptäcker.
- Två tunnlar : Föra in ny funktionalitet i en separat applikation istället för att utöka en befintlig. Det används oftast när det av någon anledning (främst på grund av brist på tid eller ovilja hos ledningen) är dyrare att göra ändringar i en befintlig kod än att skapa en ny. I det här fallet slutar klienten med två applikationer som körs samtidigt eller växelvis från varandra.
- Begå lönnmördare : Gör individuella ändringar i versionskontrollsystemet utan att kontrollera deras inverkan på andra delar av programmet. Som regel, efter sådana åtaganden, förlamas lagets arbete samtidigt som man åtgärdar problem på platser som tidigare fungerade utan fel.
Anti-mönster för konfigurationshantering
- Beroendehelvete ( även kallat " DLL-helvetet " eller "DLL-helvetet" på Microsoft Windows -plattformen ): Tillväxt av grafen över ömsesidiga beroenden mellan programvaruprodukter och bibliotek, vilket leder till svårigheten att installera nya och ta bort gamla. I komplexa fall kräver olika installerade programvaror olika versioner av samma bibliotek. I de mest komplexa fallen kan en produkt indirekt kräva två versioner av samma bibliotek samtidigt.
Övrigt
- Rök och speglar [13] : En demonstration av hur oskrivna funktioner skulle se ut (namnet kommer från två favoritsätt som magiker döljer sina hemligheter på).
- Programvaruuppsvällning : Tillåter att successiva versioner av ett system kräver mer och mer resurser.
- Kryssrutafunktioner : Förvandla ett program till ett konglomerat av dåligt implementerade och orelaterade funktioner (vanligtvis för att annonsera att funktionen finns där).
Arkitektoniska antimönster
Typiska problem förknippade med systemets struktur [6] :
- Abstraktionsinversion : Döljer en del av funktionalitet från extern användning, i hopp om att ingen kommer att använda den.
- Tvetydig synvinkel [ 13] : En representation av en modell utan att specificera dess synvinkel.
- Big ball of mud: Ett system med en oigenkännlig struktur.
- Blob (Blob [13] ): se Gud objekt.
- Gasfabrik : Valfri designkomplexitet.
- Input kludge [13] : Glöm specifikationen och implementeringen av stöd för eventuell ogiltig inmatning.
- Interface bloat : Gränssnittsutveckling är mycket kraftfull och mycket svår att implementera.
- Magisk tryckknapp : Utför resultatet av användaråtgärder i ett olämpligt (inte tillräckligt abstrakt) gränssnitt. Till exempel, i system som Delphi , är detta att skriva applikationslogik i knappklickshanterare.
- Re -Coupling: Processen att införa ett onödigt beroende .
- Skorsten (Stovepipe System [13] ): En sällan stödd montering av dåligt kopplade komponenter.
- Rasfara (lopptillstånd): Oförutseende av möjligheten att händelser inträffar i en annan ordning än förväntat .
- Rått race : Omotiverat skapande av många små och abstrakta klasser för att lösa en specifik uppgift på en högre nivå.
- Stympning : Onödigt "vässning" av ett föremål för en viss mycket smal uppgift på ett sådant sätt att det inte kommer att kunna fungera med några andra, om än väldigt likartade uppgifter.
- Spara eller dö: Spara konfigurationsändringar på hårddisken endast när programmet avslutas; leder till det faktum att i händelse av ett fel i programmet kommer dessa data att gå förlorade
Organisatoriska antimönster
Problem som chefer (eller grupper av chefer) möter [6] :
- Analysförlamning [ 13] : orimligt höga kostnader för analys och design. Leder ofta till att projektet stängs innan dess genomförande påbörjas.
- Cash cow : om det finns en produkt som ger fördelar utan betydande investeringar, investeras inga medel i utveckling och utveckling av nya produkter.
- Kontinuerlig inkurans 13] : ägna en oproportionerligt stor ansträngning åt att porta ett system till nya miljöer.
- Kostnadsmigrering : Överföra projektkostnader till en svag avdelning eller affärspartner.
- Krypande featurism: Lägga till nya funktioner på bekostnad av systemets övergripande kvalitet.
- Uppblåst elegans (Smygande elegans): en oproportionerlig förbättring av kodens skönhet till förfång för systemets funktionalitet och övergripande kvalitet.
- Design av kommitté [13] : utveckling av ett projekt utan centraliserad kontroll eller utan kompetent ledarskap.
- Upptrappning av engagemang: att genomföra ett beslut efter att det har visat sig vara fel.
- Jag sa till dig det: ignorera expertutlåtanden.
- Hantering efter siffror: En överbetoning av siffror som är mycket indirekt relaterade till det hanterade systemet, svåra att få tag på eller föremål för Goodhart-effekten .
- Drakoniska åtgärder (Management by perkele): orimligt stel ledningsstil.
- Svamphantering [ [13] : otillräcklig information till arbetare om utfört arbete.
- Scope : Förlorad kontroll över projekttillväxt.
- Säljarlåsning [13] : Säljarlåsning .
- Varma kroppar [13] : En person vars bidrag till projektet är tveksamt.
- Enskild kunskapschef ( SHOK ): när endast en person i teamet har viktig information eller kompetens för projektet, och när han lämnar, upphör arbetet.
- Knight in Shining Armor (KISA): när en man dyker upp på scenen och försöker fixa allt utan att berätta för någon vad han gjorde eller varför.
Neil och LaPlante tillhandahåller följande antimönster [5] :
- Frånvarochef : Chefen är undvikande eller osynlig under lång tid - han gömmer sig någonstans på kontoret eller borta från kontoret.
- Ha bara en hammare (All You Have Is A Hammer): enkelriktad kontroll, där samma tekniker används på alla underordnade och i alla situationer. Ibland även kallad "One-Trick Pony".
- Wild Manager (Cage Match Negotiator): Varje manager som är egensinnig bortom rimligheten och använder en "Vinn till varje pris" eller "Jag har rätt och du har fel" tillvägagångssätt för ledningen. De har ofta en kaffemugg med reglerna för förvaltning: ”Regel #1: Chefen har alltid rätt. Regel #2: Om chefen har fel, se Regel #1."
- Dubbelgångare : En chef eller kollega som antingen är lätt eller svår att arbeta med.
- Fruktlösa ringar : Du ger chefer mer och mer information de behöver för att fatta ett beslut, men chefer fattar aldrig ett beslut och fortsätter att be dig om data. Du vet inte varför de behöver dessa uppgifter.
- Gyllene barnet: Det gyllene barnet uppstår när en chef ger ett särskilt ansvar, möjlighet, erkännande eller belöning till en medlem av hans team baserat på en personlig relation med honom och trots hans faktiska handlingar. Alla är irriterade på Guldbarnet, men det verkliga problemet ligger hos chefen.
- Headless Chicken: En chef utan fokus eller plan som aldrig avslutar någonting.
- Ledare inte chef: Understryker vikten av effektivt ledarskap.
- Parrot Manager (Managerial Cloning): Mellanchefer som så småningom börjar bete sig som sina chefer.
- Chef inte ledare: Denna chef är bra på administrativa och ledande uppgifter, men saknar ledarskapsförmåga.
- Metriskt missbruk: Missbruk av mätvärden på grund av inkompetens eller avsiktlig manipulation av data .
- Trevlig kille: En chef som fokuserar på att vara allas vän slutar med att göra alla besvikna och misslyckas med att göra sitt jobb.
- Svamphantering : En situation där ledningen inte kan kommunicera effektivt med personalen. I grund och botten är informationen avsiktligt undanhållen så att alla är "tjocka, dumma och glada". Namnet är kopplat till en analogi: champinjoner odlas i mörker och i gödsel.
- Tallrikssnurring : Chefen döljer sin ineffektivitet genom att tvinga arbetare till mödosamt och värdelöst arbete.
- Proletariatets hjälte: Chefen behandlar sina underordnade som idealiska arbetare, men detta är bara hans krycka, som används för att maskera dålig ledning. Det är en form av personalens "motivation" som ger ledningen anledning att öka förväntade resultat eller få mer för mindre.
- Rising Upstart : Superstjärnor som inte kan slösa tid på att lära sig och hitta sin plats. Ibland kan det bero på okunskap (de vet inte vad de inte vet), och ibland kan det bero på otålighet (de vet vad andra inte vet). En sådan uppstickare innebär en verklig utmaning för alla utom de mest erfarna cheferna.
- Vägen till ingenstans: Avsaknaden av en plan orsakar förvirring och ledarskapskris.
- Spineless Executive: Varje chef som inte har modet att möta den nödvändiga konfrontationen eller hantera en svår situation. Istället undviker han konfrontationen eller situationen helt, eller ber dig att ge honom dåliga nyheter.
- Trehövdad riddare : En obeslutsam manager.
- Ultimate Weapon: Chefen meddelar att alla kan lita på enastående medarbetare så att dessa anställda blir kanal för allt.
- Varma kroppar: En chefssituation där en arbetare som knappt uppfyller minimikraven går från projekt till projekt eller team till team. En svag arbetare kallas en "varm kropp", även om det verkliga problemet ligger hos chefen. Detta antimönster är motsatsen till Starburst när det gäller skicklighet och potential.
Miljöantimönster
Problem orsakade av organisationens dominerande struktur och sociala modell, som är resultatet av den allmänna politiken i organisationen [15] [6] [5] [16] :
- Myrkoloni - under den yttre skönheten ligger plantering av mål[ förtydliga ] .
- Atlas Shrugs ( Atlas Shrug ) - efter tillfällig framgång börjar nedgången[ förtydliga ] .
- Autonomous Collective - självförvaltning leder till passivitet[ förtydliga ] .
- Boiled Frog syndrome ( Boiling Frog Syndrome ) - gradvisa negativa förändringar märks när det är för sent.
- Burning Bag of Dung - chefen lämnar grannarna (underordnade, avdelningar, efterträdare) i en känslig situation.
- Fascination av modeord ( Buzzword Mania ) – ledningen jonglerar med ord som få av avdelningarna förstår.
- Deflaterad ballong - företagets bästa år ligger bakom, men det kan inte inse detta och minska kostnaderna.
- Divergerande mål _ _[ klara upp ]
- Dogmatisk om dysfunktion _
- Unwavering Courage ( Dunkirk Spirit )[ klara upp ]
- The new dress of the king ( kejsarens nya kläder ) - baserad på sagan med samma namn
- Rättvisa läran _ _[ klara upp ]
- Skynda dig - få folk att skratta ( Fools Rush In )[ klara upp ]
- Founder's disease ( Founderitis )[ klara upp ]
- French Waiter Syndrome - en ohälsosam atmosfär i företaget (stereotyp amerikansk åsikt om små franska restauranger) .
- Hazing ( Geek Hazing ) - nybörjare är laddade med många triviala uppgifter som inte hjälper dem att lära sig.
- Institutionell misstro _ _[ klara upp ]
- Staden med stånd ( Kiosk City ) - varje avdelning utvecklar sin egen mekanism för informationsutbyte.
- Power of Grey ( Mediocracy )
- One-Eyed King ( Enögd kung )[ klara upp ]
- Orange Stand Economics är en dålig kostnadsberäkning.
- Pitcairn Island ( Pitcairn Island )[ klara upp ]
- Potemkin byar
- Motstridiga processer ( Process Clash )[ klara upp ]
- Rubiks kub _ _[ klara upp ]
- Skolösa barn ( Skolösa barn )[ klara upp ]
- Guldkalven ( Att dyrka guldkalven )[ klara upp ]
Se även
Anteckningar
- ↑ Budgen, D. Mjukvarudesign. - Addison-Wesley, 2003. - ISBN 0-201-72219-4 .
- ↑ Brown, 1998 , kapitel 2.
- ↑ Smith CU, 2000 .
- ↑ http://c2.com/cgi/wiki?AntiPattern . Cunningham & Cunningham Inc. . Hämtad 15 februari 2006. Arkiverad från originalet 3 april 2005. (obestämd)
- ↑ 1 2 3 Neill, Laplante, 2005 .
- ↑ 1 2 3 4 5 6 Settas, 2011 .
- ↑ Miroslav Kis. Antimönster för informationssäkerhet i programvarukravsteknik. I Proceedings of the 9th Conference on Pattern Language of Programs (Plop), 2002.
- ↑ John Long. Programvara återanvänder antimönster. I ACM SIGSOFT Software Engineering Notes, volym 26, sidan 4, juli 2001.
- ↑ Paula Kotze, Karen Renaud och Judy van Biljona. Gör inte det här - fallgropar i att använda antimönster för att lära ut principer om interaktion mellan människa och dator. Computers and Education, 50(3):979-1008, april 2008
- ↑ J. Krai och M. Zemlicka. De viktigaste serviceinriktade antimönstren. I diskussioner från International Conference on Software Engineering Advances (ICSEA), 2007.
- ↑ P.A. Laplante, R.R. Hoffman och G. Klein. Antimönster i skapandet av intelligenta system. IEEE Intelligent Systems, 22:91-95, 2007.
- ↑ 1 2 Rajiv Ramnath, Cheyney Loffing. Börjar iOS-programmering för dummies . — John Wiley & Sons, 2014-04-14. - S. 105. - 470 sid. — ISBN 9781118799277 . Arkiverad 23 juli 2016 på Wayback Machine
- ↑ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 William J. Brown. AntiPatterns: Refactoring programvara, arkitekturer och projekt i kris . — Wiley, 1998-04-03. — 156 sid. — ISBN 0-471-19713-0. Arkiverad 22 december 2015 på Wayback Machine
- ↑ Gary McLean Hall. Adaptiv kod via C#: Agil kodning med designmönster och SOLID-principer. - Microsoft Press, 2014. - S. 267-268. — ISBN 978-0735683204 .
- ↑ Original: sociopolitiska krafter
- ↑ Phillip Laplante The Burning Bag of Dung—and Other Environmental Antipatterns Arkiverad 19 september 2015 på Wayback Machine ACM Queue 30 november 2004 Volym 2, nummer 7
Litteratur
- Perl Design Patterns Book|Perl Design Patterns - En gratis onlinebok och wiki
- William J. Brown, Raphael C. Malveau, Hays W. McCormick III och Thomas J. Mowbray. AntiPatterns: Refactoring programvara, arkitekturer och projekt i kris . - John Wiley & Sons, 1998. - ISBN 0471197130 .
- William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas. Antimönster och mönster i mjukvarukonfigurationshantering . - Wiley, 1999. - ISBN 978-0-471-32929-9 .
- William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas. Antimönster i projektledning. - Wiley, 2000. - ISBN 978-0-471-36366-8 .
- Neal Ford, Matthew McCullough, Nathaniel Schutta. Presentationsmönster: Tekniker för att skapa bättre presentationer . — Addison-Wesley, 2012-08-15. — 395 sid. — ISBN 9780132963374 .
- Chad Pytel, Tammer Saleh. Rails AntiPatterns: Best Practice Ruby on Rails Refactoring . — Addison-Wesley Professional, 2010-11-09. — 347 sid. — ISBN 9780132660068 .
- Neill, Colin J. 9.1.2 Antipatterns in Systems Engineering: An Opening Trio // INCOSE International Symposium. - 2012. - Vol. 22 , nr. 1 . - P. 1233-1245 . — ISSN 2334-5837 .
- Colin J. Neill, Philip A. Laplante. Antimönster: Identifiering, Refactoring och Management. - CRC Press, 2005. - ISBN 978-1-4200-3124-9 .
- Dimitrios Settas. Mjukvaruprojekt antimönster kunskapshantering (doktorsavhandling). - Thessaloniki, Grekland: Aristoteles universitet, 2011.
- Allen E. Typiska designfel. - Förlaget "Peter", 2003. - 224 sid. — ISBN 5-887827-304-6 .
- Smith CU, Williams LG Software Performance AntiPatterns // 2nd International Workshop on Software and Performance. — 2000.
Länkar