O que você aprende em um curso de ciência da computação de 4 anos

Recentemente, escrevi um artigo sobre se você precisa de um diploma em ciência da computação para conseguir um emprego em tecnologia. Achei que revisar minha transcrição seria útil. Com sorte, discutir o que estudei ajudará as pessoas. Quero que todos possam tomar a decisão mais informada possível ao escolher seu caminho para seguir uma carreira em tecnologia.

Isenção de responsabilidade : isso foi escrito a partir de minhas recordações das aulas e da perspectiva de um desenvolvedor móvel. Muitos dos tópicos dessas aulas poderiam ser especializados e transformados em uma carreira. Portanto, todos eles são importantes para alguém no mundo. Estou escrevendo da minha perspectiva e do ponto de vista de alguém que escolheu a carreira de desenvolvedor mobile.

Programação I, II

Essa foi a essência de tudo que aprendi e me ajudou a continuar com a programação. Essas foram as aulas em que você aprendeu a programar. Antes de fazer essas aulas, eu mal tinha programado nada. Eu tentei obter uma vantagem inicial, mas não fui muito além dos loops.

Esta aula começou criando um arquivo vazio e fazendo-o compilar em um IDE (usei Code :: Blocks). E nós nos esforçamos para criar nosso próprio jogo de batalha baseado em texto. Olhar para trás, para o código que escrevi, me deixa envergonhado. Percorri um longo caminho desde então. Aqui está o repositório, se você quiser se divertir (eu só uso um arquivo main.cpp com 1063 linhas de código).

Então, o que aprendi aqui? Eu quero dizer tudo. Esses cursos foram extremamente valiosos e me proporcionaram pelo menos 70% do conhecimento de que eu precisava para trabalhar profissionalmente como programador. Aprendi instruções if, loops, lógica booleana, criação de classes, criação de estruturas, criação de interfaces, polimorfismo, herança e muito mais. Também havia algum uso de estruturas de dados básicas como matrizes e vetores.

Estruturas Discretas em Ciência da Computação

Esta classe foi adicionada à transcrição para que as pessoas se acostumassem à lógica booleana. O que tivemos nas primeiras duas semanas de aula. Infelizmente para nós, alunos desavisados, isso vai bem longe na toca do coelho. Aqui estão alguns dos tópicos abordados: “lógica, operações de conjunto e conjunto, métodos de prova, definições recursivas, combinatória e teoria dos grafos”.

Agora, todas essas coisas são úteis para saber. Mas o problema é que os alunos foram incentivados a fazer essa aula mais cedo. Normalmente junto com o Progamming I e II. E esses são alguns tópicos avançados. Eu lutaria agora para usar métodos matemáticos de prova. E lembro que realmente tive dificuldades naquela época. Além disso, eu só tive que pesquisar no Google o que é combinatória, então obviamente não os uso muito.

O fato é que muitas das coisas que eles ensinaram neste curso não pareciam aplicáveis ​​à carreira de ciência da computação na época em que fiz o curso. Agora eu sei que lógica, operações de conjunto e conjunto, definições recursivas e teoria de grafos podem ser úteis. Mas isso só depois de ser um programador por alguns anos.

O que aplico diariamente na minha carreira atual é lógica e talvez operações de conjunto. As definições recursivas e a teoria dos grafos realmente só foram úteis para entrevistas. Mas leve isso com cautela, porque sou um desenvolvedor móvel. Um desenvolvedor de back-end provavelmente consideraria a teoria dos grafos muito útil.

Estruturas de dados

Essa aula foi boa. Muito bom. As estruturas de dados são usadas em toda a programação de computadores e são a espinha dorsal da maioria dos códigos que as pessoas escrevem. Eles nos permitem armazenar dados de uma forma útil para os programas que escrevemos. A capacidade de examinar os dados e saber a melhor maneira de armazená-los para desempenho no tempo e no espaço é uma habilidade muito útil de se ter.

Aprendi sobre matrizes, pilhas, listas vinculadas, listas duplamente vinculadas, árvores, gráficos, pilhas e todos os diferentes sabores dessas estruturas de dados (como árvores de auto-equilíbrio). Esta aula não apenas me ajudou a entender as estruturas de dados, mas também me ajudou a organizar melhor os dados que eu estava armazenando.

