Desde que comecei a me envolver com a Engenharia de Software, sempre foi difícil definir ou classificar os “skills” necessários a um engenheiro de software. E esse tipo de discussão sempre me levava para a área de saúde, mais especificamente para a medicina. Afinal de contas, são tantas especializações, tantos “microuniversos” que se assemelhava muito ao que vemos na Engenharia de Software (ES).
A ES é um bicho estranho, muito estranho. Primeiramente por conta do produto principal gerado por ela: o tal do software, conhecido por alguns por SISTEMA.
É… esse mesmo sistema que “resolve” sair do “ar” justamente quando chega a sua vez de ser atendido no banco ou logo depois de passar longos 47 minutos no telefone esperando pela atendente da sua empresa de telefonia móvel. Mas como assim “saiu do ar“? Desde quando ele voa?
Software é um produto intangível e muito difícil de mensurar o valor, ou melhor, de precificar e de calcular o retorno no investimento da sua construção, manutenção e evolução. Por ser intangível, ele também tende a viver mais do que os que o construíram.
Outro ponto de muito investimento, por parte tanto da academia quanto da indústria é justamente a construção do software. Alguns pregam que a depender do “tipo” do software, as técnicas, ferramentas, processos e papéis envolvidos mudam. Por tipo quero dizer: software empacotado, o tradicional, também conhecido por shrink-wrapped software; software como serviço (SaaS); sistemas críticos; de tempo real; larga escala; sistemas operacionais; aplicativos móveis; mainframe; entre tantos outros.
A quantidade de disciplinas envolvidas na ES é muito grande e vai desde disciplinas puramente técnicas da Ciência da Computação até questões mais humanas, envolvendo Psicologia, passando por questões legais e tributárias. O mundo é software hoje em dia e tudo é software! Absolutamente tudo!
Conforme disse Douglas Rushkoff: Program or Be Programmed.
Com este cenário bastante diversificado de emoções, desafios, ações, papéis e pessoas envolvidas, eu comecei a pensar no que seria um conjunto de perfis que poderiam ser trabalhados por alguém que quer ser um bom profissional neste mundo da Engenharia de Software, que entenda das peculiaridades que envolvem a construção do software (ou serviço, ou aplicativo, ou seja lá o que for, desde que seja programável). Já via que existem algumas listas e partilho de boa parte das opiniões delas. A que mais gostei foi a de Steve Wedig, que eu utilizei como inspiração e base para sugerir a minha. Também separei, inicialmente, por tópicos que acho importantes e dentro deles sugeri alguns livros que podem ajudar neste entendimento. Adicionei às sugestões de Steve, as versões em português ou versões “alternativas” para os tópicos propostos.
Além disso, trouxe alguns livros que tratam de tecnologias específicas, mas que as técnicas abordadas neles, podem ser levadas para outras tecnologias
Eu dividiria a disciplina de desenvolvimento de software em verticais, que seriam:
- Primeiros Passos na Programação de Software (First Steps in Software Programming)
- Técnicas Fundamentais de Criação de Software (Core Software Creation Techniques)
- Conceitos de Projeto de Software (Software Design Concepts)
- Code Design: Clean Code ou O Codificador Limpo
- Structural Design: Design Patterns ou Padrões de Projeto
- Analysis Design: Applying UML and Patterns ou Utilizando UML e Padrões
- Component Design: Object Design: Roles, Responsibilities, and Collaborations
- Service Design: Service Design Patterns
- Domain Design: Domain Driven Design ou Domain Driven Design (pt-br)
- System Design: Software Systems Architecture ou Software Architecture
- System Design (Availability): Release It!
- System Design (Security): Foundations of Security
- Legacy Code: Working Effectively With Legacy Code ou Trabalho Eficaz com Código Legado
- User Experience Design: Designing Interfaces
- Conceitos de Engenharia de Software (Software Engineering Concepts)
- Conceitos de Entrega de Software (Software Delivery Concepts)
- Lean Systems: Leading Lean Software Development ou Implementando o Desenvolvimento Lean de Software
- Agile Team Organization: Essential Scrum, The Agile Samurai, The Scrum Field Guide ou Desenvolvimento de Software com Scrum
- Requirements Design: User Stories Applied
- Testing Products & Services: Agile Testing ou Lessons Learned in Software Testing
- Continuous Integration: Continuous Integration
- Continuous Delivery: Continuous Delivery, Lean Enterprise ou A Entrega Contínua
- Customer Development: Lean Startup, Lean Software Development ou A Startup Enxuta
Os livros com * são de alguma tecnologia específica, mas que as técnicas podem ser utilizadas em qualquer linguagem, por exemplo.
Alguma sugestão para complementar a lista?
Artigo originalmente publicado por Vinicius Cardoso Garcia