PM optando por uma configuração excessivamente complexa com a qual ninguém tem experiência [fechado]


51

Recentemente, iniciei um projeto que não parecia muito difícil de fazer, o conceito era um aplicativo bastante simples que precisava aceitar informações de vez em quando (talvez 10x por dia) e tentar executar algumas operações nelas e coletar todos os resultados no fim. Esse aplicativo obteria um portal da web front-end que os clientes poderiam usar para visualizar os resultados, não exatamente a ciência dos foguetes.

Para isso, inicialmente fiz um uso inteligente das bibliotecas de simultaneidade internas do Python ( ThreadPoolExecutor) e usei uma biblioteca fácil de usar para o front-end (escolhi o Flask, pois é fácil para iniciantes e é relativamente fácil de manter e testar).


Quando estávamos na metade do projeto, o PM declarou que tínhamos que usar recursos de filas de mensagens de terceiros em vez de threads e tivemos que implementar o balanceamento de carga. O que acabou acontecendo foi que começamos a trabalhar com Celery, Redis, RabbitMQ, Nginx, uWSGI e vários outros grandes serviços de terceiros com os quais ninguém tinha experiência real.

No final, isso levou a um monte de código espaguete, tarefas não testáveis ​​(devido à complexidade de bibliotecas de terceiros, o patch do código nem funcionou) e um monte de dores de cabeça porque ninguém sabia o valor agregado desses serviços. .


Antes de dizer "Sim, você deve usar esses serviços", lembre-se de que ninguém sabe como usá-los ou mesmo sabe o que eles fazem, além de introduzir um código afetado pelas condições de corrida.

O que devo fazer sobre isso? Nesse ponto, seria simplesmente muito caro reverter para o que tínhamos e o PM está impaciente ao usar esses serviços, mesmo que o produto final esteja agora em pior situação do que no início. Existe alguma utilidade em discutir isso com ele? Peço mais tempo? Ou a resposta dura, sou burra demais para o meu trabalho?


12
Que problema a concorrência resolve para você? Quem usará este sistema? Que valor comercial ele alcança? Existem problemas significativos de escalabilidade que precisam ser resolvidos? Como desenvolvedor, você deve saber o motivo pelo qual essas ferramentas e bibliotecas são necessárias. Então você pode começar a entender como essas ferramentas ajudarão, se for o caso.
RibaldEddie

7
Você está trabalhando com um PM improdutivo. Você pode ficar ou ir embora. Provavelmente o mesmo tipo de tolice acontecerá com outros projetos sob o mesmo PM.
115517 Frank Hileman

80
Por que um PM está tomando decisões técnicas ?! É um verdadeiro cheiro de projeto, se eu já cheirava um.
precisa

13
É como comprar uma serra elétrica para uma criança e pressioná-la a sair e encontrar uma árvore para cortar, para que não fosse um desperdício de dinheiro.
JeffO 12/07

28
Parece que esse projeto precisa de uma forte liderança técnica que não tenha medo de rir histericamente de um gerente de projeto que finge ser um arquiteto de soluções. Você realmente deve apenas concordar com a cabeça e, em seguida, criar a solução sensata de qualquer maneira. Sim. Isso não voaria comigo.
22817 Greg Greghardt

Respostas:


89

Quando estávamos na metade do projeto, o PM declarou que precisávamos usar recursos de filas de mensagens de terceiros em vez de threads e tivemos que implementar o balanceamento de carga

Isso não é apropriado para um PM "declarar" unilateralmente. Duas razões:

  1. As decisões de projeto devem ser tomadas por um recurso técnico e somente em resposta aos NFRs . Portanto, pergunte educadamente ao seu PM se existe uma nova NFR e se você pode obter detalhes.

  2. Se um NFR estiver sendo introduzido no meio do projeto, provavelmente isso deve ser feito através de um controle de alterações . O controle de mudanças é muito importante da perspectiva da governança; não seria apenas uma entrada para os seus requisitos, mas também é uma entrada importante para os casos de teste do controle de qualidade, o manual de implantação e suporte das operações e (aqui é a parte realmente importante) o cronograma do gerente de vendas . Se o novo requisito introduzir mais trabalho, a equipe de desenvolvimento deve ter a oportunidade de comunicar novas estimativas de desenvolvimento, e o PM terá que decidir se pode viver com a nova data, adicionar mais recursos ou pressionar a parte interessada que introduziu o NFR.

