¿La mejor manera de estimar el costo relacionado con el código de transferencia del idioma A al idioma B?


8

Haga que un cliente piense en estimar el costo de trasladar un proyecto del idioma A al idioma B. ¿Cuál es la mejor manera de armar una solicitud de propuesta para hacer esto?


3
¿Por qué necesitas hacer eso? Me cuesta imaginar que sea una buena opción.
Anto

+1 @Anto: el idioma A está en Perl, el cliente está preocupado por la seguridad de la base de código que se ejecuta en un servidor remoto. ¡Gracias!
errores el

Mejor debería simplemente preguntar "¿La mejor manera de estimar el costo?" Eso es igualmente imposible de responder.
S.Lott

2
@blunders: calcule una estimación para realizar una auditoría de seguridad completa de la base del código, y luego multiplique eso por 50.
Carson63000

1
Debe tomar de 6 a 8 semanas. O utilice esta herramienta: cznp.com/6to8weeks/index.php
JohnFx

Respuestas:


10

Si el objetivo es simplemente reproducir una aplicación exactamente en un nuevo idioma, le sugiero que discuta a su cliente de eso. Portabilidad es una de las cosas más peligrosas que puede hacer porque todos esos caprichos que surgieron debido a que implementan en Lengua A pueden ser invocados por los usuarios finales, y de repente tiene que volver a crearlos en Lengua B . Cosas desagradables. Sin mencionar que portar es un costo completamente hundido que nunca pueden esperar recuperar.

Sugeriría tratar el proyecto como cualquier otro y reunir requisitos y estimar como si el original no existiera. Probablemente encontrará que el usuario final tiene una nueva perspectiva sobre el producto desde que lo usó. Si va a volver a escribirlo, también podría mejorarlo.


3
TDD es un enfoque bastante sólido. Resumir algunos casos de uso. Defina algunas pruebas para esos casos de uso que pasa el código existente. Escriba un nuevo código que pase las pruebas. Use el código anterior como una especie de "árbitro" o "árbitro" si hay preguntas sobre casos extremos.
S.Lott

@ S.Lott: bastante difícil de TDD la experiencia del usuario final.
quentin-starin

@ S.Lott: Creo que el problema aquí es que los idiomas tienen peculiaridades. Hacer algo de la manera natural en Perl es probable que produzca un comportamiento extraño en casos de esquina, y reconstruir este comportamiento exacto en, digamos, Common Lisp va a ser incómodo. A menos que sepa si el usuario confía en este comportamiento o no, no sabe qué probar.
David Thornley

@qes: si no puedes probarlo, no existe. Seriamente. El usuario final tiene que "hacer" algo. Y ese algo tiene que ser probado. Sin pruebas, ¿cómo afirmas que está "hecho"?
S.Lott

1
@ S.Lott: Eso es lo que IBM quería hacer con la emulación IBM 360 de (IIRC) las computadoras 7094 anteriores. Descubrieron que algunos de sus clientes confiaban en características indocumentadas que eran accidentes de la implementación 7094, y terminaron replicando una docena o dos comportamientos que creían innecesarios.
David Thornley

4

Si ya tiene una base de código Perl, sabe que las líneas de código (LOC) cuentan. Vea si puede encontrar una comparación de expresividad entre Perl y Language B. Aquí hay una, por ejemplo.

Say Language B es Java. Entonces, el LOC estimado para el puerto será aproximadamente cuatro veces el LOC del original (expresividad 6 versus 1.5).

Luego use algo como el software Construx Estimate en modo LOC para estimar cuánto tiempo le tomará (y a cuántas personas le llevará).

Eso le dará estimaciones aproximadas de costo y tiempo, así como una idea de la probabilidad de que se exceda.

Si ya domina el idioma B y ha ejecutado varios proyectos medidos en él, puede usar el software Construx Estimate para calibrar para su equipo.


1
Sí, luego multiplique esa estimación por 2 o 3 para tener en cuenta los inevitables errores, cosas que no entendió, un servidor más potente que necesita comprar, café extra, analgésicos para los dolores de cabeza, etc.
rapid_now

@quickly_now: de acuerdo, pero el Estimación de Construx le brinda un rango de tiempos posibles, lo que explica algunas de esas variaciones. Eso es parte de lo que me gusta: no da LA estimación. Da un rango.
Peter K.

2

El artículo más popular de Joels , 'Cosas que nunca debes hacer' lo dice mejor: lo hicieron cometiendo el peor error estratégico que cualquier compañía de software puede cometer:

Decidieron reescribir el código desde cero.

Si terminas reescribiéndolo, vuelve a escribirlo correctamente y no solo lo portes:

  • ¿Qué partes del programa ya no se usan? Salta estas partes.
  • ¿Qué partes del programa son más importantes? Puerto estos primero.
  • Un nuevo programa, es hora de actualizar la GUI y hacerla más fácil de usar y más "sexy".
  • Oh, ¿la inversión de tiempo enorme no se usa mejor para agregar más funciones al código anterior?

2
Hay una gran diferencia entre "reescribir desde cero" y "transferir el código a otro idioma".

2

