Robert C. Martin, "OCP: The Open-Closed Principle", in Agile SoftwareResisting premature abstraction is as important as abstraction itself.
Development: Principles, Patterns, and Practices, 109.
Robert C. Martin, "OCP: The Open-Closed Principle", in Agile SoftwareResisting premature abstraction is as important as abstraction itself.
Jack Reeves, "What is Software Design?", C++ Journal, Vol. 2, No. 2, 1992.[...] programming is not about building software; programming is about designing software.
I strongly recommend reading the entire paper.
Robert C. Martin, "What is Agile Design?", in Agile Software Development:Agile developers [...] never say "We'll go back and fix that later." They never let the rot begin.
[...]The attitude that agile developers have toward the design of the software is the same attitude that surgeons have toward sterile procedure. Sterile procedure is what makes surgery possible. Without it, the risk of infection would be far too high to tolerate. Agile developers feel the same way about their designs. The risk of letting even the tiniest bit of rot begin is too high to tolerate.
[...]Professionalism dictates that we, as software developers, cannot tolerate code rot.
Robert C. Martin, "Agile Design", in Agile Software Development:
- Rigidity — The design is hard to change.
- Fragility — The design is easy to break.
- Immobility — The design is hard to reuse.
- Viscosity — It is hard to do the right thing.
- Needless Complexity — Overdesign.
- Needless Repetition — Mouse abuse.
- Opacity — Disorganized expression.
These symptoms are similar in nature to code smells, but they are at a higher level. They are smells that pervade the overall structure of the software rather than a small section of code.
Robert C. Martin, "Refactoring", in Agile Software Development:Every software module has three functions. First, there is the function it performs while executing. This function is the reason for the module's existence. The second function of a module is to afford change. Almost all modules will change in the course of their lives, and it is the responsibility of the developers to make sure that such changes are as simple as possible to make. A module that is hard to change ir broken and needs fixing, even though it works. The third function of a module is to communicate to its readers. Developers unfamiliar with the module should be able to read and understand it without undue mental gymnastics. A module that does not communicate is broken and needs to be fixed.
[...]I can't stress this enough. All the principles and patterns in this book come to naught if the code they are employed within is a mess. Before investing in principles and patterns, invest in clean code.
Frederick P. Brooks, Jr., "The Mythical Man-Month after 20 Years", in The Mythical Man-Month (Anniversary Ed.), 288-289.The tar pit of software engineering will continue to be sticky for a long time to come. One can expect the human race to continue attempting systems just within or just beyond our reach; and software systems are perhaps the most intricate of man's handworks. This complex craft will demand our continual development of the discipline, our learning to compose in larger units, our best use of new tools, our best adaptation of proven engineering management methods, liberal application of common sense, and a God-given humility to recognize our fallibility and limitations.
I must admit that my first contact with software testing was not so long ago. Since them I've been increasingly impressed with how powerful a good suite of tests can be for verifying if we are delivering the expected product. Yet, as Uncle Bob well asserts, verification is just one of the benefits of writing tests. This is especially true when we're talking about TDD. There are at least four other (arguably more important) reasons that motivate writing tests first whenever possible:
For more details about these topics I strongly recommend reading chapter 4 of Agile Software Development: Principles, Patterns, and Practices. Words of wisdom from Robert Martin.
Robert C. Martin, "Agile Practices", in Agile Software Development:Working well with others, communicating and interacting, is more important than raw programming talent. A team of average programmers who communicate well are more likely to succeed than a group of superstars who fail to interact as a team.
Frederick P. Brooks, Jr., "The Mythical Man-Month after 20 Years", in The Mythical Man-Month (Anniversary Ed.), 276.[...] the quality of the people on a project, and their organization and management, are much more important factors in success than are the tools they use or the technical approaches they take.