Che impatto hanno le lingue di scripting nei programmatori junior? [chiuso]

18

Ho avuto una discussione con uno dei miei insegnanti l'altro giorno.

Abbiamo discusso dell'impatto che i linguaggi di scripting più semplici (come Python o Ruby) hanno nei programmatori junior.

Ha sostenuto che i linguaggi di scripting generano tecniche di codifica scadenti perché i principianti non capiscono cosa sta succedendo "sotto il cofano". Ha anche citato altri esempi di come i linguaggi di scripting spesso impediscano al programmatore di trascurare le preoccupazioni sull'efficienza, la gestione della memoria, la complessità operativa, ecc.

Ho sostenuto che i linguaggi di livello inferiore potrebbero essere troppo per alcune persone e potrebbero rinunciare prima che sviluppino una passione per la programmazione. Quando ho iniziato ad apprendere il mio primo linguaggio di programmazione (C), ho avuto dei suggerimenti e ho rinunciato perché i concetti erano troppo difficili (a mia difesa, avevo solo 14 anni). Se non fosse per Java, potrei non essere diventato un programmatore! Se avessi iniziato con un linguaggio più semplice e poi scavato in profondità, sento che non mi sarei arreso e avrei imparato tanto quanto ho iniziato con C.

La lezione è terminata prima che entrambe le parti siano state completamente esplorate.

A questo punto, ho predicato che i principianti dovrebbero iniziare con linguaggi di scripting e quindi scavare in profondità; ma dopo quella discussione, ho iniziato a chiedermi se questo fosse un pensiero errato.

So, what impact do scripting languages have on junior programmers?

    
posta joe_coolish 20.04.2011 - 23:36
fonte

14 risposte

26

Non sono d'accordo. Innanzitutto, i linguaggi di scripting sono ad un livello più alto di astrazione e non c'è nulla di sbagliato in questo. All'inizio si sta solo cercando di imparare i principi. In realtà, direi che scegliere un linguaggio di livello inferiore può incoraggiare la cattiva programmazione, dal momento che uno deve fare i conti con alcuni dettagli prima di essere in grado di capirli. Invece con un linguaggio più semplice si può iniziare a scrivere codice pulito e conciso dall'inizio.

In secondo luogo, c'è molto da imparare in queste lingue. Per quanto riguarda l'apprendimento della lingua, direi che C è più semplice di Python. Uno deve fare i conti con gli indicatori o prendersi cura delle stringhe, ma ci sono molti altri concetti da imparare in Python. Comprensioni, orientamento agli oggetti, riflessione, metodi magici, funzioni di prima classe, lambda, iteratori e generatori, metaclassi: tutto ciò fa parte del linguaggio.

Penso che iniziare con Python permetta di imparare molto di più sulla programmazione e con una curva di apprendimento più delicata. Un linguaggio di livello inferiore può avere meno astrazioni - quindi concetti meno generali da imparare - e sopraffare il principiante con dettagli di cui potrebbe voler fare a meno.

    
risposta data 20.04.2011 - 23:57
fonte
22

Non importa da dove parti. Importa dove vai dopo che inizi.

BASIC potrebbe non essere la lingua più elegante del pianeta, ma comprende i fondamenti della programmazione procedurale, e questo è sufficiente per iniziare.

Ho iniziato con BASIC. Non ho rimani lì.

    
risposta data 21.04.2011 - 05:03
fonte
11

Il tuo insegnante ha ragione, tranne che presume che le sue conseguenze siano cose cattive.

Se consideri le lingue di apprendimento come un'attività puramente accademica per imparare come funzionano i computer, allora è corretto. Se li guardi come un modo per fare le cose, allora hai ragione.

    
risposta data 20.04.2011 - 23:58
fonte
5

Penso che il "linguaggio di scripting" sia una parola terribile, che è estremamente obsoleto o che meglio si adatta a una classe di linguaggi specifici di dominio. Il tuo insegnante sta semplicemente allineando tutto ciò che chiaramente non ha abbastanza comprensione in un asse del male.

Una distinzione sensata da fare è quella tra linguaggi di alto livello e linguaggi di basso livello, o tra quelli tipizzati staticamente e dinamicamente, che sono veramente ortogonali.

L'assembler è di basso livello, tipizzato dinamicamente (se parlare di tipi ha senso), C è di basso livello, tipizzato staticamente, Ruby è di alto livello, tipizzato dinamicamente, Haskell è di livello elevato, tipizzato staticamente. Java non è né alto né basso livello tipizzato in modo statico, il C ++ è tipizzato sia a livello alto che a basso livello. E così via.

