Disciplinas de CS que um aluno de graduação deve conhecer [fechado]

34

Na faculdade, nunca me interessei por teoria. Eu nunca li isso. Não importa o quanto eu tentei, eu era incapaz de ler as coisas e não sabia o que realmente estava acontecendo na prática. Como, por exemplo, no meu curso de teoria de autômatos, meu professor me disse tudo sobre o aspecto matemático, mas nem uma vez ele mencionou onde seria usado na prática. Este é apenas um exemplo.

Consegui passar na faculdade e estagiei em uma empresa também, onde fiz um projeto e, felizmente, eles não se preocuparam com minhas notas, pois estavam acima da média.

Agora, estou interessado em saber de quais assuntos um estudante de CS deve estar absolutamente e positivamente ciente? Assuntos que podem ter relevância no setor. Isso ocorre porque tenho um tempo livre em minhas mãos e isso me ajudaria melhor a ter um bom entendimento deles.

Quais são as suas sugestões? Como por um lado, algoritmos é um assunto.

Karl
fonte
3
Expressões regulares são baseadas na teoria de autômatos e ajudarão você se precisar analisar alguma coisa. Fiz e aprendi coisas na escola que se mostraram irrelevantes para os empregos que tive, mas isso diz pelo menos tanto sobre o que trabalhei quanto sobre o que aprendi. Nada que eu aprendesse seria inútil em campo sob todas as circunstâncias.
David Thornley
2
Eu odeio trabalhar com seu tipo ... jk (mais ou menos). Se eu fosse você, primeiro reservaria um tempo para revisar as coisas que você deveria saber da escola - dessa maneira você não pareceria um idiota em sua próxima entrevista. Depois disso, eu aprenderia uma quantidade razoável de estruturas de dados e algoritmos que parecem que podem ser usados ​​no mundo real. Você precisa descobrir onde quer estar. Se você é desenvolvedor de jogos, provavelmente precisará de álgebra linear, gráficos 3D e geometria computacional. Em geral, você precisa revisar no mínimo as str de dados, alg, banco de dados, SO e compilador e continuar aprendendo.
Job
É difícil nomear um aplicativo específico para a teoria de autômatos da mesma maneira que é difícil nomear um aplicativo específico para aritmética. Um exagero, talvez, mas não tanto assim. Os diagramas de estado geralmente são úteis, e manipulá-los no código é útil para vários propósitos. As árvores de decisão (minimizadas em dígitos) são um exemplo relativamente recente para mim, e eu até precisei usar modelos de estado (de forma canônica) como chaves em contêineres. Se você não pode ver aplicativos dentro de aplicativos, pense em termos de adicionar uma camada de geração indireta de código.
precisa saber é o seguinte
1
Você está recebendo muitas ótimas respostas de CS abaixo, mas acho que, ao limitar sua pergunta, você está perdendo algumas das coisas mais úteis que vi nos últimos 15 anos desde que recebi meu BSCS, o que diferencia as pessoas que se saíram bem na indústria: comunicação em pequenos grupos e habilidades de trabalho em equipe. Por mais bobo que pareça, vá ao departamento de fala / linguagem / teatro e faça uma aula como "comunicações em pequenos grupos" ou "liderança / gerenciamento de equipe / grupo". Mesmo se você não planeja administrar, as habilidades que você adquirir lá o tornarão um melhor engenheiro e membro da equipe.
cabbey

Respostas:

41

Acredite ou não, uma das coisas que se revelou de importância crítica para mim mais tarde foi a Construção de Compiladores. Não é a versão moderna de namby-pamby usando Lex e Yacc, isso é para manequins.

Construção REAL do compilador, onde você escreve seu próprio scanner e analisador de símbolos desde o início.

Isso é algo que pensei que nunca mais usaria novamente. Mas nos últimos 20 anos esse curso comprovou seu peso em ouro 4 vezes. Todo processador de comando que eu tive que escrever, todo scanner de mensagens recebidas, todo expedidor de usuário, todo intérprete de script, usou os princípios desse curso. Faça assim e a vida é doce, clara e simples. E até dei todas as informações a um colega que não havia feito isso - ele precisou realmente escrever um compilador para uma máquina abstrata. O que devo acrescentar passou a ter muito sucesso comercial.

Se eu tivesse que subir e agradecer a um professor universitário em qualquer assunto, seria esse. Sem isso, eu teria sobrevivido, mas minhas soluções teriam sido muito mais feias.

