Reescribiendo el ensamblador de IBM + COBOL en C ++

13

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.

David Stone
fuente
3
Mire el emulador de Hercules: hay mucha magia en el sistema operativo central de un mainframe de IBM que necesita ser emulado.
Yann Ramin
Sinceramente, miraría "rehacer desde el principio" (chiste malo de C64). Sin embargo, en serio, verifique las especificaciones y vea qué se necesita para escribir una nueva GUI usted mismo. Mientras la interfaz de la base de datos sea la misma, y ​​esto tomará mucho tiempo e investigación para determinar, entonces usted es dorado, y está en línea para ganar $ # && carga de dinero :)
8
Si el sistema actual realmente funciona , debe tener una muy buena razón para que esto valga la pena para el cliente. Además, lo más probable es que subestimes severamente la cantidad de trabajo necesario para reproducir el sistema actual, solo piensa que primero necesitas entender el sistema actual, haciendo que tu reescritura sea aún más costosa que tu estimación original. Esto no es para desanimarte, sino solo para asegurarte de que realmente sabes qué tarea hercúlea podrías estar inscribiendo ANTES de que no puedas retroceder. Además, haga que su trabajo sea incremental; en otras palabras, permanezca en el mainframe por ahora.
Me temo que emular el sistema sería muy difícil lo que me ha llevado a buscar una forma de hacer pequeños cambios modulares, en lugar de tratar de comenzar desde cero.
David Stone
@David Stone Una vez estuve en un proyecto, hicimos lo de "seleccionar la interfaz nueva o la antigua". Se fue RÁPIDAMENTE al infierno del desarrollo: el código estaba estrechamente acoplado con la interfaz y rápidamente 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).
Vitor Py

Respuestas:

4

Confinándome al frente técnico ...

Le sugiero que comience determinando el entorno en el que se ejecuta la aplicación. "Mainframe" podría significar un par de cosas diferentes, dada la edad de la aplicación, podría ser CICS o IMS . También es posible que los autores originales escribieran su propia tarea iniciada.

Dependiendo de dónde se ejecute la aplicación, es probable que haga uso de API para ese entorno, CICS ahora usa una interfaz muy diferente de sus primeros días, no puedo hablar por IMS. Si la aplicación es su propia tarea iniciada, es muy posible que tenga su propia API interna: me paso unos siete años apoyando a esa bestia, escrita en la misma época.

Otra cosa a tener en cuenta, dada la antigüedad de la aplicación, es que el ensamblador con el que desea integrar C ++ es anterior a la existencia de Language Environment (LE). Como tal, a menos que el ensamblador se haya actualizado para que sea conforme con LE, tendrá algunas dificultades ya que C y C ++ cumplen con LE y requieren que sus llamadores y llamadas también se ajusten.

Otro punto a considerar, si esta aplicación se ejecuta en un mainframe moribundo, es posible que esté tratando de integrarse con una aplicación que se ejecuta en hardware y software no admitidos. Esto no sería diferente a tratar de integrarse con una aplicación escrita en 1989 que se ejecuta en DOS 4.01 en su hardware original.

cschneid
fuente
La aplicación podría incluso usar TPF , lo que haría una conversión extremadamente difícil.
Gilbert Le Blanc
13

Estás saltando el arma. Según su descripción, parece que no ha entendido completamente el entorno técnico actual (qué sistema operativo exactamente, dónde y cómo se almacenan los datos, existen interfaces con otros sistemas, etc.). Pero aún más importante: un plan serio debería considerar alternativas a una reescritura interna parcial o completa del software, es decir, software comercial, externalización de la reescritura, software como servicio, etc.

Independientemente de cómo vaya la empresa, primero necesita un análisis sólido de lo que hace el software hoy y cuáles son los requisitos para la nueva solución.

Entonces, ¿por qué no ofreces hacer este análisis?

Codo
fuente
77
+1 Esta es la única respuesta que propone un análisis completo de la aplicación existente y los requisitos de la compañía antes de proponer una solución técnica. Me recuerda el viejo chiste: empiezas a codificar, voy a averiguar qué quieren.
Ese es un buen punto, y definitivamente necesito más información antes de comprometerme a hacer este trabajo. Parte del problema es que pregunté, y no fue hasta que me puse en contacto con un vicepresidente de la compañía que encontré a alguien que realmente conocía los detalles. Llamé a varias oficinas, incluido el soporte técnico, y ninguna de ellas pudo darme detalles como en qué lenguaje de programación estaba escrito el programa. Sin embargo, tengo algunas razones para lanzar una solución estándar, que editaré en Mi pregunta original
David Stone
7

¡Me sorprende que hayas recibido una respuesta tan amable!

Veamos esto desde su punto de vista.

