Ciência da Computação: grade curricular

Sabe quais disciplinas formam a grade de um curso de Ciência da Computação? Quais delas são usadas no mercado de trabalho? Este post faz uma compilação das disciplinas mais importantes da grade de um curso de Ciência da Computação, mas sem esquecer do mercado de trabalho e de concursos públicos para cargos de TI.

Ciência da ComputaçãoContexto da análise

Para quem nos acompanha e leu este post aqui, sabe que estamos organizando uma grade mestre de TI. Ela conterá uma compilação das principais disciplinas de cursos de graduação, mas combinadas com os tópicos que mais são cobrados em concursos públicos para cargos de TI.

Para a primeira parte, cursos de graduação, começarei com um relato de como foi a minha e como ela está atualmente. Esse será apenas um ponto de partida, mas farei considerações desde já sobre o que utilizei mais ou menos até hoje profissionalmente.

Grade curricular de Ciência da Computação em 2000

Eu me formei na Universidade Estadual de Maringá (UEM), Departamento de Informática (DIN). Sou da turma de 2000, que se formou em 2003. Foram 4 anos em período integral, de manhã e de tarde.

No primeiro ano tive sete disciplinas:

  1. Cálculo Diferencial e Integral
  2. Geometria Analítica e Álgebra Linear
  3. Matemática Discreta
  4. Física
  5. Sistemas Administrativos
  6. Iniciação a Ciência da Computação
  7. Algoritmos e Estruturas de Dados I

Só as duas últimas, marcadas em azul, eram do DIN. As três primeiras eram do Departamento de Matemática, a quarta do Departamento de Física e a quinta do Departamento de Administração.

No segundo ano a distribuição de disciplinas foi invertida. Ao todo, cinco disciplinas de computação (as cinco primeiras) e só duas de outros departamentos (as duas últimas):

  1. Algoritmos e Estruturas de Dados II
  2. Eletrônica Digital
  3. Programação de Sistemas
  4. Engenharia de Software
  5. Teoria da Computação
  6. Cálculo Numérico Computacional
  7. Estatística e Processo Estocásticos

O terceiro foi o ano mais puxado, com nove disciplinas de computação:

  1. Inteligência Artificial
  2. Compiladores
  3. Arquitetura de Computadores
  4. Engenharia de Software II
  5. Métodos Formais I
  6. Banco de Dados I
  7. Redes de Computadores
  8. Teoria dos Grafos e Análise de Algoritmos
  9. Sistemas Operacionais I

No quarto e último ano da graduação escolhi a ênfase de Computação Gráfica e Otimização. As outras opções eram: Engenharia de Software ou Sistemas Distribuídos. Assim, tive as seguintes disciplinas:

  1. Aspectos Psicológicos e Sociológicos da Informática (Departamento de Psicologia)
  2. Linguagens de Programação
  3. Computação Gráfica
  4. Tópicos em Pesquisa Operacional
  5. Programação Linear
  6. Simulação de Sistemas
  7. Trabalho de Graduação

Sendo a última, chamada de TG e equivalente ao TCC, assim como as duas primeiras, obrigatórias para todos os alunos. As disciplinas 3, 4, 5 e 6 decorriam da escolha da ênfase feita ao final do terceiro ano.

No total, a carga horária foi de 3.808 horas (3.638 totais + 170 de atividades complementares).

Grade atualizada de Ciência da Computação

Chequei, no momento em que publico este post, a grade do curso de Ciência da Computação da UEM. Ela foi reestruturada com as disciplinas divididas por semestre, mas, em geral, as principais continuam as mesmas. Algumas parecem terem sido quebradas em duas, trazendo fundamentos antes dos conhecimentos mais pesados. Outras saíram da grade, como foi o caso de Física e Sistemas Administrativos. Organizei abaixo os semestres dentro de cada ano.

1. Primeiro ano de Ciência da Computação na UEM em 2018:

