Qual é a matéria / teoria de CS mais difícil que você estudou, mas importante para o campo? E a razão, por favor?
Qual é a matéria / teoria de CS mais difícil que você estudou, mas importante para o campo? E a razão, por favor?
Respostas:
“Existem dois problemas difíceis na ciência da computação: cache, nomeação e erros off-by-1”
Honestamente, construção do compilador!
Projeto e Análise de Algoritmos
Acho que essa pergunta depende do professor que você teve e de como essa matéria foi organizada em sua carreira.
Analisar algoritmos pode ser tão difícil quanto alguém deseja. Lembre-se de que existem problemas não resolvidos e não apenas isso: problemas que não podem ser resolvidos.
O problema é que você pode ter um problema e, se você sabe que não pode ser resolvido, é perfeito. Mas e se você não? Você pode gastar muito tempo tentando demonstrar que é NP-Complete ou tentando encontrar uma solução de tempo polinomial para resolvê-lo.
Demonstrar NP-Completness não é fácil. Sim, muitos problemas são conhecidos, mas o importante é encontrar as reduções para demonstrar que é NP-Complete. E se você gastar muitas horas / dias / meses tentando demonstrá-lo, e ele puder ser resolvido em tempo polinomial? :)
Também existem outros assuntos, como Compiladores , Teoria de Grupos e Funções Recursivas Primitivas, que podem ser tão difíceis quanto o plano de disciplina ou o professor deseja;)
Reconhecimento de padrões, isto é, inteligência artificial. Refere-se à computação inteligente, juntamente com outras ferramentas de reconhecimento de padrões, como reconhecimento óptico de caracteres, voz para texto, identificação facial etc.
Muitas das coisas "legais" que você pode fazer ou desejar fazer com os computadores contam com esses algoritmos, e tentamos aperfeiçoá-los por décadas sem muito sucesso.
Minha escolha é a teoria da computabilidade
(Hmm ... talvez não seja tão importante, mas com certeza foi difícil)
Existem apenas dois problemas difíceis na Ciência da Computação: invalidação de cache e nomeação de coisas. - Phil Karlton
teoria das categorias (matemática discreta), mas vale a pena
Criptografia
Se você fizer isso apenas um pouco errado, pode custar milhões à empresa.
Sistemas operacionais, especialmente a parte que tem algo a ver com a segmentação.
E a razão não é porque era tão difícil fazer 5 filósofos comerem pizza com um garfo. O motivo é que escrever código multithread é difícil por si só e não necessariamente fácil para a mente humana (pelo menos masculina - de acordo com minha esposa).
Eu também voto no Compiler Design. Especialmente onde as partes DFA e NFA entram. Também não sou tão claro sobre problemas e coisas do NP.
Bem, tecnicamente, este é um ramo da matemática, mas é altamente relevante em CS.
Quase tudo no CS é baseado em filas (visível (óbvio) e invisível (não tão óbvio ou implícito)).
Nos primeiros dias de CS, as filas eram óbvias.
Uma fila de programas (cada programa um baralho de cartas).
Hoje em dia as filas não são tão óbvias. A Internet, por exemplo: uma rede comutada por pacotes, mas os pacotes formam filas e o roteamento de pacotes é uma forma de minimização da fila.
Não é muito difícil os problemas de brinquedo que você recebe no curso, mas uma vez que você começa a considerar problemas reais, isso se transforma em uma labuta séria.
Interpretar os requisitos do cliente quando o cliente realmente não sabe o que deseja. Isso não é ensinado na faculdade e é uma das habilidades mais essenciais a ter.
Pessoalmente, a minha era a lógica formal. Foi difícil para começar, mas depois que você estabelece as regras e consegue jogar o suficiente, seu cérebro ficaLogic++;
, o que no desenvolvimento é uma coisa muito boa.
Como observação, estou respondendo diretamente à pergunta - esse definitivamente não foi o assunto mais difícil quando me formei, mas provavelmente foi o assunto mais "aplicável na vida real".
Construções do compilador. Difícil, mas preciso entender os conceitos por trás
Design do Kernel alguém? Bem, eu realmente não sei como isso é feito e quais são os recursos direcionados para um sistema operacional, mas para mim pensar em projetar um kernel deve ser uma tarefa assustadora.
Eu também penso em segurança de computadores ; Realmente não sei o que torna um sistema inseguro, exceto, é claro, estouros de buffer óbvios, injeções de XSS e SQL.
Não tenho certeza, mas parece que alguns algoritmos também não são seguros; olhe para o projeto MetaSploit, ele lista todos os tipos e tipos de violações de segurança: você pode ver que existem várias maneiras pelas quais um programa pode falhar.
Existem muitos tópicos estranhos no campo, mas minhas escolhas por pura dificuldade persistente são aquelas que envolvem propriedades globais do sistema . Exemplos deste tópico geral incluem:
Isso é difícil porque você procura algo que só existe quando tudo está correto; você precisa de uma propriedade global do sistema e, no entanto, praticamente todas as ferramentas disponíveis (e todas as que se adaptam a problemas reais em minha experiência) apenas fazem realmente o raciocínio local. É difícil o processo de passar do raciocínio sobre as partes do programa para todo o shebang, principalmente porque é perfeitamente possível ter partes que são todas corretas em si mesmas, mas onde ainda existem erros sutis porque os componentes estão dispostos incorretamente; os erros podem ser características emergentes indesejáveis ...
Serviços de informações gerenciais
Durante meu período de faculdade, eu costumava ter uma disciplina de administração a cada semestre, o que me deixava totalmente louco.
Difícil! assuntos bem como Design de compilador , Design de sistema operacional etc. são difíceis, mas são realmente interessantes e desafiadores. Eu realmente baguncei assuntos como Management Information System / Services etc, pois eles estão cheios de tédio e você tem que passar por muita teoria.
Se você estiver trabalhando em ponteiros C / C ++, é o conceito mais importante a ser conhecido. Mas de alguma forma eu nunca entendi completamente na faculdade.
Projeto e Análise de Algoritmos. Não é tão difícil entender e analisar algoritmos conhecidos , é que é difícil projetar e analisar novos algoritmos para problemas difíceis e requer um amplo entendimento de muitas áreas e prática na aplicação de várias técnicas diferentes.
Qual é a matéria / teoria de CS mais difícil que você estudou, mas importante para o campo?
Matemática discreta.
Foi difícil porque as teorias são muito pouco relacionadas entre si, mas são usadas no CS. Muita memorização, eu acho ...
Prova por Indução, Big O, recursão, divisão e conquista, Teoria dos Gráficos, blá blá .. argh!
O compilador para mim foi fácil, porque tivemos que usar a Teoria dos Autômatos. ^^
Gosto das suas respostas (e não esqueci de votá-las), como compilador, kernel etc., mas a maioria dos programadores nunca encontrou esses problemas. Há um problema um pouco mais fácil, mas mais comum: simultaneidade - threads, bloqueio. É muito fácil escrever um programa que produz erros mágicos, se fizermos um pequeno erro na arquitetura de simultaneidade.
Então, eu digo, não é o problema mais difícil da computação, mas como é comumente usado, é perigoso.
Programação Orientada a Objetos
Provavelmente porque eu cortei meus dentes no FORTRAN e APL, mas a mudança de linguagens estritamente processuais para objetos foi algo com o qual lutei durante anos. Não ajuda que os chamados 'especialistas' escrevam artigos e tutoriais conflitantes sobre o que significa ser orientado a objetos e as melhores / maneiras adequadas de construir programas orientados a objetos.