Agora, se realmente existe uma NFR de boa-fé e não há como contorná-la, também pode ser apropriado solicitar recursos novos ou diferentes que tenham familiaridade com as tecnologias que estão sendo introduzidas ou solicitar um orçamento de treinamento para alguns de seus programas existentes. Recursos. Portanto, há um aspecto de custo também.

Se você fala o idioma do PM - cronograma e custo - acho que você terá mais tração do que falar sobre como os desenvolvedores se sentem sobre o design resultante. Essas coisas têm um impacto real.

Um PM deve saber melhor do que introduzir coisas como essa em tempo real, sem governança, sem controles e sem consenso. Se eles simplesmente não entenderem, pode ser necessário passar para o gerenciamento de produtos ou gerenciamento de programas, pois ele está colocando em risco a qualidade e o cronograma desnecessariamente.


21
Ok, esta é a resposta. Um gerente de projeto nunca deve tomar esse tipo de decisão. Dinheiro? Tempo? O gerenciamento de projetos lida com isso. RabbitMQ? Sem chance.
22817 Greg Greghardtt

Eu gosto muito dessa resposta. Existem controles para garantir que você não caia no inferno. Sente-se com ele e fale sobre isso.
Rhys Johns

3
No entanto, uma coisa é que, às vezes, enquanto é péssimo, talvez você precise aprender uma nova tecnologia ou biblioteca. Vai levar tempo, sim, mas pode valer a pena.
Rhys Johns

5
Como gerente de projeto, não concordo mais com esta resposta.
James McLeod

13
Nas organizações menores, o "gerente de projetos" costuma ser o chefe. Eles podem ter o ouvido do proprietário e podem ser efetivamente o desenvolvedor líder técnico ou o arquiteto ou alguma combinação ímpia. Nesses casos, o escopo de suas atribuições não é claro.
21717

31

O que seria estúpido é se deixar levar pela morte .

O que você está descrevendo é que perdeu o senso crítico. Não há senso de controle e não há um caminho claro de volta.

A última coisa que você deve fazer é trabalhar duro, manter a cabeça baixa e sofrer silenciosamente até que eles finalmente admitam que o projeto está condenado.

O que você deve fazer é pensar muito sobre o que você tem todo o direito de esperar.

Se eles querem que você use tecnologias que você não entende, espere tempo para aprendê-las. Não tenha vergonha do que você não sabe. Use sua ignorância como um bastão. Quando eles exigem que você use alguma coisa, pergunte o porquê. Não aceite 'porque'. Não aceite as "melhores práticas modernas". Não aceite 'capacidade de escala' sem obter expectativas reais e testáveis.

Por testável, quero dizer que eles precisam dizer quantos pedidos por dia / hora / minuto eles querem que ele possa fazer. Deixe claro que você pretende criar algo para exercitar esse sistema de acordo com essas especificações.

Dessa forma, você pode usar uma avaliação gratuita de 30 dias para provar que a última coisa que eles querem vale a pena ou se é melhor seguir o que você já conhece.

Agora tenha em mente. Não foram as ferramentas que introduziram o código atormentado pelas condições de corrida. Vocês fizeram isso. Você precisa aprender COMO você fez isso para poder desfazer isso.

E não. Não é muito caro voltar ao que você tinha. O PM não pode ter o que quer apenas exigindo. Você precisa recuar até poder usar efetivamente o que o PM deseja ou provar que não é o que o projeto precisa.

Sério, ceder a isso não é profissional e mortal para o projeto.

Eu estive aqui cara. Mais de uma vez. Isso faz você se sentir estúpido. Realmente não é isso. Você está apenas perdido.

