Que conceitos da Ciência da Computação você acha que o tornaram um programador melhor?
Minha graduação foi em Engenharia Mecânica então, tendo acabado como programador, estou um pouco carente do básico. Existem alguns conceitos padrão de CS que aprendi recentemente que me deram uma compreensão muito mais profunda do que estou fazendo, especificamente:
Características da linguagem
- Dicas e recursão (Obrigado, Joel!)
Estruturas de dados
- Listas Ligadas
- Hashtables
Algoritmos
- Tipos de bolha
Obviamente, a lista é um pouco curta no momento, então eu esperava sugestões sobre:
- Que conceitos devo entender,
- Quaisquer bons recursos para compreendê-los adequadamente (já que a Wikipedia pode ser um pouco densa e acadêmica às vezes).
computer-science
Jon Artus
fonte
fonte
Respostas:
Dê uma olhada nesta postagem do blog de Steve Yegge (ex-Amazon, agora no Google):
Ele fornece alguns detalhes sobre os cinco conceitos mais importantes que os desenvolvedores devem saber:
fonte
Você definitivamente deve compreender os Big-O estimativas notação e Big-O de algoritmos - o que é, como ele é usado, porque é importante, como você comparar dois algoritmos dadas as suas estimativas Big-O, como você construir estimativas Big-O para os algoritmos simples.
fonte
Acho um pouco engraçado que você esteja procurando disciplinas de ciência da computação , mas acho a wikipedia muito acadêmica: D
Enfim, aqui vai, em nenhuma ordem particular:
fonte
Alguns conceitos que ajudaram meu desenvolvimento (intelecto e código):
Esses são domínios inteiros da matemática discreta, mas uma introdução séria é necessária para o CS:
Embora as palestras e artigos de Mark Jason-Dominus sejam frequentemente direcionados a hackers Perl, acho que qualquer programador se beneficiaria de sua apresentação clara e código real, especialmente em Higher Order Perl .
fonte
Eu diria que hoje em dia é necessário entender a Programação Orientada a Objetos, mesmo que você não precise usá-la no dia a dia.
Com isso, eu também diria que entender os padrões mais comuns também pode ajudar.
fonte
Vejo vários bons conceitos de CS identificados, mas pouca conversa sobre matemática.
Eu sugiro que você procure matemática discreta . Ele tem uma ampla variedade de problemas úteis, começando com provas lógicas que o ajudam a escrever condições no código. A teoria dos grafos e a combinatória também ajudam na resolução de problemas complexos e na otimização de algoritmos.
Enquanto estamos no assunto de matemática, álgebra linear é normalmente um pré-requisito para aulas avançadas de computação gráfica.
fonte
A Matriz de Competências do Programador cobriu isso em detalhes, mas vou destacar alguns:
fonte
Eu acho gráficos e alguns algoritmos aplicados como profundidade primeiro, respiração primeiro pesquisa, caminhos mais curtos etc muito úteis. A orientação a objetos também é um conceito muito comum.
fonte
Regra 1: Software é Captura de Conhecimento . Software significa algo. Se você não tiver certeza do significado, passe mais tempo conversando com os usuários para entender o que eles fazem.
Algoritmos e estruturas de dados são as duas faces da mesma moeda. O algoritmo depende da estrutura de dados, a estrutura de dados depende do algoritmo.
Desaprenda a classificação por bolhas o mais rápido possível. Seriamente. Todas as linguagens modernas (Java, Python, etc.) têm classes de coleção que implementam uma classificação melhor do que a classificação por bolha. Não há absolutamente nenhuma circunstância em que você deva usar a classificação por bolha para qualquer coisa. Você deve estar procurando por uma classe de coleção que inclua um método de classificação. Melhor, você deve procurar um algoritmo que evite completamente a classificação.
Você deve aprender vários idiomas.
Linguagem de programação (Java, Python, etc.)
Linguagem Shell.
Linguagem de banco de dados (SQL)
Linguagens de apresentação (HTML e CSS)
Outras linguagens de representação de dados (XML, JSON)
Você deve aprender várias estruturas de dados.
Sequências (listas, tuplas, arquivos)
Hierárquico (como documentos XML e HTML, bem como o sistema de arquivos básico)
Relacional (como bancos de dados e o sistema de arquivos com links físicos e virtuais inseridos)
Mapas (ou índices ou matrizes associativas), incluindo mapas de hash e mapas de árvore
Jogos
Além de algumas análises de complexidade algorítmica. Às vezes chamado de "Big O". A classificação por bolha é ruim porque é O ( n ^ 2), onde uma classificação rápida é O ( n log n ).
fonte
Bem, a lata de minhocas está aberta agora! :)
Comecei na Engenharia Elétrica.
Design de banco de dados relacional: acompanhar os dados é como Arnold em "Kindergarden Cop".
Pode ser um caos total. Deve ser controlado.
Como manter seus dados, no menor número de locais, com o mínimo de duplicações de informações. Como manter seus dados leves e facilmente acessíveis. Como controlar o crescimento e a integridade dos dados.
Design da interface do usuário (IU): é assim que o usuário deve acessar os dados que estamos monitorando.
A maioria das interfaces do usuário é projetada por desenvolvedores. Portanto, a maioria das UIs, infelizmente, é paralela ao design do banco de dados. Os usuários não se importam com o design dos dados. Eles simplesmente querem, o que eles querem. Eles querem obtê-lo facilmente. Normalmente, isso exige uma grande separação do design de dados e da interface do usuário. Aprenda a separar você "engenheiro" da "hospitalidade sulista".
Programação orientada a objetos: muitas linguagens se resumem a este formato.
Processamento paralelo - Multi-Threading: Muitos processadores tornam o trabalho rápido!
Os computadores paralelos existem há décadas. Eles estão em nossos desktops há algum tempo. Com o caso da "computação em nuvem", o processamento paralelo massivo não é apenas obrigatório, mas também preferível. É incrivelmente poderoso! Há muito potencial de trabalho para desenvolvedores paralelos.
Noções básicas sobre regras de negócios: Isso o ajuda a fazer muito de sua lógica baseada em tabelas.
Muitas condições de IFblock podem estar em tabelas de regras de negócios. Para alterar a lógica, basta alterar as informações de uma tabela. Pouca / nenhuma recodificação. Pouca / nenhuma recompilação.
Supervisionar eventos ... Os métodos fazem o trabalho:
mantenha as coisas separadas em seu código. Isso torna mais fácil para outras pessoas fazerem atualizações no futuro. Ele também se assemelha um pouco à estrutura Model / View / Controller (MVC).
PJ
fonte
Para mim, ganhei muito com o seguinte curso no time do colégio
Coisas que eu gostaria de ter feito no time do colégio
fonte
LÓGICA - Eu apenas exagero a importância da lógica na programação. Você disse que fez Engenharia Mecânica, então deve saber o quanto a matemática pode tornar sua vida mais fácil.
Lógica proposicional , lógica de primeira ordem , lógica de segunda ordem : essas são ferramentas muito poderosas. Provavelmente as coisas mais (e únicas) importantes que aprendi na universidade. A lógica é como a artilharia pesada de um programador - muitos problemas muito complexos (assim como os menos complexos) tornam-se muito mais simples uma vez que você os coloca em uma forma lógica e organizada. É como a Álgebra Linear para os Engenheiros Mecânicos.
fonte
Acho que é bom saber como funciona um compilador. Aho tem o livro clássico sobre conceitos usados na criação de um compilador. O título é Compiladores: princípios, técnicas e ferramentas. Seu apelido é o Livro do Dragão. Para realmente entender esse livro, você deve ter uma compreensão de linguagens formais. Hopcroft tem um bom livro sobre isso - Introdução à Teoria dos Autômatos, Linguagens e Computação.
fonte
Encapsulamento
Em informática, encapsulamento é a ocultação dos mecanismos internos e estruturas de dados de um componente de software por trás de uma interface definida, de forma que os usuários do componente (outros softwares) só precisem saber o que o componente faz e não podem tornam-se dependentes dos detalhes de como isso acontece
fonte
Muitas boas respostas já foram mencionadas aqui, mas eu queria adicionar um subconjunto do que é importante, mas não foi abordado até agora.
Após 15 anos de pós-graduação em desenvolvimento profissional de software, descobri que uso regularmente alguns dos seguintes conceitos na escola:
Se o seu idioma / plataforma não suportar a Coleta de Lixo, a alocação e a limpeza da memória são críticas e seriam adicionadas à lista.
fonte
Eu votei positivamente em matemática discreta. A ciência da computação é abstração. aprender a pensar como um matemático é muito útil.
Eu também queria acrescentar algo ao que S.Lott disse sobre idiomas. Aprender vários TIPOS de idiomas também é importante. Não apenas compilado versus script. Mas funcional (ML, Lisp, Haskell) lógico (Prolog) orientado a objeto (C ++, Java, Smalltalk) imperativo (C, Pascal, FORTRAN até).
Quanto mais paradigmas de programação você conhece, mais fácil é aprender novas linguagens quando a nova linguagem quente aparecer!
fonte
Alguns dos conceitos do sistema operacional
[um bom livro " Modern Operating Systems , 2nd Edition, Andrew S. Tanenbaum"]
Conhecimento básico de redes de computadores
[um bom livro de Tanenbaum
Conceitos OOPS
Autometa finito
Uma linguagem de programação (aprendi C primeiro, depois C ++)
Algoritmos (complexidade de tempo \ espaço, classificação, pesquisa, árvores, lista vinculada, pilha, fila)
[um bom livro Introdução aos Algoritmos ]
fonte
Esforce-se para obter baixo acoplamento e alta coesão .
(Eu roubei esta imagem do site com link acima)
fonte
Tente compreender todos os níveis de programação. Do nível mais baixo (montagem) ao nível mais alto.
Pegue a recursão, por exemplo, que é um recurso fácil :) Tente aprender a montagem e crie um programa que usará a recursão na montagem.
fonte
Algoritmos.
Aprender a usar uma linguagem de programação de forma descendente é algo que você pode aprender conforme avança, mas é virtualmente impossível inventar sozinho todos os algoritmos amplamente usados. Deve-se pelo menos estar ciente do que pode e não pode ser feito com alguns problemas.
Por exemplo, não se pode simplesmente escrever alguns programas com classificação por bolha e esperar que sejam considerados bons, não importa quão bom seja o código.
Para resumir - dê uma olhada em Introdução aos Algoritmos
Não há necessidade de dominar, apenas saiba o que está acontecendo ...
fonte
Como recém-formado em ciência da computação, eu recomendaria o seguinte:
Conforme mencionado em vários posts notação Big O
Design OO
Estruturas de dados e algoritmos (não lembro o título exato do livro que usei será atualizado, se me lembro)
Sistemas operacionais http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
Problemas NP
fonte
É claramente um bom entendimento da programação orientada a objetos, bons princípios orientadores como os Princípios SOLID e seguir padrões e práticas estabelecidas.
Se você olhar para SOA, ou DDD, todos eles acabam caindo de volta para alguma forma de conceitos OOP.
Eu recomendo que você obtenha alguns bons livros OOP e também escolha uma linguagem rica como C # ou Java para começar
OOP por Grady Booch
(PHP, ruby, por favor, não votem em mim, estou apenas dando alguns exemplos para ele, para começar, vocês podem fornecer suas próprias respostas e sugestões aqui)
fonte
Estrutura e Interpretação de Programas de Computador . Se você entende este livro, tudo o mais pode ser construído facilmente sobre essa base. Se você tiver problemas com os conceitos do livro, pode ser um desenvolvedor de software, mas não um cientista da computação.
fonte
Não vou lhe dizer nenhum conceito específico para estudar, mas, em vez disso, recomendo que você faça muitas leituras leves sobre uma ampla gama de tópicos. Não se preocupe em obter uma compreensão aprofundada de cada assunto sobre o qual lê - neste ponto, é mais importante que você seja capaz de reconhecer de que tipo de problema que está olhando, para que possa fazer apenas ... estudar no tempo quando você realmente se depara com ele. Em outras palavras, está tudo bem se você não souber como resolver um problema de combinatória, desde que saiba o suficiente para pesquisar "combinatória" quando precisar ver de quantas maneiras pode organizar um conjunto de objetos ou escolher um subconjunto .
A Wikipedia é um recurso muito bom para esse tipo de navegação abrangente, especialmente se você estiver apenas folheando. Um ainda melhor, especialmente se você achar a Wikipedia muito acadêmica ou inacessível, é a wiki C2 . (Este é, curiosamente, o wiki original inventado por Ward Cunningham).
fonte
Eu acho que é essencial entender a teoria básica por trás do multi-threading, sem isso pode ser difícil até ver que pode haver um problema, até que você esteja depurando em um servidor ao vivo às 4 horas de uma manhã de domingo.
Semáforos, seções críticas e eventos.
fonte
Não, não tipo bolha, quicksort. É o big-O - a classificação da bolha tem média O (n ^ 2), a classificação rápida é O (n * log (n)).
fonte
Eu diria que abaixo estão as coisas mais importantes
Em seguida, vá para o material relacionado ao idioma específico. Espero que isto seja útil!!
fonte
Eu começaria com a citação:
O princípio mais importante, IMO, é conhecer os mais diversos paradigmas de programação, linguagens e informar-se bem sobre as ferramentas à sua disposição. Qualquer problema pode ser resolvido em quase qualquer idioma que você escolher, seja em uma linguagem mainstream completa com sua enorme biblioteca padrão ou em uma pequena linguagem especializada como AutoHotKey. A primeira tarefa do programador é determinar o que usar de acordo com a especificação do problema. Alguns conceitos fornecem uma melhor abordagem ao tópico, seja qual for o seu objetivo principal - sofisticação, ofuscação, desempenho, portabilidade, manutenção, tamanho de código pequeno ...
Caso contrário, você terminará como alguns dos programadores que tentam desesperadamente fazer algo em uma linguagem que eles se especializaram, embora o problema possa ser trivial de resolver em diferentes contextos de programação.
Este conselho vai junto com a tendência atual para projetos multilíngues (tome os aplicativos da web, por exemplo, que podem envolver várias linguagens em um único aplicativo, como C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... e até mesmo diferentes paradigmas de programação (por exemplo, C # introduziu recentemente alguns conceitos de paradigmas de programação funcional, lambdas).
Então, o básico é o aprendizado constante, para sempre :)
fonte
Acho que gráficos 3D é algo que todos deveriam aprender. Ou pelo menos como usar vetores homogêneos e transformadas de matriz.
Pode ser útil não apenas para a criação de aplicativos 3D, mas também nos campos da mecânica como cinemática inversa em robôs, cálculos de momentos e muitas outras coisas.
Eu não entendia totalmente de álgebra linear até ler gráficos 3D, um dos melhores cursos que já fiz, embora nosso professor fosse ruim.
fonte
Uma vez que máquinas com vários núcleos (CPU e GPU) estão se tornando o padrão, eu diria para incluir Algoritmos Distribuídos (de vários threads a várias máquinas). É fundamental compreender o processamento distribuído e multithread. Lamentamos que o link não forneça muita ajuda.
fonte