Esta aula foi feita em C, o que a tornou ainda mais interessante. C pode ser muito exigente, mas também muito poderoso se usado corretamente. Tive de ter muito cuidado com a forma como aloquei e limpei a memória, o que também foi muito bom para ensinar sobre gerenciamento de memória.

Havia tantas coisas úteis nesta aula que é difícil abordar todas elas. Eu nem sequer mencionei o fato de que este é um componente chave do conhecimento para entrevistas em tecnologia. Se você tem dúvidas sobre as estruturas de dados, comece a revisar alguns conceitos básicos, porque eles são muito importantes.

Análise de Algoritmos

Esta aula foi um tanto útil. Algoritmos são úteis. Eles conduzem o melhor software do mundo e os tornam poderosos o suficiente para permanecerem relevantes no mundo moderno. Mas esta aula teve alguns problemas.

A parte mais útil disso foi aprender a notação Big O. A notação Big O permite que você avalie o código e entenda como ele funcionaria em termos de tempo e espaço. Em geral, se você estiver medindo o desempenho do código em uma empresa, usará um cronômetro para controlar o tempo entre as interações. Isso permite que você veja o desempenho do seu software. Isso requer que você escreva o código e avalie os resultados posteriormente.

A notação Big O permite que você faça avaliações do desempenho do código apenas olhando para o código. Não quero entrar muito nisso, mas se você não conhece a notação Big O, leia esta postagem do blog.

Os algoritmos reais que examinamos não eram tão úteis. Só me lembro do problema da mochila e do problema do caixeiro-viajante. Eu também tive que escrever código para eles em grupos, o que não foi ótimo, porque havia uma pessoa no meu grupo que foi além do seu escopo. Isso significa que acabei escrevendo menos código para a implementação final de cada vez do que gostaria.

Uma compreensão básica de quais algoritmos famosos existem, sua finalidade e como são implementados pode ser útil (principalmente para entrevistas). A notação Big O é a chave aqui. É muito útil no trabalho e também incrivelmente útil para entrevistas.

Desenvolvimento web

Essa classe teve a maioria das habilidades que eram diretamente aplicáveis ​​a um trabalho em tecnologia. Aprendi sobre HTML, CSS, JQuery, JavaScript, PHP e JSON. Aprendi como uma solicitação é enviada de um front-end de um site para um back-end, como é processada no back-end e depois enviada de volta para o front-end com uma resposta. Aprendi como criar IU e como interagir com uma camada de dados que então interage com a rede.

No final da aula, criei meu próprio site e tomei a iniciativa de aprender Angular. Usei o Angular para deixar meu site chamativo, o que acabou me rendendo meu primeiro estágio. Também adquiri uma boa compreensão de como um site funciona nos bastidores.

Esse conhecimento por si só foi ótimo, mas eu também aprendi como pegar e aprender uma linguagem, estrutura ou formato de dados desconhecido e trabalhar com ele na hora. Pesquisei muito sobre esses tópicos para ver exemplos concretos. Aprendi como usar documentação e investigação online para entender melhor um conceito que precisava aplicar diretamente em um curto espaço de tempo. Esta é uma habilidade fundamental para ser um programador hábil.

Introdução aos bancos de dados

Quase sempre aprendi SQL nesta aula. Tenho certeza de que examinamos alguns outros conceitos, como fragmentação e agrupamento, mas não me lembro deles. Às vezes, uso o SQL em meu trabalho atual para executar consultas de dados para eventos que registrei. O SQL será parte integrante do seu trabalho ou você mal o usará. Se precisar, aprenda e torne-se um especialista. Do contrário, não se preocupe muito com isso.

Engenharia de Software I, II

Também outra aula da qual não consigo me lembrar. Acredito que examinamos vários conceitos gerais nesta aula. Cobrimos os métodos de gerenciamento de projetos Scrum e Waterfall. Repassamos os testes e todos os diferentes tipos de testes que existem. Cobrimos alguns conceitos de usabilidade e acessibilidade. Na verdade, era apenas um resumo dos conceitos que não se encaixavam em suas próprias classes.

