Qual é a parte da teoria da ciência da computação que eu deveria conhecer? [fechadas]

27

Falando como alguém com um diploma em Engenharia Eletrônica, em vez de Ciência da Computação, qual é a parte da ciência da computação que eu deveria conhecer para me tornar um melhor programador do mundo real ?

(No mundo real, quero dizer algo que vou usar e me beneficiar no meu trabalho diário como programador - por exemplo, eu sugiro que entender a normalização do banco de dados seja mais prático do que entender uma classificação rápida para a qual existem muitas de bibliotecas).

Jon Hopkins
fonte
42
1 (desculpe, eu tinha a)
haylem
5
oh, ou o mais significativo! (Eu vou agora ...)
haylem
A troca teórica de ciência da computação confirma o que todos os outros aqui mencionam: complexidade, estruturas de dados e algoritmos. cstheory.stackexchange.com/tags
chrisaycock
2
Sinto a necessidade de contestar esta questão. Não há “um pedaço” que seja suficiente para aprender e, além do mais, não há (IMHO) um pedaço “mais importante”. Existem vários aspectos que são (novamente, IMHO) igualmente essenciais para o CS. Então, acho que, embora as respostas a essa pergunta possam ser interessantes, a pergunta poderia ter sido formulada melhor.
Konrad Rudolph
1
Se você ainda não tivesse seu eeng, eu diria lógica booleana e / ou teoria dos números discretos. Quase todos os ife loopdeclaração já escrita utiliza um subconjunto dessas duas áreas de estudo.
Steven Evers

Respostas:

52

Se eu tiver que escolher apenas um pouco, o que é uma decisão difícil, eu diria que ir para a notação Big O . Compreender as implicações de O (n), O (ln n), O (n²), O (2 ^ n), O (n!) Ajuda a evitar muitos erros caros, do tipo que funciona bem no ambiente de teste, mas falha desastrosamente na produção.

user281377
fonte
2
+1 e eu diria que é mais importante que apenas saber que O (n ^ 2) seja pior que O (lg n) (por exemplo) seja saber como derivar o Big-O para um determinado pedaço de código.
Dean Harding
3
Discordo totalmente. Esse material é relativamente trivial e há tópicos mais interessantes no CS. Além disso, acho que a maioria das pessoas pensa sobre a complexidade intuitivamente, embora possam não chamá-lo de complexidade e eles não podem chamá-lo quadrática, exponencial etc.
Magnus Wolffelt
Magnus: Na minha experiência, a maioria das pessoas que não são de programação não pensa em complexidade, elas assumem intuitivamente O (n) para todos os problemas.
usar o seguinte comando
Eu ainda preciso disso formalmente.
CaffGeek
1
Chad: Não há nada sobre a notação Big O que seja excessivamente formalista, mas sem nomes para as coisas, você dificilmente pode pensar sobre essas coisas, muito menos falar sobre isso com seus colegas.
usar o seguinte comando
19

Esta é uma pergunta, todos terão uma resposta diferente. Eu diria: a teoria da complexidade é a peça mais importante, que você não aprende diretamente como programador de qualquer maneira (como algoritmos e estruturas de dados), mas o que pode afetar seu trabalho. Ajuda se eu souber que um problema tem complexidade cúbica, sei que ele será escalado mal se o tamanho do problema for aumentado.

Mnementh
fonte
Eu acrescentaria que ajuda muito saber se você está resolvendo um problema que pode ser facilmente corrigido em um idioma mais simples.
Filodad
A complexidade é importante como conceito, mas na verdade o cálculo geralmente não é. Entender o que é menos complexo é a parte importante.
Bill
@ Bill: Exatamente. Mas essa parte é a única coisa que você não necessariamente pratica. A teoria é muito útil nessa parte.
Mnementh
12

Aprenda sobre estruturas de dados, algoritmos e complexidade.

Não basta apenas entender que uma máquina não é uma caixa mágica com poder ilimitado. Você não pode jogar nada nele e espera que triture em milissegundos. Tem limites que você conhece. Você precisa aprender a não testá-los com seu código.

Veja também abordagens comuns para resolver problemas específicos de design na programação. Padrões de design, nomeadamente. Não os adore, apenas tome as idéias que eles comunicam.

O conhecimento da modelagem de banco de dados também é essencial.

Depois disso, são apenas diferentes linguagens de programação, estruturas e bibliotecas que implementam ou permitem implementar os conceitos principais. Pegue o que quiser e pratique com eles.


fonte
Detalhes - existem muitos algoritmos e estruturas de dados.
Jon Hopkins
Apenas os básicos para ter uma idéia das coisas. Pegue um livro não muito grosso e trabalhe-o.
1
Isso é um pouco mais do que um bit.
7