(E antes que alguém pule e diga "bem, você poderia ter usado lex e yacc ..." a resposta é, talvez - depende muito do sistema. Em alguns casos, as linguagens de programação não eram C (por exemplo, PL / M e Ada), em alguns casos, não havia Lex ou Yacc prontamente disponíveis para a plataforma. Saber o básico significa que uma solução está disponível, em vez de torcer as mãos, tentando descobrir como dobrar alguma ferramenta para atender ao problema.)

rapid_now
fonte
6
O +1 Compilers foi um dos meus cursos favoritos na uni e é sempre útil. Eu raramente usei lex / yacc / bison, os fundamentos são de uso muito mais concreto.
Orbling 01/01
Eu concordo totalmente, embora por uma razão diferente. Conhecer como escrever o gerador de código - embora eu tenha usado Lex e Yacc - foi minha primeira e melhor imersão em programação orientada a objetos.
Peter Turner
Você pode (e também deve saber como) escrever o gerador de código em C simples ou em outra linguagem não OO. Então, é uma lição escrever textos muito grandes de código processual e dividir a geração do analisador / scanner / código em fases sensíveis e inteligíveis.
quickly_now
Os Compiladores +1 incorporam tantos padrões e princípios que permitem ver o design e o código sob uma luz completamente diferente depois de executá-lo.
Andrew T Finnell
2
"Isso é algo que pensei que nunca mais usaria novamente." Se eu tivesse um dólar para cada vez que eu disse que para mim quando eu era mais jovem ....
Nick Spreitzer
37
  1. Estruturas de dados / algoritmos, especialmente gráficos. A quantidade de situações do mundo real nas quais eu consegui usar algoritmos relacionados a gráficos foi uma surpresa para mim. Concentre-se em conhecer as características de quando uma estrutura ou algoritmo de dados é apropriado. Ser capaz de ver um problema e saber usar programação dinâmica / algoritmo ganancioso, por exemplo, é importante e pode economizar muito tempo.

  2. Conhecimento prático da complexidade computacional. Você não precisa saber de antemão qual é o tipo de limite inferior da raiz, mas saber como descobrir o pior tempo de execução de algo que você escreve é ​​importante, especialmente para projetos críticos de desempenho.

  3. Conceitos de sistema operacional. Gerenciamento de memória, agendadores, etc. Todo desenvolvedor realmente deve ter uma sólida compreensão dos sistemas operacionais, pois o código que você escreve está constantemente interagindo com ele.

  4. NetSec. Eu encontrei muito poucos desenvolvedores que têm um entendimento sólido das preocupações básicas de segurança com o desenvolvimento (estouros de buffer, xss, SQLI, etc.). Isso é realmente necessário se você quiser ter sucesso na indústria. É ótimo se você pode escrever a próxima grande novidade, mas não terá muitos usuários por muito tempo se não proteger os dados deles.

  5. Paradigmas de programação. Conhecer as características e diferenças entre programação OO / funcional / processual. Uma das melhores aulas de graduação que eu já tive foi escrever 20 intérpretes de instrução simples para fortan, esquema, prólogo etc. nos próprios idiomas. Apenas a própria exposição pode realmente ajudá-lo a entender os conceitos fundamentais do desenvolvimento de software.

Kurtis
fonte
1
+1 É necessária uma lista inteira, (4) em particular, é sempre tão importante na era moderna distribuída.
Orbling 01/01
1
+1 em estruturas de dados / gráficos. O número de programadores que conheço que não sabem como usar corretamente um Hashtable ou por que uma lista vinculada em vez disso, uma matriz simples em alguns casos, me surpreende todos os dias.
Machado
+1 para paradigmas de programação. Uma boa compreensão dos contrastes entre os diferentes tipos de idiomas ajuda muito.
precisa saber é o seguinte
19

