Problems
Titles describe the symptom, never the pattern. Working out the fix is the exercise.
Free problems 10
Open to every account. Start here.
- BG-05Discount Applied Twice on RefreshBug HuntBUGEasyFREE
- BH-19Price Change Calls Everyone by HandBehavioralL1EasyFREE
- BH-29Shipping Cost If/Else LadderBehavioralL1EasyFREE
- BH-34A Strategy With One StrategyBehavioralL3EasyFREE
- CR-01Config Loaded Twelve TimesCreationalL1EasyFREE
- CR-03Everything Is a SingletonCreationalL2MediumFREE
- MD-09Money as a DoubleModern & EnterpriseL1EasyFREE
- PR-01The Penguin That Can't FlyDesign PrinciplesL1EasyFREE
- SM-21Unexplained Numbers in Loan RulesCode SmellsL1EasyFREE
- ST-12A Coffee Class for Every Add-On MixStructuralL1EasyFREE
Coming soon 140
The rest of the problem bank, opening with Pro. Here is what will be added.
Design Principles 16
- PR-02One Class Handles Every User TaskL1EasyComing soon
- PR-03The Invoice That Prints, Saves and Emails ItselfL1EasyComing soon
- PR-04Every New Payment Option Edits the Same ClassL1MediumComing soon
- PR-05Square Extends RectangleL1MediumComing soon
- PR-06A Read-Only Price List That Throws on AddL1MediumComing soon
- PR-07Robots Forced to EatL1EasyComing soon
- PR-08The Printer Interface With FaxL1EasyComing soon
- PR-09Order Logic Welded to the DatabaseL1EasyComing soon
- PR-10Business Logic Depends on the HTTP ClientL1MediumComing soon
- PR-11A Stack That Lets You Insert in the MiddleL1MediumComing soon
- PR-13Reaching Through Three Objects for a Postal CodeL1EasyComing soon
- PR-14Ask, Decide, SetL1EasyComing soon
- PR-15Public Balance FieldL1EasyComing soon
- PR-17Same Validation in Six PlacesL1EasyComing soon
- PR-19Configurable for Requirements That Never CameL3MediumComing soon
- PR-21The Utility Class Grab BagL1MediumComing soon
Modern & Enterprise 15
- MD-02Service Locator EverywhereL2MediumComing soon
- MD-03SQL Inside the Checkout LogicL1MediumComing soon
- MD-04Repository Returning Query BuildersL2MediumComing soon
- MD-05Half-Saved OrdersL1HardComing soon
- MD-06Null Checks on Every LineL1EasyComing soon
- MD-07Guest User Special CasesL1MediumComing soon
- MD-08A New Finder for Every Filter CombinationL1MediumComing soon
- MD-10Emails and Phones as Plain StringsL1EasyComing soon
- MD-11Date Ranges Passed as PairsL1MediumComing soon
- MD-13A Central Switch for PluginsL1MediumComing soon
- MD-14The 300-Line Import MethodL1MediumComing soon
- MD-16Modules Calling Each Other to Announce EventsL1MediumComing soon
- MD-20Retry Loops Copy-PastedL1HardComing soon
- MD-21Hammering a Dead ServiceL1HardComing soon
- MD-23Plain Data Orders, Bloated Order ServiceL1MediumComing soon
Creational 12
- CR-02Two Loggers, One FileL1EasyComing soon
- CR-04Exporter Switch in Every ScreenL1EasyComing soon
- CR-05Notification Senders Built From StringsL1EasyComing soon
- CR-06Logistics Hard-Wired to TrucksL1MediumComing soon
- CR-07The Factory That Knows Too MuchL2MediumComing soon
- CR-08Dark Button, Light CheckboxL1MediumComing soon
- CR-11An Abstract Factory for One ProductL3EasyComing soon
- CR-12The Ten-Argument PizzaL1EasyComing soon
- CR-13HTTP Request With Twelve OptionalsL1MediumComing soon
- CR-15A Builder for a PointL3EasyComing soon
- CR-16Copying Enemies Field by FieldL1MediumComing soon
- CR-18Shallow Clone SurpriseL2HardComing soon
Structural 16
- ST-01Three Payment Gateways, Three APIsL1EasyComing soon
- ST-02Legacy XML Service in a JSON WorldL1MediumComing soon
- ST-03The Maps SDK Leaks EverywhereL1MediumComing soon
- ST-04Adapter of an Adapter of an AdapterL3MediumComing soon
- ST-05A Shape Class for Every Output FormatL1MediumComing soon
- ST-07A Remote for Every TVL1HardComing soon
- ST-08Files and Folders Treated DifferentlyL1EasyComing soon
- ST-09Org Chart Salary TotalsL1MediumComing soon
- ST-13Streams With Every CombinationL1MediumComing soon
- ST-14Logging Pasted Into Every MethodL1MediumComing soon
- ST-15Decorators That Must Stop the ChainL2MediumComing soon
- ST-16Placing an Order Takes Seven CallsL1EasyComing soon
- ST-18The Facade That Ate the CodebaseL2MediumComing soon
- ST-21Images Loaded Before Anyone LooksL1MediumComing soon
- ST-22Permission Checks Inside Business LogicL1MediumComing soon
- ST-23Caching Tangled Into a Slow API ClientL1MediumComing soon
Behavioral 26
- BH-01Expense Approval If-ChainL1EasyComing soon
- BH-02Support Ticket EscalationL1MediumComing soon
- BH-03Request Middleware in One MethodL1MediumComing soon
- BH-04A Chain Where Everyone Must RunL2MediumComing soon
- BH-05Undo Built on a Giant SwitchL1MediumComing soon
- BH-06Buttons That Know Too MuchL1EasyComing soon
- BH-07A Job Queue of StringsL1MediumComing soon
- BH-08A Command Class for Every LambdaL3EasyComing soon
- BH-11Reaching Into the Playlist's ArrayL1EasyComing soon
- BH-12Tree Traversal Copy-PastedL1MediumComing soon
- BH-13Every Form Field Knows Every OtherL1MediumComing soon
- BH-14Chat Users Messaging Each Other DirectlyL1MediumComing soon
- BH-16Observer Cascade ChaosL2HardComing soon
- BH-17Public Fields for UndoL1MediumComing soon
- BH-18Game Save That Breaks EncapsulationL1MediumComing soon
- BH-20Polling for Order StatusL1MediumComing soon
- BH-22Listeners That Never UnsubscribeL2MediumComing soon
- BH-24Vending Machine If-StatesL1MediumComing soon
- BH-26Traffic Light Switch StatementsL1EasyComing soon
- BH-27States Implemented as StrategiesL2HardComing soon
- BH-28A State Machine for On/OffL3EasyComing soon
- BH-30Discount Rules HardcodedL1EasyComing soon
- BH-33Template Method Subclass ExplosionL2MediumComing soon
- BH-35Three Report Generators, 90% IdenticalL1MediumComing soon
- BH-36Data Importers Copy-PastedL1MediumComing soon
- BH-38instanceof for Every Export FormatL1HardComing soon
Bug Hunt 14
- BG-01Editing a Reorder Changes the Old InvoiceBUGMediumComing soon
- BG-02Passes Alone, Fails in the SuiteBUGMediumComing soon
- BG-04Duplicate Customers in a SetBUGEasyComing soon
- BG-06Closed Screen Still Sends EmailsBUGMediumComing soon
- BG-07A Cancelled Order Got ShippedBUGMediumComing soon
- BG-09New Payment Method Charged a Card FeeBUGMediumComing soon
- BG-10Booking Dates Shift by a DayBUGMediumComing soon
- BG-11Every Cart Shares the Same ItemsBUGEasyComing soon
- BG-14Undo Restores the Wrong TextBUGMediumComing soon
- BG-17Expired Coupon Still WorksBUGMediumComing soon
- BG-19A New Importer Skips ValidationBUGMediumComing soon
- BG-20Email Sent for an Order That Rolled BackBUGHardComing soon
- BG-21Sorting the Report Reorders the DashboardBUGEasyComing soon
- BG-22Product Vanishes From the Price MapBUGMediumComing soon
Code Smells 20
- SM-02The Order Method That Scrolls ForeverL1EasyComing soon
- SM-03Signing Up Takes Twelve ArgumentsL1EasyComing soon
- SM-04Status as Magic StringsL1EasyComing soon
- SM-05A Method in the Wrong ClassL1MediumComing soon
- SM-06street, city, zip Travel TogetherL1EasyComing soon
- SM-07The Same Switch in Five FilesL1MediumComing soon
- SM-09One Class, Five Reasons to ChangeL1MediumComing soon
- SM-10Subclasses That Override to ThrowL1MediumComing soon
- SM-11A Class That Only DelegatesL3EasyComing soon
- SM-12Two Classes Reading Each Other's PrivatesL1MediumComing soon
- SM-13An Abstract Base With One ChildL3EasyComing soon
- SM-14One Algorithm, Two Copies, DriftingL1EasyComing soon
- SM-16Fields Only Set During One MethodL1MediumComing soon
- SM-18Comments Explaining Bad NamesL1EasyComing soon
- SM-19Half the Branches Never RunL1EasyComing soon
- SM-20Three Booleans Steer One MethodL1EasyComing soon
- SM-22try/catch as if/elseL1MediumComing soon
- SM-28Factories That Build FactoriesL3MediumComing soon
- SM-30Ifs Nested Eight Levels DeepL1EasyComing soon
- SM-31Getters That Change StateL1MediumComing soon
LLD Capstones 9
- LD-01The Messy Parking LotL4HardComing soon
- LD-02Elevator Controller SpaghettiL4HardComing soon
- LD-03Splitwise Settlement MessL4HardComing soon
- LD-05Hardcoded Snake and Ladder BoardL4MediumComing soon
- LD-06Rate Limiter If-LadderL4HardComing soon
- LD-07Library Management God ClassL4MediumComing soon
- LD-11Home-Grown Logging FrameworkL4MediumComing soon
- LD-12Cache With Eviction PoliciesL4MediumComing soon
- LD-13Wallet Paying Through Many GatewaysL4HardComing soon
Concurrency 6
Architecture 6
- AR-01Business Logic in the ControllerL4MediumComing soon
- AR-03Domain Tied to the FrameworkL4HardComing soon
- AR-04Dependencies Pointing the Wrong WayL4HardComing soon
- AR-05One Model for Reads and WritesL4HardComing soon
- AR-06A Balance With No HistoryL4HardComing soon
- AR-08Events Lost After CommitL4HardComing soon