Que impacto as linguagens de script têm nos programadores juniores? [fechadas]


18

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?



4
Aprendi a dirigir em um carro com transmissão automática. Mais tarde, recebi um com transmissão manual. Demorou algum tempo para aprender, e tive sorte de não ter aprendido a embreagem e a mudança junto com todo o resto.
precisa

2
@ Singleton: Verdadeiro. De alguma forma eu tinha que pensar em xkcd.com/326 embora ...


4
Pessoalmente, acho que não é natural aprender a programar baixo e alto. Aprendemos a engatinhar, a andar, a correr, a conversar e a escrever. Não tenho certeza qual é a lógica para a reversão da ordem natural na faculdade. Normalmente, ouço as pessoas concluírem "porque se foi difícil para mim aprender, é preciso continuar difícil para você". Até Joel disse isso. Eu acho que o ciclo nunca vai acabar.
usar o seguinte código

Respostas:


26

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.


1
+1, embora eu não ache que C seja mais fácil de aprender do que Python, em qualquer sentido. Talvez haja menos conceitos para aprender em geral, mas você aprenderá mais na mesma quantidade de tempo com o Python. E, é claro, se C é fácil demais, sempre existe C ++, ensinando as complexidades das linguagens de alto e baixo nível. ;)
Martin

+1, este foi o meu pensamento! Eu gostaria de ter lido esta classe antes :)
joe_coolish

22

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á.


+1 para a resposta perfeita - mostrando de forma concisa o quanto a pergunta original está equivocada! (Como coincidência total, eu comecei com BASIC também ;-)
Péter Török

5
Surpreende-me quantas pessoas ficam lá ..: o /
Gary Willoughby:

1
Resposta excelente. Breve, preciso e direto ao ponto. Comecei com o BASIC também.
Michael Riley - AKA Gunny

11

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.


6
Tenho que discordar de você. As conseqüências são coisas ruins, porque a conseqüência é a ignorância. Isso significa que, eventualmente, algo irá quebrar e o problema estará em um nível mais baixo de abstração do que você entende, e assim você não terá idéia de como corrigi-lo. Isso é sempre uma coisa ruim.
Mason Wheeler

6
Tenho que concordar com você. As conseqüências de não saber o que se passa sob o capô é uma profunda simplicidade e franqueza de expressão, sem preocupações com as nuances do hardware. Os níveis mais baixos de abstração são para designers de idiomas, não desenvolvedores de aplicativos.
S.Lott

1
@Mason: Absolutamente. Certa vez, ganhei uma quantia substancial de dinheiro poupando a bunda de uma equipe de programadores que não tinham idéia do que realmente estava acontecendo e, portanto, não conseguiam fazer com que seu sistema de produção funcionasse bem ou funcionasse de maneira confiável. (Uma vez porque esse tipo de trabalho suga A vida é muito curta.!)
William Pietri

1
@Mason - Eu concordo com o que você disse, que é importante ter esse conhecimento se você estiver programando profissionalmente. Eu achei meu conhecimento de ponteiros, estruturas discretas e cálculo lambda extremamente valiosos. Eu estive preso em equipes nas quais os membros da minha equipe não tinham essas habilidades e eles acabaram criando códigos muito complicados ou com muitos erros. só porque eles não sabiam melhor. Parece que, às vezes, as faculdades alimentam os estudantes de CS com muito leite e carne insuficiente, mas, por outro lado, se eles alimentam a carne dos programadores iniciantes, correm o risco de desistir.
joe_coolish

1
@ Joe: De acordo com Joel, fazer com que aqueles que não conseguem lidar com isso desista é o ponto principal. E como não apenas um programador de computador, mas também um usuário de computador , aquele que regularmente trabalha com programas horríveis que eu posso supor que foram criados por codificadores incompetentes, eu realmente gostaria que o pouco "fazê-los desistir" fosse mais bem-sucedido!
Mason Wheeler

5

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).


3

Não há nada simples no Python. Dê uma olhada no Unicode e na meta-programação.


Concordo que o Python pode ser muito complexo e MUITO poderoso. Mas o básico (manipulação de corda, de manipulação de array, etc) são muito mais fáceis em Python do que em C.
joe_coolish