Devido à natureza patchwork da classe, eu realmente não internalizei nenhum dos conceitos muito bem. Foi bom ter uma visão geral básica dos conceitos abordados, mas gostaria que mais tempo fosse dedicado a tópicos individuais importantes, como testes.

Arquitetura de computador e linguagem assembly

Lembro-me vividamente dessa aula. Esta aula explica como funciona um computador. Como as instruções da máquina são enviadas e processadas pelo computador. Também escrevemos alguns códigos em MASM, que é uma linguagem assembly que interage muito estreitamente com o código de máquina.

A maioria das linguagens de programação que eu usei para fazer este curso eram linguagens de alto nível. Linguagens de alto nível tendem a estar mais próximas da linguagem humana do que do código de máquina. MASM está muito próximo do código de máquina e eu diria que está mais perto da linguagem de máquina do que da linguagem humana.

A parte mais importante desta classe é ter uma ideia do que acontece com o código depois que ele é compilado. Compreender as diferentes unidades lógicas em um computador e como seu código é tratado por elas foi muito interessante.

Para fins práticos, não acho que esta aula foi muito importante para contribuir para minha carreira em tecnologia. Não usei muito do conhecimento que ganhei com essa aula durante minha carreira até agora.

Sistemas operacionais

Vou ser sincero, estou tendo muita dificuldade em lembrar o que aprendi nesta aula. A única coisa que me lembro é de construir um programa de mensagens que usava programação de socket em C para se comunicar. Também aprendi como abrir arquivos e manipular pastas usando scripts.

Quero ser franco sobre o que me lembro da minha graduação e o fato é que não me lembro muito dessa aula. Simplesmente não usei muito do conhecimento adquirido com isso em minha carreira atual.

Introdução às Redes de Computadores

Esta aula foi muito útil. Revisou como as redes de computadores funcionavam. Isso incluiu passar por protocolos de rede como HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH e DNS. Eu aprendi sobre para que cada um desses protocolos é usado, como eles são implementados e entendi por que foram criados.

Os protocolos de rede que mencionei acima são usados ​​para funções críticas de software moderno. Isso inclui manuseio de e-mail (POP3 e IMAP), envio de solicitações de rede entre cliente e servidor (HTTP, HTTPS) e manuseio de dispositivos com segurança por meio de uma rede (SSH). Isso realmente dá a você uma compreensão de como a Internet funciona e como os dispositivos em todo o mundo podem interagir uns com os outros.

Isso não é apenas fascinante, mas pode ser útil. Usei o que aprendi nesta aula para depurar problemas que encontrei quando estava recebendo erros da rede. Consegui identificar os problemas que estava enfrentando e ajudar o desenvolvedor de back-end com o qual estava trabalhando a encontrar o bug em seu final.

Introdução à Engenharia de Usabilidade

Esta aula abordou como fazer um aplicativo intuitivo, mas também como tornar um aplicativo ou site acessível. Acessibilidade refere-se a tornar um software utilizável por qualquer pessoa, incluindo pessoas com deficiência. Isso cobre coisas como texto em fala e software de design que não depende totalmente apenas de elementos de áudio.

Os tópicos abordados foram úteis se você nunca ouviu falar sobre acessibilidade antes. Pelo menos fez você considerar essas coisas ao projetar software. Isso também me fez começar a pensar sobre a experiência do usuário e como ela é importante para um bom software. Se ninguém estiver usando a funcionalidade principal de seu aplicativo porque é confuso, seu software eventualmente perderá todos os usuários.

Embora o conhecimento seja interessante, as implementações específicas de como você criaria um software utilizável e acessível depende da plataforma. Por exemplo, a Apple tem seu próprio conjunto de diretrizes de interface do usuário que descreve os princípios gerais de design e detalhes específicos de como você deve projetar software que será executado em qualquer uma das plataformas da Apple.

Devido às informações específicas necessárias por plataforma, não tenho certeza se esta aula foi extremamente útil. Foi uma boa introdução, mas acabei tendo que aprender as diretrizes de interface da Apple, que abrangem todos os tópicos abordados nesta aula.