Atender aos requisitos de graduação não é necessariamente suficiente para ser o melhor cientista da computação que você pode ser. Para um currículo típico da faculdade, aqui estão as dez principais coisas que você deve aprender:

  1. O básico da economia - Um curso introdutório que aborda tópicos como complementos e substitutos é vital para trabalhar na economia maior, ou simplesmente para entendê-la. Embora o conceito de um Giffen Good não o ajude necessariamente, conhecer as externalidades o ajudará. Também pode ajudá-lo a perceber que mais situações são ganha-ganha do que você imagina.

  2. Como escrever uma prova - Todos os profissionais de ciência da computação devem saber como escrever uma prova. E a matemática discreta, embora faça parte de um café da manhã bem equilibrado, não conta. [A indução é apenas uma técnica de prova, e você pode sobreviver sem realmente saber muito sobre provas.] É necessário um curso de álgebra ou análise real para realmente escrever provas. Por álgebra, quero dizer teoria de grupos ou álgebra abstrata, não o curso que você fez no ensino médio. Para o benefício total, faça álgebra e análise real no mesmo termo.

    Por que a redação de provas é essencial? Porque é programação! Pense em quando você aprendeu a programar: se uma tarefa exigia umife um loop, você pode não ter tido nenhuma intuição sobre onde colocá-los em relação um ao outro. Mas agora a mesma tarefa pareceria completamente natural. Escrever uma prova é muito semelhante. Você aprende um conjunto de truques e, depois de aprender, as coisas parecem bem diferentes.

  3. Como escrever - As habilidades de comunicação por escrito são essenciais, independentemente de você trabalhar na indústria ou na academia. É melhor que você encontre um curso de mecânica, e não um curso de redação eficaz sobre um tópico diferente. Ou seja, muitas escolas tentarão tornar os cursos de redação mais relevantes ou interessantes, tratando-se de um tópico especial. Tente ir para a versão "chata" do curso.

  4. Probabilidade e estatística - Existem algumas coisas que você só aprenderá adequadamente fazendo um curso. Juntamente com os principais requisitos de CS (que devem fornecer matemática discreta, cálculo de variável única e variável múltipla e álgebra linear) e álgebra e / ou análise real, a coleta de estatísticas provavelmente lhe dará um pouco de matemática. As estatísticas de aprendizado podem ajudá-lo a trabalhar com outros cientistas em seus projetos.

  5. O tópico atual atual - nas décadas anteriores, pode ter sido bancos de dados ou programação orientada a objetos. Hoje, pode ser programação da Web ou arquitetura orientada a serviços. Qualquer que seja a moda atual, faça um curso nela. Se apenas para ver o que é a moda.

  6. O problema da parada - a maioria dos problemas não pode ser resolvida por máquinas. Essa é uma ideia bastante profunda que nossa cultura absorveu tão bem que não parece mais chocante. O mesmo acontece com o rádio, Goedel e a bomba atômica; não foi até a arte pós-moderna e a guerra fria que pudemos mais uma vez lidar com esses conceitos. No entanto, fazer um curso em teoria da computabilidade pode sensibilizá-lo novamente para essa prova bastante surpreendente.

  7. Programação funcional pura - Você provavelmente não entrará em programação funcional pura, a menos que você pesquise nela ou trabalhe para algumas poucas empresas, mas saber que isso o ajudará a ser um programador melhor. O motivo é que você aprenderá muitas novas formas de abstração e conceitos como números e continuações e mônadas da Igreja e, sim, recursão, e essas ferramentas também podem ser aplicadas ao seu próximo programa Java.

  8. P e NP - OK, este já está no seu caminho crítico, mas preste atenção de qualquer maneira. Você quer ter certeza de que pode corrigir alguém quando ele chamar incorretamente NP de “não polinomial”. Como se!

  9. Os tópicos do curso que você com certeza odeia - este pode ser um curso de CS que você encontra em um nível muito baixo, muito teórico ou não, que você acha muito questionável, muito difícil ou muito chato . Se um curso como esse parece ser um problema para você, e você se encontra explicando para outras pessoas por que está tão feliz por não precisar fazer isso, você deve aprender muito fazendo o curso! Talvez você não aprenda os materiais do curso, mas aprenderá sobre seus próprios limites e talvez mais sobre as justificativas que faz a si mesmo. [Dica: Eles geralmente são fracos.]

  10. O curso não-CS que você certamente adorará - No final, você deve se divertir. Este é o curso em que você provavelmente tirará o mínimo proveito, mas faça-o assim mesmo. Faça isso uma vez. Se você gosta de muitos cursos, então é bom para você, mas certifique-se de que não atrapalhe o restante dos cursos desta lista.

Minha abordagem aqui tem sido prática, com base nos cursos que você pode fazer. E me concentrei em objetivos de aprendizado que provavelmente serão aprendidos. Nota: Esta resposta foi adaptada de uma publicação minha em Dez Coisas que Todo Especialista em Ciência da Computação Deve Aprender .

