Como posso realmente dominar uma linguagem de programação?

103

Sei que aprendendo um idioma, você pode simplesmente comprar um livro, seguir os exemplos e, sempre que possível, tentar os exercícios. Mas o que realmente estou procurando é como dominar o idioma depois que você o aprender.

Agora eu sei que a experiência é um fator importante, mas que tal aprender o interior da língua, qual é a estrutura subjacente etc.

Existem artigos por aí dizendo: leia este livro, leia esse livro, faça este jogo e esse jogo. Mas para mim isso não significa dominar um idioma. Quero poder ler o código de outras pessoas e entendê-lo, por mais difícil que seja. Para entender quando usar uma função e quando outra, etc.

A lista poderia continuar indefinidamente, mas acredito que fiz isso. :)

E, finalmente, tome qualquer linguagem como exemplo, se necessário, embora seja melhor se C for tomado como exemplo.

cprogcr
fonte
11
Experiência é tudo o que realmente se resume. Toda a teoria em que você é especialista é inútil, a menos que você possa aplicá-la na prática.
Simon Whitehead
2
Implemente um compilador para esse idioma. Na verdade, essa é a minha maneira favorita de experimentar qualquer novo idioma. Se parece um pouco fácil e chato, tente definir a semântica formal da linguagem, usando o framework K ou algo semelhante.
SK-logic
6
"homem, batata é dinossauros, universo automóvel". não importa o quanto você domina um idioma; se o código é ruim e não faz sentido, ainda é difícil de entender.
Renato Dinhani 19/09/12
2
Eu sinto que estava perdendo um pouco o objetivo. Os idiomas evoluem, então não há domínio de um idioma, você cresce com ele, quanto mais você o usa, mais precisa aprender.
Nycynik 19/09/12
2
Código e código de leitura. Pegue uma parte aleatória do kernel do linux (Programação C) e descubra o que uma função faz.
Alex Hart

Respostas:

166

Eu tenho que responder: "Todas as opções acima". As pessoas discutem se a codificação é uma arte, uma arte, uma disciplina de engenharia ou um ramo da matemática, e acho mais justo dizer que é parte de cada uma. Assim, quanto mais técnicas você trouxer para o domínio da língua, melhor. Aqui está uma lista parcial:

  • Use o idioma o dia todo, todos os dias. Geralmente, isso significa estar empregado em tempo integral no idioma.

  • Leia tudo o que puder sobre o idioma. Especialmente, "melhores práticas" e expressões idiomáticas.

  • Participe de um grupo de usuários para conversar com outras pessoas sobre o idioma e o que eles fazem com ele.

  • Trabalhe com o código de outras pessoas! Não há maneira mais rápida de aprender o que não fazer em um idioma do que ter que limpar alguém que fez algo horrível.

  • Apoie o código que você escreve - todo bug se torna um tour pelas suas piores decisões!

  • Estudar ciência da computação e idiomas em geral

  • Aprenda um idioma muito diferente. Um ótimo elogio a C seria uma linguagem funcional como o Lisp. Isso mudará a maneira como você pensa sobre sua linguagem processual de dentro para fora.

  • Aprenda a usar as estruturas e APIs disponíveis para esse idioma.

  • Reserve um tempo para fazer suas próprias experiências com o idioma. O SICP não é aplicável ao C, mas a atitude de aprender um idioma testando seus limites é muito produtiva.

  • Leia a história do idioma para saber por que ele foi feito da maneira que é.

  • Participe de conferências para ouvir os autores do idioma falar ou para saber o que os líderes da indústria estão fazendo com o idioma.

  • Faça uma aula no idioma.

  • Ensine o idioma a outras pessoas (graças a Bryan Oakley )

Em resumo, faça tudo o que puder pensar. Não há como saber tudo sobre a maioria dos idiomas. Toda técnica de aprendizado que você usa traz uma perspectiva adicional ao seu entendimento.

