reescritura de sistemas
Modernización de aplicaciones legacy: VB6, Delphi, PHP y ColdFusion a Go
PHP 5.6, VB6, Delphi, ColdFusion, ASP clásico, Perl, Oracle Forms, un monolito Java en un servidor que nadie se atreve a reiniciar. Los reescribimos módulo a módulo en Go, Rust y TypeScript mientras el sistema viejo sigue sirviendo producción, y un banco de paridad compara viejo contra nuevo sobre su propio tráfico grabado. Treinta días para un sistema de alrededor de un millón de líneas, en fases, y puede parar al final de cualquiera de ellas.
30 días para un sistema de alrededor de un millón de líneas, partido en fases
El buzón en texto plano está tachado porque parte de cualquier sistema legacy se borra en vez de portarse, y suele ser el trabajo más barato del proyecto.
Hoy
Cuatro runtimes, dos de ellos fuera de soporte, y un buzón de ficheros que nadie quiere mirar.
- app.phpPHP 5.6
- legacy.dllVB6
- reports.cfmColdFusion
- crystal reportsunsupported
- ftp-dropplaintext
Después del cambio
Go para el núcleo y el camino de informes, TypeScript delante, transferencias firmadas.
- coreGo
- reportingGo · read replica
- webTypeScript
- transferSFTP · signed
30 días para un sistema de alrededor de un millón de líneas, partido en fases
Cómo va el trabajo
- 01días 1–4
Mapearlo
Grafo de llamadas, tareas programadas, interfaces externas y una lista medida de lo que está muerto. Los presupuestos fallan porque alguien contó líneas en vez de averiguar cuáles se siguen ejecutando.
- 02días 3–9
Poner la costura
Una frontera por la que pasa el tráfico, para que la implementación vieja y la nueva corran una al lado de la otra y se comparen. En este paso no cambia nada visible para el usuario.
- 03el grueso del proyecto
Portar módulo a módulo
Cada módulo sale detrás de la costura, se repite contra tráfico de producción grabado y toma tráfico real cuando las salidas coinciden. Con los errores incluidos, porque cuáles arreglar es otra conversación, con el negocio.
- 043–7 días por subsistema
Dar de baja
Código viejo borrado, licencias canceladas, servidores apagados. Una migración que deja el sistema viejo encendido ha duplicado lo que usted mantiene en lugar de terminar.
Qué hace la plataforma y qué hace una persona
| Qué hace la plataforma y qué hace una persona | Quién hace qué | Notas |
|---|---|---|
| Leer toda la base de código y construir el grafo de llamadas | Plataforma | Incluido el dialecto que ya no soporta nadie y el fichero que se genera desde 2009. |
| Encontrar código muerto | Plataforma | Alcanzabilidad estática, más trazas de producción cuando puedan darnos un periodo de ellas. |
| Traducir un módulo | Plataforma | La primera pasada es salida de máquina, revisada como una merge request y reescrita a mano donde un revisor no la sigue. |
| Decidir qué comportamiento es un error y cuál es una regla | Ingeniero | El sistema redondea igual desde hace doce años y alguien aguas abajo ha construido encima. |
| El banco de paridad | Los dos | La captura y la repetición son nuestras. Qué diferencias son aceptables lo firma su lado. |
| Migración y conciliación de datos | Los dos | Las filas que nunca cuadraron en la base vieja tampoco cuadran en la nueva. |
| Cambio y vuelta atrás | Ingeniero | Las fechas, la guardia y el punto en el que acordamos volver. |
Lo que ya hemos movido
Decenas de migraciones y más de diez años dentro de código legacy. Clientes de VB6 y Delphi llevados al navegador, ASP clásico y ColdFusion a Go, monolitos de PHP 4 y 5 a servicios tipados, scripts de Perl en cron y paquetes PL/SQL a servicios con pruebas encima, Oracle Forms a la web, Java anterior a Maven convertido en algo sobre lo que un recién llegado compila su primera mañana. Nuestros ingenieros ya se han encontrado con su dialecto, incluidas las partes que nadie escribió.
La primera fase es lo bastante pequeña como para ser una prueba sobre nosotros: un módulo a través de la costura, repetido contra su propio tráfico, con el informe de diferencias delante. Ve cómo trabajamos por el precio de una fase y no de un año.
Preguntas que nos hacen los ingenieros
- ¿Podemos seguir sacando funcionalidad durante la reescritura?
- Sí, y es la razón principal de que esto tarde más que una reescritura desde cero. El trabajo de funcionalidad va a los módulos viejos hasta que cada uno se porta, y el banco de paridad pilla los que han cambiado por debajo.
- ¿Por qué no refactorizar lo que tenemos?
- A veces es la respuesta correcta y la oirá en la primera llamada. La reescritura gana cuando el runtime está fuera de soporte, la cadena de herramientas solo existe en una máquina o ya no consigue contratar a nadie que lo toque. Hacemos los dos tipos de trabajo, así que la respuesta no es una postura comercial.
- ¿Y si paramos a mitad de camino?
- Se queda con un sistema medio en Go y medio como estaba, con una frontera documentada entre los dos. Es un estado real en el que vivir, y algunos clientes se quedan ahí un año mientras se libera presupuesto.
- ¿La traducción automática produce código que aceptaríamos?
- Línea a línea, no, y por eso no la entregamos. Cada módulo se regenera en Go idiomático, se revisa como cualquier merge request y se reescribe a mano cuando el revisor no lo sigue. Puede revisar el primer módulo usted mismo antes de que sigamos.
- ¿Cómo estiman esto?
- A partir de tamaños de módulo medidos, del acoplamiento y de cuánto código es alcanzable. La auditoría le da un rango, un plan por fases y precios al lado en tres a cinco días.
Empiece por un módulo
Con una descripción aproximada basta para empezar: qué es el sistema, cómo de grande y qué está forzando la fecha. Le devolvemos un plan por fases, y la primera es lo bastante pequeña como para aprobarla sin pasar por un comité.
Diez minutos si tiene las respuestas a mano. Puede mandarlo antes de haber decidido nada.