Consiglio vivamente di leggere il pdf contenuto in questo post di Karl Seguin
Contiene una serie di concetti che ogni sviluppatore software dovrebbe già conoscere ed applicare, ma sono espressi in maniera sintetica e molto chiara.
Riporto alcuni passi secondo me molto importanti e spesso poco considerati soprattutto da chi ha poca esperienza:
Although simplistic, every programming decision I make is largely based on maintainability. Maintainability is the cornerstone of enterprise development.
The ultimate tool in making your code maintainable is to keep it as simple as possible. A common belief is that in order to be maintainable, a system needs to be engineered upfront to accommodate any possible change request. I've seen systems built on meta-repositories (tables with a Key column and a Value column), or complex XML configurations, that are meant to handle any changes a client might throw at the team. Not only do these systems tend to have serious technical limitation (performance can be orders of magnitude slower), but they almost always fail in what they set out to do (we'll look at this more when we talk about YAGNI). In my experience, the true path to flexibility is to keep a system as simple as possible, so that you, or another developer, can easily read your code, understand it, and make the necessary change
Questo è uno dei punti su cui trovo maggiore resistenza in fase di analisi di un sistema software: è molto diffusa l'idea che un sistema flessibile debba essere complesso per poter prevedere tutte le possibili richieste future del cliente.
Il motivo principale di questa resistenza credo sia dovuto al fatto che il cliente viene visto come un problema e quindi si debba cercare di limitare il più possibile i canali di comunicazione. Quando il cliente chiede una modifica e la nostra architettura è rigida e complessa diventa un problema apportarla e si scarica la propria responsabilità sul cliente.
Gli altri concetti descritti nel pdf sono:
- YAGNI (You Aren't Going to Need)
- Last Responsible Moment
- DRY (Don't Repeat Yourself)
- Explicitness and Cohesion
- Coupling
- Unit Tests and Continuous Integration
Sono tutti concetti legati a minimizzare lo spreco, i quali portano ad un sistema software efficiente e ad un cliente soddisfatto.