1
O Python é muito simples para começar e muitas tarefas diárias são uma ordem de magnitude mais simples do que, por exemplo, nas linguagens de sistemas. Não, o idioma como um todo, seus detalhes sangrentos e os recursos avançados não são simples (isso vale para todos os idiomas não relacionados a brinquedos). Mas essa não era a questão.

1
Então, por que meu if searchstring.lower () em filecontent.lower (): não estava funcionando? por causa do bom no arquivo sql UTF-16LE em tfs no windows com Python2.7. Não foi divertido. conseguiu funcionar. demorou algumas horas. string.find () também não estava funcionando ... Argghhh!
Christopher Mahan

1
Como o Unicode é mais simples de manusear em C?
dan04

3

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.


6
Mas Python e Ruby são fortemente tipados. Isso é ortogonal à digitação dinâmica. Strings e números não se convertem implicitamente.
dsimcha

3
@dsimcha: Sim - e como isso refuta o que o @Ingo disse?
Jim G.

1
Porque esta pergunta é principalmente sobre Ruby e Python. Eu pensei que ele estava sugerindo que ele acha que Ruby e Python são fracamente tipados, o que é um mal-entendido comum.
dsimcha

1
@ davidk01 - esse é o meu ponto: os valores têm tipos, quer queiramos ou não. Mas nas linguagens dinamicamente digitadas (se esse termo lhe agrada mais), as variáveis ​​não. Em vez disso, a verificação de tipo é feita em tempo de execução para distinguir entre as muitas variantes do Unitype.
Ingo

2
@Ingo: Eu pelo menos conseguia encontrar usuários do Common Lisp que pensavam que a falta de tipagem estática era um benefício (na verdade, tipagem estática opcional, utilizável tanto para verificação de erros ou para fins de desempenho), pois acelerava o desenvolvimento e os erros que a digitação estática teria evitado não se mostraram difíceis de encontrar e corrigir na prática. Não vi nada além de opinião de um jeito ou de outro.
David Thornley

2

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.


2

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.


1

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.


1
Experimente antes de suspeitar. A principal diferença é que você não dá a mínima para onde é um Fooou Barou algo completamente diferente, desde que você pode .frobnicate()-lo de qualquer maneira. Sem interfaces explícitas.

Eu estou familiarizado com linguagens dinâmicas, pois meu trabalho diário é com Ruby on Rails. E sim, essa é uma convenção importante dentro da comunidade de idiomas dinâmicos. Em geral, isso é chamado de "digitação de pato". Na literatura de pesquisa, eles são chamados de tipos estruturais e existem algumas convenções de sintaxe que podem mostrar como é um 'tipo quackable'. Além disso, existem sistemas de tipos que podem reconhecê-los e verificar se seu programa está tratando os patos com gentileza.
Farley Cavaleiro

Conheço os tipos estruturais e considero-os uma ideia bastante interessante. Mas como não existe uma única linguagem madura e amplamente usada remotamente (a base de usuários no nível O'Caml seria um bom começo) que as utiliza, não as considero uma alternativa prática à digitação dinâmica. Triste, mas fato.

Idiomas amplamente usados ​​não, mas isso não impede que você faça o boot do seu próprio sistema de tipos em um sistema amplamente usado. Tenho certeza de que você já viu artigos sobre coisas como inferência de tipo para linguagens dinâmicas.
Farley Knight

Mais uma vez, não considero algo usado por mim e pelo cara ao lado uma alternativa prática . Um programador precisa de coisas como bibliotecas, sintaxe estável, ferramentas, etc.

1

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.


0

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.


A programação desleixada é uma fonte de vazamento de memória e não é preciso muito para ensinar as pessoas a acompanhar recursos, como identificadores de arquivos. Existem inúmeros programas C com vazamento de memória, então não tenho certeza do que você está ensinando às pessoas sobre ponteiros o mais rápido possível.
Davidk01

Isso é verdade, mas ... (a) não entender o básico leva a algum código incorreto (via programação hacking-to-it-right ou sloppy) e (b) eu estava tentando motivar por que os ponteiros ainda são relevantes, não afirmando que C é melhor que idiomas coletados por lixo em termos de vazamento de memória. O objetivo de chegar a ponteiros mais cedo possível é para que possamos, em seguida, obter o inferno fora de C.
JohnL4

0

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.


0

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.


0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.