La Bala de Plata
La Bala de Plata
La Bala de Plata
Pero, mientras miramos hacia el horizonte de una década, no vemos ninguna bala de
plata. No hay un desarrollo único, ni en la tecnología ni en la técnica de gestión, que
por sí solo prometa una mejora de la productividad, en la fiabilidad, en la
simplicidad. En este artículo, intentaré demostrar por qué, examinando tanto la
naturaleza del problema del software como las propiedades de las balas propuestas.
Primero, uno debe observar que la anomalía no es que el progreso del software sea
tan lento, sino que el progreso del hardware de la computadora es tan rápido.
Ninguna otra tecnología desde que comenzó la civilización ha visto seis órdenes de
magnitud en el aumento del precio de rendimiento en 30 años. En ninguna otra
tecnología se puede elegir tomar la ganancia en la mejora del rendimiento o en la
reducción de costes. Estas ganancias fluyen de la transformación de la fabricación
de computadoras de una industria de ensamblaje a una industria de proceso.
Si esto es cierto, construir software siempre será difícil. No hay una bala de plata
intrínseca.
Las computadoras digitales son en sí mismas más complejas que la mayoría de las
cosas que la gente construye: tienen un gran número de estados. Esto hace que
concebir, describir y probarlas sea difícil. Los sistemas de software tienen órdenes
de magnitud de más estados que las computadoras.
En segundo lugar, el software exitoso sobrevive más allá de la vida útil normal del
vehículo de la máquina para el cual fue escrito por primera vez. Si no hay
computadoras nuevas, entonces al menos nuevos discos, pantallas y nuevas
impresoras nuevas aparecen; y el software debe ajustarse a sus nuevos vehículos de
oportunidad.
Lo más que puede hacer un lenguaje de alto nivel es amueblar todas las
construcciones que el programador imagina en el programa abstracto. Sin duda, el
nivel de nuestro pensamiento sobre las estructuras de datos, los tipos de datos y las
operaciones está en constante aumento, pero a un ritmo cada vez menor. Y el
desarrollo del lenguaje se acerca cada vez más a la sofisticación de los usuarios.
El giro lento, al igual que las complejidades del lenguaje de la máquina, es una
dificultad accidental y no esencial del proceso de software. Los límites de la
contribución potencial del tiempo compartido se derivan directamente. El principal
efecto del tiempo compartido es acortar el tiempo de respuesta del sistema. A
medida que este tiempo de respuesta pasa a cero, en algún momento sobrepasa el
umbral humano de notoriedad, unos 100 milisegundos. Más allá de ese umbral, no
cabe esperar ningún beneficio.
Atacan las dificultades accidentales que resultan del uso conjunto de programas
individuales, proporcionando bibliotecas integradas, formatos de archivo unificados
y tuberías y filtros. Como resultado de ello, las estructuras conceptuales que en
principio siempre podrían llamarse, alimentarse y utilizarse mutuamente pueden
hacerlo fácilmente en la práctica.
Debido a estos éxitos, los entornos son el tema de gran parte de la investigación
actual en ingeniería de software. Miramos sus promesas y limitaciones en la
siguiente sección.
Sin embargo, Ada no será la bala de plata que mate al monstruo de la productividad
del software. Después de todo, es sólo otro lenguaje de alto nivel, y la mayor
recompensa de tales lenguajes vino de la primera transición -- la transición de las
complejidades accidentales de la máquina a la declaración más abstracta de
soluciones paso a paso. Una vez que esos accidentes hayan sido eliminados, los
restantes serán menores, y el resultado de su remoción seguramente será menor.
Predigo que dentro de una década, cuando se evalúe la eficacia de Ada, se verá que
ha hecho una diferencia sustancial, pero no debido a ninguna característica
lingüística en particular, ni por la combinación de todas ellas. Tampoco los nuevos
entornos Ada serán la causa de las mejoras. La mayor contribución de Ada será que
el cambio a ella ocasionó que los programadores de entrenamiento en técnicas
modernas de diseño de software.
Los tipos jerárquicos, como las clases de Simula-67, permiten definir interfases
generales que pueden perfeccionarse aún más proporcionando tipos subordinados.
Los dos conceptos son ortogonal_uno puede tener jerarquías sin esconderse y
ocultarse sin jerarquías. Ambos conceptos representan avances reales en el arte de
construir software.
Cada uno de ellos elimina otra dificultad accidental del proceso, permitiendo al
diseñador expresar la esencia del diseño sin tener que expresar grandes cantidades
de material sintáctico que no agrega contenido informativo. Tanto para los tipos
abstractos como para los tipos jerárquicos, el resultado es eliminar un tipo de
dificultad accidental de orden superior y permitir una expresión de mayor orden del
diseño.
Sin embargo, tales avances no pueden sino eliminar todas las dificultades
accidentales de la expresión del dibujo o modelo. La complejidad del diseño en sí
mismo es esencial, y tales ataques no hacen ningún cambio en eso. Una ganancia de
orden de magnitud sólo se puede obtener mediante programación orientada a objetos
si el subcepillo de especificación de tipo innecesario que todavía se encuentra en
nuestro lenguaje de programación es nueve décimas partes del trabajo que implica el
diseño de un producto de programa. Lo dudo.
Inteligencia artificial. Mucha gente espera que los avances en inteligencia artificial
proporcionen el revolucionario avance que dará ganancias de orden de magnitud en
productividad y calidad del software. [3] Yo no. Para ver por qué, debemos
diseccionar lo que significa "inteligencia artificial".
Estoy totalmente de acuerdo con esta crítica. Las técnicas utilizadas para el
reconocimiento de voz parecen tener poco en común con las utilizadas para el
reconocimiento de imágenes, y ambas son diferentes de las utilizadas en sistemas
expertos. Me cuesta mucho trabajo ver cómo el reconocimiento de imágenes, por
ejemplo, marcará cualquier diferencia apreciable en la práctica de la programación.
El mismo problema ocurre con el reconocimiento del habla. Lo difícil de construir
software es decidir lo que uno quiere decir, no decirlo. Ninguna facilitación de la
expresión puede dar más que ganancias marginales.
Tales sistemas ofrecen algunas ventajas claras sobre los algoritmos programados
diseñados para llegar a las mismas soluciones a los mismos problemas:
Es difícil ver cómo estas técnicas generalizan al mundo más amplio del sistema de
software ordinario, donde los casos con propiedades tan limpias son la excepción. Es
difícil incluso imaginar cómo podría ocurrir este avance en la generalización.
En segundo lugar, las pantallas de hoy en día son demasiado pequeñas, en píxeles,
para mostrar tanto el alcance como la resolución de cualquier diagrama de software
muy detallado. La llamada "metáfora de escritorio" de la estación de trabajo actual
es, en cambio, una metáfora de "asiento de avión". Cualquiera que haya barajado
una vuelta llena de papeles mientras está sentado entre dos pasajeros portentosos
reconocerá la diferencia - uno puede ver sólo muy pocas cosas a la vez. El verdadero
escritorio proporciona información general y acceso aleatorio a una veintena de
páginas. Por otra parte, cuando los ajustes de la creatividad corren fuertes, más de un
programador o escritor ha sido conocido por abandonar el escritorio para el piso más
espacioso. La tecnología de hardware tendrá que avanzar bastante antes de que el
alcance de nuestros alcances sea suficiente para la tarea de diseño de software.
Más en serio, incluso la verificación perfecta del programa sólo puede establecer
que un programa cumple con sus especificaciones. La parte más difícil de la tarea de
software es llegar a una especificación completa y consistente, y gran parte de la
esencia de construir un programa es de hecho la depuración de la especificación.
Sin duda, este trabajo merece la pena, y seguramente dará algún fruto tanto en
productividad como en fiabilidad. Pero por su propia naturaleza, el retorno de ahora
en adelante debe ser marginal.
Estaciones de trabajo. ¿Qué ventajas se pueden esperar para el software art del
aumento seguro y rápido de la potencia y la capacidad de memoria de la estación de
trabajo individual? Bueno, ¿cuántos MIPS se pueden usar fructíferamente? La
composición y edición de programas y documentos está totalmente soportada por las
velocidades actuales. La compilación podría soportar un empuje, pero un factor de
10 en la velocidad de la máquina seguramente dejaría el thinktime la actividad
dominante en el día del programador. De hecho, así parece ser ahora.
Unas estaciones de trabajo más potentes son bienvenidas. Mejoras mágicas de ellos
que no podemos esperar.
Si, como creo, los componentes conceptuales de la tarea están tomando ahora la
mayor parte del tiempo, entonces ninguna cantidad de actividad en los componentes
de la tarea que son simplemente la expresión de los conceptos puede dar grandes
ganancias de productividad.
Por lo tanto, debemos considerar aquellos ataques que abordan la esencia del
problema del software, la formulación de estas complejas estructuras conceptuales.
Afortunadamente, algunos de estos ataques son muy prometedores.
Comprar contra construir. La solución más radical posible para construir software
es no construirlo en absoluto.
Cada día esto se hace más fácil, ya que cada vez más y más proveedores ofrecen
más y mejores productos de software para una variedad vertiginosa de aplicaciones.
Mientras que nosotros los ingenieros de software hemos trabajado en la metodología
de producción, la revolución personal-computadora ha creado no uno, sino muchos
mercados masivos de software. Cada quiosco tiene revistas mensuales, que
clasificadas por tipo de máquina, anuncian y revisan docenas de productos a precios
que van desde unos pocos dólares hasta cientos de dólares. Fuentes más
especializadas ofrecen productos muy potentes para el mercado de estaciones de
trabajo y otros mercados Unix. Incluso las herramientas y los entornos de software
se pueden comprar de serie. En otras partes he propuesto un mercado para módulos
individuales. [9]
Cualquier producto de este tipo es más barato de comprar que de construir de nuevo.
Incluso a un costo de cien mil dólares, una pieza de software comprada está
costando sólo alrededor de un año programador. Y la entrega es inmediata!
Inmediato al menos para los productos que realmente existen, productos cuyo
desarrollador puede referir los productos a un usuario satisfecho. Además, tales
productos tienden a estar mucho mejor documentados y en cierto modo mejor
mantenidos que el software local.
Creo que el desarrollo del mercado masivo es la tendencia más profunda a largo
plazo en ingeniería de software. El costo del software siempre ha sido el costo de
desarrollo, no el costo de replicación. Compartir ese costo entre unos pocos usuarios
reduce radicalmente el costo por usuario. Otra manera de verlo es que el uso de n
copias de un sistema de software multiplica efectivamente la productividad de sus
desarrolladores por n. Eso es una mejora de la productividad de la disciplina y de la
nación.
No los paquetes, en realidad. Pueden ser algo más generalizadas y algo más
personalizables que antes, pero no mucho. Tampoco las solicitudes. En todo caso,
las necesidades empresariales y científicas de hoy en día son más diversas y
complicadas que las de hace 20 años.
Muchos usuarios ahora operan sus propias computadoras día tras día en varias
aplicaciones sin necesidad de escribir un programa. De hecho, muchos de estos
usuarios no pueden escribir nuevos programas para sus máquinas, pero son expertos
en resolver nuevos problemas con ellos.
Creo que la única estrategia de productividad de software más poderosa para muchas
organizaciones hoy en día es equipar a los trabajadores intelectuales que están en la
línea de fuego con computadoras personales y buenos programas generalizados de
escritura, dibujo, archivos y hojas de cálculo, y luego liberarlos. La misma
estrategia, llevada a cabo con paquetes matemáticos y estadísticos generalizados y
algunas capacidades simples de programación, también funcionará para cientos de
científicos de laboratorio.
Por lo tanto, la función más importante que el constructor de software realiza para el
cliente es la extracción iterativa y el refinamiento de los requisitos del producto. La
verdad es que el cliente no sabe lo que quiere. Por lo general, el cliente no sabe qué
preguntas deben ser respondidas, y casi nunca ha pensado en el problema en los
detalles necesarios para la especificación. Incluso la simple respuesta_"Hacer que el
nuevo sistema de software funcione como nuestro antiguo sistema de procesamiento
manual de información"_es demasiado simple. Uno nunca quiere exactamente eso.
Los sistemas de software complejos son, además, cosas que actúan, que se mueven,
que funcionan. La dinámica de esa acción es difícil de imaginar. Así que en la
planificación de cualquier actividad de diseño de software, es necesario tener en
cuenta una amplia iteración entre el cliente y el diseñador como parte de la
definición del sistema.
Yo iría un paso más allá y afirmaría que es realmente imposible para un cliente,
incluso trabajando con un ingeniero de software, especificar completa, precisa y
correctamente los requisitos exactos de un producto de software moderno antes de
probar algunas versiones del producto.
Por lo tanto, uno de los esfuerzos tecnológicos más prometedores de los actuales, y
que ataca la esencia, no los accidentes, del problema del software, es el desarrollo de
enfoques y herramientas para la creación rápida de prototipos de sistemas, ya que el
prototipado es parte de la especificación iterativa de los requisitos.
Un sistema de software prototipo es aquel que simula las interfaces importantes y
realiza las funciones principales del sistema previsto, aunque no necesariamente está
sujeto a las mismas limitaciones de velocidad, tamaño o coste del hardware. Los
prototipos suelen realizar las tareas principales de la aplicación, pero no intentan
manejar las tareas excepcionales, responder correctamente a entradas no válidas o
abortar limpiamente. El propósito del prototipo es hacer realidad la estructura
conceptual especificada, de manera que el cliente pueda probarla para comprobar su
consistencia y usabilidad.
He visto los resultados más dramáticos desde que empecé a instar esta técnica a los
constructores de proyectos en mi clase de Laboratorio de Ingeniería de Software.
Nada en la última década ha cambiado tan radicalmente mi propia práctica, o su
eficacia. El enfoque requiere un diseño de arriba hacia abajo, ya que es un
crecimiento del software de arriba hacia abajo. Permite un fácil retroceso. Se presta
a prototipos antiguos. Cada función añadida y nueva disposición para datos o
circunstancias más complejas crece orgánicamente a partir de lo que ya existe.
Sin embargo, no creo que podamos dar el siguiente paso hacia arriba de la misma
manera. Mientras que la diferencia entre los diseños conceptuales pobres y los
buenos puede estar en la solidez del método de diseño, la diferencia entre los buenos
diseños y los grandes seguramente no lo es. Grandes diseños vienen de grandes
diseñadores. La construcción de software es un proceso creativo. Una metodología
sólida puede empoderar y liberar la mente creativa; no puede inflamar o inspirar el
impulso.
Las diferencias no son menores, son como las diferencias entre Salieri y Mozart.
Estudio tras estudio muestra que los mejores diseñadores producen estructuras más
rápidas, pequeñas, simples, limpias y producidas con menos esfuerzo. 12] Las
diferencias entre lo grande y lo medio se acercan a un orden de magnitud.
Ninguna organización de software puede ignorar este desafío. Los buenos gerentes,
por escasos que sean, no son más escasos que los buenos diseñadores. Los grandes
diseñadores y los grandes managers son muy raros. La mayoría de las
organizaciones invierten un esfuerzo considerable en encontrar y cultivar las
perspectivas de gestión; no conozco a nadie que se esfuerce por igual en encontrar y
desarrollar a los grandes diseñadores de los que la excelencia técnica de los
productos dependerá en última instancia.
¿Cómo hacer crecer a los grandes diseñadores? El espacio no permite una discusión
larga, pero algunos pasos son obvios: