Como posso ter certeza de que estou realmente aprendendo a programar em vez de simplesmente aprender os detalhes de uma linguagem? [fechadas]

81

Muitas vezes ouço que um programador real pode aprender facilmente qualquer idioma em uma semana. Idiomas são apenas ferramentas para fazer as coisas, me disseram. A programação é a habilidade final que deve ser aprendida e dominada.

Como posso ter certeza de que estou realmente aprendendo a programar em vez de simplesmente aprender os detalhes de um idioma? E como posso desenvolver habilidades de programação que podem ser aplicadas a todas as linguagens em vez de apenas uma?

    
por Ryan 10.10.2013 / 18:49
fonte

11 respostas

96

Não se preocupe em encontrar algum conceito ridículo de "habilidade" tão comumente ouvido em declarações como:

  • Todas as linguagens de programação são basicamente as mesmas.
  • Depois de escolher um idioma, você pode escolher qualquer outro idioma com rapidez e facilidade.
  • As linguagens são apenas ferramentas, há uma magia cerebral abrangente que realmente faz o software.

Essas declarações são todas baseadas em premissas falhas e revelam uma falta de experiência em um espectro mais amplo de linguagens de programação. São declarações muito comuns e strongmente acreditadas por uma grande quantidade de programadores, não vou contestar isso, mas vou contestar a sua precisão.

Isso é provado simplesmente: gaste uma semana (ou realmente qualquer quantidade de tempo maior do que alguns dias) tentando aprender os fundamentos de Haskell , Prolog ou Agda . Logo após você começar a ouvir a antiga música Sesame Street , toque em sua mente "Uma dessas coisas não é como as outras. .. ".

Como se constata, há toda uma gama de linguagens de programação, técnicas e abordagens que são tão estranhas do que 95% de nós já fez ou já fez. Muitos ignoram completamente que qualquer um desses outros conceitos existe, o que é bom e esses conceitos não são necessários para ser um programador empregado e até mesmo efetivo.

Mas o fato permanece: essas técnicas e abordagens existem, elas são boas para muitas coisas diferentes e podem ser muito úteis, mas elas não são exatamente como as que você está acostumado e as pessoas não podem simplesmente pegá-las com uma tarde de brincar.

Além disso, eu diria que a maioria dos casos em que as pessoas afirmam ter ou podem aprender coisas tão complexas como linguagens de programação tão rapidamente como uma semana, elas estão sofrendo de um pouco During Kruger Effect , Wikipédia (grifo meu):

The Dunning–Kruger effect is a cognitive bias in which unskilled individuals suffer from illusory superiority, mistakenly rating their ability much higher than average. This bias is attributed to a metacognitive inability of the unskilled to recognize their mistakes.

Gostaria de encaminhar as pessoas para esta entrevista mais experiente sobre o conceito de aprender a programar por Peter Norvig: Aprenda a programar em dez anos .

Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, telegraph operation, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again.

Certamente, há um conjunto de princípios abrangentes que tornarão todas as línguas fáceis de aprender!

Talvez, mas eu diria que esse conjunto de princípios é tão grande que quase sempre haverá idiomas fora do seu alcance de uma semana. À medida que você adiciona novos conceitos à lista com a qual está familiarizado e se sente à vontade, essa lista de idiomas fora de seu alcance imediato pode diminuir, mas acho difícil acreditar que isso vá desaparecer. A lista de abordagens de computação conceitual para as coisas é tão ampla que é desconcertante, a partir de idiomas concatenativos para idiomas baseados em vetores para idiomas especializados em AI ou < a metaprogramação ( ou línguas que existem inteiramente para apoiar expressões ).

Após dez anos, você poderá programar em geral. Isso significa que você pode escrever um código decente em algum idioma ou estilo de idiomas. Então, depois de 10 anos, você está pronto para começar a lidar com esses incontáveis conceitos transversais para o resto de sua vida, além de ser Edsger W. Dijkstra , Donald Knuth ou John D. Carmack , você não vai chegar a todos eles.

    
por 10.10.2013 / 19:23
fonte
51

