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).
learning
computer-science
theory
Jon Hopkins
fonte
fonte
if
eloop
declaração já escrita utiliza um subconjunto dessas duas áreas de estudo.Respostas:
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.
fonte
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.
fonte
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
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.
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.
fonte
Sim, isso me levou a pensar por horas.
No processo, eu tive que remover algumas das respostas comuns já fornecidas aqui.
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.
Linguagens funcionais Não, uma única família de idiomas é apenas uma abordagem para pensar em problemas. Por que apenas essa parte deve importar?
Problema de parada Alguns são específicos demais e as pessoas viveram a vida sem saber que existiam.
Escute Se você não está ouvindo, você vive no seu próprio mundo. Não é necessariamente prejudicial!
Ciclo de Desenvolvimento de Software Nah! Ainda podemos tropeçar em um software incrível ou em um esforço heróico solo.
teoria da complexidade, acho que poderia ser isso, mas sem todos os formalismos
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 insertion
empython
enot 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.
fonte
Teoria de Autômatos e FSM. :-)
fonte
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.
fonte
existem apenas três números importantes:
fonte
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.
fonte
O Problema da Parada
O fato de existirem problemas relacionados ao computador que simplesmente não podem ser resolvidos por um computador.
fonte
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:
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)
Idiomas que podem ser analisados por um autômato com memória de pilha ou uma gramática livre de contexto.
Idiomas que podem ser analisados por uma máquina de Turing ou por um autômato com memória de acesso aleatório.
fonte
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:
fonte
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.
fonte
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 :
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 :
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.
fonte
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
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.
fonte
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.
fonte
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.
fonte