Eu tive uma discussão com um dos meus professores no outro dia.
Debatemos o impacto que linguagens de script mais simples (como Python ou Ruby) têm nos programadores juniores.
Ele argumentou que as linguagens de script engendram técnicas de codificação desleixadas, porque os iniciantes não entendem o que está acontecendo "sob o capô". Ele também citou outros exemplos de como as linguagens de script geralmente fazem com que o programador negligencie preocupações sobre eficiência, gerenciamento de memória, complexidade operacional, etc.
Argumentei que as linguagens de nível inferior podem ser demais para algumas pessoas e elas podem desistir antes de desenvolver uma paixão pela programação. Quando comecei a aprender minha primeira linguagem de programação (C), cheguei a indicadores e desisti porque os conceitos eram muito difíceis (em minha defesa, eu tinha apenas 14 anos). Se não fosse pelo Java, talvez eu não tivesse me tornado um programador! Se eu tivesse começado com uma linguagem mais simples e depois aprofundado, acho que não teria desistido e teria aprendido tanto quanto comecei com C.
A aula terminou antes de ambos os lados serem totalmente explorados.
Até esse ponto, tenho pregado que iniciantes devem começar com linguagens de script e depois se aprofundar; mas depois dessa discussão, comecei a me perguntar se isso era um pensamento errado.
Então, qual o impacto das linguagens de script nos programadores juniores?
Respostas:
Discordo. Primeiro, as linguagens de script estão em um nível mais alto de abstração e não há nada de errado nisso. No começo, estamos apenas tentando aprender os princípios. Na verdade, eu diria que a escolha de um idioma de nível inferior pode incentivar a codificação incorreta, pois é preciso lidar com alguns detalhes antes de poder entendê-los. Em vez disso, com um idioma mais simples, pode-se começar a escrever código limpo e conciso desde o início.
Segundo, há muito o que aprender nessas línguas. Quanto a aprender a linguagem, eu diria que C é mais fácil do que Python. É preciso lidar com ponteiros ou cuidar de strings, mas há muitos outros conceitos para aprender em Python. Compreensões, orientação a objetos, reflexão, métodos mágicos, funções de primeira classe, lambdas, iteradores e geradores, metaclasses: tudo isso faz parte da linguagem.
Eu acho que começar com Python permite aprender muito mais sobre programação e com uma curva de aprendizado mais suave. Uma linguagem de nível inferior pode ter menos abstrações - conceitos menos gerais para aprender - e sobrecarregar o iniciante com detalhes que ele pode querer prescindir.
fonte
Não importa onde você começa. É importante para onde você vai depois de começar.
O BASIC pode não ser a linguagem mais elegante do planeta, mas abrange os fundamentos da programação processual, e isso é suficiente para começar.
Comecei com o BASIC. Eu não ficar lá.
fonte
Seu professor está correto, exceto que ele assume que suas conseqüências são coisas ruins.
Se você considera o aprendizado de idiomas uma atividade puramente acadêmica para aprender como os computadores funcionam, ele está correto. Se você olhar para eles como uma maneira de fazer as coisas, então você está correto.
fonte
Eu acho que "linguagem de script" é uma palavra terrível, extremamente desatualizada ou, na melhor das hipóteses, adequada a uma classe de idiomas específicos de domínio. Seu professor está apenas alinhando tudo o que claramente não tem entendimento suficiente em um eixo do mal.
Uma distinção sensata a ser feita é aquela entre linguagens de alto nível e linguagens de baixo nível, ou entre as de tipo estático e dinâmico, que são verdadeiramente ortogonais.
O assembler é digitado dinamicamente em baixo nível (se falar em tipos faz algum sentido), C é digitado estaticamente em baixo nível, Ruby é digitado dinamicamente em nível alto, Haskell é digitado estaticamente em alto nível. Java não é tipicamente estatístico de nível alto nem baixo; o C ++ é tipicamente estatístico de nível alto e baixo. E assim por diante.
A discussão pode ser apenas quais paradigmas são mais adequados para um programador de nível de entrada.
Estou convencido de que a programação de baixo nível provavelmente não é uma delas. Pode ter sido, em algum momento no início dos anos 90, quando você realmente podia produzir resultados interessantes em tempo razoável.
Mas a programação é alimentada pela paixão. A paixão é nutrida por recompensas. Portanto, programadores iniciantes devem começar com ferramentas recompensadoras. As ferramentas de baixo nível não são mais gratificantes, porque há um vasto mar de ferramentas de alto nível que proporcionam o mesmo resultado em uma fração do tempo.
O pensamento humano é abstrato. À medida que aprendemos a entender o mundo, fazemos isso por abstrações de grão muito grosseiro e entramos em detalhes conforme necessário.
Para uma criança entender seu ambiente, você não vai ensinar matemática, física, química, biologia, história, sociologia e filosofia. Você dá a ele um modelo muito simples do mundo para lidar com e, por si só, muito tempo para alcançá-lo, lança incessantemente perguntas sobre você quando jovem e nega completamente sua autoridade posteriormente.
É assim que pensamos. O cérebro humano só pode processar quantidades limitadas de "unidades" de informação, mas o grau de abstração pouco importa na quantização da informação. Por exemplo: ler a expressão '34 * 75 'para nós é mais simples do que calculá-la, enquanto para computadores é o contrário. Reconhecer (e assim abstrair) um monte de pixels pretos em uma linha ondulada, que pode ser reconhecida (e, assim, mais uma vez abstraída) como um dígito individual é uma tremenda quantidade de trabalho.
Minha avó entende a idéia de abrir um arquivo. No entanto, ela não tem entendimento abaixo desse nível. E, francamente, se ela tivesse aprendido isso estudando primeiro o funcionamento interno do hardware e do sistema operacional e o que não, ela nunca teria chegado lá.
Existem muitas pessoas por aí que complicam demais as coisas, porque nunca foram ensinadas a pensar em termos de soluções claras, concisas e, portanto, elegantes, mas gastaram muito tempo se preocupando com detalhes intercambiáveis de baixo nível e resolvendo problemas contra eles. Ensinar as pessoas a pensar como computadores é a pior abordagem possível para a programação.
O valor da programação está em encontrar uma solução para um problema. Expressá-lo como código é realmente uma tarefa mecânica e monótona e deve ser feita simplesmente com as ferramentas adequadas.
Ah, e não se preocupe por não entender os ponteiros. Eu tive o mesmo problema na mesma idade. O problema aqui também é a falta de abstração. Classicamente, você aprende sobre ponteiros em algum livro em C e, enquanto luta para entendê-los, isso caminha de mãos dadas com a alocação de memória e, portanto, com a pilha e pilha de memória e assim por diante. O conceito abstrato por trás dos ponteiros é indireto. Uma variável que contém um índice em uma matriz específica é exatamente isso (na verdade, é realmente a mesma em C, onde a matriz específica é o seu espaço de endereço), e você não precisa de aritmética de ponteiro para isso.
Isso serve apenas para ilustrar que a escolha de um alto nível de abstrações torna as coisas muito mais fáceis de entender.
EDIT: e quando se trata de digitar, prefiro idiomas de tipo estaticamente. E acho que os programadores iniciantes devem entender claramente o conceito de tipos (que é abstrato).
fonte
Não há nada simples no Python. Dê uma olhada no Unicode e na meta-programação.
fonte
Eu vejo outro problema muito mais profundo.
Linguagens não-unificadas não forçam alguém a prestar atenção aos tipos, a pensar em tipos. Isso é bom desde que eu tenha pequenos scripts com algumas strings e números que são convertidos entre si sem perceber. Mas chegará o dia em que isso terminará. De repente, o programa será interrompido e todas as soluções rápidas farão com que ele seja interrompido novamente.
Ou, o programador iniciante quer descobrir que ele precisará de um conjunto de listas em vez de uma lista de tuplas, mas não terá a menor idéia de "como fazer isso" e fará perguntas no fluxo de pilha que demonstram total desamparo.
fonte
Ainda mantenho que a instrução formal e a orientação são um fator muito maior do que a escolha do idioma na qualidade do código para iniciantes. No entanto, se eu tivesse que escolher um primeiro idioma para iniciantes, eu escolheria python para programadores autodidatas e C ++ para o ensino superior.
O motivo é que, com instruções formais, você pode começar com programas pequenos e triviais para estabelecer uma base teórica sólida anos antes de precisar fazer algo útil. Eu acho que essa ordem é ideal se você puder pagar o tempo, e o C ++ oferece muita ajuda com erros de compilador e falhas de segmentação entre palestras, para que você saiba se você não está entendendo os fundamentos.
Alguns desses fundamentos são muito difíceis de aprender se você é autodidata, até obter alguma experiência. Além disso, você geralmente precisa criar algo útil o mais rápido possível e pode obter os fundamentos teóricos conforme necessário, embora você corra o risco de nunca aprender mais do que o mínimo com essa abordagem. É por isso que eu recomendo uma linguagem como python nesse caso.
fonte
Vimos o contrário na faculdade e acho útil. * Começamos no nível baixo. Ponteiros, gerenciamento de memória, matrizes de caracteres ... Então, sim, começamos com C. O mesmo acontece com algoritmos: primeiro implemente uma lista vinculada, uma hashtable, uma árvore ... E só então use as bibliotecas padrão.
Depois disso, fomos para linguagens mais poderosas, como Java, C # ou perl. Mas com a vantagem de saber o que está acontecendo sob o cinto.
Enquanto isso funciona, acredito que passar das linguagens de script para uma linguagem de nível inferior também é bom. O conhecimento de um idioma de nível alto e baixo garante que você tenha a facilidade de uso de um idioma de alto nível enquanto ainda entende o que está acontecendo. A ordem em que você as aprende é menos importante.
fonte
Linguagens de script não tornam os programadores desleixados. A falta de clareza no entendimento do domínio do problema (por exemplo, os negócios que o programa atende) é o que causa desleixo.
Como diz o velho ditado, "Você pode escrever COBOL em qualquer idioma.", Embora eu suspeite que, quando todos os tipos de dados pareçam iguais , fica mais difícil ver quais são os aspectos essenciais do seu programa, um recurso importante do COBOL- ização.
fonte
Foo
ouBar
ou algo completamente diferente, desde que você pode.frobnicate()
-lo de qualquer maneira. Sem interfaces explícitas.Eu diria que linguagens de script não incentivar técnicas desleixadas. (Observe que isso não está dizendo que os idiomas são ruins , apenas que é difícil manter grandes bases de códigos nesses idiomas). No entanto, acho que por razões diferentes das outras respostas aqui.
Eu acho que para usar qualquer linguagem que um programador precise ter um entendimento básico da programação como um todo. Eles não serão eficazes em lugar algum se não entenderem conceitos como vetores, árvores e tabelas de hash. Eles não precisam necessariamente implementar essas coisas, mas precisam conhecer suas características.
Onde eu acho que a desleixo entra em jogo não é a habilidade de programação, mas quando é preciso criar componentes reutilizáveis. Essas linguagens não exigem que você defina boas interfaces entre as unidades de código ou os mecanismos para que as bibliotecas imponham restrições em seus clientes. Não é impossível criar bons componentes reutilizáveis nessas linguagens, é apenas muito mais difícil.
As linguagens de script atraem o programador iniciante, porque ele permite que sejam executadas mais coisas "únicas" em menos tempo, mas quando esses mesmos programadores começam a fazer a manutenção, geralmente têm problemas com essas linguagens.
Não estou dizendo que as linguagens de script são ruins - longe disso. Mas eles dificultam a manutenção de enormes bases de código (vários milhões de linhas) (que é uma das razões pelas quais você não vê essas bases de código feitas em linguagens de script). Quando você precisa de soluções relativamente pequenas ou únicas, elas permitem que você realize muito mais em menos tempo e menos código (e menos código é quase sempre melhor).
Lembre-se de que nenhuma ferramenta é melhor para todos os trabalhos. Escolha a ferramenta mais apropriada para a situação. Isso vale para linguagens de programação, assim como para qualquer ferramenta.
fonte
Estou com seu professor, mas também com @Singletoned quando ele diz que seu professor está assumindo que as consequências (por exemplo, nenhum conhecimento de desempenho) são ruins.
Eu acho que começar com C é melhor do que começar com linguagens de script. Como professor, eu me concentrava em toda essa coisa da arquitetura de von Neumann (ALU, registros, memória, portas de E / S, ...), passava diretamente para ponteiros (desculpe, é realmente um conceito chave [não liberando referências (ou seja, ponteiros) nas linguagens da VM é uma fonte principal de vazamentos de memória]), atinge algumas estruturas de dados (árvore, lista vinculada, hashtable 1 ) e, em seguida ... aumenta um nível de abstração para outra coisa (OO, programação funcional, algo - regras de digitação estática fortes , yo \ m /, portanto, não há "linguagens de script"> :().
1 Hmm, talvez eu concorde com seu professor em considerações de desempenho, afinal.
fonte
Acho que o melhor é começar com uma linguagem modular e depois continuar com coisas mais complicadas. Nos meus dias, começamos com Pascal e COBOL e tentamos entender o que significam sub-rotinas, variáveis de fluxo de controle etc. Somente depois de me sentir confortável com Pascal, tive o desejo de mudar para linguagens como C / C ++ e aprender todas as outras técnicas que são mais um complemento para o programador júnior.
fonte
Vocês dois estão certos.
As linguagens de script definitivamente tornam mais difícil para os desenvolvedores iniciantes entenderem o que realmente está acontecendo. (O mesmo acontece com bancos de dados, estruturas e bibliotecas. Ah, e navegadores, servidores, redes e sistemas de arquivos.) Quando entrevisto desenvolvedores mais jovens, muitas vezes fico surpreso com o pouco que eles sabem sobre como os computadores realmente funcionam e como estão propensos à carga. programação -cult.
Por outro lado, a primeira coisa que procuro nas entrevistas não é o entendimento perfeito, é que elas adoram fazer as coisas. Quando eu comecei, um computador fazendo qualquer coisa era impressionante, então minhas pequenas coisas de montador da Apple Basic e 6502 me pareciam realmente impressionantes. Mas hoje em dia os computadores fazem muitas coisas incríveis, então eu acho que é bom para as pessoas começarem em um nível bastante alto, se é isso que é preciso para elas ficarem viciadas.
Basicamente, acho que não há problema em começar na parte rasa da piscina, contanto que você acabe buscando águas mais profundas.
fonte
Em primeiro lugar, eu poderia começar com uma linguagem de alto nível de abstração. Atualmente, eu recomendaria Python. O motivo mais importante para escolher uma linguagem de script como a primeira língua é que você pode montar facilmente algo que funcione. Como Joe menciona em sua pergunta, a principal coisa ao se tornar um programador é que você tem a motivação para prosseguir e se aprofundar. Essa motivação é obtida quando você é capaz de criar software útil e útil.
Além dos pontos com entendimento da abstração (nível alto) e entendimento da implementação subjacente (nível baixo), há um terceiro ponto que está faltando. Para ser um bom programador hoje em dia, você certamente deve dominar os dois pontos acima. Além disso, é essencial para sua competência que você observe constantemente as novas tecnologias e pontos de vista. Não importa de qual nível de abstração você começa, você deve melhorar constantemente e questionar seus métodos atuais.
Deve ficar claro desde o início que as linguagens de programação são apenas ferramentas para realizar o trabalho. É muito importante escolher a ferramenta correta para uma tarefa específica. Penso que, para um programador iniciante, uma linguagem de script de alto nível ajudará a enfatizar esse ponto. Uma linguagem de nível superior dará uma perspectiva mais ampla e motivará o programador a se aprofundar mais.
fonte