Si eres programador, no te consideres un "científico de la computación"; los informáticos son los que crean la próxima generación de computadoras, algunas de las cuales siguen siendo ciencia ficción hasta que se obtenga la combinación correcta de materiales, miniatuización y teoría computacional. Son solo el comienzo de la tubería. Las personas que desarrollan software aquí y ahora son "ingenieros de software"; toman las teorías y las herramientas, a veces superponiendo la teoría práctica y las herramientas del mundo real para aprovechar el poder en potencia de esta compleja pieza de magia electroinica y hacer que haga lo que queremos. Esa es, a su vez, una especialización del campo de la "ingeniería informática", que toma las teorías de los científicos informáticos y las aplica, hardware y software, a soluciones electrónicas para usuarios finales del mundo real.
Esto es, OMI, donde los negocios se encuentran con la teoría. En este tipo de casos, el viejo adagio "el enemigo de lo mejor es lo suficientemente bueno" se puede cambiar fácilmente para leer "el enemigo de lo suficientemente bueno es mejor". Considerándose un "ingeniero" en lugar de un "científico", y poniendo lo que hace en paralelo con otras disciplinas de ingeniería, pone de relieve las diferencias.
Digamos que un cliente acude a usted, un ingeniero civil / estructural, y le pide que construya un puente. El puente debe abarcar 20 pies, sostenerse y una tonelada de carga, debería durar 10 años con mantenimiento de rutina, y lo quieren en un mes por $ 20,000. Esas son tus limitaciones; cumplir con los mínimos sin exceder los máximos. Hacer eso es "lo suficientemente bueno" y te da el sueldo. Sería una ingeniería deficiente para usted construir el Puente Golden Gate, superando con creces tanto las especificaciones de diseño como el presupuesto en varios órdenes de magnitud. Por lo general, terminas comiendo los excesos de costos y pagando multas por excedentes de tiempo. También sería una mala ingeniería para usted construir un puente de cuerda con el peso de 5 hombres adultos a pesar de que solo cuesta $ 1000 en tiempo y materiales; no obtienes buenas críticas y testimonios de clientes,
De vuelta al software, supongamos que tiene un cliente que necesita un sistema de procesamiento de archivos creado para digerir los archivos que ingresan y poner la información en el sistema. Quieren que se haga en una semana y tiene que manejar cinco archivos al día, alrededor de 10 MB de datos, porque ese es todo el tráfico que obtienen actualmente. Tus preciadas teorías en gran medida salen por la ventana; su tarea es crear un producto que cumpla con esas especificaciones en una semana, porque al hacerlo también cumple con el presupuesto de costos del cliente (ya que los materiales son generalmente una gota en el cubo para un contrato de software de este tamaño). Pasar dos semanas, incluso diez veces la ganancia, no es una opción, pero lo más probable es que tampoco lo es un programa construido en un día que solo puede manejar la mitad del rendimiento, con instrucciones de tener dos copias en ejecución.
Si crees que este es un caso marginal, estás equivocado; Este es el entorno diario de la mayoría de los usuarios. El motivo es el ROI; Este programa inicial no cuesta mucho y, por lo tanto, se amortizará rápidamente. Cuando los usuarios finales lo necesitan para hacer más o ir más rápido, el código se puede refactorizar y escalar.
Esa es la razón principal detrás del estado actual de la programación; La suposición, confirmada por toda la historia de la informática, es que un programa NUNCA es estático. Siempre deberá actualizarse y eventualmente será reemplazado. Paralelamente, la mejora constante de las computadoras en las que se ejecutan los programas permite una menor atención a la eficiencia teórica y una mayor atención a la escalabilidad y la paralelización (un algoritmo que se ejecuta en tiempo N cuadrado, pero que se puede paralelizar para funcionar en N núcleos) parece lineal y, a menudo, el costo de más hardware es más barato que el de los desarrolladores para diseñar una solución más eficiente).
Además de eso, existe el principio muy simple de que cada línea de código de desarrollador es algo más que puede salir mal. Cuanto menos escribe un desarrollador, menos probable es que lo que escribe tenga un problema. Esto no es una crítica de la "tasa de errores" de nadie; Es una simple declaración de hecho. Es posible que sepa cómo escribir un MergeSort hacia atrás y hacia adelante en 5 idiomas, pero si usa solo un identificador en una línea de código, todo el Sort no funciona, y si el compilador no lo captó, podría llevarlo horas para depurarlo. Contraste eso con List.Sort (); está ahí, es eficiente en el caso general y, aquí está lo mejor, ya funciona.
Por lo tanto, muchas de las características de las plataformas modernas y los principios de las metodologías de diseño modernas se construyeron con esto en mente:
- OOP: cree datos y lógica relacionados en un objeto, y donde sea que el concepto de ese objeto sea válido, por lo que es el objeto o una derivación más especializada.
- Plantillas preconstruidas: un buen 60% o más de código es un sintaxis sintáctico y lo básico para que el programa muestre algo en la pantalla. Al estandarizar y generar automáticamente este código, reduce la carga de trabajo del desarrollador a la mitad, lo que permite un aumento de la productividad.
- Bibliotecas de algoritmos y estructuras de datos: al igual que en lo anterior, puede saber cómo escribir una pila, una cola, QuickSort, etc., pero ¿por qué tiene que hacerlo, cuando hay una biblioteca de código que tiene todo esto incorporado? No volvería a escribir IIS o Apache porque necesitaba un sitio web, entonces, ¿por qué implementar un algoritmo QuickSort o un objeto de árbol rojo-negro cuando hay varias implementaciones excelentes disponibles?
- Interfaces fluidas: en la misma línea, es posible que tenga un algoritmo que filtre y clasifique los registros. Es rápido, pero probablemente no sea muy legible; a su desarrollador junior le tomaría un día comprenderlo, y mucho menos hacer el cambio quirúrgico necesario para clasificar en un campo adicional en el objeto de registro. En cambio, las bibliotecas como Linq reemplazan una gran cantidad de código muy feo, a menudo frágil, con una o dos líneas de llamadas a métodos configurables para convertir una lista de objetos en objetos filtrados, ordenados y proyectados.