GlenPeterson
fonte
76
+5 para Suporte ao código que você escreve - todo bug se torna um tour pelas suas piores decisões!
Jennifer S
8
+1 apenas para a sentença final:Every technique you use to learn brings and additional perspective to your understanding.
Izkata 19/09/12
1
@ Izkata: OMG, eu escrevi isso? Na verdade, sou um falante nativo de inglês! Eu corrigi isso. Obrigado!
GlenPeterson
2
@GlenPeterson ... Na verdade, eu apenas copiei o colado sem prestar muita atenção à frase "off". O +1 foi de fato a intenção por trás dele. = P
Izkata 19/09/12
13
+1 em "Aprenda um idioma muito diferente. Um ótimo elogio a C seria uma linguagem funcional como o Lisp. Isso mudará a maneira como você pensa sobre sua linguagem processual de dentro para fora". - este é provavelmente o mais importante. Isso ajuda você a aprender como aprender sobre programação (ou seja, o que procurar em que situação).
precisa saber é o seguinte
53

10.000 horas de prática é o que é preciso.

Leia "Aprenda a programar em dez anos"

Principais pontos de cima:

  • Obter interessado na programação, e faça porque é divertido. Certifique-se de que seja divertido o suficiente para que você esteja disposto a dedicar seus dez anos / 10.000 horas.
  • Programa. O melhor tipo de aprendizado é aprender fazendo.
  • Converse com outros programadores; leia outros programas.
vartec
fonte
1
Era isso que eu ia postar! Ainda não passei horas suficientes no P.SE, obviamente.
Martijn Pieters
@MartijnPieters: :-D
vartec
8
Ótimo título para um livro! Mal posso esperar pela sequência "Ensine-se a programar bem em 20 anos!"
GlenPeterson
16
No entanto, você tem que ter certeza que você não está repetindo as mesmas 10 horas 1000 vezes ...
Izkata
Nenhuma quantidade de conhecimento técnico ajudará alguém a saber para o que automatizar ou criar um programa. É como dizer: vá à academia e faça todos os exercícios fundamentais no basquete por dez anos, durante 1 hora por dia. Poof! Você é uma estrela do basquete (mestre) ... não, é mais do que apenas habilidade técnica. Portanto, não considero isso uma resposta para a pergunta, ou seja, como se tornar um mestre? Isso pode ser parte da solução, mas não é a poção mágica para o domínio. Eu sei - eu não sou um mestre!
oemb1905
36

NUNCA se considere o mestre de todo o idioma até que você tenha implementado um idioma melhor que esse. O que significa que, para aprender como um idioma específico funciona por baixo, obtenha um livro que ensine os conceitos de compilador / intérprete do idioma. Por exemplo:

  • C: O livro do compilador LCC

  • C ++: o design e a evolução do C ++ (e depois construa seu próprio compilador C ++ ou pelo menos entenda a implementação de um usando o código do compilador GNU C ++)

  • Java: Obtenha "Inside JVM" e obtenha o código-fonte javac. O código .C de "java" também é útil

  • Python: implementação do CPython.

  • ObjectiveC: Quase todo o material da Apple sobre os componentes internos dos códigos-fonte do ambiente de tempo de execução ObjC e do compilador ajudará você.

  • Lisp: SICP Book (ensina Scheme e um interpretador-compilador básico para linguagens semelhantes a lisp): Lisp in Small Pieces (outro bom livro).

