I am aware that if there are no open files, it will be greyed out. Le Mot Wordle is in perfect condition. The small one above doesn't have an undo or redo button. As of right now, I've been able to open designs and scale them using it, but I'm confident that any more detailed work would lead to mistakes that would need to be undone.
Most formalised systems engineering processes recognise that the cost of correcting a fault increases as it progresses through the development process. Additional effort spent in the early stages of development to discover and correct errors is therefore likely to be worthwhile. Design reviews are example of such an effort.Therefore, a number of design reviews may be carried out, for example to evaluate the design against different sets of criteria (consistency, usability, ease of localisation, environmental) or during various stages of the design process.
I was somewhat skeptical when starting to read a Philosophy of Software Design, despite having it recommended by a friend. The book does a delightful job underselling itself. It is odd-shaped, published by a university press, and the preface mentions, "At this point, you might be wondering: what makes me think I know all the answers about software design? To be honest, I don't."
However, the fact that the book was written by someone who's been writing code for decades, the university press being Stanford press, and the book covering lessons learned during the first software design class at Stanford gauged my interest. Still, I wondered just how much I would learn about software design from experience partially distilled from a classroom - even if a Stanford classroom. A lot, as it would turn out.
There is a significant difference between most books written on software design and John Ousterhout's one. It's repeatability. While almost all software architecture books are based on real-world experiences of experienced developers and consultants, those are not repeatable experiences. Those people solved challenging problems using certain methods: but they did not have the opportunity to do the same with a different approach. Even my views on software architecture are based on one-off projects and their aftermath.
John, on the other hand, had the vantage point of having multiple teams solve the same design problem during a semester, with him observing. He also had the luxury of repeating this experiment multiple times. With each repeat, he was able to both validate and tweak his observations.
So how, exactly, should we fight this complexity? By encapsulating complexity via modular design and making code simple and obvious, like eliminating special cases or using consistent coding styles. The first part of the book focuses on good, modular design practices, while the second part of the book touches on techniques to make the code simple, as well as goes in-depth on commenting best practices.
Designing things twice (Chapter 11) is a suggestion that hits close to home. This is advice I've been suggesting to people to get better at designing systems, well before I read this book.
Information hiding and information leakage (Chapter 5) is another take on what good abstraction is and how efficient interfaces should behave. Those who have designed APIs have probably had first-hand experience with why leaking information beyond the bare minimum leads to tech- and architecture debt later on. John also mentions a glaring example of bad API design: over-exposing internals.
While the book does a good job covering architecture concepts when writing code, there are several areas that it does not touch on. Most of these are outside the scope of the software design course itself. However, some reference to these would have been useful.
Writing up, sharing, and debating design with other peers is a practice more and more common in tech companies. This includes both whiteboarding and presenting to a group of peers, as well as more formal RFC-like design processes. While it might be less applicable to the course John taught, it's a practice that comes with many benefits. These days, as shared editing and commenting tools are more common, with editors like Google Docs and O365. Sharing design ideas upfront and opening a debate using these tools is a great way to build more sturdy architecture. Especially when applying the "design it twice" principle, and writing up alternative designs considered, and the tradeoffs why the other design was not chosen.
Testing was absent from the book, save for the last part, mentioned at the end of the book, in 19.3, as part of software trends. In my view, good architecture and testability go hand-in-hand and would have welcomed this topic mentioned earlier. John dedicates discussing strategies to modify existing code in-depth in Chapter 16. His two pieces of advice are on staying strategic in modifying the design and maintaining the comments. This does not match my reality. The surest and safest way I know to modify existing code is to have tests. With tests in place, go ahead and make whatever change is necessary - and sensible. If there are no tests, start by writing tests. If there are tests, major refactors that wildly modify the existing design can also fly - the tests should give a safety net to do so. And with tests in place, comments become an afterthought: if there is a test for it, a comment is not that necessary. Note that after exchanging emails with John, he pointed out he focused the book on architecture, treating other topics deliberately out of scope.
I very much recommend the first half of the book - chapters 1-9 and chapter 14 - for all software engineers to read, digest, and consider applying. Concepts like depth of modules, layers adding complexity - or keeping complexity at bay - and information hiding are pragmatic tools to use when designing software. The book offers a fresh take on the concept of abstractions, and nicely complements principles like simplicity, KISS (Keep it Simple, Stupid) and YAGNI (You Ain't Gonna Need It).
There are few books that discuss software design in a simple and approachable way, while leaving the reader novel and practical concepts to use. A Philosophy of Software Design is a standout and recommended read for this reason. We need more resources to remind us not overcomplicate software architecture. It will become complicated enough, module after module, layer after layer.
My project pursued a split review. Some of the deisgn review comments indicated they want proof the items we indicated in a narrative were completed, this proof can't be given until it is built and we can take photographs. Is it best to get an extension on my 25 day window (how does one do this?) or hit the "skip review" button and submit everything as a construction review? I am assuming the credits that were looked at once during the design review will only be looked at one more time? I am a bit confused on how to proceed and am quickly running out of time. I am leaning towards the "skip review" option and having it all reviewed at the end of substantial completion in the winter of 2013...any help / advice would be greatly appreciated.
Quick clarrification: I am wondering what is the benefit of trying to rush an answer now when I can hit the "skip review" button and get a year to complete the submittal? Unfortunately I thought you were able to get the design review and then a final complete review of the project, I didn't understand that the final deisgn review is all a credit gets without paying for an appeal (is this correct). Thanks eveyone.
You can defer those design credits to the construction phase by un-checking them when you resubmit your design final review, that way their second round of review is with the construction credits. Choosing "skip review" means you accept GBCI's decision as-is and you aren't changing anything.
Thank you Kinberly, so just to clarify (as I don't want to mess this up), credits that were indicated as "pending" or "not approved" can be un-checked as complete for the final design review. The credits indicated as accepted should be left checked and submitted for final design review approval. By doing this I will get the accepted credits locked in and will be able to update / clarify the "pending" / "not approved" credits during the preliminary construction review? Thanks for the info and verification.
The reviewers use "canned" review comments, and someone at the USGBC recently decided they want photo proof. Unfortunately, they neglected to adjust the comment to take into account what a "design review" is intended for.
Yes Todd, anything that you un-check as complete will not be allowed to be submitted for the design final review (i.e. the green check on the scorecard should be gray). When you're ready to submit for the construction review, mark those remaining design credits as complete and submit them all together.
Hernando brings up a good point; however, I am hesitant to submit and then be rejected, requiring to pay for an appeal. With that being said, what is the benefit of a design review? What if something changes during construction that would change a previously approved credit? Now that I fully understand the review process it seems very risky to submit during the design process as things can change during a long construction time frame.
The benefit of a design review is to get early feedback and to space out the credit documentation. If something changes during construction to affect an approved design credit you are supposed to make the changes and resubmit it. The level of change risk depends on the project in my experience.
I think you are required to indicate that nothing has changed during construction that would affect each of the approved design credits in order to move into the construction review phase. If nothing changed in construction to affect the accuracy of any of the approved design credits then indicate as such. If something did change then change the documentation and resubmit.
582128177f