Macneil
fonte
Uma explicação para o voto negativo seria útil. Talvez eu possa mudar minha resposta e você possa mudar de idéia.
Macneil
Professor, eu não votaria na sua resposta, mas há uma coisa com a qual eu vou discutir. Prova de escrita: Até hoje, ainda não consigo escrever uma prova discreta, a menos que você me peça para provar que um número é ímpar ou par. Não vejo a conexão entre isso e a indústria. Talvez eu esteja sentindo falta do "Aspect Solving Problem?". Eu nunca poderia envolver meu cérebro em torno da indução matemática ou do lema de bombeamento. Eu não acho que isso está me atrasando.
Bryan Harrington
Escrever uma prova é como escrever um programa. Aprender a provar que um * 0 = 0, por exemplo, é como o FizzBuzz da matemática (bem, talvez seja um pouco mais difícil). Parece intimidador a princípio, mas logo você aprende os pequenos truques, assim como você aprendeu a programar. As provas podem ter estruturas diferentes que podem ajudá-lo a pensar recursivamente e estruturalmente. Como eu disse, um curso discreto de matemática não serve para aprender provas reais. Você precisa de teoria de grupo ou análise real para isso.
Macneil
Embora o conhecimento de elogios seja certamente útil, acredito que o conhecimento de complementos é mais relevante para a economia.
IJW
1
@ijw: Em relação a economia para os estudantes CS, Joel tem uma boa discussão vale a pena ler: joelonsoftware.com/articles/CollegeAdvice.html
Macneil
8

Depois de conversar com alguns representantes e amigos da empresa que fizeram muitas entrevistas:

  • Bases de dados
  • OOP
  • Algoritmos
  • Estruturas de dados

tendem a ser "obrigatórios" para novos contratados (ou como eles disseram, cursos "altamente recomendados").

Outros cursos que podem ser úteis são segurança de computadores, montagem e arquitetura de máquinas. Muitos de meus professores também me recomendaram um curso de compilador. Além disso, se você tiver tempo, recomendo cursos de matemática como teoria dos grafos, matemática discreta e combinatória. Você aprende muitas habilidades de raciocínio nessas classes que a maioria dos cursos de CS aprova, mas acaba sendo muito útil ao escrever programas muito complexos.

Espero que ajude!

K-RAN
fonte
1
Concordaria com OOP e estruturas de dados.
apoorv020
4
Estruturas básicas de dados ... muuuitooooooo importante. Mais importante, eu acho, do que POO. Você precisa pensar em como armazenar e organizar informações. E se no sistema incorporado, o layout na memória de suas estruturas de dados é algo de vida ou morte.
quickly_now
3
+1 nas aulas de matemática. Eles também ajudam você a aprender a acompanhar grandes problemas / sistemas.
Michael K
1
Networking é uma boa a fazer também.
Keyo 01/01
OOP? Você pode programar em Haskell ou C sem OOP ... Darei a você que é amplamente utilizado, mas não acho que seja fundamental. A exposição a vários paradigmas, por outro lado, parece bastante útil.
Matthieu M.
6

Depende em grande parte do que você planeja fazer com o diploma. Parece que a maioria dos especialistas em CS acaba sendo algum tipo de engenheiro de software. Com isso em mente, eu realmente não sei por que mais pessoas não apenas se especializam em engenharia de software. Suspeito que não haja programas suficientes de engenharia de software disponíveis, especialmente em instituições públicas.

Eu venho de um terreno de trás incorporado. Todas as pessoas com quem trabalho tinham diploma de EE ou CE e isso ocorre em parte porque, quando os "idosos", quando estudavam, não havia muitos programas de EC disponíveis. Portanto, é bastante óbvio que, se você deseja trabalhar no campo incorporado, é desejável um background de hardware.

Independentemente do campo em que você deseja trabalhar, acredito que todo programador deve fazer um curso de montagem de programação. Você pode nunca utilizá-lo, mas ele ensinará exatamente o que está acontecendo no nível do processador durante uma chamada de função, como as interrupções são tratadas, como a memória é estruturada ou como os diferentes modos de endereçamento são usados. Acredito que tudo isso fará de você um programador melhor.

Além disso, embora possa não ser aparente, alguns são tópicos importantes ao considerar Estruturas de dados e algoritmos para uma plataforma específica.

Pemdas
fonte
+1 porque um diploma em ciência da computação oferece experiência com uma ampla variedade de assuntos / tecnologias. Apenas preste atenção ao curso de design de software.
Mr. Ant
+1 Para montagem, sempre é aconselhável entender realmente o que está acontecendo na parte inferior da pilha. Seria bom se todos conhecessem o hardware também, mas para muitos seria um passo longe demais.
Orbling 01/01
5

Existem 2 maneiras de responder sua pergunta. Deixe-me tentar os dois. A primeira maneira é analisar as coisas do ponto de vista do mercado de trabalho em potencial, das habilidades de codificação etc. Então, aqui está minha lista:

  1. Estrutura de dados
  2. Análise de algoritmo
  3. Programação Orientada a Objetos
  4. Um curso específico em C ++ ou Java
  5. Sistemas operacionais
  6. Design da interface do usuário
  7. Programação Paralela