Desenvolvimento de software móvel e em nuvem

Vou manter este curto. Eu já era um engenheiro móvel quando fiz esta aula. Eu construí um aplicativo móvel de baixa qualidade em poucas horas para terminar minha graduação o mais rápido possível. A essa altura, eu já havia alcançado meu objetivo de conseguir um emprego como engenheiro de software, mas só precisava terminar meu curso de ciência da computação porque estava quase terminando. Meu coração não queria aprender neste momento.

Mesmo com isso dito, não acho que essa aula foi muito bem ministrada. Foi desenhado preguiçosamente. Eles encorajaram as pessoas a escrever um código para um aplicativo do Windows phone para esta classe, e a demanda por esses trabalhos é muito menor do que outros. E eu sinto que isso só foi encorajado porque o ambiente é mais fácil de configurar e o código pode ser escrito em JavaScript e se assemelha ao desenvolvimento web.

Além disso, ficou claro para mim que a pessoa que ministrava a aula não conhecia todas as plataformas de aplicativos móveis. Fomos obrigados a escrever uma pequena parte do back-end, mas eu realmente não queria. Acabei falsificando uma solicitação da Web ao ler do disco e retornar uma resposta automática após alguns segundos. Isso funcionou porque eu só tive que enviar uma demonstração e o código-fonte. E tenho a sensação de que a pessoa que está avaliando apenas olhou para a demonstração.

No geral, a aula ensinava tecnologia desatualizada e sem uso, não era avaliada adequadamente e realmente não oferecia muita orientação. Esta não foi uma aula muito boa.

Projeto de software Capstone

Falando em tecnologia desatualizada, este projeto exigiu que construíssemos uma GUI para acessar um banco de dados usando curses. Aqui está o projeto completo se você estiver interessado. Não conseguimos escolher qual era o nosso projeto final, ele foi designado para nós. E todos tiveram que fazer o mesmo projeto. Também foi feito em grupos de 3, então você realmente cobriu apenas uma pequena parte do projeto. Esta foi uma aula realmente mal administrada.

A interação com a professora era praticamente inexistente. Eu não tinha nenhum interesse no projeto e o que estávamos aprendendo parecia absolutamente inútil. Para criar interesse em um tópico, você precisa permitir que as pessoas tenham algum livre arbítrio quando se trata de escolher o que aprendem. Não ter escolha em seu projeto final é uma tolice. Este projeto é inútil para a maioria dos planos de carreira e não faz sentido forçá-lo às pessoas.

A classe deveria ter feito cada aluno enviar uma proposta com estimativas aproximadas de um cronograma de quando eles terminariam cada subparte do projeto. Isso leva a duas coisas: fazer com que as pessoas comecem a praticar o trabalho de estimativa e permitir que elas trabalhem naquilo em que estão interessadas. A classe teria sido 100 vezes melhor dessa forma.

Pensamentos finais

Eu poderia não ter assistido boa parte das aulas e ainda ser o engenheiro de software que sou hoje. Mas acho que perder alguns desses cursos pode deixar uma grande lacuna no seu conhecimento como desenvolvedor. Os tópicos que eu acho que todo engenheiro de software deveria ter algum conhecimento são Estruturas de Dados e Algoritmos.

As outras classes dependem da carreira que você escolher. Se você decidiu entrar no desenvolvimento embarcado, deve aprender sobre arquitetura de computador. Se você decidir se tornar um engenheiro de front end, você deve aprender sobre redes de computadores.

A principal lição aqui é que um bom engenheiro está aprendendo constantemente. Se você está perdendo algum conhecimento que sabe que seria útil e aplicável em seu trabalho, faça um curso para adquirir esse conhecimento. É assim que você fica melhor em escrever um bom código. Esteja sempre aprendendo.

Gostou do que leu? Confira meus outros artigos

Começar uma carreira em tecnologia do nada.

Escolha a melhor carreira em tecnologia para você - Dev Ops, Engenheiro de dispositivos móveis, Cientista de dados, Gerente de projetos e Front-end.

Dicas para sua primeira entrevista técnica.

Você deveria se formar em ciência da computação?

Swift vs. Objective-C