La discussione può essere solo, quali paradigmi sono più adatti per un programmatore entry-level.
Sono abbastanza convinto che la programmazione di basso livello probabilmente non lo sia. Potrebbe essere stato, qualche tempo fa, nei primi anni '90, quando in realtà si potevano produrre risultati interessanti in tempi ragionevoli.
Ma la programmazione è alimentata dalla passione. La passione è nutrita dai premi. Pertanto, i programmatori entry-level dovrebbero iniziare con strumenti gratificanti. Gli strumenti di basso livello non sono più gratificanti, perché c'è un vasto mare di strumenti di alto livello che ti danno lo stesso risultato in una frazione del tempo.

Il pensiero umano è astratto. Mentre impariamo a capire il mondo, lo facciamo con astrazioni a grana grossa e andiamo nei dettagli secondo necessità.
Perché un bambino capisca il suo ambiente, non lo insegni alla matematica, poi alla fisica, poi alla chimica, poi alla biologia, poi alla storia, alla sociologia e alla filosofia. Gli dai un modello molto semplice del mondo per far fronte e, da solo, a lungo andare oltre, spargendo incessantemente domande a te quando sei giovane e negando completamente la tua autorità in seguito.

È così che pensiamo. Il cervello umano può elaborare solo una quantità limitata di "unità" di informazione, ma il grado di astrattezza conta poco nella quantizzazione dell'informazione. Ad esempio: leggere l'espressione '34 * 75 'per noi è più semplice per noi che calcolarlo, mentre per i computer è il contrario. Riconoscere (e quindi astrarre) un mucchio di pixel neri in una linea ondulata, che può quindi essere riconosciuto (e quindi ancora una volta astratto) come una singola cifra, è un'enorme quantità di lavoro.
Mia nonna capisce l'idea di aprire un file. Comunque non ha comprensione al di sotto di quel livello. E francamente, se avesse dovuto imparare questo prima studiando il funzionamento interno dell'hardware e del sistema operativo e cosa no, non sarebbe mai arrivata lì.

Ci sono un sacco di persone là fuori, che complicano le cose, perché non hanno mai insegnato a pensare in termini di soluzioni chiare, concise e quindi eleganti, ma hanno passato troppo tempo a preoccuparsi di dettagli di basso livello scambiabili e risolvere i problemi contro quelli. Insegnare alle persone a pensare come i computer è il peggior approccio possibile alla programmazione.
Il valore della programmazione sta nel trovare una soluzione a un problema. Esprimerlo come codice è in realtà un compito più noioso e meccanico e dovrebbe essere fatto semplicemente con tutti gli strumenti adatti.

Oh, e non preoccuparti di non aver capito i puntatori. Ho avuto lo stesso problema alla stessa età. Il problema qui è anche la mancanza di astrazione. Classicamente si apprendono i suggerimenti da un libro C e mentre si fatica a comprenderli, questo va di pari passo con l'allocazione della memoria e quindi con la memoria stack e heap e così via. Il concetto astratto dietro i puntatori è indiretto. Una variabile, che contiene un indice in un array specifico, è proprio quella (in realtà è la stessa cosa in C, dove l'array specifico è il tuo spazio indirizzo), e per questo non hai bisogno di aritmetica puntatore.
Questo è solo un modo per illustrare, che la scelta di astrazioni di alto livello rende le cose molto più facili da capire.

EDIT: e quando si tratta di digitare, preferisco le lingue tipizzate in modo statico. E penso che i programmatori entry level debbano capire chiaramente il concetto di tipi (che è astratto).

    
risposta data 21.04.2011 - 17:05
fonte
3

Non c'è niente di semplice in Python. Dai un'occhiata a Unicode e meta-programmazione.

    
risposta data 20.04.2011 - 23:37
fonte
3

Vedo un altro, molto più profondo problema.

I linguaggi Unityped non costringono nessuno a prestare attenzione ai tipi, a pensare nei tipi. Questo è buono e buono finché ho piccoli script con alcune stringhe e numeri che vengono convertiti l'uno con l'altro senza accorgersene. Ma verrà il giorno in cui questo si spezzerà. All'improvviso, il programma si interromperà e ogni correzione rapida causerà l'interruzione di nuovo.

