Quali sono le parti più difficili dei linguaggi di programmazione C ++ / C # / Java? [chiuso]

5

Ci siamo chiesti quali sono le caratteristiche dei tre principali linguaggi di programmazione che mostrano che sei un 'esperto'? Si prega di escludere le abilità 'pratiche' come il rientro.

Ho ragione nel dire che per C ++ l'aspetto più difficile da padroneggiare è STL / generici? Java sembra molto più facile man mano che la memoria viene gestita per te. Non sono nemmeno sicuro di C #?

Sto cercando di usarlo per misurare il mio attuale livello di abilità e quello che desidero puntare.

ps questo è stato pubblicato su stackoverflow ma è stato bloccato a causa di discussioni, per favore cerca di mantenerlo civile perché sono davvero interessato alle risposte di tutti:)

    
posta Moshe 02.12.2010 - 22:59
fonte

9 risposte

10

Onestamente, non penso che tu possa davvero raggruppare queste tre lingue insieme per una simile domanda. Java e C # potrebbero essere abbastanza vicini per lavorare insieme, anche se non mi sorprenderebbe se alcune delle caratteristiche più interessanti di C # fossero più difficili e quindi più nel regno "esperto" rispetto alle funzionalità che C # e Java hanno in comune - ma C ++ è in una lega completamente diversa. Ci sono troppe cose che fanno cose folli se non le usi correttamente. Alcune funzioni, come i modelli, sono modo più potenti e complicate in C ++ rispetto a Java o C #. Valuterei pochissime funzionalità che queste tre lingue hanno in comune come di livello "esperto". In generale, le cose che ti rendono un esperto in una lingua sono le cose esoteriche che altri linguaggi non hanno necessariamente e che hanno maggiori probabilità di farti inciampare.

Misurare le tue conoscenze come programmatore senza riguardo per il linguaggio di programmazione significa misurare le cose più lungo le linee di algoritmi e strutture dati. Quanto bene comprendi i modelli di progettazione e i buoni principi di ingegneria del software contano molto più in generale di come indentati.

I tipi di abilità che ti rendono un programmatore esperto in generale non sono gli stessi tipi di abilità che ti rendono un esperto in un particolare linguaggio di programmazione. È bello avere entrambi (e se non sei almeno ragionevolmente competente nella lingua che usi, le tue conoscenze non linguistiche non ti fanno molto bene), ma stai parlando di due cose molto diverse quando Parliamo di ciò che rende qualcuno un esperto in un particolare linguaggio di programmazione e ciò che li rende un programmatore esperto in generale. E dal momento che anche i linguaggi relativamente simili come C ++, C # e Java differiscono un po 'nei dettagli, specialmente quelli che tendono a qualificarti come esperto nella lingua stessa - cercando di raggrupparli insieme nel tentativo di determinare cosa rende tu un esperto di loro davvero non funziona.

    
risposta data 02.12.2010 - 23:09
fonte
9
  • C - puntatori
  • C ++ - puntatori e STL / Modelli
  • C #: le librerie gigantesche
  • Java - le librerie gigantesche
risposta data 02.12.2010 - 23:18
fonte
8

La caratteristica più complicata del C ++ è rappresentata dai modelli, a causa della loro potenza e della sintassi scomoda. Non è difficile usare quelli pre-scritti, e non è difficile scrivere una semplice classe o funzione basata su modelli, ma i modelli C ++ sono un linguaggio completo di Turing eseguito dal compilatore.

    
risposta data 02.12.2010 - 23:14
fonte
3

Penso piuttosto che la sintassi di ciascuna di quelle lingue che elencherai non sia affatto difficile da imparare. La parte "dura" è duplice, a mio parere:

  • i framework che vengono con loro (STL per C ++, JRE per Java, .NET Framework per C #) sono voluminosi e possono richiedere un tempo lungo per padroneggiare.

  • schemi, pratiche e paradigmi. Le tre lingue che menzioni sono le caratteristiche dei linguaggi di programmazione orientati agli oggetti e abbiamo fatto molta strada da quando "Cat è una sottoclasse di Animal". Conoscere le tecniche appropriate ( SOLID , Pattern GoF , ecc.)

risposta data 02.12.2010 - 23:34
fonte
3

Rendere i programmi thread-safe e scalabili per molti, molti core.

Ma è difficile in qualsiasi lingua.

    
risposta data 03.12.2010 - 00:03
fonte
2

La matrice delle competenze dei programmatori può essere un buon modo per valutare le tue abilità livello e obiettivi in un modo agonistico della lingua.

Puoi quindi renderlo specifico della lingua chiedendoti se puoi fare in modo affidabile X in una determinata lingua.

    
risposta data 02.12.2010 - 23:02
fonte
1

Credo che la parte più difficile delle lingue non sia conoscere le funzionalità ma sapere quando usarle. Prendi gli iteratori in C # come esempio:

IEnumerable<int> Ints()
{
    yield return 1;
    yield return 2;
    yield return 3;
}

Beh sì, questo è un esempio funzionante, ma è un uso appropriato della funzione? Penso di no. Lo stesso vale per le caratteristiche di qualsiasi lingua. Ho lavorato con espressioni computazionali in F # e le capisco. Conosco anche alcuni buoni esempi di quando usarli. Il fatto è che non sono ancora abbastanza esperto per applicarli a un nuovo problema.

    
risposta data 02.12.2010 - 23:10
fonte
1

La cosa più difficile da capire in C # erano i delegati e i lambda. Io uso per scrivere tutte le mie query LINQ utilizzando il formato di query SQL. Da quando ho appreso F #, i C # lambda sono diventati molto, molto più facili e mi piacciono davvero. Tutto ciò che serviva ai delegati era un piccolo sforzo concentrato (che mi obbligava a non essere pigro) e quindi avevano senso.

Nel complesso, non penso che le librerie C # siano un grosso problema (a meno che non parli di quelle di terze parti) poiché Microsoft ha una documentazione approfondita (IMO).

    
risposta data 03.12.2010 - 15:10
fonte
1

In C #, la funzione più difficile è facilmente covarianza e contravarianza generica . Vai qui , scorri verso il basso e leggi i post del blog uno per uno dal basso verso l'alto. Assicurati di aver capito ogni parola, in particolare tutti gli esempi. Attenzione: il tuo cervello farà male .

Una volta compreso tutto, prova a comprenderlo nella pratica. Comprendi il motivo per cui puoi creare uno stack covariante (il codice sorgente viene fornito su uno dei post sulla pagina che ho collegato), ma non una coda covariante (almeno, non senza un significativo hit di velocità).

Infine, prova a trovarne un uso (non banale ^^), quindi prova a implementarlo tu stesso. Ti darò dei bonus se lo utilizzi in una struttura ricorsiva e capirai che devi "nascondere" i generici dal compilatore per far funzionare tutto.

Se fai tutto questo, congratulazioni! Sei riuscito ad acquisire abilità in un pezzo molto complicato del linguaggio C # che probabilmente non utilizzerai più.

    
risposta data 03.12.2010 - 16:54
fonte

Leggi altre domande sui tag