Esta é uma pergunta um pouco difícil.

Todos os aspectos da ciência da computação são importantes de uma maneira ou de outra.

Em termos do que você beneficiará no dia a dia, provavelmente uma visão geral generalizada de como seu código funciona "sob o capô" do código à CPU.

Entender a notação Big O é importante, e também entender como seu código pode ser executado também é muito importante em situações do mundo real.

Noite escura
fonte
7

Sim, isso me levou a pensar por horas.

No processo, eu tive que remover algumas das respostas comuns já fornecidas aqui.

SEM LISTA

  1. Notação O (n) grande . Difícil colocar aqui, mas não, podemos intuitivamente descobrir ineficiências e comparar diferentes conjuntos de procedimentos sem ter ouvido nem remotamente a análise algorítmica assintótica.

  2. Linguagens funcionais Não, uma única família de idiomas é apenas uma abordagem para pensar em problemas. Por que apenas essa parte deve importar?

  3. Problema de parada Alguns são específicos demais e as pessoas viveram a vida sem saber que existiam.

  4. Escute Se você não está ouvindo, você vive no seu próprio mundo. Não é necessariamente prejudicial!

  5. Ciclo de Desenvolvimento de Software Nah! Ainda podemos tropeçar em um software incrível ou em um esforço heróico solo.

  6. teoria da complexidade, acho que poderia ser isso, mas sem todos os formalismos

Essa ideia da Comp Science

Eu diria - " Abstrações Abstrações Abstrações ... ". Aprenda sobre isso. Veja exemplos ao seu redor e aprenda como construir usando-o. Está em todo lugar. Toda a ciência da computação, engenharia e aplicações parecem camadas e mais camadas de abstração.

Depois de saber isso, você começa a aprender a olhar bem ao seu redor.

Quando você vê alguém usando list insertionem pythone not append, você sorri, porque você sabe que as listas de python são construídos usando abstração array onde inserções são caros e acrescentar mais barato.

Este é apenas um exemplo.

pyfunc
fonte
+1 para uma resposta que você obviamente pensou muito.
Jon Hopkins
apenas um comentário sobre o seu problema no problema de parada: "Viver a vida sem saber que existe" é verdadeiro para QUALQUER tópico de ciência da computação.
4

Teoria de Autômatos e FSM. :-)

Prasoon Saurav
fonte
3

Casos de uso competitivo de estruturas de dados.

Há situações em que um mapa com árvores vermelho-preto é necessário para garantir o desempenho e outros em que você não pode usar uma matriz novamente para garantir o desempenho. Saber quando escolher qual estrutura de dados é uma habilidade inestimável.

Fanatic23
fonte
3

existem apenas três números importantes:

  • zero
  • 1
  • muitos
Steven A. Lowe
fonte
mas isso não implica que '3' também importe?
21810 Javier
Deveria ser zero, um e infinito: en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens
@Javier: 3 é um subconjunto de muitos
Steven A. Lowe
@ Thomas: diz quem?
Steven A. Lowe
@ Steven Meu entendimento pode não ser 100%, aqui, mas acho que a idéia é que você não tem nada, uma única coisa ou o número de coisas que você tem que deve ser ilimitado. Se você não está limitando a nenhuma ou a uma instância, não deve limitar as instâncias. No entanto, não tenho muita certeza POR QUE esse é o caso (só estou vagamente familiarizado com o conceito Zero / One / Infinity).
Thomas Owens
3

A coisa mais importante que aprendi no CS (e como desenvolvedor por muitos anos e como arquiteto) é a capacidade de resolver um problema com base na volatilidade e não na função. Todos os bons projetos isolam e encapsulam a volatilidade. Todos os bons desenvolvedores / arquitetos fazem isso intuitivamente, mesmo que não tenham formalizado isso em seus pensamentos. Uma grande razão para a falha do projeto é a falha em quebrar um problema com base na volatilidade e encapsulá-lo. Uma falha no encapsulamento da volatilidade inevitavelmente leva à fuga da complexidade e à falha do projeto.

JP Alioto
fonte
O que você quer dizer com volatilidade exatamente?
amara
3

O Problema da Parada

O fato de existirem problemas relacionados ao computador que simplesmente não podem ser resolvidos por um computador.


fonte
3

Você deve conhecer a teoria dos autômatos o suficiente para saber onde o problema com o qual está lidando se enquadra na hierarquia das linguagens formais. A partir disso, você pode descobrir alguns usos práticos importantes, como por que você não deve usar um REGEX para analisar HTML (o HTML precisa de uma gramática livre de contexto para descrevê-lo) e por que leva muito mais tempo para compilar C ++ em vez de Java ou C # (C ++ requer uma máquina de Turing, enquanto Java e C # podem ser descritos com gramáticas livres de contexto).

