Ad Hoc Development #
Ad hoc development is making something as a one-off. For example, you might make a script for an assignment, or to quickly automate a task. After the job is done, you don’t bother with the code again and move on to something else. Ad hoc development is fine for very small items, but if we want to build at scale we’ll run into problems real fast. It’s important to be intentional with the design of software as we increase the scale of our projects.
Software Complexity #
Software is made up of essential and accidental difficulties.
Essential difficulty is inextricably built into the process of writing software. You can’t get rid of it. It’ll always be there. On the other hand, accidental difficulty is the result of circumstances. For example, writing an essay is essentially more difficult than writing a text message, while writing said essay on your phone instead of your computer is an instance of accidental difficulty.
Software Quality #
There are two types of software quality: internal and external.
Internal quality is how good the software is from the perspective of those working on it. The main feature of internal quality is maintainability – how easy it is to maintain. This comes with a host of subcomponents such as analyzability (how easily can you understand the code?), changeability (how easily can you change the code?), stability (how much does changing one part of the code affect the other parts?), reusability (how much can you reuse code elsewhere?), and testability (how easily can you test the code for faults?). The most important part of software quality, and the hardest part to ensure, is design. You have to intentionally design software from the start to make sure it is maintainable, using principles like modularity along with tools such as version control and testing. The goal is to slow down the rate at which the software becomes unmaintainable.
External quality is how good the software is from the perspective of the people affected by the software. This includes users, support staff, and possibly people affected by the users. Some measures of external quality include functionality (does it do its job?), reliability (does it do its job consistently?), usability (is it easy to use?), efficiency (how much of the system’s resources does it take up?), and portability (can it be moved between environments easily?).