Aniket Inge
fonte
1
Agora é isso que chamo de resposta. Eu já aceitaram um, mas isso merece uma "melhor resposta" se fosse um pouco mais cedo
cprogcr
2
Você não tem idéia de quanto sua resposta ajudou. Estou lendo sobre os livros que você mencionou e são o tipo de coisa que eu preciso.
Cprogcr 19/09/12
hehe eu aprendi com eles. Fico feliz em ajudar :-)
Aniket Inge
desde que você mencionou C como exemplo, deixe-me dar o nome de mais dois livros, como presente, que eu costumava dominar C como as costas da minha mão): 1. OOC.PDF (disponível gratuitamente on-line) e 2. Minix book (embora reservar um SO implementadores, isso é o que Linus Torvalds ler antes de implementar Linux)
Aniket Inge
1
sim, de Andrew Tenenbaum, esse é o livro. Qualquer edição é boa de ler. Ele não diz como o "C" funciona, mas quando você vê como a biblioteca C é implementada para funcionar com um sistema operacional que você construiu, você começa a entender C ainda melhor! Talvez o suficiente para deixar de modificá-lo (E é aí que OOC vem em).
Aniket Inge
12

Tente usar o idioma para algo para o qual não foi planejado. Escreva um driver de dispositivo em Python ou uma biblioteca de manipulação de matrizes em COBOL. Eu acho que uma das melhores maneiras de dominar um idioma é realmente pressioná-lo, tentando fazer com que seus pontos fortes superem suas fraquezas.

TMN
fonte
1
Quando estava na faculdade, decidia que "dominava" um idioma depois de escrever Pong. Isso funcionou muito bem até eu aprender MIPS. Eu ainda tenho pesadelos.
Roddy das ervilhas congeladas
Site em C pode ser feito?
BigSack 01/09
10

Vou facilitar para você. Você nunca vai dominar um idioma. Período. Se você pensa que tem, então obviamente você não tem. De repente, não há um topo de montanha que você alcance e diga "Bem, agora eu já dominei completamente esse idioma. E agora?" Mesmo programadores experientes que trabalham com a mesma linguagem há décadas lhe dirão que, às vezes, eles ainda encontram novas idéias, processos, práticas etc. O verdadeiro objetivo é dominar seu entendimento conceitual de uma linguagem ou línguas. A capacidade de aprender novos conceitos e a velocidade com a qual você pode adotar recursos novos ou alterados no idioma são muito mais importantes do que o conhecimento comum de cada palavra-chave e sintaxe. Pare de se preocupar em "dominar" um idioma e simplesmente se preocupe em melhorar e refinar continuamente a qualidade e a eficiência do seu código.

Chris Pratt
fonte
2
The true goal is to master your conceptual understanding of a language or languages.Exatamente. Foi isso que eu realmente quis dizer.
Cprogcr 19/09/12
Qualquer linguagem de programação é finita. Ele é construído com um número finito de conceitos, requer um número finito de truques idiomáticos. Portanto, é fácil dominar qualquer idioma. Obviamente, não se pode dominar a programação em geral, sempre há um potencial para uma melhoria adicional, mas a questão é especificamente sobre uma determinada linguagem .
SK-logic
SK-logic: as linguagens de programação mudam, assim como suas bibliotecas e ambientes. Como resultado, a maneira como você trabalha com o idioma também muda. Por exemplo, o jQuery mudou a maneira como trabalhamos com Javascript.
orlp
Provavelmente, é verdade que ninguém pode realmente dominar uma linguagem como C ++, mas para outras um pouco minimalistas como Scheme deve ser bem possível - como a @ SK-logic diz, é realmente a programação , em qualquer linguagem, que não pode ser dominada, porque o O campo de aplicação é infinito.
usar o seguinte comando
1
@ nightcracker, os idiomas não "evoluem". C99 sempre será C99 e nunca mudará. O C ++ 11 sempre permanecerá o C ++ 11, mesmo depois de substituído por uma linguagem da próxima geração. Os ambientes "evoluem", sim, mas o jQuery não introduziu novas técnicas não conhecidas anteriormente para as comunidades de outros idiomas. Eles eram novos apenas na comunidade Javascript restrita.
SK-logic
5

