Ciência da Computação e Engenharia de Software: Limpando a confusão

Humberto Linero Blocked Desbloquear Seguir Seguindo 26 de novembro de 2018

É comum no domínio do software ouvir termos como cientista da computação, desenvolvedor, programador, engenheiro de software, engenheiro de computação e muito mais. Pela minha experiência, tenho notado que há dois termos que as pessoas costumam confundir: Ciência da Computação (CS) e Engenharia de Software (SE). Eu freqüentemente ouço as pessoas usá-las de forma intercambiável; no entanto, está incorreto. Eu fiz meu bacharelado em Ciência da Computação, e meu mestrado em Engenharia de Software e posso dizer por experiência pessoal que eles não são a mesma coisa. Não me entenda mal, CS e SE pertencem ao domínio da computação, e ambos são importantes para o desenvolvimento de sistemas de software. Na verdade, as pessoas de cada campo normalmente competem pelos mesmos cargos. No entanto, o foco da CS é diferente do foco da SE.

Enquanto estudava meu mestrado no SE, frequentemente ouvia colegas reclamando sobre os cursos e ficando desapontados com o currículo, porque esperavam mais programação. No entanto, na maioria dos casos, sua decepção e frustração foram o resultado da escolha do grau errado, que por sua vez foi o resultado de não compreender completamente o que é o propósito do SE e como ele difere de outras áreas da computação, como CS.

A confusão freqüente entre essas duas áreas importantes da computação é minha motivação para escrever o artigo de hoje. Se as pessoas forem capazes de compreender a diferença, elas tomarão uma decisão mais informada ao decidir em qual ramo se concentrar. Além disso, se as pessoas entenderem a diferença, elas apreciarão o papel que cada uma dessas áreas desempenha no desenvolvimento de sistemas de software.

A diferença

Caso você não esteja familiarizado, um algoritmo é um conjunto de regras que um computador segue para resolver um determinado problema. Com isso dito, a Ciência da Computação é o campo da computação que se concentra no estudo, implementação e análise de algoritmos. Um cientista da computação está interessado em estudar os aspectos teóricos dos algoritmos, sua eficiência e como implementá-los no hardware do computador [1]. Além disso, a Ciência da Computação também se concentra nas estruturas de dados e em como os algoritmos gerenciam e processam dados.

De sites como o Facebook a infraestruturas críticas, como usinas elétricas, os sistemas de software desempenham um papel essencial em nossa sociedade. Para criar sistemas de software sustentáveis e robustos, é vital entender seu ciclo de vida e aplicar princípios de engenharia sólidos ao processo de desenvolvimento de software. Com isso dito, a Engenharia de Software é o ramo da computação que se concentra na aplicação de princípios de engenharia estruturada para o desenvolvimento de software. O objetivo de um engenheiro de software é garantir que o software em desenvolvimento seja um sistema de alta qualidade, sustentável e robusto. Além disso, um engenheiro de software precisa garantir que o sistema seja desenvolvido dentro do prazo e orçamento acordados. Um Engenheiro de Software se concentra em aspectos como arquitetura de software, qualidade interna de software, engenharia de requisitos e gerenciamento de projetos.

O currículo

Como CS e SE são ramificações do domínio de computação, espera-se que cursos específicos se sobreponham em cada campo. Alguns exemplos de cursos sobrepostos incluem design de bancos de dados, estruturas de dados e design de algoritmo. Por outro lado, alguns cursos são normalmente obrigatórios em um campo, mas não em outro. Exemplos de classes que são obrigatórias em um nível de CS incluem Sistemas Operacionais, Design Orientado a Objetos, Matemática Discreta, Redes de Computadores e Arquitetura de Computadores (não confundir com Arquitetura de Software). Por outro lado, os cursos que são obrigatórios no grau SE incluem qualidade de software, engenharia de requisitos, arquitetura de software, engenharia orientada a modelo, gerenciamento de projeto e teste de software.

A maioria das universidades é flexível e permite que os alunos façam cursos eletivos de outras áreas. Por isso, é comum os alunos do departamento de Ciências da Computação terem aulas no departamento de SE e vice-versa.

Minha opinião

Eu sempre digo que as pessoas não precisam estudar Ciência da Computação ou Engenharia de Software para criar um aplicativo ou um site. Qualquer pessoa pode aprender facilmente uma sintaxe de linguagem de programação e começar a escrever código. Não é nenhum segredo que a internet está cheia de recursos para qualquer um começar. No entanto, criar um sistema de software maduro e robusto é mais do que aprender alguma linguagem de programação arbitrária.

Eu acredito que é essencial que as pessoas que criam sistemas de software tenham uma compreensão de ambos os campos. Por exemplo, por um lado, o conhecimento de CS que permite pensar criticamente e abstratamente ao criar algoritmos, analisando sua eficiência e escolhendo estruturas de dados apropriadas para os diferentes cenários. Por outro lado, o conhecimento do SE permite que você pense além do código e entenda que todas as decisões de programação afetam a qualidade interna e a arquitetura do sistema. Além disso, supondo que você esteja construindo um produto voltado para o mercado, é essencial levar em conta restrições como tempo e dinheiro e como cada decisão de programação afeta esses recursos.

Temos que ser realistas, nem todos os desenvolvedores estão interessados em gerenciar projetos de software ou em lidar com o cliente e seus requisitos. No entanto, acredito que um desenvolvedor que é capaz de entender além do código e compreende como a sua decisão de programação afeta a qualidade e a arquitetura do software é mais valioso do que aquele que está apenas interessado em escrever código e "fazer funcionar".

Conclusão

CS e SE são ambos ramos de desenvolvimento de software. É essencial que as pessoas de cada área conheçam os fundamentos da computação, algoritmos, arquitetura e qualidade. Embora CS e SE sejam usados de forma intercambiável, seu foco é diferente. Eu acredito que é essencial ter conhecimento em ambas as áreas para ter uma boa compreensão dos sistemas de software. Então qual é o melhor? Nenhum. São campos diferentes da computação que se complementam e são essenciais para o desenvolvimento de sistemas de software.

? ? ?

Se você gostou deste artigo, por favor, recomende e compartilhe. Não se esqueça de se inscrever e seguir-me no Twitter para manter-se atualizado com meus últimos posts. Vejo você no próximo.

Referências

[1] https://www.techopedia.com/definition/592/computer-science

Texto original em inglês.