Fale com o PM. Honestamente. Esqueça tudo. Mostre que você está disposto a aprender, mas não quer ser levado para um passeio. Nunca, jamais, crie ou codifique com base na fé. Faça o PM mostrar como fazer o que eles querem. Não finja que entende quando não entende. Não diga que isso será feito quando não acontecer. Se você vai acreditar em algo, acredite em si mesmo. Você tem que estar disposto a dizer NÃO.

Se isso não funcionar, limpe o currículo porque você precisará dele em breve. De uma forma ou de outra.


7
Now keep in mind. It isn't the tools that introduced race-condition plagued code. You guys did that. You need to learn HOW you did that so you can undo that.Sim, essa parte se destaca especialmente em mim. Seja aipo ou fios, qualquer tipo de simultaneidade pode introduzir condições de corrida. Os mesmos problemas podem ter existido no código baseado em encadeamento.
Izkata

10

Isso realmente deve estar no site workplace.stackexchange.com, porque o problema não é realmente uma questão de desenvolvimento de software, mas sobre relacionamentos no local de trabalho.

Se você tem certeza de que sua abordagem simples funcionaria e produziria um resultado rapidamente, seu PM é uma força destrutiva da sua empresa que deve ser removida. Descubra como elevar as notícias ao nível acima dele: que sua equipe tinha uma solução simples e funcional que fez um bom progresso e, por razões que ninguém pode explicar, seu gerente geral o forçou a tentar uma solução muito mais complexa, usando várias de ferramentas que ninguém sabe, ninguém entende, ninguém sabe se elas são úteis, e essa decisão insondável do seu gerente de contas causou todos os problemas e fez com que o projeto se atrasasse e não funcionasse.


1

Não conhecendo o contexto e a estratégia do produto adotada pelo seu gerenciamento, é difícil responder objetivamente à sua pergunta.

Aqui estão alguns argumentos objetivos. No entanto, é possível que não seja o que você esperava:

  • " Lembre-se de que ninguém sabe como usar esses produtos ainda ".
  • Usar apenas ferramentas e técnicas conhecidas perfeitamente garantirá alta produtividade. Mas isso limitará consideravelmente a capacidade de inovar. Em alguns mercados, isso pode ser fatal para o seu produto. Por exemplo, há quase 30 anos, propus usar o Windows 3.0 para desenvolver uma nova versão de um produto CAD com êxito no MS-DOS. O gerente de produto objetou que esse não era um ambiente comprovado, que seria muito complexo e difícil de aprender para a equipe e, de qualquer maneira, que "o Windows nunca será um ambiente convencional " ... deixei você adivinhar o sucesso do seu produto 2 anos depois.
  • É tudo uma questão de custos e benefícios. O custo da experimentação versus o benefício de uma escalabilidade e implantação garantida por terceiros com experiência em grandes instalações e carga de trabalho pesada.
  • As desvantagens de adicionar uma nova tecnologia podem ser suavizadas, com treinamento apropriado ou suporte / treinamento inicial por um consultor experiente.

Por fim, a escolha econômica é de responsabilidade do seu gerente de produto. Discuta com ele os prós e contras, para garantir que ele tome uma decisão bem informada e não subestime a complexidade adicional. E se ele permanecer no caminho, tente alcançar o seu melhor: você não tem nada a perder e, na pior das hipóteses, terá uma nova tecnologia em seu currículo.


1

Existem duas abordagens para bibliotecas de terceiros (e outros componentes):

  1. Use o maior número possível
  2. Use o menor número possível deles

Minha abordagem é (2). Parece que sua abordagem também é (2), mas o gerente de projeto gosta da abordagem (1).

Existem três maneiras de lidar com essa situação. Você deixa o MP fazer o que quer, tenta convencê-lo a mudar a abordagem para bibliotecas de terceiros ou vota com os pés e seleciona outro trabalho.

