Qualsiasi linguaggio di programmazione può essere imparato facilmente se i fondamenti della programmazione sono forti. Un fatto o un mito? [chiuso]


33

È vero che una persona con fondamenti abbastanza buoni nella programmazione può facilmente imparare qualsiasi linguaggio di programmazione?

Bene, quando dico i linguaggi di programmazione, mi riferisco ai linguaggi agili e dinamici come PHP, Perl, Ruby, ecc. Ma non ai precedenti linguaggi di programmazione di un lontano passato.

Ho lavorato solo su java, groovy e flex in una certa misura. Quindi considerando il fatto che sono un programmatore amatoriale ma uno studente veloce, su base approssimativa, quanto tempo ci vorrebbe per prendere piede in una di queste lingue?


1
Sostituisci "Qualsiasi" con "Più".

4
Cosa rende una lingua "agile"? Pensavo che l'agile fosse un processo di sviluppo .
oosterwal,

17
Masterizzato facilmente? No. Imparato facilmente? Sì. La padronanza implica un livello di competenza che richiede anni di utilizzo in qualsiasi lingua. Imparare come usare qualsiasi lingua una volta che i tuoi fondamenti sono in atto dovrebbe essere un dato di fatto.
Joel Etherton,

1
No, è vero solo per le lingue simili. Conoscere Java non ti aiuterà a imparare Haskell, ma ti aiuterà a imparare C ++ e così via. Conoscere PHP non ti aiuterà a imparare l'assemblaggio, ma ti aiuterà a imparare Ruby.
iveqy,

Risposte:


46

Sì, con riserve.

Quattro settimane fa, direi di avere competenze di livello professionale in C e C ++ e abilità di livello amatoriale in Java. Il mio capo mi ha chiesto di scrivere del software in JavaScript, con il quale non avevo esperienza, e sono partito.

Nelle due settimane successive ho letto molti frammenti di codice di esempio, ho trovato tutte le librerie interessanti e ho scritto il mio programma. È fatto e funziona. Poi la settimana scorsa ho comprato un libro JavaScript e l'ho letto e, ragazzo, non sapevo cosa stavo facendo. Ora capisco perché i miei oggetti si comportano in modo così strano.

Quindi ora dico, conosco un po 'di JS. Posso leggerlo e lavorarci, ma sono sicuro che quello che sto scrivendo sia inefficiente, difficile da leggere e non segua le migliori pratiche.

In generale, uno studente veloce può impiegare una settimana e iniziare a produrre prodotti di bassa qualità in una nuova lingua. Se conosci Java, puoi prendere abbastanza rapidamente C, C ++, PHP, Python, JavaScript, ma solo abbastanza bene per modificare il codice o scrivere funzioni ben definite. (Perl potrebbe essere più difficile perché i regex sono complessi.) Per progettare correttamente un sistema in una nuova lingua, probabilmente vorrai un anno di sviluppo professionale sotto mentori esperti.


18
Mi azzarderei a dire che ci vogliono due anni. Il primo anno dovrebbe lasciarti relativamente competente, il secondo anno dovrebbe lasciarti relativamente efficiente.
Tim Post

4
Ho avuto questa esperienza molti anni fa (dopo aver appreso una dozzina di lingue) ... Ho dovuto lavorare ad Ada. Per scrivere il codice in Ada ci sono voluti alcuni giorni. Per entrare davvero nello spazio di testa dei progettisti di sistemi linguistici / run-time e scrivere BUONO codice, ci è voluto un anno.
quick_now

1
Ad essere sincero, ho imparato anche Java in questo modo. Sono attualmente al 1 ° anno, e direi che "relativamente competente" è preciso.
Brad,

1
Il motivo è che i tuoi fondamenti, forse anche forti, non erano ampi. Se avessi saputo di altri linguaggi, con chiusure, comprensione dell'elenco, altre strutture di dati e altre regole di scoping prima di jscript, avresti potuto avere meno problemi.
Peter,

Ho avuto un'esperienza simile con VB.net, fino a quando non ho letto il codice che il mio capo (con diversi anni di esperienza VB) aveva scritto ... oh mio Dio. Gli odori di codice come il codice duplicato tendono a trascendere le lingue!
DisgruntledGoat

28

Fondamentalmente la risposta è sì ... e no ... dipende da cosa intendi per fondamenti e per padroneggiare facilmente .

