Los requisitos funcionales de un software describen lo que el software debe hacer. Los requisitos no funcionales describen cómo el software debe hacerlo. Los requisitos funcionales se derivan de los requisitos del sistema, que a su vez se derivan de los requisitos del usuario. Los requisitos no funcionales se derivan de los requisitos del sistema y de otros factores, como el entorno en el que se va a desplegar el software, las limitaciones de tiempo y presupuesto, y las preferencias del desarrollador.
Los requisitos funcionales se pueden expresar en términos de casos de uso. Un caso de uso describe una interacción entre el usuario y el software, en la que el usuario realiza una tarea específica. Los requisitos no funcionales se pueden expresar en términos de restricciones, que especifican límites para el software. Las restricciones pueden ser de rendimiento, seguridad, usabilidad, portabilidad, escalabilidad, fiabilidad o mantenibilidad. Algunas de estas restricciones pueden ser objetivos, como el rendimiento máximo que se desea alcanzar, o pueden ser límites, como el máximo número de errores que se permiten.
Los requisitos funcionales y no funcionales deben documentarse de forma clara y concisa. Deben ser lo suficientemente detallados como para ser comprendidos por el desarrollador, pero no deben ser tan detallados como para ser engorrosos. También deben ser lo suficientemente flexibles para permitir al desarrollador tomar decisiones sobre cómo implementar el software.