Creo que tomará mucho tiempo. Será mejor que estés seguro de que vale la pena. Intente tomar una sección del código y portarlo. Multiplique cuánto tiempo tardó por la proporción de las líneas de código que transfirió frente al total de líneas de código. Le dará una cifra aproximada, lo más probable es que la real sea más alta.

Efectivamente, está escribiendo la aplicación nuevamente desde cero, pero tiene los requisitos especificados en otro idioma, no es trivial.


+1 @Alb: De acuerdo, sobre tomar una tirada de código como prueba. Mi plan era incluir un fragmento de código Perl (línea 200) en la solicitud de propuesta y requerir un puerto con la oferta de respuesta. Esto también me permitirá comparar el código entre las ofertas, ya que todas obtendrán el mismo código.
errores el

1

Creo que, ante todo, realmente debería considerar si esta es una buena opción. ¿Cuáles son las ventajas de usar el lenguaje B en lugar del lenguaje A?

Creo que IBM tuvo una investigación que decía que los programadores escriben, en promedio, 100LOC por hora. Todavía hay más en desarrollo que eso, pero la arquitectura antigua aún está planeada. Digamos que el 50% escribirá el código, ya que de lo contrario el programa todavía está bastante planeado, ¿verdad? (Puede ser que tenga un programa estructurado y desee uno orientado a objetos y eso sería una tarea más grande).

Pero si uno escribiera 100LOC / hora, divida la cantidad de LOC actual en el sistema y multiplíquelo por la venta promedio de un programador y multiplíquelo por 2. Esto podría dar una estimación aproximada. No te tomes muy en serio los números que obtienes. (Aún mejor, no los tomes en serio). Lo que desea hacer depende de muchas cosas que simplemente se miden, como:

  • La competencia de los programadores en el nuevo lenguaje.
  • Cuán bien documentado está el antiguo proyecto
  • ¿De qué idioma se está convirtiendo y a qué se está convirtiendo?

2
Esos números (LOC / día) que supe por última vez eran más bajos: alrededor de 30. Esto está DISEÑADO, CODIFICADO, DOCUMENTADO y PROBADO. Todos los programadores superestrellas se sienten realmente ofendidos por estos números porque saben que pueden arrojar 1000 líneas de código / día. Convenientemente se olvidan un poco del tiempo de diseño, documento, prueba. (Y el tiempo en reuniones de avance, lío de fijación, la clasificación de una arquitectura roto, etc - pero usted realmente tiene que contar eso también hora es la hora..)
quickly_now

2
Debo agregar: este número mágico de LOC / día parece haberse mantenido bastante constante en los últimos 30-40 años. es decir, 30 líneas impares de ensamblador ... 30 líneas impares de FORTRAN ... 30 líneas impares de c #. Esas líneas de código ahora podrían hacer más, pero las tasas de productividad general medidas en LOC / día han permanecido bastante obstinadas durante mucho tiempo.
rapid_now

En mi publicación, dije que el código solo sería del 50%, por lo que tendrías que duplicar la suposición. En realidad, creo que el código sería solo ~ 10%, pero como el programa ya ha sido diseñado, no debería tomar tanto tiempo (o depende de cuán diferentes sean los dos idiomas)
Anto

1

Depende de cuánto tiempo tenga disponible. Algunas opciones:

  • No hay tiempo en absoluto, solo hazlo: toma la parte posterior de una servilleta y ve a buscarla. Es como ser menos de lo necesario para hacerlo en primer lugar, y más que simplemente volver a escribirlo en una sintaxis diferente.
  • De 1 a 3 días : descubra qué retrabajo de arquitectura podría ser necesario, intente estimar. Calcule cuánta lógica debe portarse, calcule algún tipo de relación. Agregue un poco de tiempo extra para las tareas relacionadas con la seguridad que le brindarán la esperanza de que haya aumentado la seguridad en el proceso. Agregue tiempo para las pruebas de integración basadas en la complejidad del trabajo y la simplicidad de su arquitectura.
  • 1 mes - pruebe algo - realice una arquitectura de prueba e intente portar algo. Calcule qué fracción del código transfirió y calcule más. Es probable que también descubra algunas cosas que eran totalmente imposibles en el nuevo idioma, y ​​proporcionará una mejor base del trabajo real involucrado en hacer que la transición suceda.

En un mundo ideal, le propondría al cliente que pague por una tarea de investigación para cubrir ese mes de trabajo y le permita crear un prototipo de lo que haría. Eso les da la opción de detenerse y no avanzar si el costo es demasiado alto. Y, todavía te pagan por el trabajo que hiciste.


La tarea de investigación +1 es una buena idea. Permite un alcance mucho mejor, lo que elimina el riesgo del ejercicio. Los peligros de encontrar algo desagradable en unas pocas semanas son mucho menores.
rápidamente_ahora

1

Solo hay una forma de obtener una estimación decente para una tarea de software. Asigne al personal disponible para que realice una parte pequeña pero comprobable de la tarea COMPLETAMENTE, y vea cuánto tiempo lleva. Divida el trabajo restante en tantos casos de uso como sea posible y haga que el mismo personal calcule cada iteración en comparación con el trabajo ya realizado. No les pidas que estimen el tiempo, solo pídeles que te digan cómo se compara con la primera iteración. Esto le dará la mejor estimación posible para el resto del proyecto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.