Oppure, il programmatore novizio aspirante capisce che avrà bisogno di una tupe di liste invece di una lista di tuple, ma non avrà la minima idea di "come fare questo", e farà domande sullo stackoverflow che mostra che è assoluta impotenza.

    
risposta data 21.04.2011 - 00:54
fonte
2

Continuo a sostenere che l'istruzione formale e il mentoring sono un fattore molto più importante della scelta della lingua nella qualità del codice per principianti. Tuttavia, se dovessi scegliere una prima lingua per principianti, sceglierei python per i programmatori autodidatti e C ++ per le lezioni universitarie.

La ragione è che con l'istruzione formale puoi iniziare con piccoli e banali programmi per gettare un strong fondamento teorico anni prima che tu debba fare qualcosa di utile. Penso che l'ordine sia l'ideale se puoi permetterti il tempo, e C ++ ti dà un sacco di aiuto con errori del compilatore e errori di segmentazione tra le lezioni per farti sapere se non stai afferrando i fondamenti.

Alcuni di questi fondamentali sono semplicemente difficili da imparare se sei autodidatta, fino a quando non avrai esperienza sotto la cintura. Inoltre, di solito devi rendere qualcosa di utile il prima possibile, e puoi ottenere le basi teoriche necessarie, anche se rischi di non imparare mai più del minimo con questo approccio. Ecco perché raccomando un linguaggio come Python in quel caso.

    
risposta data 21.04.2011 - 02:39
fonte
2

L'abbiamo visto al contrario al college e penso che sia utile. * Abbiamo iniziato sul livello basso. Puntatori, gestione della memoria, array di caratteri ... Quindi sì, abbiamo iniziato con C. Lo stesso con gli algoritmi: prima implementa una lista collegata, una tabella hash, un albero ... E solo allora usa le librerie standard.

Successivamente siamo passati a linguaggi più potenti come Java, C # o perl. Ma con il vantaggio di sapere cosa sta succedendo sotto la cintura.

Mentre questo funziona, credo che andare dai linguaggi di scripting a un linguaggio di livello inferiore sia pure un bene. Conoscere sia un linguaggio di alto e basso livello che ti assicura la facilità d'uso di un linguaggio di alto livello, pur comprendendo cosa sta succedendo. L'ordine in cui vengono appresi è meno importante.

    
risposta data 21.04.2011 - 10:47
fonte
1