O primeiro semestre possui as seguintes:

  1. Cálculo Diferencial e Integral (DMA*)
  2. Geometria Analítica e Álgebra Linear (DMA*)
  3. Matemática Discreta (DMA*)
  4. Fundamentos de eletrônica (DIN)
  5. Fundamentos de algortimos (DIN)

DMA é o Departamento de Matemática da UEM.

No segundo semestre:

  1. Cálculo Diferencial e Integral II (DMA)
  2. Álgebra Linear (DMA)
  3. Matemática Discreta II (DMA)
  4. Fundamentos de Pesquisa em Computação (DIN)
  5. Circuitos Digitais I (DIN)
  6. Estrutura de Dados (DIN)

2. Segundo ano de Ciência da Computação:

No terceiro semestre:

  1. Circuitos Digitais II
  2. Organização e Recuperação de Dados
  3. Linguagens Formais e Autômatos
  4. Processo de Software e Engenharia de Requisitos
  5. Projeto e Análise de Algoritmos
  6. Psicologia e Relações do Trabalho (DPI)

* DPI é o Departamento de Psicologia. Todas as demais são disciplinas do DIN.

No quarto semestre:

  1. Arquitetura e Organização de Computadores
  2. Programação Orientada  Objetos
  3. Interação Humano Computador
  4. Banco de Dados I
  5. Algoritmos em Grafos
  6. Análise e Projeto de Software

3. Terceiro ano de Ciência da Computação:

Quinto:

  1. Inovação em Tecnologias de Informação e Comunicação
  2. Computabilidade
  3. Arquitetura e Organização de Computadores II
  4. Probabilidade e Estatística
  5. Paradigma de Programação Imperativa e Orientada a Objetos
  6. Banco de Dados II
  7. Arquitetura de Software
  8. Informática e Sociedade

Sexto:

  1. Matemática Computacional
  2. Sistemas Operacionais
  3. Paradigmas de Programação Lógica e Funcional
  4. Modelagem e Otimização Algorítmica
  5. Computação Gráfica
  6. Construção de Software
  7. Noções de Direito (Departamento de Direito)

4. Quarto e último ano de Ciência da Computação:

Sétimo:

  1. Programação para Interfaceamento de Hardware e Software
  2. Redes de computadores
  3. Programação Concorrente
  4. Introdução a Inteligência Artificial
  5. Processamento Digital de Imagens
  6. Sistemas Digitais
  7. Processos estocásticos (DES*)

* DES é o Departamento de Estatística.

Oitavo e último:

  1. Gerenciamento de Projetos de Software
  2. Compiladores
  3. Aprendizagem de Máquina e Modelagem de Conhecimento Incerto
  4. Métodos Formais
  5. Gerenciamento de Redes de Computadores
  6. Sistemas Distribuídos
  7. Optativa (Tópicos em Sistemas de Informação, Tópicos em Inteligência Computacional ou Tópicos em Sistemas de Computação no DIN ou Introdução a Libras: Língua Brasileira de Sinais do Departamento de Língua Portuguesa).
  8. Trabalho de Conclusão de Curso

Números e referência

Ao todo, a grade atualizada tem 3.912 e prevê 206 horas de atividades complementares. 

Fonte: Projeto Pedagógico do Departamento de Informática da UEM, que pode ser visualizado aqui.

Opção de pesquisa

Olhando as duas grades é possível ver como alguns tópicos foram divididos, outros incluídos ou, ainda, reformulados.  Minha intenção não é comparar a grade de 2000 com a de 2018, e nem com a outras instituições de ensino que são referência em graduação de Ciência da Computação. Se você tiver interesse, o último ranking que pesquisei com diferentes critérios é o da Folha:

Um futuro passo será analisar as grades curriculares dos cursos de Ciência da Computação da USP, UNICAMP, UFMG, UFRJ, PUC-RJ, UFRGS, PUC-RS, UFPE, UFSC, UFSCar, UNESP e ITA.

Por ora, vamos analisar as disciplinas da UEM segundo os seguintes critérios:

  1. Vagas no mercado de trabalho
  2. Área de inovação e empreendedorismo em TI
  3. Teoria cobrada em concursos públicos de ensino superior para cargos de TI