Os níveis mais importantes das línguas formais são, do mais fraco ao mais forte:

  1. Idiomas que podem ser analisados ​​por um autômato finito ou por um REGEX (as implementações REGEX com referências anteriores são mais poderosas que esta categoria, mas ainda não podem analisar tudo na categoria 2)

  2. Idiomas que podem ser analisados ​​por um autômato com memória de pilha ou uma gramática livre de contexto.

  3. Idiomas que podem ser analisados ​​por uma máquina de Turing ou por um autômato com memória de acesso aleatório.

Dan Monego
fonte
Hum, não. Uma expressão regular analisa uma gramática regular. Essa é exatamente a categoria de gramática que pode ser aceita por um autômato de estado finito. E uma 'Gramática de Chomsky' não se refere exclusivamente às gramáticas livres de contexto, que é o que as máquinas de pilha processam.
Filodad
@philosodad - A gramática livre de contexto é mais precisa, e eu atualizei a postagem para usar o termo. Não entendi o seu problema com o que eu disse sobre expressões regulares.
Dan Monego
@ Dan - Meu problema é que uma expressão regular é precisamente tão poderosa quanto um autômato de estado finito, e se você pode analisar QUALQUER gramática determinística sem contexto com uma máquina, pode analisar TODAS as gramáticas determinísticas sem contexto.
philosodad
Ou, para ser mais preciso: você precisa de uma pilha ou não. Se você precisar de uma pilha para analisar um idioma, deverá ter uma pilha para analisar o idioma e, portanto, se um idioma exigir uma pilha para analisá-lo, você poderá analisá-lo.
Filodad
@philosodad - Existem dois tipos de expressão regular - expressões regulares na teoria e expressões regulares conforme implementadas no software. Você está correto sobre expressões regulares teóricas, mas a maioria das implementações tem vários recursos além de suas bases teóricas e pode corresponder a algumas linguagens não regulares, como a ^ n para non prime n. Como esse é um tópico sobre a teoria na prática, fiz questão de mencionar que há uma diferença entre a definição formal e a usada na natureza.
Dan Monego
2

Bem, eu poderia lhe dar uma resposta chata: teoria dos autômatos e teoria da informação.

Ou posso contar o que aprendi com um consultor de hardware há muito tempo:

  • "Bom o suficiente" não é bom o suficiente.
Mike Dunlavey
fonte
1

Ciclo de vida de desenvolvimento de software é algo que eu sugiro saber se você ainda não o conhece. Concedido isso foi introduzido no segundo ano do curso de Ciência da Computação e é algo usado repetidamente em projetos de software. Isso pode ser útil para se ter uma idéia geral de como um projeto vai do início ao fim, embora se você quiser aprofundar, existem metodologias como o Waterfall ou o Agile que você pode estudar para obter conhecimentos mais específicos.

JB King
fonte
2
Lei de Murphy: Qualquer coisa que possa dar errado, dará errado
Richard
Não é uma teoria do CS, mas esta é uma excelente resposta.
justkt
1

Programação

Do Departamento de Matemática e Ciências da Computação, Hobart e William Smith Colleges, vem a Ciência da Computação 124 Introdução à Programação :

Os tópicos incluem estruturas de controle, objetos, classes, herança, estruturas de dados simples e conceitos básicos de desenvolvimento de software.

Se você não pode programar, não está indo muito longe na computação do mundo real.

E sim, notei que você é programador. Isso é para melhorar seu conhecimento geral da teoria da programação e quais outras abordagens estão disponíveis para você.

Está programando Ciência da Computação como a conhecemos?

Em resposta ao comentário de @Thomas Owens, que apontou (com razão) que a programação não é estritamente Ciência da Computação, eu gostaria de citar o artigo da Wikipedia sobre Ciência da Computação :

... o foco da ciência da computação está mais no entendimento das propriedades dos programas usados ​​para implementar software, como jogos e navegadores da web, e no uso desse entendimento para criar novos programas ou melhorar os já existentes ...

Assim, como eu li, ao programar, você está demonstrando sua compreensão da teoria da programação. Por sua vez, isso deve ajudá-lo a criar código simples e elegante, que é uma alegria para os outros trabalharem.

