A Philosophy of Software Design
Rate it:
Read between October 6 - October 20, 2019
6%
Flag icon
We teach for loops and object-oriented programming, but not software design.
6%
Flag icon
I have wondered whether software design can be taught, and I have hypothesized that design skill is what separates great programmers from average ones.
7%
Flag icon
The second approach to complexity is to encapsulate it, so that programmers can work on a system without being exposed to all of its complexity at once. This approach is called modular design. In modular design, a software system is divided up into modules, such as classes in an object-oriented language. The modules are designed to be relatively independent of each other, so that a programmer can work on one module without having to understand the details of other modules.
8%
Flag icon
Incremental development means that software design is never done. Design happens continuously over the life of a system: developers should always be thinking about design issues. Incremental development also means continuous redesign.
9%
Flag icon
You can then use these when you are coding: when you see a red flag, stop and look for an alternate design that eliminates the problem.
10%
Flag icon
Complexity is more apparent to readers than writers. If you write a piece of code and it seems simple to you, but other people think it is complex, then it is complex.
15%
Flag icon
complexity of a system would be the complexity of its worst module.
35%
Flag icon
Bringing pieces of code together is most beneficial if they are closely related. If the pieces are unrelated, they are probably better off apart.
51%
Flag icon
I have noticed that the design-it-twice principle is sometimes hard for really smart people to embrace.
52%
Flag icon
The design-it-twice approach not only improves your designs, but it also improves your design skills.
52%
Flag icon
the process of writing comments, if done correctly, will actually improve a system’s design.
54%
Flag icon
Documentation can reduce cognitive load by providing developers with the information they need to make changes and by making it easy for developers to ignore information that is irrelevant.
55%
Flag icon
The idea of an abstraction is to provide a simple way of thinking about something, but code is so detailed that it can be hard to see the abstraction just from reading the code.
55%
Flag icon
Developers should be able to understand the abstraction provided by a module without reading any code other than its externally visible declarations.
75%
Flag icon
Writing the comments first makes documentation part of the design process. Not only does this produce better documentation, but it also produces better designs and it makes the process of writing documentation more enjoyable.
80%
Flag icon
Interfaces. An interface with multiple implementations is another example of consistency. Once you understand one implementation of the interface, any other implementation becomes easier to understand because you already know the features it will have to provide.
81%
Flag icon
The best way to enforce conventions is to write a tool that checks for violations, and make sure that code cannot be committed to the repository unless it passes the checker.
86%
Flag icon
software should be designed for ease of reading, not ease of writing.
89%
Flag icon
The problem with test-driven development is that it focuses attention on getting specific features working, rather than finding the best design.
94%
Flag icon
Dealing with complexity is the most important challenge in software design.
95%
Flag icon
The modules you defined carefully at the beginning of a project will save you time later as you reuse them over and over.