Os Compiladores +1 foram os mais difíceis e os mais recompensadores.
dietbuddha
3
Foi lá em cima com o trabalho mais abrangente e uma boa preparação para a codificação grunhida, mas não acho que tenha sido tão difícil. Talvez mais difícil sem o uso do YACC ou de quaisquer ferramentas que usamos, não sei.
Peter Turner
4
Os compiladores são realmente difíceis apenas porque a maior parte da teoria data de tempos de restrições de hardware insanamente severas e muitas das instruções formais não avançaram muito além disso. Dê uma olhada em Let's Build A Compiler para ver como a escrita do compilador pode ser fácil se você a abordar de um ângulo diferente.
Mason Wheeler
1
@ Martin York, como escritor de compiladores, acho que a complexidade da implementação de compiladores é superestimada severamente. Em geral, um compilador é muito mais simples que um intérprete. Eu suspeito que é um Livro do Dragão e seu tipo é o culpado, eles estão propondo as maneiras mais complicadas de fazer coisas simples e prestando muita atenção ao passo menos importante, ou seja, analisar.
SK-logic,
1
@ Martin York, existem técnicas para manter um AST o mais simples e sustentável possível, por mais complicado que seja o idioma de origem. Também existem várias técnicas muito simples, mas poderosas, para manter cada estágio da compilação trivial e isolado.
SK-logic,
22
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;)
s / Análise / Análise ... caso contrário, exatamente o que eu acho ... funções recursivas primitivas, uargh !!
Felix Dombek
Acordado, eu confusa através do meu bacharelado nunca estar confiante de que eu nunca com sucesso 'provou' nada (embora a minha classe Algoritmos era muito simples, devido à professora)
Peter Turner
Eu vou te mostrar nestes dias, como os algoritmos duro pode ser :)
Oscar Mederos
18
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.
É difícil porque não é algo determinístico. Desenvolver um bom AI reconhecimento de padrões requer experimentação para cada aplicativo que você deseja usá-lo para, para garantir que você escolher o algoritmo de direito, as características certas, etc ...
Ken Bloom
1
Estou apenas começando a escalar essa montanha em particular (reconhecimento de padrões). É difícil. Muita matemática. Grandes, enormes e intimidantes pilhas de matemática, olhando para mim, me desafiando a entrar.
David Poole
bem ... padrão reco também pode ser visto como estatística aplicada, não é apenas um problema dentro da faixa de CS
Concordo que a teoria da computação era difícil, mas também era uma das minhas matérias favoritas. Concedido, eu estava me formando em matemática ... #
311 Poindexter
+1 eu me formei também. Eu poderia lidar com uma introdução a essas coisas, mas a versão de pós-graduação ... feliz por ter deixado cair!
Job
foi difícil, não sabemos tanto sobre isso que não importa muito.
Exibir nome
10
Existem apenas dois problemas difíceis na Ciência da Computação: invalidação de cache e nomeação de coisas. - Phil Karlton
Embora cada vez mais popular, o Crypto não é exclusivo do software.
JBRWilkinson
Criptografia não é tão difícil. O problema é que a segurança não pode ser testada facilmente, então você só percebe seus erros quando alguém o invadir. Mas a falta de testabilidade se aplica à maioria das formas de segurança de TI, não apenas à criptografia.
CodesInChaos
4
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).
Deixe sua esposa escrever o código multithreaded então :)
3
Lembre-se, quando se trata de multithreading de memória compartilhada, o computador é um porco furtivo que está à sua disposição. Duplamente quando se lida com um processador multicore; um núcleo pode distraí-lo diante de seus olhos, onde você está assistindo, e o outro pode ir atrás de você e esfaqueá-lo pelas costas.
Donal Fellows
3
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.
Sim, eu teria tido mais dificuldade com os Compiladores se não tivesse tomado a Teoria da Computação primeiro.
Peter Turner
DFAs e NFAs são alimentos para aves. Aguarde até que você precise fazer a análise LALR (1).
David Thornley
3
Teoria das filas
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 (Tanto quanto (Alguém poderia (ver), Mas (Foi (conhecido)). Acontecer))).
Martin York
3
Análise numérica
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.
Não sei se concordo com este como sendo um conceito de Ciência da Computação. Também não vejo como isso pode ser resolvido usando o método científico.
precisa saber é o seguinte
@ jmort253 - Isso é verdade, mas a ciência da computação tenta (sem sucesso na minha opinião) investigar esse campo com métodos formais de design e validação.
Mouviciel
Concordo que não é um conceito de "ciência da computação" - mas, quando iniciei minha carreira, não tinha consciência / inconsciente do fato de que os clientes não sabem o que querem. Eu pensei que TODOS os projetos de software vinham com algum tipo de documento formal de requisitos. Talvez um tópico de palestra para um curso de engenharia de software (talvez minha faculdade não o tenha abordado)?
Steven Striga
1
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".
Lógica formal é algo com o qual eu tive um relacionamento de amor / ódio. Gostei de pensar nos conceitos, mas nunca consegui entender como isso estava me ajudando até mais tarde, quando encontrei problemas do mundo real que exigiam pensamento lógico.
precisa saber é o seguinte
@ jmort253 - Na verdade, era o mesmo para mim. Eu até lutei ao ponto de pensar que eu iria falhar, estudei tanto e até que finalmente clicou na minha cabeça. Depois disso, os benefícios foram surpreendentes.
Kyle Rozendo
1
Construções do compilador. Difícil, mas preciso entender os conceitos por trás
Você deve dar um voto positivo para a mesma resposta que foi fornecida antes de você, em vez de dar a mesma resposta novamente.
Abimaran Kugathasan
1
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:
Multithreading seguro e sem impasse
Segurança
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.
Cheios de tédio, porque eles estão falando sobre os meandros conceituais de cada sistema, enquanto metade das pessoas nunca escreveu nenhum sistema (mas eles certamente usaram uma variedade de). Além disso, os seminais usam tantas palavras carregadas, mas não fornecem um exemplo da vida real em inglês comum. Como os sistemas de suporte à decisão ... você não pode simplesmente soltar algumas capturas de tela dos relatórios do Google Analytics, FML, apenas para colocar os alunos na mesma página antes de você ter um orgasmo intelectual na frente da platéia.
Filip Dupanović 31/01
0
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.
verdade? Quer dizer, cada pessoa é diferente, mas eu acho que há muitos (quero dizer, lotes ) de tópicos mais difícil do que apenas ponteiros . Por exemplo, Computer's Architecture , Assambler que, de alguma forma, está relacionado a indicadores ;)
Oscar Mederos
É verdade, mas você achará mais fácil entender a referência de memória por meio de montadores, porque você trabalha com ponteiros brutos , enquanto em C / C ++ você trabalha com referências a ponteiros, o que apenas confunde as pessoas porque a abstração nunca é falada abertamente. sobre.
Filip Dupanović
2
Ah assambler, o melhor chá do programador
Matt Ellen
O cara perguntou os tópicos que são difíceis, mas importantes, daí indicadores.
Dilsh R
@ Matt: Você acabou de fazer o meu dia: D @ Manoj R: Os ponteiros são triviais se você pensar neles como acesso à matriz. Ou o acesso ao array é difícil?
Back2dos
0
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.
A notação Z / métodos formais usados para machucar meu cérebro na faculdade. Principalmente porque eu odiava. Difícil é muito mais fácil quando você gosta do que está fazendo e muito mais difícil quando não gosta.
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.
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.
Respostas:
“Existem dois problemas difíceis na ciência da computação: cache, nomeação e erros off-by-1”
fonte
Honestamente, construção do compilador!
fonte
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;)
fonte
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.
fonte
Minha escolha é a teoria da computabilidade
(Hmm ... talvez não seja tão importante, mas com certeza foi difícil)
fonte
fonte
teoria das categorias (matemática discreta), mas vale a pena
fonte
Criptografia
Se você fizer isso apenas um pouco errado, pode custar milhões à empresa.
fonte
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).
fonte
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.
fonte
Teoria das filas
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.
fonte
Análise numérica
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.
fonte
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.
fonte
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 fica
Logic++;
, 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".
fonte
Construções do compilador. Difícil, mas preciso entender os conceitos por trás
fonte
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.
fonte
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 ...
fonte
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.
fonte
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.
fonte
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.
fonte
Programação de restrições. que lida com problemas combinatórios, problemas NP-completos.
fonte
A otimização do algoritmo é um tópico desafiador.
fonte
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. ^^
fonte
A notação Z / métodos formais usados para machucar meu cérebro na faculdade. Principalmente porque eu odiava. Difícil é muito mais fácil quando você gosta do que está fazendo e muito mais difícil quando não gosta.
fonte
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.
fonte
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.
fonte