0% found this document useful (0 votes)
18 views3 pages

Black Art Swe

The document discusses the challenges of software design, likening it to a 'black art' due to the lack of a universal recipe for good design. It emphasizes the importance of iterative learning, abstraction, and decomposition, as well as the need for thoughtful design principles to avoid common pitfalls. Ultimately, it advocates for a balance between tactical and strategic approaches in software development, encouraging ongoing discussion and improvement in design practices.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
18 views3 pages

Black Art Swe

The document discusses the challenges of software design, likening it to a 'black art' due to the lack of a universal recipe for good design. It emphasizes the importance of iterative learning, abstraction, and decomposition, as well as the need for thoughtful design principles to avoid common pitfalls. Ultimately, it advocates for a balance between tactical and strategic approaches in software development, encouraging ongoing discussion and improvement in design practices.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

The introduction sets up the idea that despite decades of programming, we’re still fumbling with design like

it’s a
“black art.”

Software Design as a Black Art


●​ Core Idea:
○​ Even after 80+ years of programming, there’s no agreed-upon “recipe” for good design.
○​ It’s like trying to bake a perfect cake without a cookbook—everyone’s winging it based on gut
feeling.
●​ Design vs. Coding:
○​ Should spend more time on how to design software itself.
○​ Think of it like building a house where everyone focuses on buying the right tools, but nobody really
plans the architectural blueprint.

Basics
●​ Abstraction:
○​ Often cited as the “most important idea” in computer science.
○​ Imagine abstraction as the cover of a book—it hides the messy details (the text inside) so you can
quickly know what it’s about.
●​ Decomposition:
○​ Breaking down a problem.
○​ Like slicing a giant pizza into bite-sized pieces instead of trying to eat it whole.

Stanford Course
●​ Structure:
○​ Students work in pairs to build a project (around 2,000–3,000 lines of code) in a short timeframe.
○​ Review codes multiple times.
●​ Iterative Process:
○​ First Iteration: Build a rough version of a system.
■​ Rough draft.
○​ Second Iteration: Receive detailed feedback.
■​ Like having a seasoned chef tell you exactly why your soup is missing flavor.
○​ Third Iteration: Redesign a new project from scratch with the lessons learned.
●​ IMPORTANT:
○​ The course isn’t about writing “perfect” code right away. It’s about learning design through repeated
practice and feedback.

Red Flags & Design Principles

1. Deep Classes vs. Shallow Classes


●​ Deep Classes:
○​ A deep class hides a lot of complexity behind a very simple interface.
○​ Picture a tiny, neat mailbox that, when opened, reveals an entire storage room full of goodies.
●​ Shallow Classes:
○​ These either do very little or expose too many messy details.
○​ It’s like a window display that looks fancy but holds almost nothing valuable behind it.
●​ Takeaway:
○​ A “deep” class gives you maximum benefit (lots of functionality) for minimal mental overhead (small
interface).
2. Defining Errors Out of Existence
●​ The Problem with Errors:
○​ Throwing exceptions everywhere (like in Java’s substring methods) forces developers to write extra
error-handling code.
○​ It’s like having a car that constantly sounds alarms for every little bump—annoying and distracting.
●​ Redesigning Error Handling:
○​ Instead of letting errors occur and then catching them, design your systems so the error conditions just
“don’t happen.”
○​ It’s like having a safety net in a playground that’s built into the design, so you never need to worry
about falling.

3. Exceptions
●​ For some errors , it might be better to crash, in most exceptions, if ahndled properly then are good.
●​ It’s like deciding to pull the emergency brake on a train when something goes seriously wrong, rather than
trying to patch up the tracks on the fly.

Approach
●​ Tactical:
○​ Quick work, but messy.
●​ Strategic:
○​ Slower, but well structured.
●​ Investment:
○​ John suggests investing around 10–20% extra time now to reduce headaches (and extra work) later.
●​ Cultural Impact:
○​ Companies that reward “tactical tornadoes” (those who churn out quick, messy code) may win
short-term but suffer long-term maintenance woes.
○​ Example: Facebook’s “move quickly and break things” vs. the more measured approach seen in
places like Google or VMware.

Additional Insights
●​ Iterative Improvement & Learning from Mistakes:
○​ Both the class and John himself evolve their thinking by repeatedly reviewing and refining code.
○​ Like practicing a musical instrument—you get better note by note, even if your first attempts sound
off.
●​ Layering & Performance:
○​ Layers help manage complexity but too many layers can hurt performance.
○​ Think of it as having multiple layers of clothing. A few layers keep you comfortable, but too many
can make you sluggish and overheated.
●​ Hiring for Growth (Slope vs. Y-Intercept):
○​ John prefers to hire people who have a steep “learning curve” (fast learners) rather than just those who
start off with a lot of skills.
○​ It’s like choosing someone who’s an eager apprentice with tons of potential over someone who’s
already good but won’t grow much further.
●​ General Takeaway on Software Design:
○​ There isn’t one magical formula; it’s a mix of principles, iterative practice, and learning to see red
flags in design.
○​ Personal Thought: It reminds me of gardening—if you tend your garden (code) carefully, pruning the
weeds (bad patterns) regularly, you’ll eventually grow a much healthier, more sustainable system.
Final Reflections
●​ Evolving Philosophy:
○​ John is still learning from his students’ code reviews and evolving his own ideas. He sees his book
and course as starting points for a larger, ongoing conversation.
●​ Invitation to Debate:
○​ He encourages discussion and feedback, hoping that over time a community will form around better,
shared design principles.
○​ It’s like opening a community cookbook—everyone brings a recipe, and together you find the best
way to cook up quality software.
●​ Real-World Constraints:
○​ While ideal design is the goal, real-life pressures (deadlines, legacy systems) often force a tactical
approach. The challenge is balancing speed with quality.
●​ Personal Wrap-Up:
○​ I found the talk very relatable; it’s not polished in the sense of “one-size-fits-all” advice but is full of
practical, imperfect wisdom. It’s like talking to a seasoned friend who’s been through the coding
trenches and isn’t afraid to admit that sometimes, you just have to learn by doing (and redoing).

You might also like