I linguaggi di scripting non rendono i programmatori trascurati. La mancanza di chiarezza nella comprensione del dominio del problema (ad esempio, l'attività svolta dal programma) è la causa della sciatteria.

Come dice il vecchio proverbio, "Puoi scrivere COBOL in qualsiasi lingua.", anche se sospetto che quando ogni tipo di dati è uguale a , diventa più difficile vedere quali sono gli aspetti essenziali del tuo programma, una delle principali funzionalità di COBOL-izzazione.

    
risposta data 21.04.2011 - 00:42
fonte
1

Direi che i linguaggi di scripting fanno incoraggiano tecniche sciatte. (Nota che questo non sta dicendo che le lingue sono cattive , solo che è difficile mantenere grandi codebase in dette lingue) Tuttavia, penso che per ragioni diverse dalle altre risposte qui.

Penso che per usare qualsiasi linguaggio un programmatore debba avere una conoscenza di base della programmazione nel suo complesso. Non saranno efficaci da nessuna parte se non comprendono concetti come vettori, alberi e tabelle hash. Non devono necessariamente essere in grado di implementare queste cose, ma devono conoscere le loro caratteristiche.

Dove penso che la disadattazione entri in gioco non è competenza di programmazione, ma quando è necessario creare componenti riutilizzabili. Questi linguaggi non richiedono la definizione di buone interfacce tra unità di codice o meccanismi per consentire alle librerie di imporre vincoli sui loro client. Non è impossibile creare componenti riutilizzabili in tali lingue, è solo molto più difficile.

I linguaggi di scripting hanno il fascino del programmatore newbie perché consente di ottenere più operazioni "una tantum" in meno tempo, ma quando quegli stessi programmatori iniziano a programmare la manutenzione spesso hanno problemi con questi linguaggi.

Non sto dicendo che i linguaggi di scripting siano cattivi, tutt'altro. Ma rendono difficile mantenere enormi codebase (diversi milioni di righe) (che è uno dei motivi per cui non si vedono codici di questo tipo fatti in linguaggi di scripting). Quando hai bisogno di soluzioni relativamente piccole o una tantum, ti permettono di ottenere molto di più in meno tempo e meno codice (e meno codice è quasi sempre meglio).

Ricorda che nessuno strumento è il migliore per ogni lavoro. Scegli lo strumento più appropriato per la situazione. Questo vale per i linguaggi di programmazione come per qualsiasi strumento.

    
risposta data 21.04.2011 - 20:17
fonte
0

Sono con il tuo insegnante, ma anche con @Singletoned quando dice che il tuo insegnante sta supponendo che le conseguenze (ad esempio, nessuna conoscenza delle prestazioni) siano cattive.

Penso che iniziare con C sia meglio che iniziare con i linguaggi di scripting. Come insegnante, mi concentrerei su tutta la faccenda dell'architettura di von Neumann (ALU, registri, memoria, porte I / O, ...), sposta dritto su puntatori (mi dispiace, è davvero un concetto chiave [non rilasciando riferimenti (cioè puntatori) nei linguaggi VM è una fonte primaria di perdite di memoria]), ha colpito alcune strutture dati (albero, elenco collegato, hashtable 1 ) e then ... calcola un livello di astrazione in qualcos'altro (OO, programmazione funzionale, qualcosa - strong tipizzazione statica regole , yo \ m /, quindi niente "linguaggi di scripting" > :().

1 Hmm, forse sono d'accordo con l'insegnante sulle considerazioni sulle prestazioni, dopotutto.

    
risposta data 21.04.2011 - 00:42
fonte
0

Penso che la cosa migliore sia iniziare con un linguaggio modulare e poi passare a cose più complicate, ai miei giorni abbiamo iniziato con Pascal e COBOL e ho cercato di capire cosa significano le subroutine, le variabili di controllo del flusso ecc. Solo dopo essermi sentito a mio agio con Pascal ho persino avuto il desiderio di passare a linguaggi come C / C ++ e imparare tutte le altre tecniche che sono più di un'aggiunta al programmatore junior.

    
risposta data 21.04.2011 - 05:27
fonte
0

Hai entrambi ragione.

I linguaggi di scripting rendono sicuramente più difficile per gli sviluppatori principianti capire cosa sta realmente accadendo. (Quindi, database, framework e librerie. Oh, e browser, server, reti e filesystem.) Quando intervisto i giovani sviluppatori, sono spesso sbalordito di sapere quanto poco sanno come funzionano realmente i computer e quanto sono inclini al carico -cult programming.

D'altra parte, la cosa numero uno che cerco nelle interviste non è la comprensione perfetta, è che amano fare le cose. Quando ho iniziato, un computer che faceva qualcosa era davvero impressionante, quindi le mie piccole cose di assemblaggio di Apple Basic e 6502 mi sembravano davvero fantastiche. Ma oggigiorno i computer fanno un sacco di cose incredibili, quindi penso che per le persone sia bello iniziare ad un livello piuttosto alto, se è quello che ci vuole per essere agganciati.

Fondamentalmente, penso che sia giusto iniziare nella parte bassa della piscina finché finisci per pescare acque più profonde.

    
risposta data 21.04.2011 - 07:44
fonte
0

In primo luogo, ho iniziato senza dubbio un linguaggio con un livello di astrazione più elevato. Attualmente raccomanderei Python. La ragione più importante per scegliere un linguaggio di scripting come prima lingua è che puoi facilmente mettere insieme qualcosa che funzioni. Come menziona Joe nella sua domanda, la cosa numero uno mentre si diventa programmatori è che si ha la motivazione per andare avanti e scavare più a fondo. Questa motivazione si ottiene quando sei in grado di creare software funzionante e utile.

Oltre ai punti con comprensione dell'astrazione (alto livello) e comprensione dell'attuazione sottostante (livello basso) c'è un terzo punto che è mancato. Al fine di essere un buon programmatore al giorno d'oggi è necessario padroneggiare entrambi i due punti sopra. Inoltre, è fondamentale per la tua competenza che tu guardi costantemente alle nuove tecnologie e ai punti di vista. Non importa da quale livello di astrazione inizi, devi migliorare costantemente e mettere in discussione i tuoi metodi attuali.

Dovrebbe essere chiaro fin dall'inizio che i linguaggi di programmazione sono solo strumenti per portare a termine il lavoro. È molto importante scegliere lo strumento corretto per un particolare compito. Penso che per un programmatore principiante un linguaggio di scripting di alto livello aiuterà a enfatizzare questo punto. Un linguaggio di livello superiore darà una prospettiva più ampia e motiverà il programmatore a scavare più a fondo.

    
risposta data 21.04.2011 - 09:57
fonte