A segunda maneira é olhar as coisas de uma perspectiva um pouco abstrata e, quem sabe, também pode ser um pouco filosófico. A lista a seguir pode não ter as habilidades mais exigentes que o mercado de trabalho exige, mas tenho certeza de que quando você sair desses cursos, terá uma apreciação mais profunda da arte de desenvolver software.

  1. Linguagem finita e teoria dos autômatos
  2. Construção do compilador
  3. Teoria dos grafos
  4. Inteligência artificial
Fanatic23
fonte
Não liste apenas um conjunto de cursos que, na sua opinião, você considera essenciais, forneça razões e experiências que você ditou e que ditou sua lista.
2

Eu também acrescentaria Engenharia de Software ou Práticas de Design à lista, embora seu conteúdo seja geralmente escolhido pelos estudantes do setor.

Além disso, na minha opinião (embora não seja apoiada por muita experiência), as empresas realmente não querem a maioria das coisas teóricas ensinadas em cursos como bancos de dados etc., querem que as pessoas entendam e sejam capazes de usá- las.

EDIT: Devido ao voto negativo, sinto vontade de explicar a minha resposta. Sou estudante de ciências da computação no último ano e minha experiência é baseada em meu estágio e entrevistas de emprego com empresas líderes no campo. Na minha experiência, as pessoas raramente precisam usar algoritmos complicados ou codificar estruturas de dados muito complicadas em entrevistas ou trabalhos.

Mais útil se você pode criar e usar bancos de dados, usar controle de origem, saber depurar adequadamente, saber usar padrões de design etc. No entanto, como eu disse, essas habilidades são geralmente adquiridas na indústria e não abordadas em cursos. As práticas de engenharia / design de software geralmente envolvem a construção de um projeto de tamanho médio, muito útil para o aprendizado de todas essas habilidades.

apoorv020
fonte
Forneça mais detalhes sobre suas experiências e por que alguém deve fazer esses cursos.
@ Mark: Você pode explicar a lógica por trás do voto negativo?
apoorv020
@ apoorv020 sem explicar por que você está recomendando práticas de engenharia ou design de software, sua resposta não é útil. Sua edição ainda não explica por que você está recomendando.
@ apoorv020 o único valor que resgata as práticas de engenharia ou de design de software é que você normalmente cria um projeto de tamanho médio (o que isso significa)? O que você aprendeu pessoalmente ao fazer esses cursos?
Eles são bons de saber, mas estes não são assuntos de CS.
Thomas Owens
2

Coisas que aprendi na faculdade que uso todos os dias:

  • Metodologia de design orientado a objetos
  • Padrões de design
  • Expressões regulares
  • Algoritmos e análise básicos
  • Estruturas de dados

Eu gostaria de ter feito um curso de banco de dados. (Eu peguei o suficiente para sobreviver desde que me formei, mas gostaria de saber mais.) Também gostaria que o controle de versão fosse ensinado - é onipresente, extremamente útil e foi completamente ignorado no currículo da minha escola.

Eu tive que fazer vários cursos de matemática. Não uso cálculo desde que me formei. Eu gostaria de fazer um curso de estatística. (Novamente, eu peguei o suficiente para sobreviver desde que me formei, mas gostaria de saber mais.)

Além do departamento de CS, faça um curso de redação. Boas habilidades de comunicação por escrito são essenciais para o sucesso.

pwc
fonte
+1 Surpreso que os bancos de dados não eram obrigatórios em seu curso, geralmente considerado um componente essencial.
Orbling 01/01
Isso foi. Eu saí disso por questões técnicas e me arrependo.
pwc
@Orbling: Muitas vezes, pequenos departamentos (em oposição aos das grandes escolas estaduais) simplesmente não têm professores suficientes para exigir todos os tópicos principais. Na minha escola, por exemplo, os bancos de dados eram eletivos.
Macneil
@ Macneil: No meu curso, o curso de bancos de dados primários era um pré-requisito (cobrindo todos os princípios básicos: modelagem de ER, formulários normais, SQL (não apenas SQL básico, composto / aninhado, etc), posicionamento de índice etc.), o último, mais complexo , os cursos de banco de dados eram eletivos (acho que eram três no total). Eu nunca decidi aceitá-los, pois achei que eram coisas que eu poderia absorver de forma independente com mais facilidade do que outros cursos que eu perderia. Acho que tomei OR avançado em vez disso.
Orbling 01/01
@pwc: Aposto que você se lembra por que saiu disso, em vez de como?
Orbling 01/01
2

