Un avión, a diferencia de, por ejemplo, un sitio web, es un sistema en el que cualquier falla en ciertos sistemas es completamente inaceptable, ya que los errores, por ejemplo, en la supervisión del vuelo pueden hacer que el piloto automático no funcione correctamente y se hunda. Obviamente, esto no sucede ya que los brillantes ingenieros de Boeing y Airbus tienen controles en el piloto automático para asegurarse de que no decida repentinamente que una inmersión es una maniobra perfectamente aceptable y segura. O tal vez la computadora se cuelga, y los pilotos en el avión más nuevo ya no pueden volar el avión. Por supuesto, hay varios procedimientos de seguridad y redundancias integrados en estos sistemas para evitar un choque (tanto del software como de la aeronave).
Sin embargo, por otro lado, es bastante obvio que el software no es perfecto: tanto el software de código abierto como el de código cerrado se bloquean regularmente, y solo el programa más simple "Hello World" no falla. ¿Cómo pueden los ingenieros que diseñan los sistemas de software en las industrias aeronáutica, médica y de vida o muerte logran probar su software para que no falle (y si falla, al menos falla con gracia)?
Espero desesperadamente que no todos vayan a ir: "¡Oh, trabajo para Boeing / Airbus / (alguna otra compañía) y no lo es! Diviértase en su próximo vuelo / visita al hospital".
Respuestas:
He trabajado mucho en controles industriales. No tiene que estar en una industria gloriosa como la aeroespacial. Casi todas las máquinas industriales tienen suficiente energía potencial para causar lesiones graves o la muerte. He estado cerca cuando la gente resultó herida. Si pasa la mayor parte de su tiempo en un escritorio en una oficina, probablemente se sorprenderá de lo peligrosos que pueden ser la mayoría de los trabajos de fábrica (y ciertamente fueron hasta hace poco). Ahora tenemos mejores métodos de protección de la máquina. Así es como funciona en la práctica (aunque varía de jurisdicción a jurisdicción):
Hay estándares de OSHA en los EE. UU., Y pautas similares (generalmente más estrictas) en la UE. Por lo general, comienzan por exigirle que haga un análisis del riesgo. Esto significa que usted hace una lista de todos los peligros y luego los clasifica, teniendo en cuenta cosas como con qué frecuencia una persona estaría expuesta al riesgo, qué tan fácil es evitar el riesgo (depende de la velocidad, etc.) y qué es la gravedad del resultado (corte, amputación, muerte, etc.).
Gran parte del análisis tiene que ver con la protección de los riesgos. Si coloca una jaula grande alrededor de su máquina y la atornilla, entonces su máquina se considera segura si los componentes de la máquina no pueden romper la protección. Si necesita una herramienta para ingresar, se considera una tarea de mantenimiento, y se supone que las personas de mantenimiento deben estar capacitadas sobre cómo trabajar de manera segura en una máquina. Sin embargo, en realidad, la mayoría de las máquinas necesitan una interacción regular con los operadores, por lo que tenemos que colocar puertas de acceso en la protección, o cortinas de luz, etc. Es necesario controlar esas puertas y cortinas de luz y la potencia a los peligros a los que el operador se expone. tiene que ser apagado de una manera "de control confiable".
Según ese análisis, los riesgos se clasifican en varias categorías. Una escala de clasificación común es la Categoría 1 a la Categoría 4 (basada en la norma EN 954-1). De acuerdo con esas categorías, usted está legalmente obligado a proporcionar un cierto nivel de protección y seguridad de la máquina.
La categoría 4, por ejemplo, requiere que:
Esto puede ser difícil de lograr en la práctica, pero se simplifica por la disponibilidad de componentes estándar que están certificados para la Categoría 4. Por ejemplo, un componente común en estos sistemas es un relé de seguridad. Estos son más que solo relés mecánicos:
Como puede ver, estos son dispositivos complicados. Los costos típicos están en el rango de $ 200 a $ 600 por cada relé de seguridad. Obviamente hay software en estos dispositivos. Para obtener la certificación de su relé de seguridad, generalmente debe seguir un diseño como este:
Una vez que diseñe su sistema de seguridad para su máquina, utilizando componentes con clasificación de seguridad, debe hacer que un ingeniero profesional revise y selle el diseño. Entonces construyes la máquina. Entonces el P.Eng. revisará la construcción de la máquina asegurándose de que se construyó según el diseño. Lo documentarán y realizarán algunas pruebas para asegurarse de que funciona como se esperaba. Esto se denomina revisión previa al inicio (PSR) y no se realiza en todas las jurisdicciones. Después de que pasa el PSR, se le permite tener un operador que ejecute la máquina.
En los últimos años ha habido algunas revoluciones en los sistemas de seguridad. Durante un tiempo, nadie confió en la transmisión de datos de seguridad a través de una red, por lo que lo que normalmente se llama "sistemas de E / S distribuidas" como DeviceNET y EtherCAT no se permitieron en la parte de seguridad del sistema. Sin embargo, los protocolos recientes ahora permiten que los dispositivos de seguridad se ejecuten en estas redes industriales. Los protocolos hacen uso de mensajes con marca de tiempo y procesamiento dual redundante en ambos extremos de la conexión.
Los relés de seguridad siguen el camino del ave dodo, reemplazados por PLC de seguridad más complicados, que son como una forma de construir la lógica de seguridad en un lenguaje de diagrama de bloques de funciones. Una vez más, estos PLC de seguridad utilizan todo redundante. Cuando se aprueba el programa, antes de que la máquina se ponga en servicio, el P.Eng. sellará el programa y el programa / PLC se bloqueará con una contraseña. También toma un hash del programa y ese hash se registra en la documentación (eso es lo que el P.Eng. Realmente está estampando).
Ahora, una vez que haya diseñado su sistema de seguridad, la lógica que escriba para controlar la máquina en sí misma puede ser muy cómoda. Los programadores con frecuencia hacen que las máquinas choquen causando miles de dólares en daños, pero al menos nadie resultará herido.
fuente
Hay un movimiento serio hacia la verificación formal en lugar de pruebas funcionales aleatorias.
Las agencias gubernamentales como la NASA y algunas organizaciones de defensa están gastando cada vez más en estas tecnologías.
Todavía son un PITA para el programador promedio, pero a menudo son más efectivos para probar sistemas críticos.
También hay una tendencia a probar más técnicas de la academia, para cosas como validar código multiproceso.
fuente
Depende de lo que sea el software. Por ejemplo, en los planos generalmente hay un procesamiento dual redundante para sistemas críticos; en el caso extremo, pueden usarse 2 diseños de hardware diferentes y dos piezas de s / w desarrolladas independientemente, una para ejecutar en cada una. Ambos calculan y verifican entre sí. Esto no es infalible y es extremadamente costoso.
Cuando se trata de cosas como las pruebas de los sistemas de la aeronave, hay una serie de pruebas realizadas: las pruebas de los sistemas relacionados con el vuelo toman meses, y si realiza algún cambio, se requiere una serie completa de reevaluaciones. Esto generalmente se hace en un simulador, que en realidad podría estar lleno de piezas reales de la aeronave (por ejemplo, cabina) con un motor simulado o similar. Como puede imaginar, esto también es horriblemente costoso de construir. Los cambios se evalúan contra un programa de prueba formal y luego se ejecutan en un avión real en vuelos de prueba. En el camino se ejecutan pruebas como "funcional alterado", aquí es donde se permite que el elemento modificado haga su trabajo normal y todo se verifica / prueba para ver que no haya ningún efecto perjudicial. Esto también cuesta mucho dinero y puede llevar semanas.
Sé de un ejemplo en el que se requería un cambio muy simple a un sistema de vuelo, tan simple que te sorprendería lo insignificante que es. Sin embargo, la nueva prueba de esto habría llevado más de 3 meses y costaría algo así como $ 1M.
Cuando ingresa a la medicina, hay toda una serie de obstáculos regulatorios para saltar relacionados no solo con las pruebas sino también con los procesos y la documentación del desarrollo.
Todos estos campos son un gran paso adelante desde lugares que eliminan un poco de código PHP para un sitio web. Es lento, laborioso, difícil, aburrido, tedioso, meticuloso y muy costoso. Tome sus costos normales de desarrollo / prueba y multiplíquelo por aproximadamente 100 y se está acercando a la marca.
fuente
Para el software del transbordador espacial de la NASA, lea They Write the Right Stuff . Para la FDA (Administración de Alimentos y Medicamentos de los EE. UU.) Lea, lea esto
fuente
Como ya tienes suficientes respuestas geniales e informativas, aquí está mi opinión.
Es simple: la primera prueba siempre se realiza en los propios programadores. Tiende a mantener bajo el recuento de errores y garantiza que solo los programadores de calidad se mantengan en la nómina.
fuente
El software vital no se prueba con ningún estándar que no sea el "parece funcionar" , ya que se hace por todas partes.
Toda la inversión se destina a lo que parecía funcionar antes o para proyectos que permitan a los no programadores producir un mejor software.
ps No hay comentarios sobre el primero
-1
, pero me encantaría tomar-1
para cada referencia que contrarresta mi declaración.¿Puedo tomar un +1 por cada referencia que encuentre que el software crítico no está bien diseñado o probado? Simson Garfinkel documenta diez casos en un artículo sobre WIRED.
fuente
No hay una respuesta para todos los casos. Depende del fabricante individual decidir cómo diseñar y probar su software. Pero todo el proceso de desarrollo de software debe cumplir con las especificaciones formales.
Por ejemplo, cuando la creación de software para dispositivos médicos debe seguir la norma IEC 62304 estándar para el software para dispositivos médicos. (Lamentablemente, solo puedo vincular a Wikipedia, ya que no es gratis). Casi todos los países del mundo requieren que se siga este estándar.
Cuán estrictos son estos requisitos depende del riesgo de daño. Por ejemplo, un dispositivo de soporte vital tendría el mayor riesgo de daño (muerte segura si el sistema falla), mientras que un sistema que funciona con diagnósticos de enfermedades tiene un riesgo menor (posible muerte si una enfermedad terminal no se diagnostica correctamente si el sistema falla).
Pero lo que esto dice básicamente es que debe haber una trazabilidad desde los requisitos hasta el software. Debe realizar verificaciones de la unidad de software. Eso no especifica cuál es la verificación. Pueden ser pruebas unitarias, puede ser una revisión de código. Para los dispositivos de mayor riesgo, debe revisar manualmente las interfaces entre las unidades de software (por lo que yo entiendo y recuerdo). Y, por supuesto, muchas otras reglas. Ah, y debes escribir mucha documentación para documentar tu trabajo.
El estándar no prohíbe el desarrollo ágil, aunque al leerlo parece que fue escrito con el desarrollo en cascada en mente.
No conozco otras áreas de desarrollo de software, como aviación, trenes, automóviles, etc. Pero supongo que existen otras pautas formales similares.
fuente
Se utilizan muchas técnicas, incluidas, entre otras, las siguientes:
Pero la técnica número uno es:
El software de una nave espacial necesita más esfuerzo para probar que para diseñar y codificar en primer lugar.
Las aeronaves se someten a varios años de pruebas de vuelo donde el avión se encuentra en situaciones extremas. Esto prueba no solo la estructura física sino también el software.
fuente
Hay un artículo "Software perfecto" de Jack Ganssle en EETimes con fecha 3/1/2009 12:00 AM EST. Algunos puntos a partir de ahí:
Curiosamente, con respecto al software comercial, los datos recopilados por Capers Jones sugieren que "el software en general tiene una eficiencia de eliminación de defectos (el porcentaje de errores eliminados antes del envío) del 87%. El firmware obtiene un 94% mucho mejor". Para mí, ninguno de estos es casi perfecto. El artículo que un respondedor anterior mencionó indica que el equipo del transbordador espacial de la NASA logró una tasa de eliminación de errores del 99%, pero el costo es de 35 millones por año para aproximadamente 400k líneas de código.
Un artículo más interesante "Software para sistemas confiables" del mismo autor el 11/1/2009, parece ser más relevante. Se puede resumir así:
Según mi memoria, HP practicó el diseño por contrato hace casi una década. Con un equipo pequeño, 500 mil líneas de código, solo se informaron 2 errores después de la entrega. Muy impresionante.
En mi opinión, solo se puede lograr un software confiable o perfecto si el costo no es prohibitivamente alto. Los marcos o las automatizaciones son imprescindibles.
fuente
Por lo general, tienen un enclavamiento de hardware que se usa como a prueba de fallas.
Por ejemplo, los diseños estándar de cuadros de texto malvados para robots asesinos siempre vienen con un interruptor de apagado: P
fuente
Cada industria tiene su propio conjunto de agencias reguladoras que tienen requisitos de pruebas y documentación para hardware y software relacionados con la seguridad. Considere este PDF de Underwriters Laboratory (UL) que presenta el estándar UL 1998: http://www.ul.com/global/documents/offerings/industries/hightech/software/UL_softwareconformityassessment.pdf
Hay referencias en ese documento a muchos otros relacionados de UL, CSA e IEC.
Típicamente, el software relacionado con la seguridad tendrá circuitos de hardware redundantes o se requerirá que tenga otras características de control redundantes para garantizar un funcionamiento seguro y modos de falla seguros.
fuente