Grokking Simplicity is a friendly, practical guide that will change the way you approach software design and development.SummaryDistributed across servers, difficult to test, and resistant to modification—modern software is complex. Grokking Simplicity is a friendly, practical guide that will change the way you approach software design and development. It introduces a unique approach to functional programming that explains why certain features of software are prone to complexity, and teaches you the functional techniques you can use to simplify these systems so that they’re easier to test and debug.About the technologyDevelopers rightly fear the unintended complexity that infects most code. This book shows you how to write software that keeps complexity close to its inherent minimum. As you write software you should distinguish between code that alters your system’s state, and code that does not. Once you learn to make that distinction, you can refactor much of your state-altering “actions” into stateless “calculations.” Your software will be simpler.About the bookThe book also teaches you to solve the complex timing bugs that inevitably creep into asynchronous and multithreaded code. In advanced sections of the book you learn how composable abstractions help avoid repeating code and open up new levels of expressivity.What's insidePatterns for simpler codePowerful time modeling approaches to simplify asynchronous codeHow higher-order functions can make code reusable and composableAbout the readerFor intermediate and advanced developers building complex software. Exercises, illustrations, self-assessments, and hands-on examples lock in each new idea.About the authorEric Normand is an expert software developer who has been an influential teacher of functional programming since 2007. Table of Contents1 Welcome to Grokking Simplicity2 Functional thinking in actionPART 1 - ACTIONS, CALCULATIONS, AND DATA3 Distinguishing actions, calculations, and data4 Extracting calculations from actions5 Improving the design of actions6 Staying immutable in a mutable language7 Staying immutable with untrusted code8 Stratified design, part 19 Stratified design, part 2PART 2 - FIRST-CLASS ABSTRACTIONS10 First-class functions, part 111 First-class functions, part 212 Functional iteration13 Chaining functional tools14 Functional tools for nested data15 Isolating timelines16 Sharing resources between timelines17 Coordinating timelines18 Reactive and onion architectures19 The functional journey ahead