Manejaron exitosamente un sistema de treinta años con probablemente cientos de miles de líneas de código, interfaces con quizás otros veinte sistemas que encarnan procesos de negocios que evolucionaron a lo largo de cuarenta años.

Probablemente sean expertos en su campo y, como tal, considerarían a C ++ como un paso hacia abajo del "lenguaje de ensamblador de alto nivel" de IBM para darle su título completo. El lenguaje ensamblador de IBM es extremadamente poderoso y el lenguaje "MACRO" es la mejor implementación de un lenguaje de preprocesamiento / plantilla.

Habrá una propuesta para reemplazar su sistema cada cinco años desde que se implementó por primera vez. Algunos habrían sido rechazados después de un estudio de factibilidad, algunos habrían llegado a la etapa de diseño antes de perder su presupuesto, algunos incluso podrían haber entrado en el código y tal vez en la etapa de prueba antes de que se toparan con problemas de rendimiento y quedaran en lata.

C ++ simplemente no ayudaría. No hay una biblioteca de gráficos en el entorno donde se ejecuta la aplicación. (Hay una biblioteca de gráficos 3270, pero es poco probable que sea compatible con C ++, ya que nadie la usa, y hay una biblioteca de cliente "X" completa, pero debe estar en un entorno diferente para usarla).

Tienen una interfaz de usuario que dista mucho de ser perfecta pero que es bien conocida y rápida. Un operador experimentado completará un formulario aproximadamente tres veces más rápido utilizando una pantalla verde en lugar de una GUI equivalente. Además, pueden prestar atención al cliente mientras tocan la letra.

Los operadores de pantalla necesitarán capacitación, sea cual sea la interfaz que utilicen, volver a capacitar a todos sus empleados para que utilicen una GUI nueva y desconocida sería una partida presupuestaria masiva en comparación con solo capacitar a los nuevos empleados en el viejo sistema mundial.

James Anderson
fuente
4

Tuve un problema similar hace algunos años en BellSouth. Simplemente escribí el código COBOL para escanear los programas de lenguaje ensamblador byte a byte, separar los códigos de operación y los operandos, convertir las instrucciones de ramificación para ir a tos y convertir las instrucciones de comparación en IF. Este programa convirtió las instrucciones de DC al código COBOL Data Division equivalente, y convirtió movimientos, zaps, etc., según corresponda.

Una vez hecho eso, escribí un segundo programa para convertir IFs y GOTOs en IF-THENs, con movimientos y cosas así en las líneas entre estos grupos (esto no fue realmente tan difícil de hacer; el secreto es insertar los IFs y ELSEs mientras relees el cobol "pidgin" de primera fase de atrás hacia adelante).

IF-THEN-ELSER buscó situaciones en las que encontró una referencia GOTO cerca de una etiqueta, que podría eliminarse de forma segura (disminuyendo su número de referencias en 1). Ejecuta este programa IF-THEN-ELSER de forma iterativa (es decir, lo ejecuta una y otra vez, deteniéndose solo cuando su último pase no puede encontrar la manera de hacer más cambios). La mayor parte del trabajo crítico lo realiza este if-then-elser, cuyo producto COBOL debe ser cuidadosamente revisado y examinado por un programador experto y competente en lenguaje ensamblador (es decir, yo). En mi experiencia, mi "if-then-elser" pudo eliminar más del 90 por ciento de los GO TO que resultaron de las instrucciones de la rama original.

Supongo que es posible avanzar desde este punto con una conversión directa a C (o C ++), lenguajes con los que también estoy familiarizado. Sin embargo, en BellSouth, nuestro idioma de elección fue COBOL / II. Siempre hay un poco de complejidad que surge de situaciones en las que una etiqueta restante tiene múltiples referencias IR A (muchas veces, estas situaciones son manejadas por COBOL PERFORMs, pero a veces pueden representarse simplemente mediante construcciones OR y AND).

Creo que es bueno producir código en COBOL / II elegantemente estructurado en bloques, con EVALUADOS (construcciones de casos) y 88 nombres de condición de nivel. Agregar estos toques finales condujo a otro par de programas, que resultaron útiles en los programas COBOL que no se originan en programas convertidos de ensamblador.

No sé si esto ayuda.

Como han comentado otras personas, debe llevar a cabo este proceso con cuidado. Ayuda tener 10-12 años de experiencia en codificación de ensambladores informando sus procesos de toma de decisiones. Los que tenemos esa experiencia son difíciles de encontrar más.

Como nota final: solo escribimos en ensamblador en ese entonces porque los compiladores para los lenguajes de alto nivel producían código de objeto engorroso e ineficiente. Los compiladores COBOL "optimizadores" de hoy no tienen esos mismos malos hábitos. ----------

