El mejor paper de Ingeniería de Software que leí en 20 años
"Since the early days of computers and programs, the process and outcomes of software development has been a minefield plagued with problems and failures, as much as the complexity and complication of software and its development has increased by a thousandfold in half a century. Over the years, a number of theories, laws, best practices, manifestos and methodologies have emerged, with varied degrees of (un)success. Our experience as software engineers of complex and large-scale systems shows that those guidelines are bound to previously defined and often narrow scopes. Enough is enough. Nowadays, nearly every company is in the software and services business and everything is -or is managed by- software. It is about time, then, that the laws that govern our universe ought to be redefined. In this context, we discuss and present a set of universal laws that leads us to propose the first commandment of software engineering for all varieties of information systems."
FU = every system, big and small, should have provisions that allow it to be FIXED and UPDATED either from within or outside the system proper.CK = every system, big and small, should have provisions that allow it to acquire and make use of CONTEXTUAL KNOWLEDGE to decide whether it is functioning properly or not.IN = every system, big and small, should have provisions that allow it to be INDEPENDENT of its NETWORK as much as possible; in the absence of the surrounding network, systems should gracefully degrade to a level of usefulness that would resemble a fully independent, smaller, isolated system.G = in GENERAL, for all kinds of systems, SECURITY and INTEGRITY concerns should supersede those of FUNCTIONALITY, which in turn ought to be balanced against USABILITY.R = every system should have provisions that allow it to be REUSED in different contexts and by different systems.E = every system should have provisions that allow it to be EXTENDED to accommodate new behaviors.A = every system should have provisions that allow it to offer ANALYTICS to enable measuring and tracking of its use.L = every system should have provisions that allow it to be LOOSELY COUPLED to reduce both the interdependencies across its modules/components as well as other systems that it possibly interacts with.The combination of the above, REAL properties, with the aforementioned FUCKING ones leads us to REAL FUCKING LAW, which is the foundation for the development of REAL FUCKING systems.
Reutilizable, Extensible, poder darte Métricas en el uso, Poco Acoplado con otros sistemas (lo más independiente posible). Además, debe poder ser arreglado o cambiado (en caliente), debe tener herramientas y métricas para poder saber cómo está funcionando (bien o no), debe ser lo más independiente respecto a herramientas y el contexto (plataformas/tecnologías), y los conceptos de Seguridad e Integridad deben ser más importantes que las Funcionalidades, y estas deben ser equilibradas con la Usabilidad.