FATTO

  • Conoscere i fondamenti della programmazione aiuterà indipendentemente dalla lingua. Per fondamenti qui intendo cose che non sono specifiche di un determinato paradigma. Cose come algoritmica, livelli di astrazione, isolamento ecc.

  • Conoscere bene i fondamenti di un determinato paradigma (OOP, funzionale ecc.) Faciliterà l'apprendimento delle lingue a supporto dello stesso paradigma. Si potrebbe dire che conoscere bene una lingua ti permetterà di imparare rapidamente le lingue della stessa famiglia.

  • Con tutte le lingue apprese nella stessa famiglia, la prossima mi renderà molto più facile, non sarei sorpreso se questa curva di apprendimento fosse esponenzialmente più veloce poiché ne sai di più.

MITO

  • Quando ci si sposta su un nuovo paradigma diverso, conoscere bene una lingua del primo paradigma non sarà utile quanto apprendere una lingua nella stessa famiglia. In effetti, a seconda della differenza tra loro, potresti benissimo dover prima disimparare alcune cose prima di poter andare avanti e far breccia nel nuovo paradigma.

--- modificata l'ultima sezione in base ai commenti ---

Fatto...

  • Conoscere un primo paradigma può aiutarti a imparare il prossimo ...

ma

Mito

  • Non essere arrogante, può anche rallentarti o essere di alcun aiuto per il terzo paradigma.

tutto bene tranne l'ultimo. aneddoticamente, conoscere un linguaggio di programmazione procedurale come C non è stato di alcun aiuto quando si è cercato di imparare un linguaggio logico come Prolog, e nel mio caso si è messo in mezzo, ad es. "Q: come posso codificare un loop in prolog?" ==> "A: tu no".
Steven A. Lowe,

2
Le prove aneddotiche che ho sentito qui e là suggeriscono che puoi iniziare un programmatore principiante su Scheme abbastanza facilmente, ma che è molto più difficile se hanno programmato in BASIC o C # o qualcosa del genere prima.
David Thornley,

1
@Steven & David: non ero del tutto sicuro di quest'ultimo. Sono passato dal procedurale all'oggetto funzionale, ma non ho ancora provato la famiglia logica. L'ho trovato più facile col passare del tempo e dell'esperienza, ma non ho osato generalizzare. Modificherò la risposta in base al tuo commento.
Newtopian,

14

per una lingua simile , sì

per le lingue con paradigmi radicalmente diversi, non tanto

esempio: conosci C ++, vuoi imparare Java, un gioco da ragazzi; conosci VB.NET, vuoi imparare Prolog ... l'intera torta, forse tre o quattro torte


1
Sono d'accordo. Ci sono alcune lingue che stanno solo seguendo una filosofia completamente diversa; quindi non è banale passare ad esempio da un linguaggio imperativo come C a un linguaggio di programmazione logica come Prolog senza fare alcuno sforzo.
sakisk,

4

Credo che la breve risposta sia: "una specie di vero ma difficile da verificare". È molto difficile imparare l'API, gli usi, i modi di dire e i paradigmi (OO, funzionali, ecc.) Strettamente associati rispetto alla sintassi reale di una lingua. Penso che il linguaggio stesso sia facilmente conquistabile se hai una forte conoscenza ed esperienza sui fondamenti di programmazione e alcune conoscenze sui compilatori, ma difficile da padroneggiare a causa di cose ausiliarie.

Un chiaro esempio sarebbe passare da una lingua all'altra; C a Java. La sintassi del codice assomiglia molto ai programmi in stile C, ma devi anche conoscere i java api (generici, garbage collection, ecc.) E molto probabilmente, nel nostro attuale "panorama IT", alcuni framework di terze parti (Spring, jUnit , Ibernazione e così via) per fare qualcosa di utile per le aziende. Quindi, se hai già fatto C in precedenza, la sintassi del linguaggio non sarebbe il problema, è il resto.

Questo viene da me che conosce Java, C #, Javascript, HTML, CSS, Delphi, ecc. Potrei non conoscere tutti gli angoli dei framework o delle librerie che utilizzo, ma conosco la mia strada e posso imparare rapidamente grazie a la mia esperienza con quelli diversi da quelli precedenti. Per uno "studente veloce" è davvero tutto il pensiero laterale.


Sono completamente d'accordo. Imparare le migliori pratiche / API / librerie popolari / ecc. Richiede molto, molto più tempo rispetto all'apprendimento della sintattica di un linguaggio di programmazione, ed è la vera sfida che si trova, e qualcosa che può essere acquisito solo impiegando un po 'di tempo lavorando con la lingua e il suo ecosistema.
jviotti,

