Há alguns meses, começamos a desenvolver um aplicativo para controlar um equipamento de teste desenvolvido internamente e registrar um conjunto de medidas. Ele deve ter uma interface de usuário simples e provavelmente exigiria threads devido à gravação contínua que deve ocorrer. Este aplicativo será usado por alguns anos e será mantido por vários estudantes de ciência da computação durante esse período.
Nosso chefe se formou há 30 anos (não deve ser considerado uma ofensa; também tenho mais da metade desse tempo) e determinou que desenvolvêssemos esse aplicativo no ANSI C. A lógica é que ele é o único que estará o tempo todo e, portanto, ele deve ser capaz de entender o que estamos fazendo. Ele também decidiu que não devemos usar tipos de dados abstratos; ele até nos deu uma lista com o nome das variáveis globais (suspiro) que ele quer que usemos.
Na verdade, tentei essa abordagem por um tempo, mas estava realmente me atrasando para garantir que todas as operações do ponteiro fossem seguras e que todas as seqüências tivessem o tamanho correto. Além disso, o número de linhas de código que realmente se relacionavam com o problema em questão era apenas uma pequena fração de nossa base de códigos. Depois de alguns dias, desfiz a coisa toda e comecei de novo usando C #. Nosso chefe já viu o programa em execução e gosta da maneira como funciona, mas não sabe que está escrito em outro idioma.
Na próxima semana, nós dois nos encontraremos para revisar o código fonte, para que ele "saiba como mantê-lo". Estou meio assustada e gostaria de ouvir de vocês quais argumentos eu poderia usar para apoiar minha decisão.
Covarde seu,
fonte
Respostas:
Observe que o "Por favor, faça assim para ter certeza de que posso mantê-lo" é realmente um requisito muito bom - a maioria dos programas gasta muito mais tempo sendo mantida do que escrita e manter uma solução em uma tecnologia conhecida geralmente é uma boa idéia.
Imagine se algum garoto novo de computador, quando solicitado a escrever um aplicativo C #, o escrevesse em Haskell em dois dias e dissesse "Ei, ele funciona e eu vou embora, tchau", deixando a manutenção em você.
Imagine se algum garoto novo de computador, quando solicitado a escrever um aplicativo ANSI C há 15 anos, o tivesse escrito no Visual Basic 6 em dois dias e o deixado. Agora você precisa mantê-lo e o Windows 7 já começa a reclamar quando a mídia de instalação é inserida .
Pode ser uma boa oportunidade para dizer - como Heinzi sugeriu nos comentários - que "este é um protótipo rápido escrito em C # que se parece muito com C - devemos preparar a produção ou reimplementá-la no ANSI C como você?" perguntou "e, em seguida, faça a discussão agora. Ter uma fonte real para ver é muito melhor do que "Ei, não devemos escrever nosso próximo aplicativo em Haskell, porque é mais rápido".
Em outras palavras - agora você tem a oportunidade de demonstrar que uma nova plataforma pode ser considerada. Lembre-se de que você escreveu um protótipo antes da revisão do código - isso ajudará a remover a impressão de que você está tentando ocultar C # sob o radar. Eu sugeriria que você também demonstrasse que todo o código existente escrito em ANSI C pode ser usado no C #. Pessoalmente, acredito que você será informado de que o alvo continua sendo o ANSI C para permanecer em uma única plataforma.
fonte
Seu chefe parece ser seu cliente nesse caso, e seu principal requisito é que ele consiga manter o aplicativo quando você seguir em frente. Isso parece bastante razoável.
Portanto, a escolha é fazer o que ele pede ou demonstrar que você pode concluir o desenvolvimento E ensiná-lo a manter um aplicativo C # dentro dos limites de tempo e a um custo menor. Se você não pode fazer isso, não está atendendo aos requisitos do projeto.
fonte
Você não forneceu muitas informações, mas acho que C é absolutamente a escolha certa - trabalho como engenheiro em uma planta industrial e a maioria (se não todos) de nosso código está escrita em C. Se você precisar obter medições de um dispositivo (estou assumindo um medidor de vazão ou termopar ou similar aqui) e exibi-lo quase em tempo real C é uma excelente opção.
É rápido, portátil (nunca escrevi em C #, mas não acho que funcione sem uma versão específica da estrutura instalada e geralmente é apenas com base no Windows).
Por todos os meios, você poderia usar outro idioma para fazer a GUI. Mas você pode economizar seu esforço e apenas usar um pacote de tendências pré-existente (existem alguns bons de código aberto disponíveis).
Para resumir, eu diria que a interface subjacente com a parte C do hardware é uma ótima opção.
fonte
TCHAR
porcaria específica do Windows (que não estávamos usando consistentemente de qualquer maneira) e adotamos um padrão de equipe para usar o UTF-8 ao mesmo tempo que a transição do Linux. Infelizmente, isso exigiu a reimplementação de uma grande parte da biblioteca padrão no Windows, queboost::nowide
não existia na época.Oh céus. Esta é uma aplicação em tempo real? Controlando equipamentos em tempo real? Reunindo dados em tempo real? Usando um idioma com um coletor de lixo? Oh céus.
Embora eu concorde que você provavelmente possa fazer o aplicativo em um idioma mais moderno em menos tempo, esse provavelmente não é o principal critério. A FACILIDADE DE SUA PROGRAMAÇÃO É MUITO MENOS IMPORTANTE DO QUE OS OUTROS CRITÉRIOS, como os que seu chefe estabeleceu, E o tempo de resposta e o comportamento determinístico.
Eu sugeriria que você fizesse um protótipo em C # ou Python, apenas para testar a funcionalidade principal e a interface do usuário. Em seguida, teste tudo, medindo latências e tempos de resposta reais, quando o aplicativo é atingido com muitos dados, durante muitos dias de execução contínua. As chances são de que o aplicativo pode acabar sendo muito lento ou ficar para trás em momentos aleatórios, quando a VM ou o coletor de lixo entrar em ação.
Eu sugiro que você apresente o que você fez como um protótipo.
Codificar em C não é tão difícil. Se você não estiver disposto, diga. Há muitos de nós prontos para o desafio. (Venho fazendo codificação C em tempo real há, décadas, agora).
fonte
Bem, a primeira coisa a fazer é procurar seu chefe e confessar. Você desconsiderou o pedido claro dele e, pior, faz isso há meses. Não sei quanto tempo você gastou nisso, mas, assumindo que a maior parte do tempo é alocada para a conclusão do projeto, você deve enfrentar o fato de que em breve poderá procurar um novo emprego.
Quanto mais cedo você lidar com isso, melhor.
Em segundo lugar, não acho que você possa convencê-lo de que o ANSI C é inadequado, o que você precisa fazer é convencê-lo de várias outras coisas (1) que c # é adequado, (2) ele pode aprender facilmente a manter c # (3). ) que você não era capaz de escrevê-lo em C. Supondo que você ainda tenha um emprego e um papel a desempenhar neste projeto, eu me concentraria em 2, enfatizando as semelhanças entre c e c #.
Citações em resposta a comentários ...
fonte
Este é um requisito bastante razoável.
Isso não faz sentido. Agora está começando a parecer um pouco suspeito, porque esse é um requisito de design do programa e não um requisito de idioma. Se o código deve ser fácil de manter, implementando ADTs ou usando testes bem testados, os pré-existentes devem ser uma prioridade.
Ok, agora fede. Agora podemos dizer que seu chefe tem experiência limitada, não apenas de várias linguagens de programação, mas de programação em geral. Um programador veterano qualificado, independentemente da preferência de idioma, nunca faria tal afirmação. (A única exceção em que consigo pensar é se a maior parte do código é executada em um sistema incorporado bastante pequeno e, portanto, toda a memória de trabalho necessária para o código deve ser pré-alocada. A idéia de que o mesmo código espera-se que a interface do usuário no nível da tela seja fortemente contra esse caso).
Suponho que seu chefe nunca tenha se envolvido em projetos de software de missão crítica em larga escala, mas é mais provável que ele tenha flutuado em vários projetos de baixa qualidade.
Portanto, isso não tem nada a ver com a linguagem de programação C. Você também pode escrever facilmente programas igualmente nojentos em C #. É um erro muito comum acreditar que um bom design de programa depende do idioma. Isso simplesmente não é verdade!
O C # certamente tem uma sintaxe mais bonita, mais limpa e menos obscura que o C. Ele possui bastante suporte ao design de programas, pois possui muito mais palavras-chave relacionadas ao OO que o C. Mas, além disso, não informa como escrever seus programas. Se você acredita que tudo o que é escrito em C é horrível por padrão e tudo o que é escrito em C # é o paraíso por padrão, aposto que você está atualmente escrevendo programas em C # bastante horríveis sem perceber.
O que eu sugeriria é que você faça um design de programa abstrato, independente da linguagem, mas detalhado antes de qualquer outra coisa. Use a abordagem normal, orientada a objetos. Quais objetos existem e como eles se comunicam entre si, quais são as dependências necessárias, etc. Quando você pensa bastante no design do programa e o coloca no papel, isso não deve importar muito para você nem para seu chefe. idioma em que você escolheu implementá-lo.
fonte
A primeira questão a ser abordada é emocional e irracional. O setor de TI está em constante mudança e, embora haja lugares para tudo, recusar-se a melhorar ou adotar a mudança é um problema.
Por que seu chefe se apega ao ANSI C? Se esse é o único idioma que ele conhece, talvez seja hora de mudar, mas um argumento racional pode ser insuficiente. Seu chefe se sentirá desvalorizado ou possivelmente demitido se forçado a trabalhar em um idioma desconhecido? Enfatize a experiência que ele tem e outros benefícios que ele traz.
Se você não resolver esse problema, todos os argumentos racionais que você pode trazer serão desperdiçados. Como subordinado, você pode não ser o único que pode ter essa discussão com ele. Talvez trate esse assunto com um dos outros gerentes, se houver.
Considere-o também da sua perspectiva. Por que você deseja usar c #? Quanto disso é o desejo de usar algo novo e legal? Seja honesto com você mesmo. Se você reconhecer isso, isso ajudará você a argumentar com mais eficácia.
A segunda questão é de risco e custo. Escrever software é caro e a escolha do idioma é um fator importante nisso. Considerar:
Eu poderia continuar, mas o objetivo é parar de discutir apenas os méritos técnicos das línguas. Méritos técnicos são coisas que somente você e seu chefe entendem. Se você começa a falar sobre o impacto nos negócios, atrai um grupo muito maior de pessoas e apresenta um argumento muito mais convincente.
Talvez C seja uma escolha melhor. C # não é automaticamente melhor para todas as situações. Talvez você faça esse projeto usando C, mas faça uma prova de conceito em C # para o próximo. Lembre-se de que você pode perder a batalha, mas ainda vencer a guerra também.
fonte
Talvez outro argumento: provavelmente é muito difícil encontrar estudantes de ciência da computação que tenham experiência suficiente para escrever código C sem cometer erros. ANSI C não é a primeira coisa que as pessoas aprendem hoje.
Agora todos os estudantes de ciência da computação vão me matar.
fonte
Você falhou completamente em nos convencer de que o ANSI C era inadequado. C é uma excelente linguagem que parece adaptada para o tipo de tarefas que você descreveu. Com a breve descrição da tarefa (exceto o requisito de idioma), eu também recomendaria C (ou talvez vá).
Eu acho que o problema é que você estava programando em C com sua mente pensando em C #. Eu tenho um problema semelhante ao mudar de Perl para C ou java. Você deve aprender a se adaptar ao idioma, e não aprender a traduzir do seu modo de pensar para o idioma do dia.
O problema não é seu chefe ou a linguagem C, o problema é abrir sua mente para diferentes maneiras de pensar. Mudar a linguagem de programação é algo que o beneficiará.
fonte
Primeiro, você precisa dizer ao seu chefe que está em um idioma diferente agora. Ele ficará (compreensivelmente) zangado se você devolver algo propositalmente contra os requisitos sem aviso prévio.
Agora, a melhor maneira de explicar essas coisas aos chefes / gerentes é colocá-las em termos de tempo e dinheiro. Estime quanto tempo esse projeto levaria no ANSI C e depois estime quanto tempo levaria em algo mais alto, como o C #. Note que eu disse nível superior, não moderno. Isso pode ajudar a suavizar as coisas também. Quero dizer, você não resolveria pintar uma sala com apenas um pincel minúsculo, usaria rolos e outras coisas que fazem com que cada traço (linha de código) cubra mais área do projeto. Além disso, se você ou um dos membros de sua equipe não conhece C, ou se sente à vontade para fazer um grande projeto em C, isso leva à questão do tempo ainda mais porque eles terão que se atualizar.
Também parece que seu chefe está tentando microgerenciar. Tenho certeza de que uma das outras respostas tentará explicar como convencer seu chefe a fazer isso menos
fonte
A aversão do supervisor aos ADTs foi abordada em outro lugar, assim como o aparente desconhecimento do desenvolvedor quanto aos custos do GC, portanto, vou me concentrar em "threads".
Talvez, em vez de pensar em termos de encadeamento .NET (ou JVM, se houver doutrinação), o que você pode querer é múltiplos processos, usando algum mecanismo de comunicação entre processos (IPC) para se comunicar entre eles. Por exemplo - mensagens do Windows, memória compartilhada, buffer de arquivo mapeado na memória, pipe nomeado, qualquer que seja. Dedique pequenos processos à interação com um dispositivo ou aspecto do dispositivo e verifique o IPC para comunicar atualizações e reconhecer solicitações, e tenha um processo um pouco maior para manter a GUI e se comunicar com os "monitores" do equipamento usando o IPC que você selecionar.
fonte