Se você quiser convencer o PM a mudar a abordagem, considere estes argumentos:

  • Tempo para aprender. Cada biblioteca externa requer tempo para aprender; nesse momento, um programador competente pode escrever a funcionalidade desejada, especialmente se uma biblioteca enorme for escolhida apenas para fazer uma coisa muito simples que poderia ser feita em algumas centenas de linhas de código.
  • Substituição.Se você possui uma biblioteca externa, como garantir que, se seu desenvolvimento for interrompido, poderá substituí-lo por outra biblioteca semelhante? Minha solução é evitar bibliotecas externas sempre que possível, e sempre que isso não for possível, escrevo um invólucro simples para abstrair a parte da interface de programação que desejo. Normalmente, a interface que eu quero é muito mais simples que a interface que a biblioteca oferece. Em seguida, meu código acessa a biblioteca externa somente através desse wrapper, facilitando as substituições. Construir todo o seu aplicativo em alguma estrutura é um grande não-não. Servlets? Sim, eles estão aqui há muito tempo e continuam aqui no futuro próximo. Mecanismos de modelo? Sim, embora eles não sejam exatamente substituíveis (você geralmente escolhe um e fica com ele), o valor que eles trazem é enorme, portanto, selecione com cuidado - e lembre-se de que, ao alternar mecanismos de modelo, você pode ter dois mecanismos de modelo no mesmo aplicativo, mas normalmente não pode ter duas estruturas no mesmo aplicativo. Apache Struts? Não, as estruturas vêm à moda e saem de moda rapidamente, e você geralmente não pode ter duas estruturas no mesmo aplicativo.
  • Versão do inferno. Ao selecionar uma biblioteca externa, você deve atualizá-la para evitar vulnerabilidades de segurança, e atualizá-la pode causar problemas. Componentes bem projetados (como Java JRE) são compatíveis com versões diferentes, mas minha experiência é que a maioria das bibliotecas é uma porcaria devido à imposição de uma versão enorme. Além disso, o componente X pode exigir Z versão 1 e o componente Y pode exigir Z versão 2 e talvez você não consiga vincular Z versão 1 e Z versão 2 no mesmo aplicativo.
  • Vulnerabilidades de segurança. Ao selecionar uma biblioteca externa, o número de vulnerabilidades de segurança facilmente exploráveis ​​em relação ao seu aplicativo aumenta. Alguns poderiam afirmar que o código desenvolvido internamente se assemelha à segurança através da obscuridade, mas, novamente, eu diria que ainda é uma forma de segurança.
  • Problemas de licença. Cada biblioteca externa impõe sua própria licença em partes do seu programa. Por exemplo, as bibliotecas GPL não podem ser usadas em programas que não sejam GPL, e as bibliotecas LGPL também exigem a distribuição do código-fonte junto com os binários, o que pode levar uma quantidade considerável de largura de banda.
  • Hora de inicialização do aplicativo. Cada grande biblioteca externa diminui o tempo de inicialização do seu aplicativo. Ao escrever uma biblioteca simples e enxuta internamente, você pode acelerar o tempo de inicialização do seu aplicativo.
  • Pegada na memória. Por ter X exigindo Y exigindo Z exigindo A exigindo B, você precisa de X + Y + Z + A + B na memória ao mesmo tempo. Ao implementar apenas o equivalente a X, vamos chamá-lo de X 'internamente, você precisa apenas de X' na memória. E geralmente a pegada de memória de X 'é menor que a pegada de memória de X.
  • Risco de insetos. Quanto mais linhas houver no componente externo, maior será o risco de você encontrar um bug que será difícil de corrigir devido à enorme quantidade de código que você precisa entender. Se você faz a coisa internamente, costuma fazê-lo com menos linhas de código (para fazer exatamente o que você precisa, nada mais) e, portanto, menor risco de erros.
  • Personalização. Se eu mesmo escrever consultas SQL, sei como é a consulta e como ela é executada em um determinado mecanismo de banco de dados e em um determinado conjunto de índices. Se, por outro lado, a consulta SQL é gravada por um componente externo, não sei nada sobre seu desempenho. Eu trabalhava em uma empresa em que cada página da web demorava alguns segundos para ser obtida. Suspeitei que a causa era a biblioteca do Hibernate, que eles usavam buscava muitos dados automaticamente do banco de dados quando tudo que você precisava era de um item e nem todos os itens relacionados a esse item em particular. Saí da empresa antes de descobrir a verdadeira causa da lentidão, porque não gostava da abordagem de usar um grande número de bibliotecas existentes.

