O que é um Software Engineer?

Certa vez, estava eu atualizando o meu LinkedIn quando o @davidsonfellipe me indagou sobre o título de "Analista e Desenvolvedor Web" que possuo atualmente. Segundo ele, "Front-end/Back-end Engineer" é mais atrativo para que headhunters cheguem a um perfil.

Contra argumentei dizendo que essa não era a minha formação, e que não me sentia confortável em me chamar de engenheiro. Ele, hoje um Front-end Engineer com formação em Engenharia da Computação, afirmou que isso era bobagem, e que eu já praticava muitas das suas atribuições no dia a dia.

A partir daí comecei a me perguntar: O que raios é e o que faz um Engenheiro de Software?

Engenharia?

Segundo o Wikipedia:

A engenharia é a ciência, a arte e a profissão de adquirir e de aplicar os conhecimentos matemáticos, técnicos e científicos na criação, aperfeiçoamento e implementação de utilidades, tais como materiais, estruturas, máquinas, aparelhos, sistemas ou processos, que realizem uma determinada função ou objetivo.

Um engenheiro é basicamente o profissional que aplica esse conhecimento para desenvolver soluções para problemas técnicos. Em determinadas áreas de atuação, ele deve estar certificado/licenciado para que possa utilizar esse título.

É importante notar que um engenheiro transita entre diversas áreas de conhecimento dentro de uma determinada profissão. Um Engenheiro Civil, por exemplo, além de gerenciar e executar as obras, também é responsável por fazer análise de solo, ventilação, das instalações elétricas, do saneamento, dos custos, dos padrões de qualidade, da segurança, do prazo, etc.

"O que meus amigos acham que eu faço (whatmyfriendsthinkido.net)"
O que meus amigos acham que eu faço (whatmyfriendsthinkido.net)

Na TI, como não há regulamentação da profissão, é muito comum vermos desenvolvedores "abraçarem" diferentes atribuições dentro de um projeto, e por fim, acabarem exercendo esse papel multidisciplinar.

A Engenharia de Software

O termo "Engenharia de Software", surgiu na década de 60, com a intenção de contornar a crise do Software, e dar um tratamento mais sistemático e controlado ao desenvolvimento de sistemas complexos.

Segundo [Friedrich L. Bauer](http://en.wikipedia.org/wiki/FriedrichL.Bauer "Leia mais sobre Bauer no Wikipedia"), autor do que viria a ser a primeira definição sobre Engenharia de Software:

(...) é a criação e a utilização de sólidos princípios de engenharia a fim de obter software de maneira econômica, que seja confiável e que trabalhe eficientemente em máquinas reais.

Enquanto um cientista da computação estará "focado" com o desenvolvimento de modelos matemáticos, algoritmos, e a aplicabilidade de sua lógica dentro de um contexto específico, o engenheiro, além de estar envolvido com o desenvolvimento do sistema, terá atenção ao processo, à eficiência, aos recursos e até mesmo aos custos.

Em outras palavras: Não basta só programar

O @romulojales me apresentou um ponto de vista super interessante sobre o assunto:

Se eu recebo algo para fazer e simplesmente faço, eu sou apenas um desenvolvedor. Agora, se eu recebo algo para fazer, e questiono, eu sou um engenheiro.

Determinar quais são as responsabilidades de um Engenheiro de Software nem sempre é uma tarefa fácil. O @mittmann apresentou o seu ponto de vista sobre a questão:

Já que a engenharia abrange muita coisa. O engenheiro é um cientista aplicado.

O Facebook, por exemplo, detalha de forma bem sofisticada o que ele espera de um profissional com este título:

  • Create elegant and useful solutions to solve complex business problems by working across various teams, understanding the needs of our business partners and advertisers, and putting on your product manager hat to provide solutions to solve those problems.
  • Work closely with product management and UX design teams to define and refine feature specifications.
  • Design and develop front-end interfaces, underlying APIs, and backend systems across a number of programming languages with focus on JavaScript, React and PHP (Hack).
  • Analyze and improve the efficiency, scalability, stability, and security of business applications and in-house systems to help scale the company.

Note a ênfase em "eficiência, escalabilidade e estabilidade". É normal vermos empresas exigindo certa experiência nesses quesitos nos tempos atuais (não me surpreenderia se os próximos requisitos para o "cargo" envolvessem big data e "containerização").

Transitar entre as diferentes esferas do conhecimento (como front-end, back-end, storage, infra-structure, business, project management) é outra característica marcante desses profissionais. O SWEBOK (Software Engineering Body of Knowledge) determina quais áreas de conhecimento fazem parte da Engenharia de Software em seu guia, que pode ser baixado diretamente do site da Computer Society.

Conclusão

"Dilbert e os engenheiros do Google (seroundtable.com)"
Dilbert e os engenheiros do Google (seroundtable.com)

Intitular-se engenheiro ou não, é algo que vai além do simples "ter aprendido sobre determinado assunto". Durante a escrita desse artigo, me deparei com vários questionamentos, envolvendo a graduação, a regulamentação da área, e até mesmo sobre cargos, papéis e remunerações.

Na prática, se você é uma pessoa engajada com o projeto, em diferentes esferas, com foco em sustentabilidade, qualidade, transitando entre a base de dados, a infraestrutura, a experiência do usuário, e o código em si. Você pode ter certeza que está desempenhando papéis que cabem a um Engenheiro de Software.

Até a próxima.

Referências