3 Essentials for Software Design
![Image](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd_KCIO1inytg8osa3rxp7ERvozwsbao4rkbitZyYSmOb4bYNNWLANUwIPNVt3k66BuRh3ZLo4ovuTvB8cQ4RGa3LbpbcM-Cs3uw9dwzjq1nhjr-k84dCm5O2kr7LeRZkmeiGBH6l1Uvk/s320/toolbox-306888_640.png)
1. Your Toolbox: Design Patterns In software design, design patterns are an essential toolbox to ensure your code is broken down into small independent units. This toolbox gets filled one-by-one, a single design pattern at a time. Since the tools can be used in different combinations, quickly the toolbox owner becomes more effective in creating a design that is focused on minimum effort and risk. This is especially true if you write or support software in a team. First you must ensure the tasks - and thus the code - are broken down into independent units. Common symptoms that arise when this is not properly done: engineers waiting on each other code to complete, functionality duplication, merge conflicts, the work of member "a" breaks the work of member "b" (regression bugs), incoherent interfaces - e.g. getX, doWriteX, deleteById; while much more coherent interface would be: readX-writeX-deleteX, or getX-updateX-deleteX. The second issue is in supporting (r