Existem muitos cursos importantes, dependendo da direção que você planeja seguir. No entanto, supondo que você possa programar, o curso mais importante deve ser:

  • Estruturas e algoritmos de dados

    Praticamente tudo na computação volta ao tratamento de dados usando algoritmos. Preste atenção especial a matrizes e hashtables, pois elas são de longe as estruturas de dados mais úteis em uso comum, mas listas, árvores e gráficos (bem, listas são tipos restritos de árvores e árvores são tipos restritos de gráficos) vão seja importante também. Além disso, entender algoritmos é vital para produzir código que não é terrível. (Caso contrário, você fará coisas terríveis, como usar um algoritmo O ( n 3 ) onde um O ( n log n ) o fará.) Se o seu diploma em CS não tiver um curso DS + A obrigatório , não é CS. Ou engenharia de software. Ou mesmo apenas programação.

Além disso, o curso que achei mais útil ao longo dos anos em vários campos foi:

  • Concorrência

    Existem muitos aspectos na concorrência, mas eu esperaria uma compreensão da diferença entre memória compartilhada e passagem de mensagens. Eu também gostaria que houvesse uma forte cobertura de estratégias de bloqueio (mutexes, semáforos etc.) e transações.

    Isso é vital para entender a paralelização, é claro, mas também é essencial para qualquer coisa distribuída (por exemplo, escrever um serviço exposto à Internet, mesmo que seja de thread único, pois os clientes serão assíncronos de qualquer maneira). Entendo que também é útil para escrever jogos (que geralmente são multithread) e trabalhar com dispositivos incorporados.

Além disso, acho que é do interesse da maioria dos estudantes de graduação serem expostos a tantas idéias diferentes quanto possível. Muitas linguagens de programação e paradigmas. Muitas áreas de aplicação diferentes. Uma quantidade razoável de matemática (novamente, porque é útil com frequência) e também alguma exposição a fatores humanos e psicologia (porque qualquer software que interage com os usuários está lidando com pessoas). Afinal, você nunca sabe exatamente o que fará no futuro, portanto, planejar a flexibilidade é uma ótima estratégia de vida.

Donal Fellows
fonte
1

Quando eu estava na faculdade, havia muitos tópicos sobre os quais eu não via utilidade na minha vida real e às vezes essa intuição foi comprovada (métodos formais são realmente práticos apenas para problemas triviais na maioria dos casos) e outras vezes está completamente errado (a notação Big-O é muito útil), então acho que, em geral, meu eu mais jovem fazia parte do certo.

Se você deseja se preparar para o mundo real, além do que a K-Ran recomenda acima, sugiro ler o Código Completo e usá-lo como base para uma pesquisa mais aprofundada sobre os tópicos que você achar difícil ou que não tem. suficientemente coberto.

glenatron
fonte
Às vezes, acho úteis métodos formais, embora obviamente apenas em componentes pequenos. Pensei em Dijkstra et al. como dizendo algo como "Se você é um matemático perfeito, pode ser um bom programador".
David Thornley
Eu suspeito que se você está trabalhando em um código que depende de vida, basicamente você precisa ter uma sólida compreensão dessas coisas. Mas para o trabalho que fiz, nunca foi necessário. Se eu fiz necessidade agora, eu teria que voltar e reaprender a partir do zero ...
glenatron
Coisas como Z são realmente usadas apenas para software de missão crítica em organizações onde, como você diz, vidas estão em risco. No entanto, acho que aprendê-los instila uma percepção muito maior da correção do código e dá profundidade a todos os tipos de especificação. Às vezes, o que você aprende não é por si só, mas ajuda a garantir o que está acima.
Orbling 01/01
Pense nisso como fazer blocos de construção maiores e sólidos. Se você provou que seus componentes estão corretos (e os testou para encontrar os erros estúpidos que você cometeu no design e na prova), você tem menos motivos para se preocupar ao escrever e depurar.
David Thornley
1

Eu acho que você deveria estudar o seguinte:

Sistema operacional: - Mesmo que você não precise que ele funcione como programador, vale a pena saber como um sistema operacional funciona e é esperado de um graduado em CS. Qualquer bom livro pode ajudar.

OOP: - Isso é pão e manteiga. Uma obrigação. Livros, se você quiser perguntar: Seu primeiro livro deve ser: - cabeça primeiro OOAD, então você pode ir para o livro de Grady Booch e Ivar Jacobson

Estruturas de dados e algoritmos: - Muito importante para desenvolver o pensamento lógico e a mentalidade.

Para mim, isso é suficiente. Nunca é tarde demais. :)

Abhi
fonte
1