3

I fondamenti dell'informatica che dovresti conoscere includono non solo le basi matematiche (teoria degli insiemi, logica, teoria dei grafi, algebra, teoria dell'informazione, teoria dell'informazione algoritmica, ecc.) Ma anche un numero di linguaggi di programmazione, almeno uno per ciascuno gruppo - ovvero, un imperativo (possibilmente con OOP, ma quel bit non è obbligatorio), uno desideroso funzionale, uno pigro funzionale, uno logico, uno concatenativo o basato su stack.

Con questa base sarai in grado di imparare facilmente qualsiasi nuova lingua in pochissimo tempo. Se mancano alcuni bit, potresti dover affrontare una forte resistenza.

E il modo migliore per imparare a fondo la lingua è implementare un compilatore o un interprete di giocattoli per un sottoinsieme significativo di esso (ovviamente senza una libreria standard - questa è la parte più complicata e noiosa di qualsiasi lingua).


2

Credo che il consenso qui sia che avere buoni fondamenti aiuterà in una certa misura, e non sono in disaccordo. Tuttavia, un punto che manca alle altre risposte è il problema di cogliere gli idiomi della lingua, e penso che per padroneggiare una lingua devi scriverla in modo idiomatico.

Ad esempio puoi scrivere risme di C # completamente corretto senza mai usare l' usingistruzione per disporre automaticamente degli oggetti, ma in C # idiomatico ben scritto vedrai using {...}molto. Non conosco nessuno dei linguaggi none-.Net che hanno questo costrutto (anche se ne conosco pochissimi altri e il mio Java è piuttosto arrugginito, quindi potrei sbagliarmi), quindi anche un esperto proveniente da un'altra lingua che non ha questo La funzione dovrà imparare da zero questo linguaggio.


Esistono idiomi simili ampiamente utilizzati in Lisp e Scheme, quindi non sarà nulla di nuovo per uno che proviene da quel background e uno cercherà deliberatamente questa funzione in qualsiasi nuovo linguaggio.
SK-logic,

Sì, ma se venite da, diciamo, Pascal o ADA, sarebbe un linguaggio completamente nuovo che non sapreste nemmeno cercare fino a quando non lo vedrete.
Steve,

questo è esattamente il motivo per cui credo che si debba conoscere almeno una lingua di ciascun gruppo per poter apprendere qualsiasi nuova lingua e scegliere saggiamente gli strumenti.
SK-logic,

@ SK-logic: quando ho visto cose come "usare" e "provare ... finalmente", non ho avuto problemi a capirle come l'equivalente approssimativo del Common Lisp "svolgete-proteggete". Tuttavia, caratteristiche linguistiche del genere potrebbero non apparire in una determinata selezione multi-paradigma di lingue.
David Thornley,

1

È una vera affermazione per alcune definizioni di "abbastanza buono" e "facilmente".

Migliore è la tua comprensione dei fondamenti, più facile è passare da una lingua all'altra. Se sei un programmatore esperto Java che ha una solida conoscenza dei linguaggi orientati agli oggetti, ad esempio, le differenze di sintassi di base tra Java e C # dovrebbero essere relativamente facili da padroneggiare in una o due settimane. Ci vorrà più tempo per capire come le funzionalità di tutte le librerie associate si mappano dall'una all'altra, ma probabilmente avrai una buona gestione delle librerie di base in un mese o due. Quindi, si tratta di capire quei casi in cui l'approccio standard a un problema nel linguaggio A non si traduce direttamente nell'approccio standard nel linguaggio B (cioè si desidera utilizzare LINQ in C # anziché JPA in Java) e mettersi a proprio agio abbastanza nella nuova lingua che tu ' stai pensando piuttosto che pensare nella vecchia lingua e "tradurre". Ciò richiederà probabilmente dai tre ai sei mesi, a seconda di quanto bene in genere utilizzi le mappe. A sei mesi, l'esperto programmatore Java sarebbe probabilmente uno sviluppatore C # ragionevolmente efficiente e competente. Ma come per qualsiasi cosa, puoi trascorrere anni imparando tutti i dettagli intricati, padroneggiando varie librerie e componenti aggiuntivi che non fanno parte della lingua ma fanno parte dell'ecosistema circostante e generalmente migliorando te stesso come sviluppatore in quella lingua. l'esperto programmatore Java sarebbe probabilmente uno sviluppatore C # ragionevolmente efficiente e competente. Ma come per qualsiasi cosa, puoi trascorrere anni imparando tutti i dettagli intricati, padroneggiando varie librerie e componenti aggiuntivi che non fanno parte della lingua ma fanno parte dell'ecosistema circostante e generalmente migliorando te stesso come sviluppatore in quella lingua. l'esperto programmatore Java sarebbe probabilmente uno sviluppatore C # ragionevolmente efficiente e competente. Ma come per qualsiasi cosa, puoi trascorrere anni imparando tutti i dettagli intricati, padroneggiando varie librerie e componenti aggiuntivi che non fanno parte della lingua ma fanno parte dell'ecosistema circostante e generalmente migliorando te stesso come sviluppatore in quella lingua.


