A melhor maneira de estimar o custo relacionado à portabilidade do código do idioma A para o idioma B?

8

Faça um cliente pensar em estimar o custo de portar um projeto do idioma A para o idioma B. Qual é a melhor maneira de reunir uma solicitação de proposta para fazer isso?

erros
fonte
3
Por que você precisa fazer isso? É difícil para mim imaginar que seja uma boa escolha.
Anto
+1 @Anto: o idioma A está em Perl, o cliente está preocupado com a segurança da base de código em execução em um servidor remoto. Obrigado!
erros cometidos
Melhor você simplesmente perguntar "Melhor maneira de estimar o custo?" Isso é igualmente impossível de responder.
31511 S.Lott
2
@blunders: trabalho de uma estimativa para fazer uma auditoria de segurança completa da base de código, e depois multiplicar por 50.
Carson63000
1
Deve levar de 6 a 8 semanas. Ou usar esta ferramenta: cznp.com/6to8weeks/index.php
JohnFx

Respostas:

10

Se o objetivo é simplesmente reproduzir um aplicativo exatamente em um novo idioma, sugiro que você fale com seu cliente sobre isso. Portando é uma das coisas mais perigosas que você pode fazer, porque todas essas peculiaridades que surgiram porque implementado em Língua A pode ser invocado pelos usuários finais, e de repente você tem que recriá-los em Língua B . Coisas desagradáveis. Sem mencionar que a transferência é um custo completamente irrecuperável que eles nunca podem esperar recuperar.

Eu sugeriria tratar o projeto como qualquer outro e reunir requisitos e estimar como se o original não existisse. Você provavelmente descobrirá que o usuário final tem uma nova perspectiva do produto desde a sua utilização. Se você vai reescrevê-lo, é melhor fazê-lo.

jbondeson
fonte
3
TDD é uma abordagem bastante sólida. Resuma alguns casos de uso. Defina alguns testes para os casos de uso que o código existente passa. Escreva um novo código que passe nos testes. Use o código antigo como uma espécie de "árbitro" ou "árbitro" se houver perguntas sobre casos extremos.
31511 S.Lott
@ S.Lott: bastante difícil de TDD a experiência do usuário final.
Quentin-starin
@ S.Lott: Acho que o problema aqui é que os idiomas têm peculiaridades. Fazer algo da maneira natural em Perl provavelmente produzirá um comportamento estranho em casos extremos, e reconstruir esse comportamento exato em, digamos, Common Lisp será complicado. A menos que você saiba se o usuário está confiando nesse comportamento ou não, você não sabe o que testar.
21711 David Thornley
@ qes: Se você não pode testá-lo, ele não existe. A sério. O usuário final precisa "fazer" alguma coisa. E que algo tem que ser testado. Sem testar, como você afirma que está "pronto"?
31511 S.Lott
1
@ S.Lott: Era o que a IBM queria fazer com a emulação IBM 360 do (IIRC) dos computadores 7094 anteriores. Eles descobriram que alguns de seus clientes confiavam em recursos não documentados que foram acidentes com a implementação do 7094 e acabaram replicando uma dúzia ou dois comportamentos que consideravam desnecessários.
precisa
4

Se você já possui uma base de código Perl, conhece as linhas de código (LOC) contadas. Veja se você pode encontrar uma comparação de expressividade entre Perl e Idioma B. Aqui está um, por exemplo.

Diga que a linguagem B é Java. Em seguida, o LOC estimado para a porta será cerca de quatro vezes o LOC do original (expressividade 6 versus 1,5).

Em seguida, use algo como o software Construx Estimate no modo LOC para estimar quanto tempo levará (e quantas pessoas serão necessárias).

Isso fornecerá estimativas de custo e tempo, bem como uma idéia de como é provável que você ultrapasse.

Se você já é proficiente no idioma B e já executou vários projetos medidos, pode usar o software Construx Estimate para calibrar para sua equipe.

Peter K.
fonte
1
Sim, então multiplique essa estimativa por 2 ou 3 para explicar os inevitáveis ​​erros, coisas que você não entendeu, servidor mais poderoso que você precisa comprar, café extra, analgésicos para dores de cabeça e assim por diante.
quickly_now
@quickly_now: concordou, mas a Estimativa do Construx fornece um intervalo de tempos possível, o que explica algumas dessas variações. Isso faz parte do que eu gosto: não dá a estimativa. Dá um intervalo.
Peter K.
2

O artigo mais popular de Joels , 'Coisas que você nunca deve fazer', diz o melhor: eles cometeram o pior erro estratégico que qualquer empresa de software pode cometer:

Eles decidiram reescrever o código do zero.

Se você acabar reescrevendo-o, reescreva-o corretamente e não apenas o porte:

  • Quais partes do programa não são mais usadas? Pule essas peças.
  • Quais partes do programa são mais importantes? Port estes primeiro.
  • Um novo programa, hora de atualizar a GUI e tornar mais fácil o uso e mais 'sexy'.
  • Ah, o enorme investimento de tempo não é melhor usado apenas para adicionar mais recursos ao código antigo?
Carra
fonte
2
Há uma grande diferença entre "reescrever do zero" e "portar o código para outro idioma".
2