Como alguém que entrevista candidatos regularmente para trabalhos de programação e alguém que depois de mais de 12 anos na indústria se sente razoavelmente bem-sucedido, sugiro o seguinte

  • Design de banco de dados e SQL: É incrível quantos programadores não conhecem SQL simples e aqueles com boas habilidades em SQL são inestimáveis. Ser capaz de projetar um bom banco de dados pode não ser útil em uma empresa que possui uma estrutura de banco de dados definida, para start-ups e empresas que estão passando por mudanças, é uma OBRIGAÇÃO!
  • Padrões de design. Eles simplesmente o ajudarão a tomar melhores decisões sobre bom design
  • OOP: geralmente é um pré-requisito para a maioria dos cursos, mas ajudará.
  • Algoritmos: como poucas pessoas sabem o que é recursão, muito menos entender quando isso poderia economizar uma grande quantidade de códigos complexos.
  • Estruturas de dados: a maioria das linguagens modernas lida com essas coisas para você, mas entendê-las é a chave para um bom design.

Em seguida, algum trabalho extra curricular, leia:

  • Livros do tipo de certificação. Eles geralmente ensinam o tipo de sintaxe e os operadores abaixo das coberturas. É muito mais importante SABER por que você está fazendo algo, em vez de "porque funciona", que é tão comum.
Codemwnci
fonte
1

Depende , não existe uma boa resposta para esta pergunta.

Programador é um mundo geral para identificar alguém que escreve software de computador.

Agora, lá fora, existem softwares de todos os tipos. Por exemplo, usando a wikipedia como fonte de generalização, podemos encontrar três grandes generalizações :

  • programação do sistema
  • software de programação
  • software de aplicação

No primeiro campo , a programação do sistema desenvolve drivers de dispositivo, sistema operacional, servidores; assim, por exemplo, você pode seguir um curso de sistema operacional.

mas e o software de programação ? aqui, como escreveu a wikipedia, você pode codificar compiladores, depuradores, intérpretes, vinculadores, editores de texto; portanto, um curso de teoria automatizada, teoria da linguagem, linguagem e compiladores pode ser útil.

Não podemos falar de software de qualquer tipo:
- videogames: álgebra, física, cursos orientados a objetos?
- software matemático: cursos de matemática?
- edição de imagens: cursos de matemática, física, algoritmos?
- automação industrial: cursos de matemática, física, algoritmo, robótica?
- software médico: biologia, medicina, que outro curso?
- muita coisa aqui: muitos cursos aqui.

Como você pode ver, é claro que você pode seguir e se tornará útil para o seu trabalho.

Na minha experiência, eu sou um engenheiro de software de sistema e software de aplicativo no campo de segurança (você quer seguir um curso de segurança?). Começando com um pouco de muita experiência em programação, estou ficando mais interessante em algoritmos e sistemas distribuídos e, novamente, sinto desconfortável com a simplicidade do aplicativo de uso geral que escrevi (sniffer, sistema de detecção de intrusão de rede, dissector e detector de protocolo, etc.).

Como você aprendeu amargamente em ciência da computação teórica! você fluiu neste curso? : P

Você aprendeu, por exemplo, que toda a linguagem de computador pode ser ajustada em um conjunto de funções matemáticas computáveis ​​e, por exemplo, se sua experiência seguir o mesmo caminho, logo você ficará desconfortável nesse pequeno conjunto de cálculo e, como eu, poderá começar a ver como o desenvolvimento O software não é tão atraente e surpreendente porque o mesmo DESIGN PATTERN volta novamente (você seguiu os cursos de padrões de design?) e, por exemplo, pode começar a ter mais interesse em POR QUE e COMO a linguagem pode ser traduzida em função matemática e começando a Aprenda que a linguagem de computador não é tão complexa! em breve, por exemplo, você ficará mais surpreso com a pessoa e a psicologia e poderá obter mais interesse e se tornar um bom gerente de projetos! você seguiu os cursos sobre o ciclo de vida do software?

Então agora, qual é o curso que você DEVE TER na sua carreira no CS?

Eu sugiro que você aprenda o máximo que puder em todos os campos, especialmente no campo da teoria, porque no campo de trabalho comum, você logo se sentirá entediado com a pouca complexidade à sua volta e, ao se tornar um trabalhador em tempo integral, terá muito menos tempo para aprender. como as coisas realmente funcionam e muito mais tempo para ver como as pessoas com forte conhecimento teórico projetaram coisas para funcionar e lhe deram a possibilidade de codificar para obter comida em casa.

existe um senso errado de realidade na ciência da computação. um cientista da computação, por exemplo, às vezes está muito longe do desenvolvedor de software.

dê uma olhada na explicação da Wikipedia.

divirta-se com a vida :)

meus 2 centavos.

desculpe pelo meu péssimo inglês.