Mark Mondt
fuente
2

El consejo de Joel es generalmente sólido, pero en este caso una reescritura completa está atrasada. Idealmente, una reescritura con un hacha de batalla, ya que lo que estás tratando aquí es un monstruo.

No estoy seguro de qué agregar exactamente, ya que ya has hecho un buen argumento para que lo reescribas tú mismo. Mi única recomendación sería omitir C ++ por completo e ir directamente a una interfaz web para el sistema de alquiler, ya que probablemente será aún más fácil capacitar a los trabajadores y le ahorrará mucho trabajo en la interfaz de usuario (además de hacer es mucho más fácil obtener sangre nueva en el proyecto, o incluso simplemente externalizar todo).

En cuanto a los programadores COBOL existentes, tal vez puedan ayudar a documentar el sistema existente y al proceso de migración.


fuente
2
+1: este no es un trabajo para C ++
6502
2
@ 6502: ¿Por qué no? La experiencia del OP está en C ++. Descubrir cómo lidiar con un sistema antiguo es bastante malo. Aprender otro idioma no va a ayudar. Un programador competente que utilice herramientas en las que el programador sea competente podrá hacer que funcione mucho mejor que el sistema anterior sin importar el idioma.
En silico
1
@In silico: en mi opinión, para un proyecto razonablemente grande de este tamaño, ahorraría tiempo al aprender un lenguaje más apropiado como, por ejemplo, Python que usar C ++. Suponiendo que Python no estuviera allí, para un proyecto lo suficientemente grande de este tipo, IMO vale la pena escribir su propio Python en C ++ y codificarlo usando eso en lugar de hacerlo todo en C ++. C ++ es un lenguaje muy agradable y su punto fuerte es que, por diseño, no quiere dejar ningún espacio debajo de C ++ y sobre el ensamblador. Totalmente inútil aquí. ¿Sugeriría escribir todo utilizando FPGA si ese fuera el área de especialización del afiche?
6502
3
@ 6502: no estoy de acuerdo. Con una técnica adecuada y moderna, bibliotecas bien diseñadas y competencia en el lenguaje, todas esas cuestiones son irrelevantes. (Eso es cierto para cualquier lenguaje, por supuesto). Y las personas han desarrollado sistemas y software a gran escala en C ++ que funciona bien y no parece tener un problema con el uso de C ++. El hecho de que no use C ++ para este trabajo no significa que otros no puedan usarlo y usarlo bien. Eso lo decide el OP. Estoy seguro de que eres bastante productivo en otros idiomas y, por supuesto, sigue así.
En silico
1
In silico: claramente cualquier cosa puede en teoría ser implementada con cualquier cosa (incluyendo brainf k). Esto no significa que todas las herramientas sean equivalentes. Creo que para una aplicación de negocios tener un código que sea simple de escribir y leer (incluso por personas no técnicas) es mucho más importante que la velocidad de computación simple. También algo como el comportamiento indefinido es un precio demasiado alto para pagar por la proximidad innecesaria al metal. Si para usted C ++ es una buena opción para la lógica de negocios y una aplicación de entrada de datos, entonces me pregunto si hay algo para lo que C ++ sea una mala elección ...
6502
2

En cuanto al aspecto técnico, mucho dependerá de la calidad, la modularidad, del código del ensamblador. Algunos programadores entendieron la importancia de crear módulos con funciones específicas y limitadas y una interfaz parametrizada clara y simple, utilizando convenciones de enlace de subrutinas estándar de IBM. La gran mayoría, sin embargo, tendió a crear monstruosidades monolíticas.

Con el primero, la reutilización es posible, y no debería ser tan difícil resolver el "pegamento" entre C ++ y el ensamblador, suponiendo que los módulos del ensamblador usen secuencias de llamada estándar (o al menos consistentes). Sin embargo, con toda probabilidad, el código del ensamblador será un desastre. Aunque era posible escribir ensamblador estructurado, muy pocas personas lo hicieron, y será casi imposible discernir cualquier "diseño" desde el cual comenzar a reescribir.

Por otro lado, el ensamblador 360/370 tiene un nivel bastante alto en comparación con los microprocesadores actuales, y es mucho más simple, y C a veces se considera "ensamblador de alto nivel". Trabajé para una compañía de DBMS cuyo producto era un ensamblador completamente 370, y nuestro arquitecto principal creía que sería posible traducir a máquina el código del ensamblador en C (para una futura portabilidad). Soy escéptico, pero el punto es que la distancia no es tan grande como podrías pensar.

No sé si algo de esto es útil. Como digo, creo que depende en gran medida de la calidad y el tamaño del código original.

Cap
fuente
1