Acho que vai demorar muito tempo. É melhor você ter certeza de que vale a pena. Tente pegar uma seção do código e portá-lo. Multiplique quanto tempo levou pela proporção das linhas de código que você portou versus o total de linhas de código. Isso fornecerá um valor aproximado, o real será mais alto em alguns múltiplos provavelmente.

Efetivamente, você está escrevendo o aplicativo novamente do zero, mas possui os requisitos especificados em outro idioma, não é trivial.

Alva
fonte
+1 @Alb: concordo em tomar um pedaço de código como teste. Meu plano era incluir um pedaço de código Perl (linha 200) na RFP e exigir uma porta com a oferta de resposta. Isso também me permitirá comparar o código entre as ofertas, uma vez que todas receberão o mesmo código.
erros
1

Penso, em primeiro lugar, que você realmente deve considerar se essa é uma boa escolha. Quais são as vantagens de usar o idioma B em vez do idioma A?

Acho que a IBM teve uma investigação que disse que os programadores escrevem, em média, 100LOC por hora. Ainda há mais em desenvolvimento do que isso, mas a arquitetura antiga ainda está planejada. Digamos que 50% escreverão o código, pois, caso contrário, o programa ainda está bem planejado, certo? (Pode ser que você tenha um programa estruturado e deseje um orientado a objetos, o que seria uma tarefa maior).

Mas se alguém escrever 100LOC / hora, divida a quantidade de LOC atual no sistema e multiplique pela venda média de um programador e multiplique por 2. Isso pode fornecer uma estimativa aproximada. Não leve os números que você leva muito a sério. (melhor ainda, não os leve a sério). O que você quer fazer depende de muitas coisas para medir, como:

  • A competência dos programadores no novo idioma
  • Quão bem documentado é o projeto antigo
  • De qual idioma está sendo convertido e para o qual está sendo convertido?
Anto
fonte
2
Esses números (LOC / dia) da última vez que conheci eram mais baixos - são cerca de 30. Isso é PROJETADO, CODIFICADO, DOCUMENTADO e TESTADO. Todos os programadores superstar ficam realmente ofendidos com esses números porque sabem que podem jogar fora 1000 linhas de código / dia. Eles convenientemente esquecem um pouco sobre o tempo para projetar, documentar e testar. (E o tempo em reuniões de progresso, falta-up fixação, classificando uma arquitetura quebrado, etc - mas você realmente tem que contar que também tempo é tempo..)
quickly_now
2
Devo acrescentar - esse número mágico de LOC / dia parece ter permanecido praticamente constante nos últimos 30-40 anos. ou seja, 30 linhas ímpares de montador ... 30 linhas ímpares de FORTRAN ... 30 linhas ímpares de c #. Essas linhas de código agora podem fazer mais, mas as taxas gerais de produtividade medidas em LOC / dia permaneceram bastante teimosamente inalteradas por muito tempo.
quickly_now
No meu post, eu disse que o código seria apenas 50%, então você teria que dobrar o palpite. Na realidade, acho que o código seria apenas ~ 10%, mas como o programa já foi concebido, não deve demorar tanto tempo (ou isso depende de quão diferente as duas línguas são)
Anto
1

Depende de quanto tempo você tem disponível. Algumas opções:

  • Não há tempo, faça-o - Pegue a parte de trás de um guardanapo e vá até ele. É como ser menor do que o necessário para torná-lo em primeiro lugar, e mais do que simplesmente redigitá-lo em uma sintaxe diferente.
  • 1-3 dias - descubra qual retrabalho de arquitetura pode ser necessário, avalie a estimativa. Descobrir quanta lógica deve ser portada, descobrir algum tipo de proporção. Adicione um tempo extra para tarefas relacionadas à segurança que fornecerão alguma esperança de que você tenha aumentado a segurança no processo. Adicione tempo para testes de integração com base na complexidade do trabalho e na simplicidade da sua arquitetura.
  • 1 mês - experimente - realize uma arquitetura de teste e tente portar alguma coisa. Descubra qual fração do código você portou e faça uma estimativa mais detalhada. É provável que você também descubra algumas coisas que eram totalmente impossíveis no novo idioma, e isso fornecerá uma base melhor do trabalho real envolvido na realização da transição.

Em um mundo ideal, proponho ao cliente que pague por uma tarefa de investigação que cubra esse mês de trabalho para permitir que você protótipo exatamente o que faria. Isso lhes dá a opção de interromper e não avançar se o custo for muito alto. E você ainda é pago pelo trabalho que fez.

bethlakshmi
fonte
A tarefa de investigação +1 é uma boa ideia. Permite um escopo muito melhor, que arrisca o exercício. Os perigos de encontrar algo desagradável em poucas semanas ficam muito menos.
quickly_now
1

Existe apenas uma maneira de obter uma estimativa decente para uma tarefa de software. Designe a equipe disponível para executar uma parte pequena mas testável da tarefa COMPLETAMENTE e veja quanto tempo leva. Divida o trabalho restante no maior número possível de casos de uso e faça com que a mesma equipe estimar cada iteração em comparação com o trabalho já realizado. Não peça a eles para estimarem o tempo, apenas peça que eles lhe digam como ele se compara à primeira iteração. Isso fornecerá a melhor estimativa possível para o restante do projeto.

Kevin Cline
fonte