Trabajo como agente / gerente de alquiler para una compañía de alquiler de autos que se ejecuta en un sistema de alquiler que fue escrito en 1972. Decidí que tal vez era hora de una actualización. Para un poco de antecedentes, aquí hay un breve ejemplo de la locura con la que tenemos que lidiar diariamente con este programa:
Un agente de alquiler debe recordar que la impresión en una pantalla usa "MXC" en el campo ACT (todo se basa en códigos cortos), que significa "pantalla MaXimum en un contrato", mientras que en otra requiere PR (para IMPRIMIR) en el campo ACCIÓN, pero varias pantallas usan una Y en el campo PT (para PrinT), otra pantalla usa Y en el campo PRT (para PRinT), y otra pantalla requiere que el usuario presione enter (pero no la entrada al lado del letras, como se trata de un nuevo carácter de línea, debe ser el ingreso en el teclado numérico) y luego F8, una pantalla diferente pero relacionada requiere simplemente F8, algunas pantallas tienen un campo etiquetado PRT, que debería ser para PRinT, pero el campo en realidad no hace nada y la impresión se realiza automáticamente después de pasar por varias indicaciones, y aún más pantallas tienen un campo etiquetado IMPRIMIR S / N,que por defecto es Y para operaciones en las que otra ubicación ya está entregando documentación, y N para operaciones en las que otro distribuidor necesitará documentación.
Decidí que podía hacer un mejor trabajo que esto, así que me puse en contacto con la persona de la compañía que tomaría la decisión de actualizar esto. Finalmente me comunico con el vicepresidente de TI, quien está a cargo de este programa. Recibo un poco de información de él, y me doy cuenta de que mi compañía de alquiler de autos tiene su programa de alquiler escrito en el ensamblador de mainframe de IBM con un poco de COBOL mezclado. Dice que no hay puestos disponibles en este momento, pero que debería envíele un correo electrónico mi currículum de todos modos (en caso de que algo se abra).
Esto me lleva a mis preguntas.
El primero es técnico. Con la idea de mejorar la capacidad de mantenimiento en el futuro, mi pensamiento es reescribirlo en un lenguaje de nivel superior al lenguaje ensamblador. Mi área de experiencia es en C ++, así que esa es la opción obvia para mí. La compañía necesita urgentemente una forma más fácil de actualizar el programa, ya que recientemente leí un artículo en el que se cita al hombre con el que hablé diciendo que el equipo trabajó duro, y están orgullosos de anunciar que el programa ahora tiene soporte para 5 de códigos de ubicación de dígitos (en lugar de 4) y números de automóviles de 8 dígitos (en lugar de 7). Mi filosofía sobre las actualizaciones, incluso en situaciones tan graves, está en línea con la de Joel: http://www.joelonsoftware.com/articles/fog0000000069.html en resumen, las reescrituras deberían ser incrementales, en lugar de tirar todo lo que había antes y comenzando de nuevo.
¿Existe una manera fácil de integrar el ensamblaje de IBM con C ++ y, de ser así, cómo debo hacerlo? Soy vagamente consciente de la palabra clave asm, pero no sé si es mejor usar eso o hacer otra cosa. ¿Se desaconseja este plan? Hago la mayor parte de mi trabajo en Linux usando g ++ y GNU make, por lo que las respuestas específicas son bienvenidas, pero definitivamente no son necesarias (ya que no tengo idea de qué tipo de sistema de compilación no tienen, pero sospecho que casi ninguna).
La segunda pregunta es más política. ¿Cómo debo convencer a esta empresa de que necesitan hacer el cambio? Los ahorros de costos teóricos son enormes (según mis estimaciones, la compañía está desperdiciando un millón de dólares extra por año, solo en el aumento de los costos de capacitación para aprender a interactuar con el programa), pero mis cambios propuestos probablemente pondrían todo el los programadores actuales no tienen trabajo, en caso de que se promulguen, por lo que existe una gran resistencia estructural al cambio.
editar: Debo explicar por qué modificar lo que la compañía ya tiene me parece la mejor solución. Todavía estoy abierto a otras sugerencias, porque este es un monstruo de un programa, sin embargo. Nunca he tenido un trabajo de programación antes, así que corrígeme en cualquier análisis incorrecto que pueda dar.
En primer lugar, está la solución estándar.
De mis conversaciones con algunos gerentes de nivel medio sobre este tipo de cosas, una de las principales preocupaciones con el cambio a un nuevo sistema es la gran cantidad de empleados leales que han estado con la compañía durante décadas y que ahora se sienten cómodos con el sistema. . Si tengo la capacidad de modificar lo que tenemos, podría mantener la interfaz actual en una especie de 'modo de compatibilidad'. Los usuarios ya tienen que iniciar sesión para usar el sistema actual, por lo que podría agregar la posibilidad de activar una configuración cuando los usuarios inicien sesión por primera vez (después de hacer este cambio), donde se les da la opción de usar interfaz 'clásica' o la interfaz 'nueva'. No hay forma de que encuentre una solución estándar que permita eso,
Mi empresa también posee el software que utilizamos; No lo licenciamos. Esto significa que la gerencia con la que estoy hablando actualmente son las mismas personas que realmente podrían autorizarme a hacer un cambio. Con una solución de terceros, tendría que obtener la aprobación de mi compañía además de asegurar los derechos que serían necesarios de la compañía que desarrolló el producto que utilizamos, lo que agrega un obstáculo adicional. Esto también requeriría convencer a la compañía de que renuncie a "su" producto y tome otro producto, lo que parece un obstáculo mayor que intentar actualizar lo que tenemos, pero podría estar equivocado sobre este tema.
Finalmente, mirando hacia el futuro, no solo quiero mejorar la interfaz de usuario y corregir algunos errores. Después de actualizar esos problemas 'urgentes', esperaba actualizar la forma fundamental en que la empresa funciona en relación con la tecnología. Después de pasar 1-2 años en este tipo de problemas, mi plan era volver a la gerencia y proponer cambios más dramáticos. Hay muchas formas en que la empresa funciona que podrían mejorarse fundamentalmente con tecnología que simplemente no están utilizando en este momento. Por ejemplo, cada región funciona de la misma manera. El principal aeropuerto local es el centro de distribución de automóviles. Se envían principalmente según sea necesario. Sin embargo, el aeropuerto se utiliza como base de operaciones para todas las operaciones. Enviarán a dos personas en un automóvil a mi ubicación para que nos recojan un automóvil que no necesitamos, luego regrese al aeropuerto con el automóvil en el que vinieron, más lo que están llevando (estamos a 32 millas del aeropuerto). Luego vendrán a la ubicación a 5 millas de nosotros en dos autos para dejar uno de ellos, luego regresarán en su otro auto al aeropuerto. Lo hacen incluso si el automóvil que enviamos es el mismo tipo de automóvil que necesitan cerca de nosotros. He estado con la compañía durante aproximadamente dos años, y solo parece que se han desviado de esto en las emergencias más extremas de escasez de automóviles (unas tres veces). Reemplazaría a las 4 personas que trabajan en cada región con un sistema de programación automatizado que determina qué automóviles van a dónde y tratan de encontrar el camino que requiere la menor cantidad de tiempo + millas + conductores para entregar todos los automóviles donde deben estar, como un ejemplo de las correcciones de nivel superior que espero agregar algún día.
Sin embargo, antes de sentirme cómodo proponiendo todo esto, creo que sería útil establecer un punto de apoyo en la empresa y la base del código haciendo las tareas más pequeñas, como actualizar la interfaz. Soluciones como la subcontratación o de otro modo eliminarían esta posibilidad.
if (m_newInterface)
comenzó a aparecer el código de espagueti en toda la base del código. El desacoplamiento y la refactorización tomaron el tiempo suficiente para que, cuando se hizo, la mayoría de los usuarios ya hayan migrado a la nueva interfaz (piense en varios años).