Paperback ☆ Code Complete PDF/EPUB ✓

Widely considered one of the best practical guides to programming Steve McConnell's original CODE COMPLETE has been helping developers write better software for than a decade Now this classic book has been fully updated and revised with leading edge practices and hundreds of new code samples illustrating the art and science of software construction Capturing the body of knowledge available from research academia and everyday commercial practice McConnell synthesizes the most effective techniques and must know principles into clear pragmatic guidance No matter what your experience level development environment or project size this book will inform and stimulate your thinking and help you build the highest quality code Discover the timeless techniques and strategies that help you Design for minimum complexity and maximum creativity Reap the benefits of collaborative development Apply defensive programming techniques to reduce and flush out errors Exploit opportunities to refactor or evolve code and do it safely Use construction practices that are right weight for your project Debug problems quickly and effectively Resolve critical construction issues early and correctly Build quality into the beginning middle and end of your project


10 thoughts on “Code Complete

  1. says:

    Code Complete is a massive work so this summary is necessarily very high level It is not a book that one can absorb completely in one reading but one can absorb its high level themes summarized nicely in the second to last chapter Conquer Complexity High quality code manages complexity No one can think of all of the levels of abstraction needed to fully understand a program at once just admit it and try to make your code less complex Complexity can be managed at every level of the development process from having a well thought out high level design to choosing good variable namesPick Your Process Having a process is important It does not matter exactly what the process is in fact the process should be tailored to the problem at hand The purpose of a process is to allow for coordination between people When a project is small 1 maybe 2 people then it is the talent of the individual that matters most When a project is large it is managing communication that matters mostWrite Programs for People First Computers Second Computers do not care about programs being readable but people do and people are going to read your programs many time Readable code has a plethora of advantages including lower error rates being easier to debug and modify and having shorter development time Make code readable first and only optimize when you can make measurable improvements to measurable performance bottlenecksProgram into Your Language Not in It Do not limit your programming by the features your language supports Write libraries that will support the programming features you want for the problem at hand One example McConnell gives writing an assertion library if your language does not support assertionsFocus Your Attention with the Help of Conventions Conventions like processes do not matter in their particulars Some conventions are better than others but for the most part conventions tend to be arbitrary However having conventions makes code easier to read and modify because a convention can communicate a lot without using much space or requiring much thinkingProgram in Terms of the Problem Domain This is a particular method of managing complexity Higher level code should be supported by lower level code that hides implementation specific details from the higher level code When done well this makes the code easier to read and easier to modify Even at the construction level this can be done by choosing good class names and abstractions factoring code into methods to maintain a common level of abstraction and choosing good variable namesWatch for Falling Rocks Look out for warning signs such as classes with an abnormally high number of defects These warning signs do not necessarily mean that something is wrong with that part of the program but they are a good indicator that you should be a little bit suspicious These warning signs could show up after construction error rate or during construction compiler warning indications from your self or other that your program is hard to understandIterate Repeatedly Again and Again In addition to being my favorite section heading in the book this principle emphasizes that iteration is appropriate at all points of the software development process Requirements are rarely fixed in stone bugs are always present and developers can always find a better way to rewrite code Iteration gives all of these improvements a chance to actually make it into the product under developmentThou Shalt Rend Software and Religion Asunder No one convention process or tool set is the be all and end all of software development Developers should be wary of absolutes and try to avoid blind faith in the processes they use Solutions should be adapted to the problem at hand not vice versa The key to keeping an open mind and becoming effective and flexible is experimentation Be willing to try new things measure the effectiveness of those experiments and be willing to change based on the resultsThose are the high level principles These principles occur over and over again through the seven parts of this book The first part titled Laying the Foundation discusses the general process of software development and the role of construction aka programming in that process Construction is important according to McConnell because it is the only part of the software development process that absolutely must happen to produce a working software project Construction is also an area that traditionally has not has as much attention to it as other areas such as high level design or testing However McConnell stresses that all parts of the development process are important in creating a successful project and gives pointers throughout the text to resources that discuss other parts of the software development process in depth He notes that pre construction planning is particularly important since no amount of good construction and through testing can save a bad designSection two is Creating High Quality Code This section introduces a point emphasized again and again throughout the book Software's Primary Technical Imperative is managing complexity High quality code exposes people reading it to consistent levels of abstraction separated by clear boundaries Complexity is managed by minimizing the essential complexity one has to deal with at any given time and trying to keep accidental complexity from spreading throughout the code base High quality classes and routines provide consistent abstractions document their assumptions and check their invariants defensively they fail sooner rather than later Even a simple class or routine is worthwhile if it decreases the complexity of reading the code where it is used One of the most practically useful facts I got out of Code Complete was learning about the Pseudocode Programming Process This process is a way of developing code by starting with detailed pseudocode When constructing a program a developer should iteratively write pseudocode that is high level enough to be in the domain of the problem but low level enough for translation to real code to be nearly mechanical Developing pseudocode ensures that the developer understands the problem at a low enough level for implementation encourages the programmer to think about error checking before implementing the nominal path through the code may indicate what when to factor code into separate routines and suggest names for those routines Those parts of the high level pseudocode that the developer decides to leave in provide automatic high level commenting of codeThe third section is entitled Variables and discusses the effective use of variables The chapters in this section discuss data initialization do it close as close to the declaration as possible variable scope keep it as small as possible limiting variables to a single purpose effective variable names keep them specific use a naming conventions and tips for using fundamental and complex data typesStatements are covered in section four called not surprisingly Statements This section discusses methods for effectively organizing and using straight line code conditionals and loops as well as exotic control structures such as exceptions gotos and various table driven control structures This section discusses how deep nesting of control structures tends to make code complex If possible it should be avoided by restructuring the code or factoring the nested code into its own routine The paths there are through a code fragment the complex it is the number of paths a developer must consider at a single time should be minimizedSection five Code Improvements discusses a mishmash of techniques for improving code It discusses software quality collaboration developer testing debugging refactoring and code tuning One key point of this section is that the goals of a certain construction project should be clear Some goals are bound to go against each other and if developers do not know which are most important they will do a bad job of trying to optimize all of them at once The most obvious example of this tendency is that aggressive optimization may make code less readable and prevent beneficial refactorings This section also points out that code reviews testing debugging refactoring and code tuning all have the potential to improve code quality but it is when they are used thoughtfully in unison that their potential is maximizedSection six System Considerations discusses some higher level issues in constructing a system As project size increases project quality and development speed tend to go down in a faster than linear manner This is because as the project increases and overhead gets taken up by managing communication and details tend to get lost in the cracks It is for this reason that having a process and conventions becomes important on large projects the that is automatic the less that quality and and development time will suffer This section also discusses how to manage programmers and essential tools that every developer should know about and use This section also discusses several integration processes and emphasizes that which process is right depends on the project being developedThe final section of Code Complete is Software Craftsmanship This section talks about good practices in actually structuring code and how to write good effective comments and code that documents itself as much as possible This section also describes the importance of personal character in becoming an excellent developer McConnell posits that intelligence is less important than other personal characteristics such as humility curiosity intellectual honesty communication and cooperation creativity and discipline effective laziness and good habits The point emphasized throughout the discussion on personal character is that a good developer needs to be happy and willing to learn from other developers and be willing to admit when their are right and wrong if they want to earn the trust and respect of othersA useful part of the final section was McConnell's summary of where to find information In particular he presents A Software Developer's Reading Plan reproduced below for my future reference Note that the plan should be supplemented to the needs and interests of particular developersIntroductory levelAdams James L Conceptual Blockbusting A Guide to Better Ideas 4th ed Cambridge MA Perseus Publishing 2001Bentley Jon Programming Pearls 2d ed Reading MA Addison Wesley 2000Glass Robert L Facts and Fallacies of Software Engineering Boston MA Addison Wesley 2003McConnell Steve Software Project Survival Guide Redmond WA Microsoft Press 1998McConnell Steve Code Complete 2d ed Redmond WA Microsoft Press 2004Practitioner levelBerczuk Stephen P and Brad Appleton Software Configuration Management Patterns Effective Teamwork Practical Integration Boston MA Addison Wesley 2003Fowler Martin UML Distilled A Brief Guide to the Standard Object Modeling Language 3d ed Boston MA Addison Wesley 2003Glass Robert L Software Creativity Reading MA Addison Wesley 1995Kaner Cem Jack Falk Hung Q Nguyen Testing Computer Software 2ed New Yor NY John Wiley Sons 1999Larman Craig Applying UML and Patterns An Introduction to Object Oriented Analysis and Design and the Unified Process 2d ed Englewood Cliffs NJ Prentice Hall 2001McConnell Steve Rapid Development Redmond WA Microsoft Press 1996Wiegers Karl Software Requirements 2d ed Redmond WA Microsoft Press 2003Manager's Handbook for Software Development NASA Goddard Space Flight CenterProfessional levelBass Len Paul Clements and Rick Kazman Software Architecture in Practice 2d ed Boston MA Addison Wesley 2003Fowler Martin Refactoring Improving the Design of Existing Code Reading MA Addison Wesley 1999Gamma Erich et al Design Patterns Reading MA Addison Wesley 1995Gilb Tom Principles of Software Engineering Management Workingham England Addison Wesley 1988Maguire Steve Writing Solid Code Redmond WA Microsoft Press 1993Meyer Bertrand Object Oriented Software Construction 2d ed New York NY Prentice Hall PTR 1997Software Measurement Guidebook NASA Goddard Space Flight CenterFor details and up to date reading lists see wwwconstruxcomprofessionaldev requires an account free with purchase of code completeOther interesting things from a quick skim of the bibliographyBaecker Ronald M and Aaron Marcus 1990 Human Factors and Typography for More Readable Programs Reading MA Addison WesleyVarious works by Kent BeckVarious works by Barry BoehmDijkstra Edsger 1965 Programming Considered as a Human Activity Proceedings of the 1965 IFIP Congress Amsterdam North Holland 213 17 Reprinted in Yourdon 1982 Writings of the RevolutionDisjkstra Edsger 1972 The Humble Programmer Communications of the ACM 15 no 10 October 859 66Knuth's Literate ProgrammingPaul Oman and Curtis Cook The Book Paradigm for Improved Maintenance and Typographic Style is More than CosmeticSchneiderman Ben 1980 Software Psychology Human Factors in Computer and Information Systems Cambridge MA WinthropSpinellis Diomidis Code Reading An Open Source PerspectiveVarious by Gerald Weinberg