... how can I develop programming skills that can be applied towards all languages instead of just one?

A chave para essa questão é transcender a linguagem e pensar em não o idioma em que você está codificando.

WAT?

Os programadores poliglotas experientes pensam na árvore de sintaxe abstrata (AST) do seu próprio modelo mental da linguagem. Não se pensa "Preciso de um loop para aqui", mas sim "Preciso passar por cima de algo" e traduz isso para o apropriado para, ou enquanto, ou iterador ou recursão para essa linguagem.

Isso é semelhante ao que se vê ao aprender uma língua falada. As pessoas que falam muitas línguas fluentemente pensam o significado , e ele aparece em um determinado idioma.

Pode-se ver alguma pista dessa AST nos dois vídeos de Compreensão de código com rastreamento ocular < e Experimento com código de rastreamento ocular (iniciante) onde os movimentos do olho de um iniciante e programador experiente são observados. Pode-se ver o programador experiente 'compilar' o código em seu modelo mental e 'executá-lo' em sua cabeça, enquanto o iniciante tem que iterar sobre o código palavra-chave por palavra-chave.

Assim, a chave para a questão do desenvolvimento de habilidades de programação para aplicar em todas linguagens é aprender múltiplas linguagens de forma que se possa distanciar de ter o modelo mental de um linguagem e desenvolver a capacidade de gerar o AST para um problema por conta própria em uma linguagem de cabeça que é então traduzida para um determinado idioma.

Uma vez que alguém tenha essa habilidade de usar o AST na cabeça, aprender outro idioma dentro de uma escola de pensamento similar (indo para Befunge é um pouco de um salto de Java, mas não tanto de Forth ) torna-se muito mais fácil - é 'apenas' traduzir o AST para um novo idioma, o que é muito mais fácil do que o 3º, 4º e 5º (etc ...) tempo que é feito.

Existe um artigo clássico, Programadores Reais não usam Pascal . Parte disso diz:

... the determined Real Programmer can write Fortran programs in any language

Existem também bits para os quais você não pode simplesmente usar o AST mental - você também precisa pensar na linguagem. Isso leva um pouco de tempo para ser realizado (ainda sou acusado de escrever o código Perl em Python e meu primeiro O código Lisp foi revisado dizendo "Este é um programa C muito bom.").

Para isso, devo apontar um artigo publicado pela ACM, Como não escrever em Fortran Qualquer idioma . O terceiro parágrafo do artigo (que não está citando aspas) aborda diretamente a questão em questão:

There are characteristics of good coding that transcend all general-purpose programming languages. You can implement good design and transparent style in almost any code, if you apply yourself to it. Just because a programming language allows you to write bad code doesn’t mean that you have to do it. And a programming language that has been engineered to promote good style and design can still be used to write terrible code if the coder is sufficiently creative. You can drown in a bathtub with an inch of water in it, and you can easily write a completely unreadable and unmaintainable program in a language with no gotos or line numbers, with exception handling and generic types and garbage collection. Whether you're writing Fortran or Java, C++ or Smalltalk, you can (and should) choose to write good code instead of bad code.

Não basta apenas ter o AST - é necessário ter o AST para traduzir para outros idiomas. Ter um Fortran AST em sua cabeça e escrever código Fortran em Java não é uma coisa boa. É preciso também estar familiarizado o suficiente com a linguagem e seus idiomas para poder pensar na linguagem (apesar do que eu disse no topo).

Eu vi o código Java escrito por alguém que não parou de escrever código C. Houve um objeto com um método principal. Nesse objeto havia vários métodos estáticos chamados por main e classes internas privadas que tinham campos públicos (e, portanto, pareciam muito com struts). Foi um código C escrito em Java. Tudo o que foi feito foi traduzir a sintaxe de um idioma para outro.

Para superar esse ponto, é necessário continuar a escrever código em vários idiomas, não pensar nessas linguagens ao projetar o código, mas pense nelas ao traduzir o design para o código para funcionar com as expressões idiomáticas da língua.