Para o primeiro item, tomarei como referência o site ApInfo, que trabalha com vagas no mercado de TI. Além disso, vou usar também a minha experiência de 2008 a 2014, período que trabalhei como funcionário em duas empresas de TI que entregam diferentes tecnologias, além do período 2015-atualmente, em que atuo como empreendedor trabalhando com técnicos de TI, programadores web, programadores mobile, designers 2D e 3D, gerentes de projeto e engenheiros de software, eletrônicos e mecatrônicos. Também conto com parceiros da área de TI e de agências de marketing, que também demandam desses profissionais que citei.

Para a segunda área, vou seguir a linha que trabalhamos no Workshop de Inovação. Foco em inovação pensando em Realidade Aumentada (AR), Realidade Virtual (VR) e Holografia, mas sem esquecer Robótica, Internet das Coisas (IoT) e Inteligência Artificial.

Por fim, usarei os sites das bancas, como CESPE e FCC, para mostrar questões de concursos públicos para áreas de TI.

O que mudaria na minha formação

O primeiro ano da minha faculdade foi de pânico geral. Havia uma disciplina muito difícil, que era Cálculo Diferencial e Integral I, do departamento de Matemática, mas que também contava com um excelente professor. Depois, a disciplina de Algoritmo e Estrutura de Dados I, com alto índice de reprovação, do Departamento de Informática, era a mais temida. Corria o boato que o professor era um carrasco, o que aumentava o pânico dos alunos. Neste primeiro ano eu apanhei bastante, até que aprendi a programar efetivamente e, depois disso, do segundo ano para a frente, tudo mudou.

Se eu tivesse o poder de voltar no tempo e, ainda, palpitar na grade que eu mesmo aprenderia, inverteria a ordem de algumas matérias. Digo isso considerando também os critérios que enumerei acima para escolha das principais disciplinas da grade de Ciência da Computação.

Acredito que o caminho natural ao se estudar TI é conhecer um pouco de hardware, depois um pouco de software, e assim sucessivamente, completando rodadas nos dois pilares. Pelo menos até certo ponto em que cada pilar corresponderá efetivamente a uma especialização. Parece simples e óbvio, mas não é. Dosar as medidas certas de hardware e software no começo é uma tarefa difícil.

Rodada level 1

O aluno, normalmente, quando começa, quer codificar. Colocar a mão na massa e fazer seus programas. Mas isso é o mais difícil. Antes tem que saber lógica e pelo menos uma linguagem de programação. É preciso ir com calma mesmo. O caminho de começar programando parece mais legal, mas a longo prazo pode frear a curva de conhecimento.

Acho esquisito o aluno aprender sobre algoritmos, mas não saber que quando ele declara uma variável ela aloca espaço na memória RAM. Se a pessoa não entende bem o conceito de memória RAM é difícil abstrair alguns elementos da programação. Implementar, em um algoritmo, uma operação de entrada e saída sem saber quais são os dispositivos de entrada e saída.

Aprender software e hardware de forma totalmente isolada não faz sentido, pois o primeiro roda sobre o segundo e possui vínculos diretos entre seus componentes.

Se as disciplinas de TI fossem contadas como surgiram na história, o caminho proposto faz bastante sentido. Por isso, entendo que alguns fundamentos de arquitetura de computadores e sistemas operacionais precisam ser ensinados antes de fundamentos de programação, como algoritmos e estrutura de dados. Para a primeira rodada, portanto, proponho que ela deve ser organizada assim:

  1. Fundamentos de Computação (O que é, exemplos e diferenças entre hardware e software)
  2. Arquitetura e Organização de Computadores (diferença entre os dois conceitos, principais equipamentos e principais partes desses equipamentos com suas respectivas características técnicas)
  3. Sistemas operacionais (o que são, quais suas funções, exemplos e características dos principais)

Ao final dessa rodada o aluno estará bem capacitado para entender toda a camada de desenvolvimento de software que atua sobre os equipamentos e sistemas operacionais.

Rodada level 2

