Desenvolvimento de software @ Engineering USA
Na Engineering gostamos de resolver problemas e nos esforçamos para fornecer a cada um dos nossos clientes a solução que melhor se adapta ao seu problema. Às vezes, isso significa alavancar um dos produtos de ponta do nosso parceiro e personalizá-lo, e às vezes isso significa sair da caixa e tentar inventar algo inteiramente novo para corresponder perfeitamente às necessidades de nossos clientes.
Mas construir um produto sólido e sustentável é uma tarefa difícil. O que pode parecer a maneira mais rápida de enviar e finalizar um produto geralmente acaba tendo um custo total maior devido aos problemas de manutenção que surgem depois que o produto já foi enviado. Criação e manutenção de software requerem padrões de qualidade bem estabelecidos e métodos para entregar um produto superior em tempo hábil.
Ultimamente, a Engineering vem trabalhando no desenvolvimento de soluções de software customizadas, tanto para nossos clientes como para nossos parceiros. Esta nova empresa exigiu repensar a forma como o software é criado e enviado à Engineering, a fim de alcançar padrões mais elevados de qualidade.
Neste artigo, iremos destacar o que torna a Engineering capaz de oferecer soluções de software personalizadas que atendam aos padrões da indústria e abracem as mais modernas tecnologias, bem como mostrar-lhe o funcionamento interno de nossas práticas de desenvolvimento de software.
Objetivos
Em uma frase, podemos definir qualquer projeto como bem-sucedido quando ele atende às expectativas do cliente ou das partes interessadas. No caso de um projeto de desenvolvimento de software bem-sucedido, isso pode ser alcançado quando os seguintes objetivos forem atingidos:
- Alta Qualidade: O produto fornecido atende as necessidades do cliente com atenção aos mínimos detalhes.
- Confiável: O software foi submetido a testes cuidadosos para acabar com a ocorrência de bugs que podem interromper a experiência de uso.
- Entrega Rápida: É importante entregar o projeto a tempo, para cumprir o prazo do cliente.
- Atualizável e Extensível: Todo software precisa ser mantido. Como tal, tem de ser concebido de uma forma que facilite a manutenção após a entrega e permita a fácil modificação no caso de os requisitos mudarem ou novos requisitos serem adicionados.
Engineering Agile
Nos últimos 15 anos, uma nova filosofia chamada Extreme Programming (XP) começou a se espalhar no mundo do desenvolvimento de software. O XP permite que pequenas equipes consigam desenvolver grandes projetos e cortem custos de manutenção. Muitas metodologias para desenvolvimento de software nasceram depois de diferentes variações de princípios de XP. Como uma coleção de conceitos e princípios de alto nível, o XP é muito valioso, mas às vezes se choca com alguns preconceitos que permanecem no desenvolvimento de software, especialmente quando, no caso da Engineering, temos de lidar com soluções antigas e tecnologias empresariais.
Na Engineering, alavancamos os princípios centrais de metodologias ágeis quando temos que construir nosso software e projetamos um fluxo de trabalho simples e escalável, para que possa ser usado em um projeto de uma só pessoa, bem como em um projeto com dez pessoas ou mais.
Nossa abordagem nos ajuda de muitas maneiras. Começamos por definir um prazo para um MVP (Minimum Viable Product – Produto Mínimo Viável) que podemos mostrar aos nossos clientes o mais rápido possível. A partir daí, procedemos em pequenas iterações até que todos os casos de uso sejam tratados. Isso nos permite a fácil comunicação com os clientes e o rápido feedback, quando as alterações são menos dispendiosas. Nossos clientes ficam felizes em participar no desenvolvimento, acompanhar o projeto desde o início e ver o progresso real do trabalho diariamente. A abordagem ágil permite-nos lidar com todos os requisitos adicionais ou bugs descobertos de repente, muito rapidamente, e enviar a modificação após a entrega sem aborrecimentos.
Nossa abordagem mistura alguns aspectos do Scrum para o que diz respeito à gestão dos sprints, e github-flow para o que diz respeito à gestão da base de código e o rastreamento de problemas.
Abordagem Padronizada
Ao construir um software, é importante padronizar os procedimentos e regras a serem seguidas ao longo do processo de desenvolvimento. Na Engineering, selecionamos nossas tecnologias e ferramentas com base no que é mais produtivo e melhor atende aos padrões da indústria, e desenvolvemos regras e ativos internos para aplicar aos próprios projetos. Isso nos permite ter um portfólio mais coeso de produtos, fazer facilmente integrações entre diferentes projetos e reutilizar módulos independentes de negócios. Quando temos de iniciar um novo projeto, é muito fácil iniciar a solução e começar a escrever o código que realmente funciona, porque podemos aproveitar uma mistura bem testada de tecnologias e fluxo de trabalho. A Engineering usa e impõe o seguinte para garantir que nosso processo e produto atendam aos mais altos padrões de qualidade com o menor impacto no custo:
- Regras de Verificação de Estilo de Código Automatizado
- Regras de Análise Estática de Código Automatizado
- Fluxo de trabalho automatizado de implantação com um clique
- Regras e convenções internas entre diferentes projetos
Fonte de Controle
Acreditamos que o controle da fonte é um dos componentes mais importantes (e mais negligenciados) para garantir padrões de alta qualidade no desenvolvimento de software. Não usar corretamente um método de controle da fonte faz com que o código fique inutilizável ao longo do tempo, aumentando drasticamente a dívida técnica que pode afundar um projeto antes mesmo de ser implantado.
Na Engineering, tratamos o código-fonte como o documento de design mais importante, e tomamos cuidado extra para garantir que apenas códigos bem testados e de alta qualidade se transformem em produto final. Usamos o GitHub para hospedar nossos projetos, usamos sua ferramenta de rastreamento de problemas e puxamos mecanismos de solicitações para comunicação tanto interna quanto com nossos clientes.
Também aproveitamos o poder do controle da fonte quando temos que manter diferentes ramos para implementações diferentes do mesmo projeto, em que cada implantação pode ter requisitos adicionais ou necessidades para segmentar um cliente específico ou uma planta.
Revisão de Código
Dois pares de olhos são sempre melhores que um, então nós gostamos de fazer revisões do código antes que ele seja aceito na base de código-fonte. Isso ajuda a detectar erros ou ineficiências no código, resultando no corte de dívidas técnicas. A revisão de código também promove a disseminação das melhores práticas entre os desenvolvedores, para que qualquer pessoa possa reconhecer, abordar e aprender com seus erros mais rápido, para não mencionar evitar que esses erros afetem a qualidade do produto.
Test Driven Development (TDD)
Nós sempre testamos todas as funcionalidades, e cada vez que uma nova funcionalidade é adicionada, ela deve ser acompanhada por um teste que abrange todos os casos de uso. Nós gostamos de testes de unidade, porque eles podem ser executados sem despesas adicionais cada vez que o código muda para garantir que as modificações não quebrem as funcionalidades previamente introduzidas.
Integração e Entrega Contínua
Na Engineering, nós gostamos de automação. Automatizar tarefas significa que você pode delegar uma máquina para fazer as tarefas chatas para você, e os computadores são bem conhecidos para executar tarefas chatas de uma maneira muito rápida, barata e livre de erros. Usamos "grunt" e "gulp" para criar nossas tarefas de teste e implantação. Usamos o incrível AppVeyor CI para executar nossa tarefa automaticamente toda vez que o código é modificado. Por exemplo, com Continuous Delivery (Entrega Contínua), podemos automatizar todas as tarefas a seguir no servidor CI e com um único comando, sempre lembrando que o projeto construído não depende do ambiente no qual ele foi criado:
- Análise de Estilo
- Análise de Códigos Estatísticos
- Resolução de dependência externa
- Compilação do projeto .NET
- Compilação do projeto JavaScript
- Minificação
- Teste de Corrida
- Compactação de ativos
- Geração de documentação em PDF
- Compilação do instalador
Isso torna a construção de um projeto a partir do código-fonte um processo muito barato, replicável e livre de erros. Cada compilação também é fortemente identificada por um número de versão para que sempre saibamos qual versão é implantada.
Tecnologias Orientadas à Web
As novas tecnologias baseadas na web nos permitem desenvolver projetos mais rapidamente e sem erros e tornam a implantação, um processo fácil e replicável, consequentemente reduzindo custos e produzindo produtos de qualidade significativamente maior. Nós nos concentramos em uma grande quantidade de tecnologia específicas para criar um fluxo de trabalho bem testado e sólido:
- C# and .NET porque estas são as padronizações na indústria e empresas de TI
- SQL Server fornece a solução mais sólida quando se trata de gerenciar um banco de dados para indústria de manufatura
- ServiceStack é uma estrutura baseada em .NET para criar serviços web sólidos e extensíveis e REST APIs
- Typescript une a formalidade e a segurança da digitação estática com a versalidade e velocidade de JavaScript e bibliotecas laterais do cliente
- NodeJS e grunt automatizam nossas tarefas e aproveitam muitas das melhores práticas laterais de desenvolvimento do cliente
- AngularJS nos permite construer interfaces de usuários muito ricas e interativas com uma quantidade absurdamente baixa de códigos
- npm e nuget são nossos sistemas de gerenciamento de dependência de escolha para clientes e servidores, respectivamente
O resultado é um software que é fácil de usar e instalar, com uma moderna interface de usuário (UI), poderosas capacidades de depuração e um diagnóstico leve e rápido.
Engineering
Na Engineering, abraçamos a filosofia Open Source em desenvolvimento de software e tentamos introduzir esse conceito no mundo da manufatura e das empresas TI.
O fluxo de trabalho de desenvolvimento moderno é fortemente baseado em Open Source. Esta tendência também pode ser vista na última política da Microsoft em relação às tecnologias de desenvolvimento: o gigante de Redmond sempre foi conhecido pela sua política de código fechado, mas no ano passado abriu a maior parte da sua plataforma .NET. Este é um sinal claro de que, mesmo para projetos empresariais, chegou a hora de aproveitar o enorme potencial que o Software Open Source (OSS) pode oferecer.
Na Engineering, contamos com uma grande quantidade de OSS para os nossos principais componentes e gostamos de demonstrar o nosso compromisso através do fornecimento aberto de muitos módulos que não são o nosso negócio principal. Você pode encontrar nossos projetos Open Source em https://github.com/hylasoft-usa. Fazemos isso não apenas para ajudar a comunidade a crescer, mas para nos ajudar a desenvolver com a modularidade em mente e fornecer dependências altamente reutilizáveis e facilmente gerenciáveis
Reutilização
Nós pensamos que é importante não reinventar a roda cada vez que um novo projeto é iniciado. Seria bom começar a escrever o código principal logo no primeiro dia de desenvolvimento, mas é claro que há muitas tarefas paralelas que precisam ser implementadas primeiro para cada projeto, desde o mecanismo de registro, até a integração com sistemas externos, a autenticação, a estrutura de relatório e bibliotecas de utilitários. Quando um projeto é concluído, olhamos para que partes podem ser extraídas e reutilizadas de forma independente em outros projetos. Isso não só nos permite reduzir drasticamente o trabalho e as linhas de código para cada projeto, mas também aumenta a qualidade do produto e reduz as dívidas técnicas, já que cada módulo é completamente independente de um único projeto e já foi testado e utilizado individualmente.
O Que Vem a Seguir?
Na Engineering, estamos sempre à procura de novas formas de melhorar o nosso fluxo de trabalho de desenvolvimento e de refinar nosso estoque de tecnologia. Estamos vivendo em uma era muito emocionante para o desenvolvimento de software e temos a certeza de que o mundo empresarial será revitalizado por essas mudanças de paradigma.
Muitos conceitos estão saindo do mundo da inovação de start-ups tecnológicas para o mundo industrial: desenvolvimento baseado em contêiner, como o tipo fornecido pela Docker promete ser o padrão para substituir o modelo de virtualização mais antiga, o futuro próximo promete ser um período muito interessante para experimentar com tecnologias vestíveis e Realidade Aumentada, e assim como a Internet das Coisas (IoT) está se tornando cada vez mais importante na fabricação.
Na Engineering, não queremos perder uma única oportunidade de mudar o mundo da manufatura e, como sempre, estamos muito empolgados em trabalhar com nossos clientes e parceiros em projetos para tornar essas ideias em realidade.