before we begin this self-awareness gives you the ability to know when to try one more thing and when to head in different direction systems thinking everything is system by understanding what elements make up the systemhow they are connectedand how they interact with one anotheryou can understand the system by learning to deconstruct and understand systemsyou inevitably teach yourself how to design and build systems every piece of software out there is an expression of these three core componentsthe elements that make up the solutionand set of connections and interactions between them at very basic levelyou can begin by asking yourself"what are the elements of the system want to build?write these down thenwrite down how they are connected to each other lastlylist all the interactions between these elements and what connections come into play do thisand you will have designed the system all design patterns deal with these three fundamental questions what are the elements and how are they created what are the connections between elementsor what does the structure look like how do the elements interactor what does their behavior look likethere are other ways to classify design patternsbut for now use the classical three groupings to help you develop your systems thinking skills mental models mental models are internal representations of the external world the more accurate your models of the world arethe more effective your thinking is the map is not the territoryso having more-accurate mental models makes your view of the world more accurateand the more versatile your set of mental models isthe more diverse the set of problems you will be able to solve throughout this book you will learn set of mental tools that will help you solve specific programming problems you will regularly come across in your career as programmer another way to look at mental models is to see them as grouping of concepts into single unit of thought the study of design patterns will aid you in developing new mental models the structure of problem will suggest the kind of solution you will need to implement in order to solve the problem in question that is why it is important that you gain complete clarity into exactly what the problem is you are trying to solve