Cuidado, especialmente se uma biblioteca se chamar de estrutura . Isso significa que a biblioteca exige que você construa todo o aplicativo em torno de si. Você geralmente não pode ter duas estruturas no mesmo aplicativo; eles lutarão entre si sem coexistir pacificamente. Biblioteca de utilitários de desenvolvimento da Web? Sim, por favor, existem muito poucos deles. Se alguma vez eu encontrar uma biblioteca melhor do que a que uso agora, posso usar a biblioteca recém-encontrada no novo código, continuando a usar a biblioteca antiga no código antigo. Estrutura de desenvolvimento da Web? Um grande NÃO buzinar !


0

Acho que o seu gerente de projetos está buscando um sistema difícil de gerenciar que produza muito trabalho de manutenção enquanto estiver em operação, para garantir sua renda.

Pessoalmente, você parece estar preso ao python, apenas esqueça o python por um tempo, não codifique no python por um ano, aprenda coisas novas; você verá que existem outras linguagens que podem fazer o mesmo e, provavelmente, melhor.

Como outros já disseram, aprenda as ferramentas antes de começar a codificá-las. Talvez sugira que seria bom avaliar a pilha necessária juntos, com base na pesquisa de diferentes ferramentas que parecem adequadas para a tarefa. Ou talvez pergunte como ele criou essa lista, ele poderia ter recebido ajuda de alguém que está atualizado.


-2

Os desenvolvedores não devem ter medo de aprender a usar novas bibliotecas, estruturas, tecnologias, etc. Essa é uma parte essencial da descrição do trabalho de um desenvolvedor e é perfeitamente razoável alguém sugerir que a equipe trabalhe com coisas de terceiros que ninguém possui. experiência ou até exigir que a equipe o faça se estiver em posição de tomar decisões técnicas autorizadas para a equipe.

No entanto, não é razoável esperar que você possa usar uma nova tecnologia (muito menos várias novas tecnologias ao mesmo tempo)) na sua pilha e continue progredindo. Deveria ter sido planejado um tempo significativo para aprender os meandros da nova abordagem e descobrir um bom design para incorporar as novas peças, durante as quais não seria esperado nenhum progresso real no produto real (das pessoas que fazem esse trabalho de aprendizado / design) , que pode ou não ser a equipe inteira, embora, se não estiver, provavelmente precise haver mais tempo programado para as pessoas que aprenderam a transferir conhecimento para o restante da equipe). Esse é o custo de fazer esse tipo de mudança importante. Aprender novas tecnologias faz parte do trabalho do desenvolvedor, mas não é algo que acontece apenas com custo zero de tempo.

Parece que isso não aconteceu com a pergunta. As pessoas tentaram de alguma maneira criar boas implementações sobre tecnologias que elas mesmas não entendiam. Claro que o código resultante é terrível.

Tente convencer o seu PM que a empresa vai precisar de gastar mais tempo com isso. Ele virá na forma de parar agora, aprender e avaliar as novas tecnologias, descobrir um bom design e limpar a bagunça da implementação atual. Ou virá na forma de mais tempo desperdiçado em bugs, manutenção, desenvolvimento mais caro etc.

É impossível dizer se as opções técnicas descritas na pergunta (balanceamento de carga, filas de mensagens etc.) são realmente apropriadas. Eu não acho que "ninguém na equipe tem experiência em trabalhar com isso antes" é uma boa razão para absolutamente descartar uma decisão, mas faz aumentar o custo de curto prazo de tomar essa decisão (que pode alterar o " melhor "decisão para o contexto), e se o seu gerente de projetos não está considerando isso e espera que a equipe se torne imediatamente tão produtiva quanto as pessoas experientes, você deve recuar por esse motivo; eles definirão cronogramas de projetos altamente irrealistas, o que não é do interesse de ninguém.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.