Você já sabe a resposta para isso

  • Você tem que usar o idioma. Muito. Para resolver o maior número possível de problemas
  • Você precisa ler (e, idealmente, trabalhar com) o código de outras pessoas, de preferência aqueles que possuam um certo grau de domínio (isto é, uma compreensão profunda de pelo menos algum aspecto da linguagem). Por extensão, se você puder conversar com as pessoas sobre como resolver problemas com o idioma, tanto melhor.

Tudo se resume a trabalho duro e determinação e por tudo o que você pode nunca chegar lá.

Pense de onde tiramos o termo - para se tornar um Mestre Artesão, você tinha que ser um aprendiz e depois um viajante, e somente eles, se você tivesse a chance de se tornar um mestre. Ao longo do caminho, você seria ensinado e praticaria, observando e questionando outras pessoas em seu ofício e (esperançosamente) aprendendo com elas.

Não há bala mágica ...

Murph
fonte
2

Comece lendo e entendendo o que é SDLC (também conhecido como ciclo de vida de desenvolvimento de software). É um processo iterativo que envolve auto-aperfeiçoamento, aprendizado,**practicing, practicing...**

insira a descrição da imagem aqui

Isso abriria seus horizontes em quais áreas você precisa aprender ou melhorar. Existem vários livros básicos de engenharia de software que você também consideraria muito útil ler quando criar alguns aplicativos por conta própria.

Além disso, quando você se sentir confiante com uma linguagem OOP , poderá começar a aprender padrões de design , e os padrões de Head First Design são realmente um bom livro a considerar. Eu amo este livro.

EL Yusubov
fonte
1
Obrigado. Eu já tinha escolhido a resposta quando li isso, mas com certeza vou seguir seu conselho.
Cprogcr
não sabe por que a votação foi reduzida, informe-me o que precisa ser aprimorado.
EL Yusubov 19/09/12
2

Não existe substituto para experiência. Para dominar algo, você precisa fazer / usar muito, para muitas coisas diferentes.

Então vá em frente e use essa linguagem para exercícios (como o Project Euler ) e projetos pessoais, coisas que você realmente precisa ou coisas que você acha interessantes. Escreva um jogo, escreva um aplicativo da web, escreva um analisador, como quiser. E a cada passo, esforce-se para entender o que você está fazendo, em vez de apenas colar o código ou seguir as instruções.

Quero poder ler o código de outras pessoas e entendê-lo, por mais difícil que seja.

Isso é algo que você pode fazer imediatamente depois de entender a sintaxe básica. Basta pegar um código e reservar um tempo para detalhá-lo. Procure coisas que você não entende ou faça perguntas específicas em locais como o estouro de pilha .

Michael Borgwardt
fonte
2

No lado mais alto do problema, aprenda sobre arquitetura: como organizar seus projetos, qual é a sua estrutura. Não basta deixá-los crescer aleatoriamente.

No nível médio, aprenda diferentes técnicas e paradigmas. Quanto mais ferramentas diversas você tiver em seu repertório, mais poder terá para você. Se você estudou apenas java, python e ruby, foi exposto apenas a uma pequena parte do espaço de programação. Aprenda programação imperativa e funcional, aprenda prólogo e J. A idéia não é "dominar" centenas de idiomas, mas aprender sobre diferentes maneiras de resolver os mesmos problemas.

No lado de baixo nível do problema, uma coisa que poderia ajudá-lo a ser um programador melhor (de fato, seja o que for que você faz) é ter um bom modelo mental da plataforma. Por exemplo, você pode aprender como as estruturas de controle C funcionam e conhecer as bibliotecas mais comuns, mas se você não tiver um modelo mental de como os ponteiros e a memória funcionam, terá problemas com expressões moderadamente complexas.

José Dinuncio
fonte
1

Posso fazer algumas sugestões?

Primeiro, se você puder encontrar um mentor para discutir o uso do idioma e obter as melhores dicas e truques, além de responder quando uma técnica é melhor que a outra.