A única maneira de chegar lá - ser capaz de desenvolver habilidades de programação que podem ser aplicadas a todos os idiomas - é continuar aprendendo idiomas e manter essa linguagem de programação mental flexível, em vez de ligada a um idioma.

(Minhas desculpas ao ChaosPandion por tomar emprestado pesadamente de a idéia que ele apresentou .

    
por 10.10.2013 / 21:26
fonte
12

Escolha um idioma e comece a codificar. O Python é uma boa opção para iniciantes, e há tutoriais disponíveis on-line , para que você possa aprender como fazê-lo corretamente.

Tudo segue disso. Seus interesses levarão você a frameworks e conceitos de design que adicionarão sofisticação aos seus programas. Você descobrirá que há cursos on-line que podem ser realizados para fundamentar os fundamentos e a teoria, e que existem diferentes paradigmas de programação que você pode explorar, e assim por diante.

E sim, você descobrirá idiomas como Haskell que lhe ensinarão algo novo, uma vez que você tenha uma base sólida nos fundamentos.

Alguns programadores provavelmente acham que todas as linguagens são iguais porque não foram expostas a nenhuma que as faça pensar de maneira diferente. Todas as linguagens mais comumente usadas são derivadas de Algol (são essencialmente linguagens procedurais) e, dentre elas, a maioria é de linguagens de forma semelhante a C. Todas elas fazem essencialmente as mesmas coisas, embora algumas com mais sofisticação do que outras.

    
por 10.10.2013 / 19:20
fonte
5

A programação é sobre resolução de problemas de tal forma que a solução pode ser expressa em uma gramática tão restrita que pode ser implementada com uma linguagem de programação. A arte da programação é, portanto, a arte de resolver problemas.

Certos idiomas convidam outros paradigmas de programação, como orientação a objetos, orientada a eventos, multiencadeados e baseados em framework MVC. Todos são apenas modelos e padrões e não têm nada a ver com implementação.

Se você puder sentar e resolver um problema no papel de tal forma que ele possa ser facilmente traduzido em código e esteja associado a um modelo apropriado para sua plataforma, então você é um programador. Se tudo o que você pode fazer é pegar essas soluções e implementá-las em nosso idioma escolhido, então isso é outra questão.

Eu tenho programado por 30 anos (OMFG!) e ainda uso php.net para procurar comandos em PHP porque não é minha primeira língua.

Eu diria que a experiência em idiomas é inversamente proporcional à frequência com que você olha para o manual ou para o stackoverflow. A especialização em programação é a facilidade com que você resolve problemas de maneira compatível com as linguagens de programação de computadores.

Em notícias relacionadas, aprendi Ruby na semana passada. Embora eu não seja "perito", posso lhe resolver um problema que eu poderia escrever em Perl, digamos, e então passar uma idade traduzindo isso para Ruby enquanto eu aprendo um pouco mais.

    
por 11.10.2013 / 00:09
fonte
3

Eu acho que, como com qualquer coisa, a prática leva à perfeição. Apenas não se limite a sempre fazer a mesma coisa ou sempre usando a mesma linguagem e continue aprendendo coisas em cada projeto.

Eu acho que você pode facilmente desenhar um paralelo para algo como aprender a tocar guitarra. Qualquer bom músico pode aprender a tocar uma nova música em um período muito curto de tempo, porque eles já conhecem todos os acordes e toda a teoria por que os acordes são tocados do jeito que são. Como eles ficam tão bons? Eles apenas tocaram tantas músicas que todos os padrões acabaram de se misturar, enquanto ao mesmo tempo suplementaram seus conhecimentos com a teoria documentada real de que esses padrões também se inscrevem.

Então talvez você possa tocar algumas músicas muito bem, mas não pode se desviar ou pegar novas músicas rapidamente. Este é provavelmente o equivalente a um programador .NET que continua a fazer o mesmo CRUD várias vezes, em algum momento, tente algo novo, adicione algumas chamadas de serviços da Web ou uma interface avançada ou grave-as em um novo língua. Quando você se deparar com um obstáculo para descobrir por que as coisas acontecem da maneira como o fazem, faça perguntas sobre o Stack Exchange, etc. Eventualmente, você verá todos os padrões que surgem continuamente e conhecerá algumas das teorias subjacentes e aprender um novo idioma parece quase tão assustador.

    
por 10.10.2013 / 18:56
fonte
1

Não vou abordar quanto tempo leva para aprender um idioma ou o que significa aprender um idioma; em vez disso, vou abordar seu problema real: como determinar se você aprendeu a programar ou aprendeu uma linguagem de programação.

Você aprendeu a programar se aprendeu a dividir um problema em processos distintos e depois usar esses processos para resolver seu problema. Você aprendeu uma linguagem de programação se aprendeu a sintaxe de uma linguagem e sabe como ajustar o funcionamento de um processo, quando implementado nesse idioma.

Isso não quer dizer que você deve programar em Fortan quando usar Lisp ou somar os valores de uma coluna em uma tabela em um banco de dados usando um cursor. Só que a linguagem é um detalhe de implementação. Um que pode alterar os processos necessários, mas não a necessidade de identificar e criar processos - no final, há uma implementação no mundo real, com entrada / saída e resultados desejados.

    
por 11.10.2013 / 05:24
fonte
1

Minha estratégia sempre foi focar em habilidades puras em vez de habilidades específicas.

Em vez de aprender a sintaxe especial do Python (ou de qualquer outra linguagem) para o que você quer fazer, gaste seus ciclos cerebrais resolvendo problemas abstratos, como a melhor maneira de resolver todos os problemas nessa categoria.

Dessa forma, você saberá o que fazer, não importa o idioma, e possuirá principalmente habilidades atemporais que podem ser usadas para programação em qualquer idioma.

Evite, especificamente, ferramentas cheias de armadilhas, como o MySQL, ou linguagens opinativas, como Java, pois o que você aprender usando essas ferramentas terá uma grande proporção de conhecimento específico de ferramentas, que se tornará inútil rapidamente. / p> Ao contrário do que foi dito em muitas respostas, NÃO ouça outros programadores, você é um noob e não há como dizer o falso do negócio real, então é melhor você levar tudo com uma colher de sal.

Você quer estar questionando o tempo todo e aceitando apenas quando a solução é rápida, elegante e confiável.

    
por 11.10.2013 / 08:26
fonte
0

Existe a abordagem teórica. Aprendendo sobre como os computadores realmente funcionam sob a capa. Como as instruções básicas do processador são agrupadas para tornar as operações e estruturas mais complexas que tomamos como garantidas em terras de programação de alto nível.

Depois, há a abordagem de programação mais prática. O principal ponto de discórdia que as pessoas costumam chamar de "não bons programadores" é que eles realmente só conhecem uma língua. E mesmo que conheçam os outros, eles os programam da mesma maneira que fazem com a linguagem nativa . É um ciclo que se deve quebrar se eles realmente quiserem aprender como programar. A resposta padrão para isso é aprender pelo menos um idioma de cada paradigma de programação. Então aprenda uma linguagem OOP, uma linguagem funcional, uma linguagem de script ... etc. E aprendendo, não quero dizer aprender a sintaxe . Você aprende uma linguagem usando-a para criar algo.

Pessoalmente, quando quero aprender um novo idioma, uso os puzzles Project Euler . Eu vou para um quebra-cabeça que já resolvi em uma linguagem OOP (como um exemplo) e tento resolvê-lo usando um funcional enquanto tento seguir as melhores práticas da nova linguagem. Quando você resolve o mesmo problema usando duas abordagens fundamentalmente diferentes, você não apenas vê quais são as diferenças reais, mas também mostra onde estão as áreas comuns. Essas áreas comuns que são compartilhadas por todas as linguagens são a programação real , as diferenças são apenas maneiras diferentes de alcançá-la.

    
por 10.10.2013 / 19:08
fonte
0

Bem, a maioria das coisas que eu queria dizer já foi dita. O que eu gostaria de acrescentar é uma analogia muito simples.

Se as linguagens de programação são consideradas meras ferramentas, mesmo assim não há absolutamente nenhuma lógica em ser bom em um faz ser bom no outro um cakewalk.

Just consider a bunch of reputed master swordsmen, suddenly put down their swords and went off to battle with spears after 7 days training. What would happen? They would be massacred.

As línguas muitas vezes não são difíceis de aprender, mas é preciso paciência e exercício para ser bom nisso. Além disso, não há uma maneira correta de aprender programação.

Learning a programming is like playing an RPG game. Sometimes you use swords, sometimes spears, sometimes a shield. Each enemy you kill, you get experience points. Once you have enough experience points, you level up. Now mastering a sword will not make you excellent with bows and arrows. But a portion of the experience you gained previously will increase your stamina and speed.

Veja algumas coisas que você pode fazer ao aprender um idioma.

  • Leia sobre o idioma. se parecer interessante, experimente o (s) aplicativo (s) hello world por você mesmo.
  • Leia alguns tutoriais, truques, blogs.
  • Crie aplicativos simples apenas por diversão.
  • Teste recursos diferentes.
  • Se você realmente gostar, compre alguns livros e / ou tutoriais em vídeo.
  • Pesquise boas bibliotecas.
  • Pesquise respostas, pergunte somente se você não encontrar as respostas.
  • Ajude os outros a pedir respostas (onde é melhor do que aqui?)
  • Faça algo útil. Fazer um aplicativo de calculadora pode ser um bom exercício, mas se você fizer um aplicativo de lista de tarefas e realmente usar seu PC / telefone, a sensação é 100 vezes satisfatória.

Experimente novos idiomas, explore novas bibliotecas, aprenda novos truques no seu tempo livre. Antes que você perceba, você se surpreenderá com sua própria habilidade.

    
por 10.10.2013 / 20:52
fonte
0

No meu caso, aprendo como programar através do seguinte:

  1. Aprenda com os mestres. Ouça os podcasts de programação, leia blogs profissionais em seu tópico de programação de escolha, leia / assista maravilhosos tutoriais feitos por gurus que estão espalhados por toda a web e, por último, leia livros épicos como O Programador Pragmático . Este livro tem muitas gemas de programação que foram acumuladas ao longo da carreira dos autores. Uma maneira certa de aprender a codificar é saber como outros programadores bem-sucedidos fazem isso.
  2. Experiência fazendo. Ler sobre isso e saber é uma coisa, colocá-lo em prática e fazê-lo funcionar é outra. Não há melhor professor do que experiência, por isso, coloque a sua codificação e comece.
  3. Pergunte a alguém que saiba. Assim como você está fazendo agora, não tenha medo de perguntar sobre as melhores práticas ou melhores maneiras de fazer as coisas com os seniores em sua equipe, ou se você tiver a infelicidade de não ter acesso aos idosos, mentores ou gurus, então ainda há o resto do stackexchange e a internet para perguntar.

Além disso, como seus comentaristas mencionaram, não se esqueça de dominar suas ferramentas também. Aprender todas as melhores práticas e maiores teorias é totalmente inútil ou será mal implementado se você não souber o suficiente sobre sua ferramenta, neste caso, uma linguagem de programação.

    
por 10.10.2013 / 19:21
fonte
0

Eu acho que, se você pode pensar analiticamente, você tem um bom começo.

Aprenda qualquer idioma desejado e trabalhe por meio de uma série de exemplos, por exemplo como apresentado em quase todos os livros que ensinam programação.

Em seguida, tente resolver seus próprios problemas. Tente encontrar soluções diferentes e compare-as. Velocidade e uso de memória são fatores comumente usados que importam. Discuta suas soluções com outros programadores.

Leia o código de outros programadores e tente entender por que eles resolveram o problema dessa maneira.

Você também deve ler alguns livros sobre algoritmos para obter uma visão geral das abordagens padrão. Novos problemas são frequentemente modificações de problemas antigos.

Muita prática e trabalho com código também em equipes ajudarão você a aumentar suas habilidades passo a passo.

Espero que minha opinião lhe responda a uma pergunta pelo menos parcial.

    
por 10.10.2013 / 19:03
fonte