No puedo decir si esto es una broma o no: ¿su empresa está ejecutando en serio el código originalmente escrito hace 39 años? Si se ejecuta en un sistema / 360, tendrá que compilar g ++ desde la fuente ...

Honestamente, ni siquiera pensaría en usar ninguno de los viejos códigos; debe adoptar un enfoque nuevo, sentarse y pensar en lo que debe incluirse en el diseño, y hacerlo desde cero. Sí, implicará un poco de planificación, pero no creo que incluso Joel diga que este es un caso de cambios incrementales.

En cuanto a persuadir a la empresa de que necesita cambiar, debe señalar razones específicas que mejorarán la eficiencia, reducirán los costos y / o mostrarán que lo que está utilizando ahora está perjudicando los resultados en este momento.

Otro comentario: me imagino que otras compañías de alquiler de automóviles se han unido al resto de nosotros en el siglo XXI; Haría un poco de reconocimiento para ver cómo lo están haciendo (basado en la web, imagino), y posiblemente modelarlo después de uno de esos sistemas (es decir, no reinventar la rueda).

¡Buena suerte!

Chris Gregg
fuente
55
No es inusual que los sistemas mainframe utilicen bases de código iniciadas en los años 60 o 70. IBM mantiene sus mainframes zSeries y el sistema operativo compatible con versiones anteriores de 360 ​​simplemente por esto. No hay mucho en el modelo de negocio de una empresa de alquiler de automóviles (o un banco o una compañía de seguros) que haya cambiado desde entonces. Puede agregar una interfaz web, claro, pero ¿qué ha cambiado en la forma en que almacena los autos en la base de datos?
Bo Persson
zOS tiene un compilador nativo de C ++ completo con preprocesadores para CICS y DB2. Entonces no hay necesidad de g ++.
James Anderson
55
En segundo lugar, es bastante común que las grandes corporaciones ejecuten código mainframe de 30 años. Es generalmente confiable, eficiente y hace el trabajo. También tiende a estar muy mal documentado.
James Anderson
3
@ Chris, ¿por qué no se debe ejecutar el código de 39 años? ¿Se vuelve rancio a los 30? 20? El código de producción probado en batalla puede ser antiguo, pero aún así funciona perfectamente. Cualquier reescritura debe llegar al mismo nivel que el programa anterior antes de que tenga algún beneficio para el que paga sus tarifas.
1
@ Chris, muy poco es más rápido que una aplicación de "pantalla verde" bien escrita, y lo sé por experiencia personal al ser el tipo Java en una tienda de Cobol. Francamente, creo que todos ustedes subestiman sinceramente la cantidad de trabajo necesaria para tener una aplicación similar. Además, el código no se oxida. Solo ser viejo no es razón suficiente para arreglarlo.
0

En teoría, no debería ser difícil convencer a la alta gerencia para que reemplace el sistema anterior si puede mostrarles que les ahorrará megabucks. Y lo hará. Va a ser cada vez más difícil encontrar programadores para mantener este sistema, y ​​esos programadores serán cada vez más caros. No se trata de "si", se trata de "cuándo". Realmente tiene que ser actualizado.

Sin embargo, la pregunta es si puede convencerlos no solo de que necesita actualizarse (y probablemente lo sepan de todos modos), sino de que debería ser un proyecto interno. Especialmente si el equipo eres solo tú. Muy a menudo, un reemplazo tan importante se subcontrata. Incluso puede haber algún software disponible para su consideración. Estas opciones deben investigarse y sus gerentes insistirán en que eso suceda si son razonables.

En cuanto a la tarea, si fuera a hacerlo, realmente creo que una reescritura de bulldoze puede ser apropiada en este caso. El argumento de Joel no se aplica en todos los casos. Sin embargo, no podría saberlo sin verlo.

Igby Largeman
fuente
0
  1. Un cambio incremental está fuera de la cuestión.

  2. Es probable que haya una solución comercial disponible. Hay muchos negocios de alquiler de autos.

  3. Si, como último recurso, necesita reescribirlo, primero pase un tiempo pensando en cómo funcionará el nuevo sistema.
    Después de haber identificado la funcionalidad y las interfaces, puede elegir las herramientas de desarrollo que mejor se adapten a las necesidades (y sus habilidades).

Una estrategia para minimizar el estrés para los usuarios finales es comenzar emulando la vieja interfaz fea que los usuarios conocen, con algunas sutilezas como listas desplegables para mnemónicos feos, luego agregar gradualmente la funcionalidad de la interfaz de usuario y destetarla en una interfaz de usuario moderna.

Probablemente no desee mantener el mismo formato de archivo de datos, por lo que no habrá vuelta atrás una vez que cambien.

Michael J
fuente
1
Si no lo hace de manera incremental, lo más probable es que el proyecto falle.