Beruflich Dokumente
Kultur Dokumente
De todos los monstruos que llenan las pesadillas de nuestro folclore, ninguno aterroriza
más que a los hombres lobo, porque se transforman inesperadamente de lo familiar en
horrores. Para estos, uno busca balas de plata que pueden colocarlas mágicamente para
descansar.
El proyecto de software familiar, al menos como lo ve el gerente no técnico, tiene algo de
este carácter; generalmente es inocente y directo, pero es capaz de convertirse en un
monstruo de horarios perdidos, presupuestos destruidos y productos defectuosos. Así que
escuchamos gritos desesperados por una bala de plata, algo para hacer que los costos de
software caigan tan rápido como lo hacen los costos de hardware de la computadora.
Pero, cuando miramos hacia el horizonte de una década, no vemos una bala de plata. No
existe un desarrollo único, ya sea en la tecnología o en la técnica de gestión, que por sí
solo promete una mejora de un orden de magnitud en la productividad, en la
confiabilidad, en la simplicidad. En este artículo, intentaré mostrar por qué, examinando
tanto la naturaleza del problema de software como las propiedades de las viñetas
propuestas.
El escepticismo no es pesimismo, sin embargo. Aunque no vemos avances sorprendentes,
y de hecho, creo que eso es inconsistente con la naturaleza del software, están en marcha
muchas innovaciones alentadoras. Un esfuerzo disciplinado y consistente para desarrollar,
propagar y explotar estas innovaciones debería de hecho producir una mejora en el orden
de magnitud. No hay camino real, pero hay un camino.
El primer paso hacia el manejo de la enfermedad fue la sustitución de las teorías
demoníacas y las teorías de los humores por la teoría de los gérmenes. Ese mismo paso, el
comienzo de la esperanza, en sí mismo desvaneció todas las esperanzas de soluciones
mágicas. Les dijo a los trabajadores que el progreso se haría paso a paso, con gran
esfuerzo, y que se tendría que pagar una atención persistente e inquebrantable a una
disciplina de limpieza. Lo mismo ocurre con la ingeniería de software hoy en día.
No solo no hay balas de plata a la vista, la propia naturaleza del software hace que sea
improbable que exista - ningún invento que haga por la productividad, confiabilidad y
simplicidad del software que hicieron los componentes electrónicos, transistores e
integración a gran escala para hardware de computadora No podemos esperar ver alguna
vez ganancias dobles cada dos años.
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
obtener beneficios en un rendimiento mejorado o en costos reducidos. Estas ganancias
fluyen de la transformación de la fabricación de computadoras de una industria de
ensamblaje a una industria de procesos.
En segundo lugar, para ver qué ritmo de progreso se puede esperar en la tecnología del
software, examinemos las dificultades de esa tecnología. Siguiendo a Aristóteles, los divido
en esencia, las dificultades inherentes a la naturaleza del software y los accidentes, esas
dificultades que hoy asisten a su producción pero que no son inherentes.
La esencia de una entidad de software es una construcción de conceptos entrelazados:
conjuntos de datos, relaciones entre elementos de datos, algoritmos e invocaciones de
funciones. Esta esencia es abstracta en el sentido de que tal construcción conceptual es la
misma bajo muchas representaciones diferentes. Sin embargo, es muy preciso y muy
detallado.
Creo que la parte más difícil de la construcción de software es la especificación, el diseño y
las pruebas de esta construcción conceptual, no el trabajo de representarla y probar la
fidelidad de la representación. Aún así cometemos errores de sintaxis, para estar seguros;
pero son difusos en comparación con los errores conceptuales en la mayoría de los
sistemas.
Si esto es cierto, la creación de software siempre será difícil. Inherentemente no hay una
bala de plata.
Consideremos las propiedades inherentes de esta esencia irreductible de los sistemas de
software modernos: complejidad, conformidad, capacidad de cambio e invisibilidad.
Complejidad. Las entidades de software son más complejas para su tamaño que quizás
cualquier otra construcción humana porque no hay dos partes iguales (al menos por encima
del nivel de declaración). Si lo son, convertimos las dos partes similares en una subrutina,
abierta o cerrada. A este respecto, los sistemas de software difieren profundamente de las
computadoras, los edificios o los automóviles, donde abundan los elementos repetidos.
Las computadoras digitales son más complejas que la mayoría de las cosas que las personas
construyen: tienen un gran número de estados. Esto hace que concebir, describir y
probarlos sea difícil. Los sistemas de software tienen órdenes de magnitud más estados que
las computadoras.
Del mismo modo, una ampliación de una entidad de software no es simplemente una
repetición de los mismos elementos en tamaños más grandes, es necesariamente un
aumento en el número de elementos diferentes. En la mayoría de los casos, los elementos
interactúan entre sí de forma no lineal, y la complejidad del todo aumenta mucho más que
linealmente.
La complejidad del software es una propiedad esencial, no accidental. Por lo tanto, las
descripciones de una entidad de software que abstrae su complejidad a menudo abstraen
su esencia. Durante tres siglos, las matemáticas y las ciencias físicas dieron grandes pasos
construyendo modelos simplificados de complejos
fenómenos, derivar propiedades de los modelos y verificar esas propiedades por
experimento. Este paradigma funcionó porque las complejidades ignoradas en los modelos
no eran las propiedades esenciales de los fenómenos. No funciona cuando las
complejidades son la esencia.
Muchos de los problemas clásicos del desarrollo de productos de software se derivan de
esta complejidad esencial y sus aumentos no lineales con el tamaño. De la complejidad
surge la dificultad de comunicación entre los miembros del equipo, lo que conduce a fallas
en los productos, a sobrecostos, a retrasos en el cronograma. De la complejidad surge la
dificultad de enumerar, y mucho menos entender, todos los estados posibles del programa,
y de ahí viene la falta de fiabilidad. De la complejidad de la función surge la dificultad de
invocar la función, lo que hace que los programas sean difíciles de usar. De la complejidad
de la estructura surge la dificultad de extender los programas a nuevas funciones sin crear
efectos secundarios. De la complejidad de la estructura vienen
los estados no visualizados que constituyen trampas de seguridad.
No solo problemas técnicos, sino también problemas de gestión provienen de la
complejidad. Hace la descripción general difícil, impidiendo así la integridad conceptual.
Hace que sea difícil encontrar y controlar todos los cabos sueltos. Crea la tremenda carga
de aprendizaje y comprensión que hace que la rotación de personal sea un desastre.
Conformidad. Las personas con software no están solas al enfrentar la complejidad. La física
se ocupa de objetos terriblemente complejos, incluso en el nivel de partículas
"fundamentales". El físico se esfuerza, sin embargo, en una fe firme de que existen
principios unificadores que se pueden encontrar, ya sea en los quarks o en las teorías del
campo unificado. Einstein argumentó que debe haber explicaciones simplificadas de la
naturaleza, porque Dios no es caprichoso ni arbitrario.
Tal fe no conforta al ingeniero de software. Gran parte de la complejidad que debe dominar
es la complejidad arbitraria, forzada sin rima o razón por las muchas instituciones y sistemas
humanos a los que deben ajustarse sus interfaces. Estos difieren de la interfaz a la interfaz,
y de vez en cuando, no por necesidad, sino solo porque fueron diseñados por diferentes
personas, en lugar de por Dios.
En muchos casos, el software debe ajustarse porque es la llegada más reciente a la escena.
En otros, debe ajustarse porque se percibe como el más conformable. Pero en todos los
casos, mucha complejidad proviene de la conformación a otras interfaces; esta complejidad
no se puede simplificar mediante ningún rediseño del software solo.
Si examinamos los tres pasos en el desarrollo de la tecnología de software que han sido más
fructíferos en el pasado, descubrimos que cada uno atacó una dificultad mayor diferente
en la construcción de software, pero que esas dificultades han sido accidentales, no
esenciales, dificultades. También podemos ver los límites naturales a la extrapolación de
cada ataque.
Idiomas de alto nivel. Sin duda, el golpe más poderoso para la productividad, confiabilidad
y simplicidad del software ha sido el uso progresivo de lenguajes de alto nivel para la
programación. La mayoría de los observadores atribuyen ese desarrollo al menos a un
factor de cinco en productividad, y con los consiguientes avances en confiabilidad,
simplicidad e inteligibilidad.
¿Qué logra un lenguaje de alto nivel? Libera un programa de gran parte de su complejidad
accidental. Un programa abstracto consiste en construcciones conceptuales: operaciones,
tipos de datos, secuencias y comunicación. El programa de máquina concreta se refiere a
bits, registros, condiciones, ramas, canales, discos, etc. En la medida en que el lenguaje de
alto nivel incorpore los constructos que uno quiere en el programa abstracto y evita todos
los más bajos, elimina un nivel completo de complejidad que nunca fue inherente al
programa en absoluto.
Lo más que puede hacer un lenguaje de alto nivel es proporcionar todos los constructos 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á
aumentando constantemente, 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.
Además, en algún momento la elaboración de un lenguaje de alto nivel crea una carga de
dominio de la herramienta que aumenta, no reduce, la tarea intelectual del usuario que
rara vez utiliza los constructos esotéricos.
Ahora consideremos los desarrollos técnicos que con mayor frecuencia se presentan como
potenciales balas de plata. ¿Qué problemas abordan: los problemas de la esencia o las
dificultades accidentales restantes? ¿Ofrecen avances revolucionarios o incrementales?
Ada y otros avances de lenguaje de alto nivel. Uno de los desarrollos recientes más
promocionados es Ada, un lenguaje de alto nivel de propósito general de la década de 1980.
Ada no solo refleja las mejoras evolutivas en los conceptos de lenguaje, sino que incorpora
características para alentar el diseño moderno y la modularización.
Quizás la filosofía Ada es más un avance que el lenguaje Ada, ya que es la filosofía de la
modularización, de los tipos de datos abstractos, de la estructuración jerárquica. Ada es
demasiado rica, un resultado natural del proceso por el cual se establecieron los requisitos
en su diseño. Eso no es fatal, para el trabajo subconjunto
los vocabularios pueden resolver el problema de aprendizaje, y los avances de hardware
nos darán los MIPS baratos para pagar los costos de compilación. Avanzar en la
estructuración de los sistemas de software es de hecho un muy buen uso para el aumento
de MIPS que nuestros dólares comprarán. Los sistemas operativos, denunciados en voz alta
en la década de 1960 para su memoria
y los costos del ciclo, han demostrado ser una excelente forma de utilizar algunos de los
MIPS y bytes de memoria baratos del aumento de hardware pasado.
Sin embargo, Ada no probará ser la bala de plata que mata al monstruo de la productividad
del software. Después de todo, es solo otro lenguaje de alto nivel, y la mayor recompensa
de tales idiomas provino de la primera transición: la transición de las complejidades
accidentales de la máquina a la más abstracta.
declaración de soluciones paso a paso. Una vez que esos accidentes hayan sido eliminados,
los restantes serán más pequeños, y la recompensa de su eliminación seguramente será
menor.
Predigo que dentro de una década, cuando se evalúe la efectividad de Ada, se verá que ha
hecho una diferencia sustancial, pero no debido a ninguna característica particular del
lenguaje, ni a la combinación de todas ellas. Tampoco los nuevos entornos de Ada probarán
ser la causa de las mejoras.
La mayor contribución de Ada consistirá en cambiar a los programadores de capacitación
ocasionales en técnicas modernas de diseño de software.
Sistemas expertos. La parte más avanzada del arte de inteligencia artificial, y la más
ampliamente aplicada, es la tecnología para construir sistemas expertos. Muchos científicos
de software están trabajando arduamente para aplicar esta tecnología al entorno de
creación de software. [3, 5] ¿Cuál es el concepto y cuáles son las perspectivas?
Un sistema experto es un programa que contiene un motor de inferencia generalizado y
una base de reglas, toma datos de entrada y suposiciones, explora las inferencias derivables
de la base de reglas, arroja conclusiones y consejos, y ofrece explicar sus resultados
volviendo sobre sus razonamientos para el usuario . Los motores de inferencia
generalmente pueden tratar con datos y reglas difusos o probabilísticos, además de la lógica
puramente determinista.
Dichos sistemas ofrecen algunas ventajas claras sobre los algoritmos programados
diseñados para llegar a las mismas soluciones a los mismos problemas:
Programación "automática". Durante casi 40 años, las personas han estado anticipando y
escribiendo sobre "programación automática" o la generación de un programa para
resolver un problema a partir de una declaración de las especificaciones del problema.
Algunos hoy escriben como si esperaran que esta tecnología proporcionara el siguiente
avance. [5]
Parnas [4] implica que el término se usa para el glamour, no para el contenido semántico,
afirmando,
En resumen, la programación automática siempre ha sido un eufemismo para
programar con un lenguaje de nivel superior al que actualmente estaba disponible
para el programador.
Es difícil ver cómo tales técnicas se generalizan al mundo más amplio del sistema de
software ordinario, donde los casos con tales propiedades ordenadas son la excepción.
Incluso es difícil imaginar cómo podría ocurrir este avance en la generalización.
Estaciones de trabajo. ¿Qué ganancias se esperan para el arte del software del aumento
cierto y rápido en la capacidad de potencia y memoria de la estación de trabajo individual?
Bueno, ¿cuántos MIPS uno puede usar de forma fructífera? La composición y edición de
programas y documentos es totalmente compatible con las velocidades actuales. La
compilación podría ser un estímulo, pero un factor de 10 en la velocidad de la máquina
seguramente dejaría al pensamiento como la actividad dominante en el día del
programador. De hecho, parece ser así ahora.
Estaciones de trabajo más potentes que seguramente daremos la bienvenida. Mejoras
mágicas de ellos que no podemos esperar.
Ataques prometedores en la esencia conceptual
Aunque ningún adelanto tecnológico promete dar el tipo de resultados mágicos con los que
estamos tan familiarizados en el área de hardware, existe tanto una gran cantidad de
trabajo bueno que está ocurriendo ahora, como la promesa de un progreso constante,
aunque no espectacular.
Todos los ataques tecnológicos a los accidentes del proceso de software están
fundamentalmente limitados por la ecuación de productividad:
Si, como creo, los componentes conceptuales de la tarea ahora ocupan la mayor parte del
tiempo, entonces ninguna cantidad de actividad en los componentes de la tarea que sea
meramente 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 versus construir. La solución más radical posible para construir software no es
construirlo en absoluto.
Cada día es más fácil, ya que cada vez más proveedores ofrecen más y mejores productos
de software para una vertiginosa variedad de aplicaciones. Mientras que los ingenieros de
software hemos trabajado en la metodología de producción, la revolución de la
computadora personal ha creado no uno, sino muchos mercados masivos para software.
Cada puesto de periódicos tiene revistas mensuales, que clasifican por tipo de máquina,
publicitan y revisan docenas de productos a precios desde unos pocos dólares hasta unos
pocos cientos de dólares. Fuentes más especializadas ofrecen productos muy potentes para
la estación de trabajo y otros mercados de Unix. Incluso las herramientas de software y los
entornos se pueden comprar de forma inmediata. En otro lugar, propuse un mercado para
módulos individuales. [9]
Cualquier producto de este tipo es más barato de comprar que construir de nuevo. Incluso
con un costo de cien mil dólares, una pieza de software adquirida cuesta tan solo como un
programa en un año. ¡Y la entrega es inmediata! Inmediatamente al menos para productos
que realmente existen, productos cuyo desarrollador puede referir productos a un usuario
feliz. Además, tales productos tienden a estar mucho mejor documentados y mejor
conservados que el software nacional.
El desarrollo del mercado masivo es, creo, 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 incluso entre unos pocos usuarios reduce
radicalmente el costo por usuario. Otra forma 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.
La cuestión clave, por supuesto, es la aplicabilidad. ¿Puedo usar un paquete estándar
disponible para realizar mi tarea? Algo sorprendente ha sucedido aquí. Durante las décadas
de 1950 y 1960, el estudio tras otro demostró que los usuarios no usarían paquetes
comerciales para nómina, control de inventario, cuentas por cobrar, etc. Los requisitos eran
demasiado especializados, la variación caso por caso era demasiado alta. Durante la década
de 1980, encontramos tales paquetes de gran demanda y uso generalizado. ¿Que ha
cambiado?
No los paquetes, realmente. Pueden ser algo más generalizados y algo más personalizables
que antes, pero no mucho. No las aplicaciones, tampoco. En todo caso, las necesidades
comerciales y científicas de hoy en día son más diversas y complicadas que las de hace 20
años.
El gran cambio ha estado en la relación costo / hardware del software. En 1960, el
comprador de una máquina de dos millones de dólares sintió que podía pagar $ 250,000
más por un programa de nómina personalizado, que se deslizaba fácilmente y sin
interrupciones en el entorno social hostil a la computadora. Hoy en día, el comprador de
una máquina de oficina de $ 50,000 no puede permitirse un programa personalizado de
nómina, por lo que adapta el procedimiento de nómina a los paquetes disponibles. Las
computadoras son ahora tan comunes, si no tan queridas, que las adaptaciones son
aceptadas como algo normal.
Existen excepciones dramáticas a mi argumento de que la generalización de los paquetes
de software ha cambiado poco a lo largo de los años: hojas de cálculo electrónicas y
sistemas de bases de datos simples. Estas poderosas herramientas, tan obvias en
retrospectiva y tan tardías en aparecer, se prestan a innumerables usos, algunos bastante
poco ortodoxos. Los artículos e incluso libros abundan sobre cómo abordar tareas
inesperadas con la hoja de cálculo. Un gran número de aplicaciones que anteriormente se
habrían escrito como programas personalizados en Cobol o Report Program Generator
ahora se realizan rutinariamente con estas herramientas.
Muchos usuarios ahora operan sus propias computadoras día tras día en varias aplicaciones
sin siquiera escribir un programa. De hecho, muchos de estos usuarios no pueden escribir
nuevos programas para sus máquinas, pero sin embargo son expertos en resolver nuevos
problemas con ellos.
Creo que la estrategia de productividad de software más poderosa para muchas
organizaciones hoy en día es equipar a los trabajadores intelectuales ingenuos que están en
la línea de fuego con computadoras personales y buenos programas generalizados de
escritura, dibujo, archivo y hoja de cálculo y luego soltarlos . La misma estrategia, llevada a
cabo con paquetes matemáticos y estadísticos generalizados y algunas capacidades de
programación simples, también funcionará para cientos de científicos de laboratorio.
Por lo tanto, uno de los esfuerzos tecnológicos actuales más prometedores y que ataca la
esencia, no los accidentes, del problema del software, es el desarrollo de enfoques y
herramientas para el prototipado rápido de sistemas, ya que la creación de prototipos
forma parte de la especificación iterativa de requisitos.
Un prototipo de sistema de software es aquel que simula las interfaces importantes y realiza
las funciones principales del sistema previsto, sin estar necesariamente sujeto a las mismas
limitaciones de velocidad, tamaño o costo del hardware. Los prototipos generalmente
realizan las tareas principales de la aplicación, pero no intentan manejar las tareas
excepcionales, responden correctamente a las entradas no válidas o cancelan limpiamente.
El propósito del prototipo es hacer real la estructura conceptual especificada, de modo que
el cliente pueda probarla en cuanto a consistencia y usabilidad.
Gran parte del procedimiento de adquisición de software actual se basa en la suposición de
que uno puede especificar un sistema satisfactorio por adelantado, obtener ofertas para su
construcción, hacer que se construya e instalarlo. Creo que esta suposición es
fundamentalmente errónea, y que muchos problemas de adquisición de software surgen
de esa falacia. Por lo tanto, no pueden corregirse sin una revisión fundamental: revisión que
permite el desarrollo iterativo y la especificación de prototipos y productos.
Desarrollo incremental: desarrollar, no compilar, software. Todavía recuerdo la sacudida
que sentí en 1958 cuando escuché por primera vez a un amigo hablar sobre la construcción
de un programa, en lugar de escribir uno. En un instante, amplió mi visión completa del
proceso de software. El cambio de metáfora fue poderoso y preciso. Hoy entendemos
cómo, al igual que otros procesos de construcción, la construcción de software, y usamos
libremente otros elementos de la metáfora, como especificaciones, ensamblaje de
componentes y andamios.
La metáfora del edificio ha sobrevivido a su utilidad. Es hora de cambiar de nuevo. Si, como
creo, las estructuras conceptuales que construimos hoy son demasiado complicadas para
ser especificadas con precisión de antemano, y demasiado complejas para ser construidas
sin fallas, entonces debemos adoptar un enfoque radicalmente diferente.
Volteemos la naturaleza y estudiemos la complejidad de los seres vivos, en lugar de solo las
obras muertas del hombre. Aquí encontramos constructos cuyas complejidades nos
estremecen de asombro. Solo el cerebro es intrincado más allá del mapeo, poderoso más
allá de la imitación, rico en diversidad, autoprotector y autorenovable. El secreto es que se
cultiva, no se construye.
Entonces debe ser con nuestros sistemas de software. Hace algunos años, Harlan Mills
propuso que cualquier sistema de software debería crecer mediante el desarrollo
incremental. [10] Es decir, primero se debe hacer que el sistema se ejecute, incluso si no
sirve de nada, excepto llamar al conjunto adecuado de subprogramas ficticios. Luego, poco
a poco, debería completarse, con los subprogramas a su vez en desarrollo, en acciones o
llamadas a talones vacíos en el nivel siguiente.
He visto los resultados más espectaculares desde que comencé a instar esta técnica a los
creadores de proyectos en mi clase de Laboratorio de Ingeniería de Software. Nada en la
última década ha cambiado radicalmente mi propia práctica o su eficacia. El enfoque
requiere un diseño de arriba hacia abajo, ya que es un crecimiento descendente del
software. Permite un retroceso fácil. Se presta a prototipos tempranos. Cada función
adicional y nueva disposición para datos o circunstancias más complejas crece
orgánicamente de lo que ya existe.
Los efectos de la moral son sorprendentes. El entusiasmo salta cuando hay un sistema en
ejecución, incluso uno simple. Los esfuerzos se redoblan cuando aparece la primera imagen
de un nuevo sistema de software gráfico en la pantalla, incluso si solo es un rectángulo. Uno
siempre tiene, en cada etapa del proceso, un sistema en funcionamiento. Encuentro que
los equipos pueden hacer crecer entidades mucho más complejas en cuatro meses de lo
que pueden construir. Se pueden obtener los mismos beneficios en proyectos grandes que
en mis proyectos pequeños. [11]
Grandes diseñadores. La pregunta central sobre cómo mejorar los centros de arte de
software, como siempre, en las personas.
Podemos obtener buenos diseños siguiendo las buenas prácticas en lugar de las malas. Se
pueden enseñar buenas prácticas de diseño. Los programadores se encuentran entre la
parte más inteligente de la población, por lo que pueden aprender buenas prácticas. Por lo
tanto, un impulso importante en los Estados Unidos es promulgar buenas prácticas
modernas. Nuevos planes de estudios, nueva literatura, nuevas organizaciones como el
Instituto de Ingeniería de Software, todas han surgido para elevar el nivel de nuestra
práctica de pobre a bueno. Esto es completamente correcto.
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 buenos no
lo es. Los grandes diseños provienen de grandes diseñadores. La construcción de software
es un proceso creativo. La metodología de sonido puede potenciar y liberar la mente
creativa; no puede inflamar ni inspirar al borracho.
Las diferencias no son menores: son más bien como las diferencias entre Salieri y Mozart.
Estudio tras estudio muestra que los mejores diseñadores producen estructuras que son
más rápidas, más pequeñas, más simples, más limpias y se producen con menos esfuerzo.
[12] Las diferencias entre el gran y el promedio se aproximan a un orden de magnitud.
Una pequeña retrospección muestra que, aunque muchos sistemas de software finos y
útiles han sido diseñados por comités y construidos como parte de proyectos multiparte,
esos sistemas de software que han entusiasmado a apasionados fanáticos son aquellos que
son productos de una o pocas mentes de diseño, grandes diseñadores. Considere Unix, APL,
Pascal, Modula, la interfaz Smalltalk, incluso Fortran; y contrastarlos con Cobol, PL / I, Algol,
MVS / 370 y MS-DOS. (Ver la Tabla 1.)
Por lo tanto, aunque estoy totalmente de acuerdo con los esfuerzos de transferencia de
tecnología y desarrollo curricular que están en marcha, creo que el esfuerzo individual más
importante que podemos hacer es desarrollar formas de hacer crecer a los grandes
diseñadores.
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. Grandes diseñadores y
grandes gerentes son muy raros. La mayoría de las organizaciones dedican un esfuerzo
considerable a encontrar y cultivar las perspectivas de gestión; No conozco a ninguno que
invierta el mismo esfuerzo en encontrar y desarrollar a los grandes diseñadores de quienes
dependerá la excelencia técnica de los productos.