Software Design

18 posts

lineOriginal article

Code Quality Improvement Techniques Part 1 (opens in new tab)

Maintaining a clear separation of concerns between software layers requires avoiding implicit dependencies where one layer relies on the specific implementation details of another. When different components share "hidden" knowledge—such as a repository fetching extra data specifically to trigger a UI state—the code becomes fragile and difficult to maintain. By passing explicit information through data models, developers can decouple these layers and ensure that changes in one do not inadvertently break the other. ### The Risks of Implicit Layer Dependency When layers share implicit logic, such as a repository layer knowing the specific display requirements of the UI, the architecture becomes tightly coupled and prone to bugs. * In the initial example, the repository fetches `MAX + 1` items specifically because the UI needs to display a "+" sign if more items exist. * This creates a dependency where the UI logic for displaying counts relies entirely on the repository's internal fetching behavior. * Code comments that explain one layer's behavior in the context of another (e.g., `// +1 is for the UI`) are a "code smell" indicating that responsibilities are poorly defined. ### Decoupling Through Explicit State The most effective way to separate these concerns is to modify the data model to carry explicit state information, removing the need for "magic numbers" or leaked logic. * By adding a boolean property like `hasMoreItems` to the `StoredItems` model, the repository can explicitly communicate the existence of additional data. * The repository handles the logic of fetching `limit + 1`, determining the boolean state, and then truncating the list to the correct size before passing it up. * The UI layer becomes "dumb" and only reacts to the provided data; it no longer needs to know about the `MAX_COUNT` constant or the repository's fetching strategy to determine its display state. ### Strategic Placement of Logic and Constants Determining where constants like `ITEM_LIST_MAX_COUNT` should reside is a key architectural decision that impacts code reuse and clarity. * **Business Logic Layer:** Placing such constants in a dedicated Domain or Use Case layer is often the best approach for maintaining a clean architecture. * **Model Classes:** If a separate logic layer is too complex for the project scale, the constant can be housed within the model class (e.g., using a companion object in Kotlin). * **Dependency Direction:** Developers must ensure that functional logic does not leak into generic data models, as this can create confusing dependencies where a general-purpose model becomes tied to a specific feature's algorithm. Effective software design relies on components maintaining a "proper distance" from one another. To improve code quality, favor explicit flags and clear data contracts over implicit assumptions about how different layers of the stack will interact.

figma3 min readCurated summary

Why Design is for Everyone | Figma Blog

Design is presented not as a discipline owned by professional designers, but as a shared way of solving problems and communicating ideas. As technology evolved from physical products like Sony’s Walkman to software and digital interfaces, design became increasingly central to usability, accessibility, and product success. The author argues that organizations achieve better products and systems when design knowledge is shared across teams rather than confined to a single department. ## Design as a shared practice - Design is described as: - A tool for solving problems - A mindset for approaching challenges - A framework for communicating and developing ideas - Professional designers may identify strongly with the discipline, but design should remain accessible to everyone. - Observing hundreds of teams and thousands of individuals led the author to conclude that individual expertise has limits. - Teams equipped with shared design knowledge can create: - Better user experiences - More effective processes - Stronger organizational systems - The future of design is therefore organization-wide, built through a design-driven culture rather than isolated design departments. ## Design through technological change - Design evolves alongside technology, helping transform technical possibilities into products people can understand and use. - Its role extends beyond appearance: design bridges the gap between prototypes and market-ready experiences. ## The Walkman: engineering combined with user-centered design - Sony’s 1979 portable stereo began with engineering advances from the Pressman tape recorder. - Engineers made the device smaller and lighter, removed recording functionality, and improved sound quality. - Design was essential to the Walkman’s widespread adoption: - User testing shaped its intuitive interface. - Field research identified ways to improve portability and usability. - Dual headphone jacks supported shared listening. - The “hotline” button allowed users to talk while listening. - Its distinctive blue-and-silver body and orange button differentiated it from conventional black, gray, and white electronics. - The Walkman illustrates how engineering, interface design, accessibility, user research, and design thinking can combine to create a cultural icon. ## The rise of interface design - By the mid-2000s, industry attention shifted from hardware toward the software that powered devices. - Apple’s products demonstrated that hardware alone was insufficient; interfaces, touch interactions, haptics, and software usability were equally important. - The App Store created a new mobile-software economy and intensified competition around digital experiences. - Web 2.0 and mobile apps accelerated investment in software and helped establish new technology companies. - Software expanded interface design beyond the constraints of physical controls, enabling more powerful and flexible interaction models. ## Digital-native interfaces - Early digital products often used skeuomorphism, imitating familiar physical objects such as buttons, sliders, and scroll wheels. - These visual metaphors helped users understand unfamiliar digital interfaces by connecting them to established physical experiences. Design works best when it is treated as a shared organizational capability. Giving non-designers a seat at the table allows teams to apply user-centered thinking to products, processes, and systems at scale.

Read original(opens in new tab)
figma3 min readCurated summary

Dylan Field and Garry Tan on design, AI, and the power of “locking in” | Figma Blog

AI is expanding what designers and product builders can explore, but it has not eliminated the need for human judgment, context, or craft. Dylan Field argues that design will become even more important as teams use AI to generate ideas and prototypes faster, while still needing expertise to turn them into thoughtful, polished products. The central challenge is closing the gap between making something work and making it work well. ## AI Expands the Design “Idea Maze” - Current AI systems primarily function as tools that augment people in specific tasks, rather than as general intelligence. - They lower the barrier to participating in design while also raising the ceiling on what experienced creators can accomplish. - AI allows teams to explore more branches of an “idea maze,” generating greater breadth during ideation. - However, meaningful progress still requires depth: teams must investigate, refine, and evaluate promising directions. ## The Value of Rapid Feedback and “Vibe Coding” - Terms such as “getting locked in,” “I’m cooking,” and “vibe coding” describe the flow state created by rapid experimentation. - Faster feedback loops help people move ideas from their heads onto the screen more fluidly. - Figma’s emphasis on play reflects the goal of making creative expression accessible and enjoyable, even for non-experts. - AI tools are increasingly effective at helping users start and prototype quickly. - The unresolved problem is helping users move from an exciting prototype to a finished, reliable product—an issue shared by both design and code-generation tools. ## Design Is More Than Functionality - Founders and teams increasingly recognize design as a source of product value. - The important question is no longer only whether software works, but how it works. - User experience, clarity, quality, and the overall interaction determine whether a product feels successful. ## Why Human Designers Still Matter - AI has developed along partly separate tracks: diffusion models address visual creation, while language models focus on reasoning and code generation. - It remains unclear how effectively these approaches can be combined into systems capable of true design. - Field describes design as “art as it applies to problem solving,” requiring more than producing an image or implementing a short specification. - Designers contribute context involving culture, brand, product experience, and the broader problem being addressed. - As software creation becomes more automated, the ability to supply judgment and context may make design an even more critical role. AI is best understood as a force multiplier for exploration and iteration, not a replacement for design expertise. Teams should use it to accelerate experimentation while preserving the human work required to select, shape, and finish products well.

Read original(opens in new tab)