Gary Rowe
fonte
Programação não é teoria da CS. Na verdade, eu poderia argumentar facilmente que a programação não é ciência da computação.
Thomas Owens
@ Thomas Owens Atualizei minha resposta para fazer backup de minha afirmação de que ela é válida. Você poderia revisá-lo e me informar seus pensamentos?
Gary Rowe
1
Ainda não acho que a programação seja CS. A programação PODE ser útil para um cientista da computação que queira implementar um algoritmo ou estrutura de dados, mas os tópicos da teoria de CS (do meu livro Introdução à teoria de CS, portanto provavelmente também existem tópicos mais avançados) incluem lógica, teoria de autômatos e teoria de grafos. , computabilidade, complexidade computacional e análise de algoritmos. Eu diria também que as linguagens de programação (a teoria por trás do design e implementação de uma linguagem) também fazem parte da ciência da computação. No entanto, você não precisa ser capaz de programar para ser um bom cientista da computação.
Thomas Owens
@ Thomas Owens Entendo o seu ponto de vista e (põe um chapéu purista) Concordo. No entanto, o OP está pedindo um pouco de CS que o ajudaria no mundo real. Eu mantenho firme minha opinião de que a teoria de programação (conforme implementada em bom código) é um pouco disso. Eu editei um pouco de acordo.
Gary Rowe
Sim. Do CS, eu diria que entender linguagens de programação e paradigmas pode ajudar (especialmente se você estiver implementando DSLs, mas conhecer muitos paradigmas como procedural, funcional, OO, lógica apenas ajuda no desenvolvimento de software). Compreender algoritmos e estruturas de dados também ajuda a escolher o (s) correto (s) para resolver seu problema da maneira mais eficiente. A teoria dos autômatos pode ajudar (eu trabalhei com um sistema que já era um FSM gigante, mas não sei como isso é comum). Então, eu diria que estruturas de dados, algoritmos e teoria de PL seriam as coisas mais úteis a saber do CS.
Thomas Owens
1

Eu tenho que discordar de Konrad Rudolph. Você deve conhecer "um pouco" da ciência da computação para torná-lo um "programador do mundo real" melhor. Se você não tirar mais nada das respostas que está chegando aqui, pelo menos considere isso: satisfazer os requisitos NÃO é o mesmo que satisfazer o cliente! Os usuários finais tentarão SEMPRE usar seu programa de uma maneira que você nunca pensou ou codificou. SEMPRE, SEMPRE, SEMPRE.

Portanto, para ser um programador melhor, você deve primeiro OUVIR. Escute o cliente. Escute as necessidades deles. Escute os desejos deles. E, especialmente, ouça o seu nível de "conhecimento técnico". Não sei dizer quantas vezes vi um projeto criado exatamente o que foi solicitado, mas não exatamente o que o cliente realmente precisava. Tudo porque o programador que reunia as solicitações não estava realmente ouvindo.

Outra coisa que você pode tirar é que, a menos que você tenha experiência em design de interface do usuário, peça a alguém para projetar a interface do usuário. Sempre consigo identificar um aplicativo em que a interface do usuário foi projetada pelo programador e não por um especialista. O que é lógico e faz sentido para você não fará sentido para o cliente. E, se seus clientes não são especialistas em tecnologia (e quem são?), Sua solução "funcionalmente correta, mas esteticamente feia" será recebida com o calor do skunk em um jantar.


fonte
3
Essa resposta não lida com a teoria da CS, sobre a qual Hopkins perguntou.
James
1

Linguagens funcionais!

Aprender linguagens funcionais faz você pensar em termos de expressões, em vez de etapas e estados mutáveis ​​nomeados (variáveis). Isso tem um impacto significativo na sua capacidade de lidar efetivamente com os problemas de programação diários - especialmente agora que quase todas as linguagens populares têm recursos funcionais.

Os algoritmos e a teoria da complexidade também são importantes, mas são um pouco menos interessantes, pois permitem colocar nomes em coisas que você já sabia e poderia deduzir.

Magnus Wolffelt
fonte
0

Que os computadores são essencialmente correspondentes de padrões, nada mais. Tudo se resume à Máquina de Turing - o clássico conceito de Ciência da Computação para explicar o processamento de padrões.

therobyouknow
fonte
-2

Solução de problemas e o desejo de continuar aprendendo!

Eles me servem muito melhor do que conhecer a classificação rápida e a normalização do banco de dados.

Bryan Harrington
fonte
6
Isso não é teoria da ciência da computação, eles se aplicam igualmente à engenharia eletrônica (ou praticamente qualquer outra forma de) engenharia.
Jon Hopkins
Do meu ponto de vista, levar o seu exemplo em consideração, sabendo que a ordenação rápida não é útil. Saber que existe e o que faz é especial é útil, mas também fica a uma pesquisa do Google, se eu não soubesse nada sobre isso. Conhecer qualquer algoritmo também não é útil. No entanto, saber como criar um e interpretar um é! Talvez se eu pudesse mudar minha resposta, a complexidade é provavelmente a mais importante.
Bryan Harrington
1
Você não pode procurar por algo se não souber que precisa ou que ele existe. Sua resposta lista qualidades importantes para um desenvolvedor, mas não responde à pergunta.
Adam Lear