1

Direi che dipende completamente dall'entusiasmo di una persona nell'apprendimento della nuova lingua. Quando i fondamenti sono forti e se riesce a capire come la nuova lingua interpreta qualsiasi cosa, allora è abbastanza facile imparare qualsiasi lingua.

Il miglior esempio è me stesso. Ho lavorato con parecchie lingue anche se ho svolto gran parte del mio lavoro in C # ma ho iniziato la mia carriera da C e ho continuato a studiare C ++, Java, VB, PHP, linguaggi di scripting, perl e così via. Ovunque durante questo periodo non mi sono mai sentito come se non potessi imparare questa lingua.


3
E le lingue che hai descritto sono più o meno simili tra loro. Per una sfida, prova a imparare Haskell, o Scheme, Forth o Prolog.
David Thornley,

1

Non ho mai trovato difficile imparare un nuovo linguaggio di programmazione, al contrario, è stato molto divertente per la maggior parte del tempo. Eppure, ci sono lingue che ho guardato ma che non ho mai capito, perché non potevo cogliere l'idea dietro di loro, se ce ne fosse. Un esempio è COBOL, non ho mai capito cosa dovesse succedere in quale DIVISIONE e SEZIONE e perché. Altri esempi sono PHP e Groovy. Con PHP ho cercato di capire perché uno ne avesse bisogno in primo luogo, dato che esiste il perl. Forse qualcuno può spiegare. Con Groovy non capisco nemmeno un po 'i concetti alla base.


1

Tutto dipende.

So che è spesso la risposta ...

Ma cosa significano i fondamenti ?? Molte persone che hanno fondamenti per un paradigma (come OO) non li hanno per altri paradigmi (come funzionale).

Molte persone provenienti da OO e conoscono tutti i modelli di progettazione, potrebbero non avere indizi di modelli di progettazione funzionale o cose come la comprensione dell'elenco, il curry, la ricorsione della coda, le chiusure ...

Quindi SÌ: se i fondamenti significano i fondamenti di tutti i paradigmi.

In questo caso il problema è che javascript usa molti paradigmi, come procedurale, OO e funzionale un po 'e ha uno strano ambito proveniente da Java, C ++, ...

Pertanto, in questo caso i fondamenti non aiutano, ma raccogliere più fondamenti qui e continuare a convertirli in un'altra lingua può diventare sempre più facile quanto più schemi ottieni nella tua cassetta degli attrezzi.


0

Non dimenticare che l'arte della programmazione per computer è l'arte di rimanere ESATTAMENTE ciò che intendi. Quindi qualsiasi mezzo per dire al computer cosa fare, da Java ad Access a Excel a Visual Fortran, è un linguaggio di programmazione.

E alcune lingue sono semplicemente pessime. IMHO Excel e Basic sono parolacce; Java e C ++ sono buoni linguaggi. Lo scripting di FileMaker è un linguaggio terribile. L'HTML può essere eccellente se non sei sciatto.

Puoi impararlo? Se va bene, si. Se è male, dipende dalla tua tregua disgusto. Le cose che ti fanno venir voglia di vomitare sono difficili da imparare.

Non impegnarti ad usare la lingua X su un progetto a meno che tu non abbia già visto e giocato con la lingua X.


0

La risposta è "Questo non è un mito!"

Sono proprio come te, ho anche lavorato in varie tecnologie, vale a dire. java, .net e recentemente lavorato con iPhone, Android e Blackberry.

La rete è piena di risorse, basta passare attraverso le informazioni per capirlo, implementarlo e andare oltre.

In effetti "La tecnologia è fatta per gli sviluppatori, non gli sviluppatori sono fatti per le tecnologie, le tecnologie cambiano ma gli sviluppatori no".

:)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.