vaias
fonte
1

De maneira geral, a coisa em que os alunos de CS devem ser fluentes é o inglês.

Sem uma compreensão do inglês falado e escrito, você estará para sempre em desvantagem.

Basta olhar para as inúmeras perguntas que surgem nos sites da Stack. Muitos deles são difíceis de decifrar. Algumas pessoas usam uma mistura de l33t, mensagens de texto (não tenho certeza do termo correto). Outros fazem uma declaração e simplesmente acrescentam um ponto de interrogação enquanto perdem pequenos pensamentos importantes, como verbos ou adjetivos.

Se você não conseguir se comunicar, não será capaz de entender muito menos o que os outros estão dizendo.

Tudo o resto são apenas detalhes. Se você consegue se comunicar, possui pelo menos inteligência média e pode entender o que lê, também pode ter uma programação de carreira bem-sucedida.

Eu não
fonte
1

Chego a isso de uma perspectiva um pouco diferente, pois não me formei em CS, me formei em Engenharia Eletrônica (com especialização em negócios).

Com base nisso, acho que uma lista de coisas que você deve entender é relativamente curta, já que eu (e muitos outros graduados em CS) sobrevivemos felizes sem saber nada sobre o design do compilador ou algo parecido.

O que eu diria que peguei e que acho útil:

  • Design do RDBMS - os RDBMSs ficam atrás da maioria dos sistemas e sites e você deve entender pelo menos o básico do que está acontecendo (aprendi isso no trabalho).
  • Design básico da interface do usuário - todos os melhores programadores com quem trabalhei poderiam produzir um aplicativo utilizável que não era feio como o inferno. Exceto um, mas ele é a exceção que prova a regra.
  • Alguma programação básica - e eu quero dizer básica. Eu aprendi um pouco de C (para processamento de imagem e sistemas embarcados), alguma linguagem Assembly (que eu havia esquecido poucas semanas após a conclusão do curso) e algum Pascal (um curso básico de computação era padrão para todos os engenheiros). Ao entrevistar, fico impressionado com o fato de poucos graduados em CS realmente poderem programar de alguma maneira que as organizações comerciais considerariam úteis, por isso não espero muito, mas espero que eles saibam o básico.
  • Lógica - eu aprendi isso através da eletrônica digital, matemáticos através da teoria, graduações em CS através da programação, mas, como você a aprende, deve ter uma boa compreensão disso, pois tudo se resume a isso.
  • Habilidades de comunicação - eu fiz alguns cursos na universidade fora do meu diploma, habilidades de apresentação e assertividade. Muito senso comum, mas nunca é demais ouvir coisas sensatas algumas vezes.
  • Noções básicas de negócios e contabilidade. Alguns programadores agem como se isso não importasse, mas na minha opinião isso é importante para quem trabalha em uma empresa - é assim que o jogo funciona e vai controlar sua vida. Por que você não quer saber pelo menos os rudimentos de como e por que as coisas acontecem?

E se você tiver a chance de aprender sobre gerenciamento de projetos, isso realmente não faria mal, mas isso é ensinado muito mal na universidade em muitos casos e é algo que você aprenderá um pouco sobre o trabalho apenas trabalhando em projetos.

Jon Hopkins
fonte
0

Eu também adicionaria alguns cursos básicos de Recursos Humanos / Psicologia à lista.

Isso pode parecer uma adição estranha, mas parte do trabalho profissional é aprender a vender a si mesmo e a negociar. Entrar na sua primeira entrevista 'real' sem um conhecimento sólido das motivações do drone de RH é uma receita para o desastre e provavelmente terminará com o aluno sendo ferrado em um salário baixo.

Conheça o seu inimigo para que você possa se proteger.

Peter Bernier
fonte
-1

1º ano:

  1. OOP básico em um idioma de alto nível
  2. Estruturas de dados

2º ano:

  1. Compilador, você cria um arranhão simples de um formulário
  2. Concorrência

3 º ano:

  1. Algoritmo
  2. Sistema operacional, você adiciona funcionalidades e aprimoramentos a um simples
  3. Linguagem formal

4º ano:

  1. Trabalho em rede
  2. Sistema distribuído
  3. Interface de usuário
  4. Compilador avançado
  5. Sistema operacional avançado
  6. Inteligência artificial
  7. Computação Gráfica

Esses cursos devem fornecer muita teoria e prática de codificação.

Thierry Lam
fonte
-2

É estranho que ninguém tenha mencionado Arquitetura de Computadores.

Sorantis
fonte
Acho arquitetura de computador é importante saber se você quiser entender o impacto de caches de memória, falhas de página etc.
apoorv020