Seguindo com o conceito, a próxima rodada abordará aspectos de hardware mais detalhados, como Eletrônica e Circuitos Digitais. Em seguida, ainda na mesma rodada de hardware, redes de computadores.

Na parte de software é preciso entender como funciona a organização de arquivos e a recuperação de dados. Vejam que nesse momento ainda estamos dissecando tudo o que um usuário pode fazer usando um equipamento e seu sistema operacional, mas a organização de arquivos é essencialmente software. Tudo gira em torno dos dados, por isso um aprofundamento nessa parte só traz benefícios para o desenvolvimento. Vale lembrar também que a organização de dados está diretamente associada aos sistemas operacionais, como eles tratam e gerenciam os dados controlados por eles. Para fechar a parte de software, conhecer o processo de engenharia de software antes de sua implementação reforça a importância do planejamento.

  1. Eletrônica ou Fundamentos de Eletrônica
  2. Redes de Computadores
  3. Organização e recuperação de dados (diferença entre os dois conceitos, principais equipamentos e principais partes desses equipamentos com suas respectivas características técnicas)
  4. Engenharia de Software I

Aluno liberado para aprender a codificar.

Rodada level 3

Em hardware, focaria em infra-estrutura escalável, além de inovação, trazendo os equipamentos mais modernos da atualidade para serem estudados na faculdade, mesmo que a instituição não os disponha fisicamente. Isso é importante para reduzir a defasagem entre o que o mercado usa em relação ao que a instituição de ensino capacita o aluno.

Para software, algoritmos, estruturas de dados e banco de dados, mas com os conhecimentos aplicados junto com os de engenharia de computação.

  1. Interação Humano Computador / Inovação / Computabilidade / Virtualização / Cloud Computing (é software, mas como envolve muitos equipamentos para ser escalável e com alta disponibilidade, coloquei aqui como hardware)
  2. Circuitos Digitais II / Sistemas Digitais / Interfaceamento Hardware/Software  
  3. Fundamentos de Algoritmos
  4. Estrutura de Dados
  5. Banco de dados I
  6. Linguagem de Programação

Rodada level 4

A partir daqui a parte de hardware é pausada e começam as especializações no desenvolvimento de software. Mais para frente, quando o aluno dominar programação, a parte de hardware pode ser retomada para o desenvolvimento em equipamentos embarcados. Atualmente é uma área muito fonte com a IoT.

Então, temos:

  1. Paradigma de Programação Imperativa e Orientada a Objetos
  2. Programação Orientada a Objetos
  3. Paradigmas de Programação Lógica e Funcional
  4. Arquitetura de Software
  5. Engenharia de Software II
  6. Banco de Dados II
  7. Implementadores: compiladores e interpretadores
  8. Programação concorrente

Rodada level 5

A partir daqui começam as especializações de área. Os caminhos são alternativos e nem sempre se cruzam. A área de Inteligência Artificial está bombando atualmente, mas ela não é usada em todas as outras. Não ainda. Por isso, vejo trilhas diferentes para seguir. Mesma coisa dá para dizer do mercado de Computação Gráfica. É extremamente útil, mas você não vê vagas de desenvolvedor 3D, para games ou simuladores, com a mesma frequência que desenvolvedor web ou mobile.

Nem inteligência artificial e computação gráfica costumam cair com frequência em concursos públicos. É um conhecimento muito avançado e restritivo ainda. Só vi uma questão sobre redes neurais até hoje.

Portanto, existem vários caminhos:

  • Forcar em Sistemas Distribuídos
  • Focar em Gestão de projetos e Construção de Software
  • Focar em IA
  • Focar em Computação Gráfica, Processamento de imagens e Otimização (foi o que fiz)

Algumas disciplinas como Grafos, Análise de Algoritmos e Autômatos são frequentemente cobrados em concursos públicos, mas não no desenvolvimento do dia a dia (web, mobile e PC). A não ser que seja algo bem específico. Por exemplo, para um software que trace rotas geo localizadas, a teoria dos grafos é muito pertinente.