Em segundo lugar, pratique o máximo possível e experimente o idioma ao máximo! Eu costumava trabalhar em equipe, que (por diversão) selecionava um verbo ou outra parte da linguagem de programação do manual todos os dias. Foi uma marca de honra se você pudesse trabalhar na sua codificação naquele dia. Isso significava que toda a equipe de programação precisava examinar e entender o termo (às vezes) obscuro para entendê-lo e usá-lo efetivamente. Alguns dias fracassamos, mas essa equipe foi divertida de trabalhar e realmente tecnicamente ligada !!

Nicholas Sibson
fonte
0

As linguagens de programação refletem as idéias por trás dos paradigmas de programação que foram desenvolvidos visando o desenvolvimento de software de uso geral ou o desenvolvimento de software de uso especial. Por exemplo, uma linguagem de programa como Java representa o paradigma de programa orientado a objetos, mas o AspectJ (uma extensão de Java) é usado para programar de acordo com a programação orientada a aspectos.

Dada esta breve introdução, para realmente dominar um idioma, comprar e ler um livro por si só não seria muito útil. Você precisaria entender o ambiente em que pode programar usando o idioma desejado, aprender sobre o paradigma e, mais importante, criar um aplicativo significativo usando o idioma. Construir um pequeno aplicativo que pode oferecer várias ferramentas fornecidas pelo idioma é uma abordagem de aprendizado realmente útil.

Eu tenho visto pessoas vindas da comunidade C pura sem aprender nada sobre orientação a objetos e dificuldade em aprender Java ou objetivo-c. Também vi pessoas lutando com a programação de interfaces de usuário quando realmente não entenderam os elementos da interface do usuário, programação orientada a eventos, etc.

Eu espero que isso ajude!

hsnm
fonte
0

Eu adicionaria dois itens à lista de Glen

  • Tente resolver o problema difícil que outros têm, por exemplo, dê respostas sobre SO
  • Leia blogs / livros para designers de idiomas. Esse é o melhor recurso de conhecimento profundo. Você saberia qual é a decisão de design por trás do motivo X.
Lukasz Madon
fonte
0

Para desenvolver o que a @TMN disse. Tive grande sucesso em aprender idiomas escrevendo o mesmo programa em um idioma diferente.

Por exemplo, escrever um programa que lê um arquivo CSV, analisa o texto e depois o grava em um segundo CSV com as colunas na ordem inversa.

Como isso,

Coluna1, Coluna2, Coluna3

para

Coluna3, Coluna2, Coluna1

Isso lhe dará um entendimento básico ou o idioma. Então veja o que mais você pode fazer. Talvez permita a substituição de valor, reordenação ou leitura na linha de comando. Torne-o tão complexo quanto você desejar.

Também acho o que o @GlenPeterson disse sobre,

Aprenda um idioma muito diferente. Um ótimo elogio a C seria uma linguagem funcional como o Lisp. Isso mudará a maneira como você pensa sobre sua linguagem processual de dentro para fora.

É uma ótima idéia. Eu sugeriria uma linguagem como Haskell, porque nas versões mais recentes você pode programar usando todos os quatro paradigmas de programação OO, procedurais, lógicos ou funcionais. Mesmo sendo uma linguagem funcional, você pode, com algum esforço, implementar outros paradigmas, o que seria uma boa experiência de aprendizado.

Ótima linguagem para brincar.

Dan
fonte
0

Você não pode aprender um idioma do livro. Tudo que você precisa é prática e prática. Não pense que você pode aprender um idioma desse livro em particular ou de uma fonte específica. Apenas pense que a linguagem de programação é a mesma que a linguagem humana. Você não pode simplesmente aprender inglês ou francês lendo um livro em particular. vida do dia. Código do zero, amplie sua funcionalidade, tente criar algo que o deixará um pouco satisfeito. E se você está pensando em dominar uma linguagem como conhecendo toda a linguagem e usando cada elemento da linguagem de programação em codificação prática, você NÃO PODE. Ou mesmo se você puder, pode levar de 10 a 15 anos.

sumit
fonte