When developing software, especially at planning time, it's useful to not only consider functional requirements (the core of what the software must do), but also to bear in mind early on what the various "fundamentals" apply. These are often referred to as non-functional requirements, "-ilities", "fundamentals", "horizontals", or quality attributes.
Wikipedia has a perhaps overly-extensive list over in the quality attributes page. In practice, the ones I've seen applied most broadly are these.
- Accessibility, which is often neglected early on.
- Debuggability, related to observability and basically - will we be able to find problems efficently to fix things?
- Documentation, which also covers a pretty broad spectrum of considerations, but having a strategy for internal and external consumers can make a big difference.
- Localizability, pretty important for world-class software.
- Performance, which encompasses a number of things like efficiency and considerations around latency, throughput and the like.
- Scalability, especially in distributed systems, but really this applies in all sorts of places.
- Stability and/or reliability, closely associated with resiliency. I think of the former as "does it work properly?" and the latter as "does it still work when other things are not working properly?"
- Testability, closely related to observability, debuggability, good componentization and a few others, but definitely not something to be left as an afterthought.
Many of these are not just about enabling the capability in software ("testability") but also about actually implementing a plan to test the product (and make it performant, localize it, etc.)
Happy planning and development!
Tags:
design
Home