Writing code is the easy part of your work as a software developer. This practical book lets you explore the other 90%-everything from requirements discovery and rapid prototyping to business analysis and designing for maintainability. Instead of providing neatly packaged advice from on high, author Gregory Brown presents detailed examples of the many problems developers encounter, including the thought process it takes to solve them.

He does this in an unusual and entertaining fashion by making you the main character in a series of chapter-length stories. As these stories progress, the examples become more complex, and your responsibilities increase. Together, these stories take you on a journey that will make you question and refine the way you think about, and work on, software projects.

Steps in this unique journey include:

Using prototypes to explore project ideasSpotting hidden dependencies in incremental changesIdentifying the pain points of service integrationsDeveloping a rigorous approach towards problem-solvingDesigning software from the bottom upData modeling in an imperfect worldGradual process improvement as an antidote for over-commitmentThe future of software development

Chapter 1Using Prototypes to Explore Project IdeasStart by understanding the needs behind the projectUse wireframes to set expectations about functionalitySet up a live test system as soon as you start codingDiscuss all defects, but be pragmatic about repairsCheck your assumptions early and oftenLimit the scope of your work as much as possibleRemember that prototypes are not production systemsDesign features that make collecting feedback easyChapter 2Spotting Hidden Dependencies in Incremental ChangesThere's no such thing as a standalone featureIf two features share a screen, they depend on each otherAvoid non-essential real-time data synchronizationLook for problems when code is reused in a new contextChapter 3Identifying the Pain Points of Service IntegrationsPlan for trouble when your needs are off the beaten pathRemember that external services might change or dieLook for outdated mocks in tests when services changeExpect maintenance headaches from poorly coded robotsRemember that there are no purely internal concernsChapter 4Developing a Rigorous Approach Toward Problem SolvingBegin by gathering the facts and stating them plainlyWork part of the problem by hand before writing codeValidate your input data before attempting to process itMake use of deductive reasoning to check your workSolve simple problems to understand more difficult onesChapter 5Designing Software from the Bottom UpIdentify the nouns and verbs of your problem spaceBegin by implementing a minimal slice of functionalityAvoid unnecessary temporal coupling between objectsGradually extract reusable parts and protocolsExperiment freely to discover hidden abstractionsKnow where the bottom-up approach breaks downChapter 6Data Modeling in an Imperfect WorldDecouple conceptual modeling from physical modelingDesign an explicit model for tracking data changesUnderstand how Conway's Law influences data management practicesRemember that workflow design and data modeling go hand in handChapter 7Gradual Process Improvement as an Antidote for OvercommitmentRespond to unexpected failures with swiftness and safetyIdentify and analyze operational bottlenecksPay attention to the economic tradeoffs of your workReduce waste by limiting work in progressMake the whole greater than the sum of its partsChapter 8The Future of Software Development