As disciplinas que não citei atuam como complementares na maioria dos casos, dependendo da área de atuação.

Observação

Não quero polemizar aqui, até porque para quem já teve todas essas disciplinas de matemática, física, estatística, e mais outras que também cursei no mestrado na Unicamp, todo o conhecimento adquirido contribuiu na minha formação. Agora, para ser mais objetivo e direto, faço as seguintes considerações

Disciplinas de matemática

1. Cálculo Integral e Diferencial = Mesmo trabalhando com programação 3D e elementos de computação gráfica, não uso diretamente cálculos integrais e diferenciais. Se preciso disso, chamo métodos que fazem isso para mim. Assim, vários itens aprendidos nesta disciplina, que no meu caso foram os excelentes livros do Le Tholdi, não são usadas na prática. É muito legal o começo, a introdução, a sensação de que você não sabia fazer contas efetivamente. Mas quando chega em cálculo de volumes 3D, integrais ou mesmo vários axiomas e teoremas, o conhecimento é muito mais específico e aplicável na matemática do que na computação do dia a dia, como um desenvolvimento web, mobile e PC. Colocaria somente a parte introdutória na rodada 3.

2. Cálculo Numérico = Disciplina que ajuda muito a entender algumas técnicas de processamento numérico, como o Método das Aproximações Sucessivas. Sob determinado ponto, acho essa disciplina mais útil do que a primeira no dia a dia, embora, também passe longe de ser um conhecimento demandado com muita frequência, razão pela qual a colocaria na rodada 2.

3. Matemática Discreta = Ótima disciplina para entender álgebra ou lógica de Boole, que é um dos pilares da programação. Essa disciplina parece inofensiva, mas tem muito a ver com lógica, portanto, assim como Cálculo Numérico, enxergo nela maior aplicabilidade perante as demais. A colocaria na rodada 1.

4. Geometria Analítica e Álgebra Linear = Outra disciplina mais específica de matemática do que de computação. No mundo de desenho 2D e 3D via programação, atualmente, os SDKs estão recheados de funções prontas, de forma que entender os conceitos e como usá-los corretamente na programação é suficiente. Assim, não colocaria essa disciplina diretamente em nenhuma rodada, mas sim junto com Cálculo Integral e Diferencial.

Física, Estatística e Outras

O conteúdo de física foi bem exagerado na minha graduação, embora eu tenha achado divertido. Tive que aprender e fazer muitos cálculos físicos que, na prática, nunca utilizei. A disciplina até saiu da grade. Os livros, recheados de fórmulas e provas matemáticas, eram excelentes, mas ficou claro que a profundidade era a de formação de um físico mesmo, não era Física aplicada à Ciência da Computação. Já fiz alguns simuladores físicos e não usei os conhecimentos que lá aprendi, apenas os do ensino médio.

Estatística também seguiu essa linha, embora, seja uma disciplina com maior aplicação em computação. Atualmente, com grandes volumes de dados, dominar algumas técnicas de estatística pode ser um diferencial. Reparem que a disciplina de 2000, Estatística e Processos Estocásticos, foi agora organizada em 2, uma de Probabilidade e Estatística, e outra de Processos Estocásticos.

Sistemas Administrativos saiu da grade, mas no lugar veio uma disciplina de Direito. Acho bem importante o profissional de TI ter noções de Direito, ainda mais para quem vai para concursos. Psicologia e Informática e Sociedade também reforçam a importância de ter conhecimento do lado humano relacionado aos processos computacionais.

Sobre o Autor

Leandro Pinho Monteiro

Leandro Pinho é engenheiro de computação, graduado em Ciência da Computação na Universidade Estadual de Maringá (UEM) e mestre em Engenharia da Computação na Faculdade de Engenharia Elétrica e Computação (FEEC) da UNICAMP, ambas formações com foco em Computação Gráfica. Possui experiência no desenvolvimento de sistemas interativos 3D para pontos de venda, marketing e eventos. Atualmente trabalha como consultor de tecnologia e é o responsável pela coordenação dos cursos oferecidos na Universidade da Tecnologia.