Costumo ouvir que um programador real pode aprender facilmente qualquer idioma dentro de uma semana. Idiomas são apenas ferramentas para fazer as coisas, me disseram. A programação é a habilidade máxima 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 todos os idiomas, em vez de apenas um?
"What do you mean you're not an expert in LanguageX?!? I can learn a language in a Week!"
. 1 semana depois:"See, I've learnt the language, and here's a Hello World example I copied from Wikipedia to prove it!"
Respostas:
Não se preocupe em conhecer algum conceito ridículo de "habilidade", tão comumente ouvido em declarações como:
Essas declarações são todas baseadas em uma premissa falha e traem a falta de experiência em um espectro mais amplo de linguagens de programação. São afirmações muito comuns e fortemente acreditadas por uma grande quantidade de programadores, não vou contestar isso, mas contestarei sua precisão.
Isso é provado simplesmente: Passe uma semana (ou realmente qualquer quantidade de tempo maior que alguns dias) tentando aprender os fundamentos de Haskell , Prolog ou Agda . Você logo começará a ouvir a velha música da Vila Sésamo tocando em sua cabeça "Uma dessas coisas não é como as outras ...".
Como se vê, há toda uma gama de linguagens de programação, técnicas e abordagens tão estranhas ao que 95% de nós faz ou já fez. Muitos não sabem que nenhum desses conceitos existe, o que é bom e que esses conceitos não são necessários para ser um programador empregado e até eficaz.
Mas o fato permanece: essas técnicas e abordagens existem, elas são boas para muitas coisas diferentes e podem ser muito úteis, mas não são exatamente como o que você está acostumado e as pessoas não podem simplesmente buscá-las com uma tarde de brincadeiras.
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 quanto uma semana, sofrem de um pouco do Efeito Dunning Kruger , Wikipedia (ênfase minha):
Gostaria de referir as pessoas a essa visão mais experiente sobre o conceito de aprender a programar por Peter Norvig: Aprenda a programar em dez anos .
Certamente, há um conjunto de princípios abrangentes que facilitarão o aprendizado de todos os idiomas!
Talvez, mas eu argumentaria que esse conjunto de princípios é tão grande que quase sempre haverá idiomas fora do alcance de uma semana. À medida que você adiciona novos conceitos à lista com a qual está familiarizado e à vontade, essa lista de idiomas fora do seu alcance imediato pode encolher, mas é difícil acreditar que isso ocorra. A lista de abordagens de computação conceituais para as coisas é tão ampla que é desconcertante, de línguas Concatenative para línguas vetor base para linguagens especializadas em AI ou metaprogramming ( ou idiomas que existem inteiramente para suportar expressões regulares ).
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 dez anos, você estará pronto para começar a enfrentar esses incontáveis conceitos gerais abrangentes pelo resto da vida e, além de Edsger W. Dijkstra , Donald Knuth ou John D. Carmack , não conseguirá entender tudo deles.
fonte
A chave para esta pergunta é transcender a linguagem e pensar em não o idioma que você está codificando em.
WAT?
Programadores poliglotas experientes pensam na árvore de sintaxe abstrata (AST) de seu próprio modelo mental da linguagem. Não se pensa "preciso de um loop for aqui", mas sim "preciso fazer um loop sobre algo" e traduz isso para o apropriado por, ou enquanto, ou iterador ou recursão para esse idioma.
Isso é semelhante ao que se vê ao aprender um idioma falado. As pessoas que falam muitas línguas pensam fluentemente o significado , e ele sai em um determinado idioma.
Pode-se ver alguma pista deste AST no par de vídeos eyetracking Código Compreensão com Eye Tracking e Experiment Eye-Tracking Código (Iniciante) , onde os movimentos do olho de um begineer e programador experiente são vigiados. Pode-se ver o programador experiente 'compilar' o código em seu modelo mental e 'executá-lo' em sua cabeça, enquanto o iniciante precisa repetir o código por palavra-chave.
Assim, a chave para a questão do desenvolvimento de habilidades de programação para aplicar a todos os idiomas é aprender vários idiomas para que se possa distanciar-se de ter o modelo mental de um idioma e desenvolver a capacidade de gerar o AST para um problema por si só. um idioma principal que é então traduzido para um determinado idioma.
Uma vez que se tenha essa capacidade de usar o AST na cabeça, aprender outra língua dentro de uma escola de pensamento semelhante (ir para Befunge é um pouco de Java, mas não tanto de Forth ) fica muito mais fácil - é 'apenas' traduzir o AST para um novo idioma que é muito mais fácil na 3ª, 4ª e 5ª (etc ...) vez.
Há um artigo clássico: Real Programmers Don't Use Pascal . Parte disso diz:
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 código Perl em Python e meu primeiro código Lisp foi revisado dizendo "Este é um programa C muito bom").
Para isso, devo salientar um artigo publicado pela ACM, Como não escrever Fortran em qualquer idioma . O terceiro parágrafo do artigo (que não está entre aspas) aborda diretamente a questão em questão:
Não basta apenas ter o AST - é necessário que o AST possa ser traduzido para outros idiomas. Ter um Fortran AST na sua cabeça e escrever código Fortran em Java não é uma coisa boa. É preciso também estar familiarizado o suficiente com o idioma e seus idiomas para poder pensar no idioma (apesar do que eu disse no topo).
Eu vi código Java escrito por alguém que não parou de escrever código C. Havia um objeto com um método principal. Nesse objeto, havia
main
vários métodos estáticos chamados por e classes internas privadas que tinham campos públicos (e, portanto, pareciam muito com struts). Era 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 escrevendo código em vários idiomas, não pensando nesses idiomas ao projetar o código, mas pense neles ao traduzir o design no código para trabalhar com os idiomas de idioma corretamente.
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 vinculada a um idioma.
(Minhas desculpas ao ChaosPandion por emprestar muito da idéia que ele apresentou .)
fonte
Escolha um idioma e comece a codificar. O Python é uma boa opção para iniciantes, e há tutoriais disponíveis online , para que você possa aprender como fazê-lo corretamente.
Tudo segue daí. Seus interesses o levarão a estruturas e conceitos de design que adicionarão sofisticação aos seus programas. Você descobrirá que existem cursos on-line que você pode fazer que embasam 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, depois de ter uma base sólida nos fundamentos.
Alguns programadores provavelmente pensam que todos os idiomas são iguais porque não foram expostos a nenhum que os faça pensar de maneira diferente. Todas as linguagens mais usadas são derivadas do Algol (são essencialmente linguagens procedurais) e, dentre elas, a maioria é uma linguagem similar a C. Todas elas fazem essencialmente as mesmas coisas, embora algumas com mais sofisticação do que outras.
fonte
A programação diz respeito à resolução de problemas de forma que a solução possa ser expressa em uma gramática tão restrita que possa ser implementada com uma linguagem de programação. A arte da programação é, portanto, a arte de resolver problemas.
Certas linguagens convidam outros paradigmas de programação, como orientação a objetos, orientada a eventos, multithread e baseada em framework MVC. Estes são apenas modelos e padrões e não têm nada a ver com implementação.
Se você pode resolver e resolver um problema no papel de 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 no idioma escolhido, isso é outra questão.
Faço programação há 30 anos (OMFG!) E ainda uso
php.net
comandos de pesquisa em PHP porque não é minha primeira linguagem.Eu diria que o conhecimento em idiomas é inversamente proporcional à frequência com que você olha para o manual ou o fluxo de pilha. A especialização em programação é a rapidez com que você resolve os problemas de maneira compatível com as linguagens de programação de computadores.
Em notícias relacionadas, eu aprendi Ruby na semana passada. Embora eu não seja um "especialista", posso resolver um problema que eu poderia escrever em Perl, digamos, e depois passar uma idade traduzindo-o para Ruby enquanto aprendo um pouco mais.
fonte
Eu acho que, como em qualquer coisa, a prática leva à perfeição. Apenas não se comprometa a sempre fazer a mesma coisa ou sempre usando o mesmo idioma e continue aprendendo as coisas em cada projeto.
Acho que você pode facilmente traçar um paralelo com algo como aprender a tocar violão. Qualquer bom músico pode aprender a tocar uma nova música em um período muito curto de tempo, porque já conhece todos os acordes e toda a teoria por trás dos motivos pelos quais os acordes são tocados. Como eles conseguem isso tão bem? Eles tocaram tantas músicas que todos os padrões acabaram se misturando, e ao mesmo tempo complementaram seu conhecimento com a teoria documentada que esses padrões também se inscrevem.
Talvez você possa tocar algumas músicas muito bem, mas não pode desviar ou pegar novas músicas rapidamente. Provavelmente, isso é equivalente a um programador .NET que continua criando o mesmo aplicativo CRUD várias vezes; em algum momento, tente algo novo, adicione algumas chamadas de serviço da Web ou uma interface avançada, ou escreva-o em um idioma totalmente novo. Quando você se deparar com um problema, veja por que as coisas acontecem do jeito que acontecem, faça perguntas no Stack Exchange, etc. Eventualmente, você verá todos os padrões que surgem continuamente e conhecerá algumas das teorias subjacentes e aprender um novo idioma não será. parece quase tão assustador.
fonte
Não vou abordar quanto tempo leva para aprender um idioma ou o que significa aprender um idioma. Em vez disso, vou abordar o 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 usá-los para resolver seu problema. Você aprendeu uma linguagem de programação se aprendeu a sintaxe de uma linguagem e sabe como ajustar como um processo funciona, quando implementado nessa linguagem.
Isso não quer dizer que você deve programar em Fortan ao usar Lisp ou adicionar 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 mudar quais processos são 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.
fonte
Minha estratégia sempre foi focar em habilidades puras, e não em habilidades específicas.
Em vez de aprender a sintaxe especial do Python (ou qualquer outro idioma) para o que você quer fazer, gaste seu cérebro resolvendo problemas abstratos, como a melhor maneira de resolver todos os problemas dessa categoria.
Dessa forma, você saberá o que fazer, independentemente da linguagem, e possuirá principalmente habilidades atemporais que podem ser usadas para programar em qualquer linguagem.
Evite especificamente ferramentas cheias de truques, como MySQL ou linguagens opinativas, como Java, pois o que você aprender usando essas ferramentas terá uma grande proporção de conhecimento específico sobre ferramentas, que se tornará inútil rapidamente.
Ao contrário do que foi dito em muitas respostas, NÃO ouça outros programadores, você é um noob e não há como diferenciar o falso do negócio real, então é melhor levar tudo com uma colher de sal.
Você quer questionar o tempo todo e aceitar apenas quando a solução é rápida, elegante e confiável.
fonte
Existe a abordagem teórica. Aprenda sobre como os computadores realmente funcionam ao abrigo. 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 áreas 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 rotular como "não são bons programadores" é que elas realmente conhecem apenas um idioma. E mesmo que conheçam os outros, eles programam neles da mesma maneira que fazem com o idioma nativo . É um ciclo que é preciso quebrar se eles realmente querem aprender a programar. A resposta padrão para isso é aprender pelo menos uma linguagem de cada paradigma de programação. Portanto, aprenda uma linguagem OOP, uma linguagem funcional, uma linguagem de script ... etc. E aprendendo não quero dizer aprender a sintaxe . Você aprende um idioma usando-o para criar algo.
Pessoalmente, quando quero aprender um novo idioma, uso os quebra-cabeças do Project Euler . Vou a um quebra-cabeça que já resolvi em um idioma OOP (como exemplo) e tento resolvê-lo usando um funcional, tentando seguir as melhores práticas do novo idioma. Quando você resolve o mesmo problema usando duas abordagens fundamentalmente diferentes, 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.
fonte
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, tornar o bom no outro uma tarefa complicada.
Muitas vezes, as línguas 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.
Aqui estão algumas coisas que você pode querer fazer ao aprender um idioma.
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.
fonte
No meu caso, eu aprendo como realmente programar através do seguinte:
Além disso, como seus comentadores mencionaram, não esqueça de dominar suas ferramentas também. Aprender todas as melhores práticas e melhores teorias é inútil ou será mal implementado se você não souber o suficiente sobre sua ferramenta, neste caso, uma linguagem de programação.
fonte
Eu acho que, se você pode pensar analiticamente, tem um bom começo.
Aprenda qualquer idioma que você quiser e trabalhe sozinho através de uma série de exemplos, por exemplo, conforme apresentado em quase todos os livros que ensinam programação.
Em seguida, tente resolver seus próprios problemas. Tente encontrar soluções diferentes e compará-las. Velocidade e uso de memória são fatores comumente usados que são importantes. 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 geralmente são modificações de problemas antigos.
Muita prática e trabalho com código também em equipes o ajudarão a aumentar suas habilidades passo a passo.
Espero que minha opinião responda a sua pergunta pelo menos parcialmente.
fonte