Computing Reviews
Today's Issue Hot Topics Search Browse Recommended My Account Log In
Review Help
Search
Refactoring for software design smells : managing technical debt
Suryanarayana G., Samarthyam G., Sharma T., Morgan Kaufmann Publishers Inc., San Francisco, CA, 2014. 258 pp. Type: Book (978-0-128013-97-7)
Date Reviewed: Aug 21 2015

While much has been published focused on code smells and implementation-oriented design patterns, there is a dearth of resources for software architects, designers, and developers working on software design at a macro level. This book begins to fill that gap.

The first two chapters are introductory and just long enough to set the stage for the discussion that follows. The first chapter, “Technical Debt,” defines “design smells” as “certain structures in the design that indicate violation of fundamental design principles and negatively impact design quality.” Smells are essentially anti-patterns, with an emphasis on progressively quicker identification through familiarization. Having a catalog of design smells such as this book provides is essential to accomplishing the goal of rapidly identifying and mitigating software design issues.

The importance of understanding and resolving design smells is emphasized in this first chapter by a discussion on technical debt. While intended to lay the foundation for the material that follows, this is a concise summary of the issues around technical debt that will be of use as reference material. The second chapter, “Design Smells,” explains the classification of the smells that follows in the subsequent chapters. In broad terms, the authors have limited their scope to structural, as opposed to behavioral, smells in the realm of design, rather than architecture or implementation.

What follows is a well-researched and well-written catalog of design smells, organized in four broad headings according to design principles in view. Chapters 3 through 6 contain these smells under the headings “Abstraction Smells,” “Encapsulation Smells,” “Modularization Smells,” and “Hierarchy Smells.” Each “smell” is presented following the same basic structure. First, the named design smell is defined in a rationale section, which includes the design principles that it violates. The “potential causes” section gives a handful of possible reasons for its introduction into a software product. Then, an “examples” section gives specific, often recurring examples of where the smell might be encountered in practice. The “suggested refactoring” section that follows gives specific refactorings for each of the examples introduced in the earlier section. This is followed by a section on “impacted quality attributes,” which ties the design smell to the quality attributes that are degraded by its introduction. The “aliases” section gives additional names for the design smell that are encountered in the literature. Finally, a “practical considerations” section offers practical advice for avoiding the particular design smell in the future. Because the discussion of each design smell includes these seven major headings, these four chapters provide a broad overview of design smells in practice, as well as a useful reference guide for practitioners.

The final two chapters offer useful closing practical advice and considerations. Chapter 7, “The Smell Ecosystem,” reflects on some broader implications that can be drawn by considering design smells in the broader context of systems. This discussion is brief but thought-provoking and could probably be expanded into another volume on its own. The last chapter, “Repaying Technical Debt in Practice,” again could easily be expanded to fill a separate volume. These broad summaries of commonly encountered situations in practice are helpful, but brief.

The book also includes a handful of useful appendices. There is a brief summary of some common design principles in Appendix A. Appendix B offers some suggestions for tools that may be helpful in identifying and addressing design smells in software. Appendix C provides some explanation of the notation used in figures throughout the book. Finally, Appendix D gives a short list of additional recommended resources.

Given its practical orientation and the variety of real-world examples offered throughout the book, this is a must-have for any practicing software engineer, developer, software architect, or anyone else interested in software design. This book would also provide a good introduction to real-world problems in the context of a software design or architecture course.

More reviews about this item: Amazon

Reviewer:  Nathan Carlson Review #: CR143716 (1511-0929)
Bookmark and Share
  Reviewer Selected
 
 
Restructuring, Reverse Engineering, And Reengineering (D.2.7 ... )
 
 
Software Maintenance (K.6.3 ... )
 
 
Testing And Debugging (D.2.5 )
 
Would you recommend this review?
yes
no
Other reviews under "Restructuring, Reverse Engineering, And Reengineering": Date
Software evolution: the software maintenance challenge
Arthur L., Wiley-Interscience, New York, NY, 1988. Type: Book (9789780471628712)
Mar 1 1989
The year 2000 computing crisis
Murray J., Murray M., McGraw-Hill, Inc., New York, NY, 1996. Type: Book (9780079129451)
Oct 1 1996
Constraint-based design recovery for software reengineering
Woods S., Quilici A., Yang Q., Kluwer Academic Publishers, Norwell, MA, 1998. Type: Book (9780792380672)
Dec 1 1998
more...

E-Mail This Printer-Friendly
Send Your Comments
Contact Us
Reproduction in whole or in part without permission is prohibited.   Copyright 1999-2024 ThinkLoud®
Terms of Use
| Privacy Policy