Imparare a usare C (o C ++) è un requisito per essere un buon programmatore (eccellente)? [chiuso]


25

Quando ho iniziato a imparare a programmare, i veri programmatori potevano scrivere assembly nel loro sonno. Qualsiasi istruzione seria in informatica includerebbe un grosso addestramento e pratica nella programmazione usando assembly. Da allora è cambiato, al punto che vedo la laurea in Informatica con assemblea, se inclusa, è relegata in un incarico e in un capitolo, per un totale di due settimane di lavoro su 4 anni di scuola.

La programmazione C / C ++ sembra aver seguito un percorso simile. Non sono più sorpreso di intervistare i laureati che non hanno trascorso più di due settimane a programmare in C ++ e hanno letto C solo in un libro da qualche parte. Mentre i gradi CS più gravi sembrano ancora includere un significativo apprendimento del tempo e l'uso di una o entrambe le lingue, la tendenza è chiaramente verso un C / C ++ meno applicato a scuola.

È chiaramente possibile fare una carriera producendo un buon lavoro senza mai leggere o scrivere una singola riga di codice C o C ++.

Alla luce di tutto ciò, vale la pena imparare le due lingue? Devono assolutamente eccellere? (al di là dell'ovvio consiglio specifico non linguistico, come "una buona selezione di lingue è probabilmente importante per un'istruzione completa", e "è probabilmente una buona idea continuare a provare e imparare nuove lingue durante la carriera di un programmatore, solo allungare le cellule grigie ")


8
C è onnipresente nell'infrastruttura software di oggi. Impararlo ti darà sicuramente una comprensione più profonda di ciò che sta realmente accadendo nel software che scrivi. (Vedi programmers.stackexchange.com/questions/14744/… ).
Charles Salvia,

Ho anche trovato qui pertinenti le risposte: programmers.stackexchange.com/questions/29109/…
blueberryfields

Tangenziale: un buon programmatore è a suo agio con vari paradigmi di programmazione, questo significa aver imparato (e usato) diverse lingue.
Matthieu M.,

Imparare più lingue non può far male.
Max

4
Non esiste C / C ++. Ci sono solo C e C ++. Sono lingue molto diverse e la risposta è probabilmente molto diversa a seconda della lingua di cui stai parlando.
Caleb,

Risposte:


63

Joel Spolsky (sì, quel Joel) ha sostenuto un po 'di tempo fa che i programmatori veramente difficili sanno come usare linguaggi più difficili (come C, C ++ e Lisp) e i loro costrutti (come puntatori e caratteristiche funzionali), e che i linguaggi di livello superiore di solito non lo erano 'duro' abbastanza per dimostrare la tua competenza.

Posso capire il suo punto che le persone che conoscono C e C ++ e che sono effettivamente brave in questo sanno molto di più su ciò che accade sotto il cofano rispetto alle persone che, diciamo, programmano in Ruby (e solo in Ruby). Direi che va così: se conosci un linguaggio "difficile", è probabilmente una buona prova che sei in grado di programmare nel rispetto di severi vincoli o di padroneggiare modi complessi di pensare. Se sei bravo in un linguaggio di alto livello, potresti anche essere in grado di programmare nel rispetto di severi vincoli, ma non ci sono prove.

Non credo che l'apprendimento del C o del C ++ danneggi il tuo cervello (alcune persone sembrano crederci però). In realtà, impararlo solo per apprezzare le migliori lingue di livello superiore potrebbe essere una buona idea.


34

Sì, per essere un eccellente programmatore (ai nostri tempi attuali) è necessario conoscere C (o C ++).

Non è la lingua stessa, è l'ambiente.

I programmi non funzionano nel vuoto. Un programmatore eccellente conosce il suo ambiente, come un grande scultore conosce il suo materiale. Il nostro attuale ambiente di programmazione (sistemi operativi, compilatori, reti, ecc.) È basato su C / C ++.

Un programmatore eccellente scrive programmi efficienti e li esegue il debug in situazioni di vita reale. Deve conoscere l'ambiente e al giorno d'oggi richiede conoscere C / C ++.

Modifica: non posso resistere all'aggiunta del riferimento a matrice. Morpheus potrebbe chiederti: vuoi prendere la pillola di Java e continuare a vivere in un mondo confortevole fornito dalla macchina virtuale? Oppure prendi la pillola C e vedi quanto in profondità arriva la tana del coniglio?


9
+1 per il riferimento a Matrix, lo terrò per un possibile uso futuro :-)
Konamiman,

20

Devo fare riferimento a un altro articolo di Joel. In The Law of Leaky Abstractions , l'apprendimento di lingue come C, Lisp, C ++ e le lingue che coinvolgono la gestione della memoria implicano anche l'apprendimento di un modo di pensare che ci definisce per il resto della nostra carriera.

Il mio professore nella mia classe di Strutture di dati e algoritmi, William Spears, ha detto a una schiera di studenti scettici di Informatica perché non stavamo imparando gli strumenti più recenti. Gli studenti si sono lamentati del fatto che non si sentivano preparati per il "mondo reale" perché non stavamo imparando Java. Non stavamo imparando JavaScript. Non c'erano classi su HTML. Non stavamo imparando [[INSERIRE LA TECNOLOGIA QUI]].

Perché non stavamo imparando gli strumenti più recenti? Secondo il nostro professore, la tecnologia cambia così rapidamente che in 4 anni gli strumenti che apprendiamo potrebbero essere obsoleti. Bene, dopo alcuni anni nel settore, dovrei dire che sono d'accordo con la sua valutazione.

Lo scopo di una formazione in Informatica è imparare come imparare. Capire le soluzioni a molti problemi nello sviluppo spesso richiede una capacità di pensare fuori dagli schemi che può venire solo dall'apprendimento di base, fondamentale, informatico, crudo, che deriva dal lavorare con C, C ++ e Lisp.

Quando quelle astrazioni nel mondo reale perdono, e lo faranno, una comprensione delle basi è ciò che separa la media dal migliore.


3
Mi manca qualcosa. Cosa c'entra Lisp con i fondamenti dell'apprendimento? È la più grande inversione di astrazione mai inventata. Uno dei suoi obiettivi di progettazione originali e fondamentali era "facciamo finta di non essere davvero su una macchina Turing e vediamo quanto possiamo semplificare le cose facendo ciò".
Mason Wheeler,

6
@Mason: Imparare Lisp non ti insegnerà quasi nulla sui computer del mondo reale. Ti insegnerà molto sulla teoria del calcolo. L'informatica grezza non riguarda solo i computer grezzi.
David Thornley,

2
@Mason Wheeler Learning lisp introduce diversi concetti avanzati, tra cui: dati / codice sono intercambiabili, codice di riflessione / auto-modifica e l'importanza di considerare il compilatore / VM parte del prodotto finale
blueberryfields

@blueberryfields: ... tutti considerati vulnerabilità dannose e / o di sicurezza in un modo o nell'altro da programmatori più esperti. Cose molto brutte da insegnare ai neofiti.
Mason Wheeler,

2
@Mason Non capisco il contesto del tuo commento - stiamo parlando di programmatori eccellenti qui, non di neofiti. Non considererei un programmatore, che non ha una conoscenza approfondita di questi concetti, e li applica appropriatamente (e regolarmente) nel suo lavoro, come un esperto.
Blueberryfields,

18

Lasciami dire così. Supponiamo che tu abbia bisogno di assumere qualcuno per fare un po 'di lavoro in C ++, e qualcuno applica chi ha fatto un progetto C ++ al college ma ha programmato in Java solo dopo la laurea. Al contrario, supponiamo che tu abbia bisogno di assumere qualcuno per un po 'di lavoro Java, e qualcuno applica chi ha fatto un progetto Java al college ma ha programmato in C ++ solo dopo la laurea.

Chi hai intenzione di assumere più a tuo agio? Direi il ragazzo del C ++, dal momento che passare all'utilizzo di un linguaggio di raccolta dei rifiuti è molto più facile che allontanarsi da uno. Allo stesso modo per altri concetti e altri linguaggi, come passare dalla compilazione all'interpretazione o dalla tipizzazione statica a quella dinamica. In quasi tutte le funzionalità per confronto delle funzionalità che è possibile effettuare tra le lingue, il C ++ si presenta alla fine difficile, il che rende difficile programmare, ma anche un'ottima base per giudicare un programmatore.

Riesci a prosperare in una carriera senza mai toccare il codice C o C ++? Certo, ma non vorrei ancora assumere qualcuno che non fosse in grado o non avesse paura di farlo.


3
Argomento poco impressionante. Se avessi bisogno del lavoro di Java, assumerei qualcuno con esperienza Java. Se avessi bisogno del lavoro in C ++, assumerei qualcuno con esperienza in C ++. Se ho dovuto assumere un ragazzo Java per una posizione di C ++ allora potrei passare un po 'di tempo in più intervista lui quiz su puntatori e gestione della memoria e Raii; Allo stesso modo, se ho dovuto assumere un ragazzo C ++ per una posizione di Java, allora mi piacerebbe trascorrere più tempo in questa intervista chiedendo nervosismi, modelli di progettazione, di riflessione, ecc Né insieme di abilità sembra richiedere più intelligenza, solo l'esperienza. La maggior parte della curva di apprendimento è comunque nelle biblioteche.
Aaronaught,

13

No, non è necessario imparare C o C ++ come un buon programmatore, ma capire che aiuterebbe a chiarire alcuni concetti di base come la gestione della memoria.


7

vale la pena imparare le due lingue?

È chiaramente possibile fare una carriera producendo un buon lavoro senza mai leggere o scrivere una singola riga di codice C o C ++.


6

In breve, no non lo sono. Sono lingue utili da imparare, ma puoi facilmente essere un programmatore eccellente senza toccare una linea di C o C ++. La maggior parte dei programmatori eccellenti li avrà probabilmente toccati, ma questo è un altro punto: in molte applicazioni in questi giorni non sono usati quasi quanto .NET e Java, e in quanto tali la loro necessità è leggermente diminuita.

Nota che non sto dicendo che non vale la pena imparare, penso che siano entrambe lingue importanti da imparare, soprattutto se stai pensando di fare una carriera fuori dalla programmazione. Ma puoi essere un programmatore decente senza aver mai toccato neanche uno? Sicuro.


5

Dipende dai tuoi interessi.
Se vuoi essere nella programmazione del sistema, sì, dovrai imparare C / C ++ in quanto lingue predefinite di CS. Per acquisire familiarità con concetti di sistema operativo, compilatori, strutture dati, gestione della memoria ecc., È necessario conoscere C / C ++. Inoltre, su C / C ++ sono disponibili tonnellate di buoni testi, libri e articoli che ottimizzeranno le tue capacità di programmazione. Pochi giorni fa in / * Programmers * / ho letto una risposta eccellente per Why C - Perché è vicino al metallo .
Al contrario, se vuoi limitarti alla programmazione dell'applicazione, non è necessario utilizzare C / C ++, inizia direttamente con C # (.Net) / Java e otterrai un buon lavoro di sviluppo. Ma se ami davvero la programmazione hardcore, sono sicuro che un giorno inizierai a studiare C / C ++.


Vicino al metallo! Adoro quel commento.
Wajih,

3

Dipende totalmente dal dominio dell'applicazione in cui vuoi lavorare. Se vuoi giocare nel panorama incorporato, devi praticamente conoscere C o C ++. Il C ++ è probabilmente anche il linguaggio più comunemente usato nello sviluppo del gioco. Se vuoi lavorare su applicazioni web, C o C ++ potrebbero non essere così importanti. Non esiste un linguaggio che detenga il prestigio di essere tenuto a conoscere come una precedenza per la definizione di un buon ingegnere del software.


3

C è stato chiamato "assemblaggio portabile", il che è molto vero. È stato progettato per rendere Unix portatile tra i processori e per descrivere il codice molto vicino al set di istruzioni del processore sottostante.

Se scopri che ti piacerebbe lavorare vicino all'hardware reale, trovandoti in software incorporato o driver di dispositivo, ecc., Non c'è modo di aggirare C. Se vuoi lavorare nei linguaggi più tradizionali, i linguaggi di alto livello sono un'idea migliore poiché molte delle caratteristiche che rendono C potente lo stanno anche rendendo C pericoloso, quindi sono state ridotte o semplicemente rimosse.

Personalmente considererei molto importante capire cosa alla fine sarà necessario eseguire i tuoi programmi, poiché molte decisioni di progettazione dipendono da questo, quindi dovresti almeno avere familiarità con come mappare il codice sul set di istruzioni di assemblaggio e come funziona nell'attuale hardware. Le cose che dai per scontate in realtà richiedono tempo e perché.

Pertanto, ti suggerirei almeno di dare un'occhiata a C e ad alcuni codici aritmetici del puntatore avanzato, quindi sai cosa non devi affrontare quotidianamente.


1

C è utile da imparare perché è vicino al silicio. Il linguaggio C o assembly ti darà una buona idea di ciò che i computer possono fare e di come lo fanno, e questo sarà probabilmente utile per capire cosa è possibile e cosa è pratico. Inoltre, c'è un sacco di codice C là fuori a cui potresti essere interessato, e molti altri linguaggi moderni usano gran parte della sua sintassi e semantica.

Il C ++ è un linguaggio di livello superiore che contiene alcune caratteristiche molto interessanti. Ha molti buoni usi ed è un linguaggio potente. D'altra parte, ci sono molte altre lingue potenti e utili là fuori.

Quindi, consiglio vivamente di imparare cosa succede ai livelli inferiori e C è un modo eccellente per impararli, quindi consiglio vivamente di imparare C. C ++ è facoltativo; impararlo ti insegnerà le cose, ma ci sono altri modi per imparare la maggior parte di esse, e se stai già lavorando in una lingua tradizionale, ci sono lingue migliori da imparare per raccogliere nuovi concetti.


0

Dipende dal tipo di software che pensi di realizzare. I giochi sono spesso scritti in C / C ++ in quanto è classicamente un linguaggio più ottimizzabile quando si tratta del codice eseguibile. In un certo senso, ciò che codifichi è solo ciò che ottieni.

Detto questo, C # è stato utilizzato anche per programmare giochi. C # è probabilmente uno dei i migliori linguaggi per lo sviluppo di applicazioni desktop, almeno sulla piattaforma Windows.

Insieme a Visual Studio, C # è diventato quasi l'unico linguaggio di sviluppo software che utilizzo (scusando linguaggi come SQL e PHP ecc.) In quanto è a tutti gli effetti, dannatamente fantastico secondo me.

Se sviluppi su Windows, ti consiglio vivamente di imparare C # .NET insieme a qualsiasi altra cosa.

Tuttavia, non credo che C ++ sia un requisito in sé, ma è bello avere una conoscenza di livello inferiore di puntatori, gestione della memoria e altri concetti.


1
@ Nick: il mondo dei computer è oltre le finestre e C #.
Ranger

2
Ecco perché ho detto "Se sviluppi su Windows" .
Nick Bedford,

0

@Nick Bedford ha ragione sul dominio in cui stai lavorando. Le mie controparti software scrivono driver di dispositivo e software incorporato. C è la strada da percorrere. E non pensare al C ++ come a una seconda lingua, hanno enormi sovrapposizioni.


3
Se non pensi al C ++ come a un linguaggio diverso dal C, in realtà non conosci bene il C ++. Lavorare solo in sovrapposizione è possibile ma non consigliabile.
David Thornley,

Forse ho esagerato la somiglianza. Ma sono più gli stessi che, ad esempio, C e Perl.
Brian Carlton,

0

Molti hanno detto che C è buono da imparare per la gestione della memoria e sono d'accordo. Per la mia opinione sull'apprendimento di C è che è molto utile imparare per imparare a eseguire il debug di un programma. Molto può andare storto per iscritto per C che richiede di pensare a come si dovrebbe eseguire il debug dei programmi. Uso raramente uno strumento di debug in nessuna delle mie programmazioni (in C o in altre lingue) semplicemente perché C mi ha insegnato come aggiungere programmi di debug integrati nei programmi.

L'apprendimento del C / C ++ è necessario per una carriera? No, ma ho anche visto molti sviluppatori Java che non conoscono molte nozioni di base sulla programmazione perché hanno imparato solo Java. Lo stesso con i programmatori Perl. Imparare più di una lingua dovrebbe essere un requisito per una carriera, sia che C / C ++ sia una di quelle lingue o meno.


+1 - Vedere concetti simili presentati in modo diverso in lingue diverse mi ha aiutato a capire meglio quei concetti e vederli in una luce completamente nuova.
jmort253,

0

All'inizio, pensavo che la mia università fosse nella generazione di Dennis M. Ritchie per aver incluso C per 2 semestri quando ci sono molte lingue relativamente nuove come Java, Visual Basic ecc. Ma il fatto è, o almeno ora credo, che C sia uno dei migliori linguaggi che ti aiutano a comprendere i concetti fondamentali della programmazione.

E sulla carriera senza imparare C (o C ++) - Sì, è possibile, ma l'apprendimento C mostrerà le tue conoscenze nella programmazione.


0

La risposta per me è stata sì. Sia il C che il C ++ erano corsi obbligatori nel mio corso di laurea in CS, e ritengo che avere un CS o un titolo correlato sia un requisito minimo per essere un "buon programmatore". Inoltre, essere un "buon programmatore" significa essere in grado di razionalizzare i problemi che si verificano e capire perché qualcosa non funziona come ci si potrebbe aspettare. Troppe volte nella mia carriera ho assistito a individui che erano sconcertati da problemi e pensando che ci fossero forze soprannaturali che lavoravano contro di loro ... è ridicolo.

L'IMO, conoscendo C, dimostra la capacità di comprendere qualsiasi linguaggio imperativo e di risolvere i problemi usando uno degli strumenti più potenti mai inventati dall'umanità.


0

Un programmatore ben arrotondato ha diverse valigie nella manica, e queste includono:

1) Programmazione di basso livello ... C come minimo. Qualche assemblea non farebbe male.

2) Programmazione funzionale ... Un linguaggio funzionale puro, non un ibrido - Lo schema funziona qui.

3) OOP ... Normalmente direi smalltalk, ma suppongo che ora potremmo andare con Java.


0

C è la madre di tutto il linguaggio di programmazione .... Conoscenza esperta in C ti fa fare molta strada nel conoscere qualsiasi altro linguaggio come Java in breve tempo.

Il C ++ è un gioco con la palla completamente diverso ed è il più complesso tra tutti.


0

Non è necessario imparare C o C ++ per essere un buon (eccellente) programmatore, tuttavia è necessario imparare l'Assemblea per essere un buon (eccellente) programmatore. Un'eccellente programmazione significa ottimizzare su memoria, Mhz, larghezza di banda, vincoli di potenza e quindi scegliere il miglior design e / o implementazione per svolgere il compito a portata di mano. Tra gli informatici la principale debolezza è ancora, dopo decenni di tecnologie in evoluzione, con una gestione ottimale dei dati. Questo è un insieme di abilità insegnate scrivendo Assembly (qualsiasi assembly; potrebbe essere ARM, o MIPS, o x86, o un microcontrollore, o un DSP, o anche inferiore, tramite verilog / VHDL).


0

Avendo abilmente usato c, c ++, assembly e Lisp, direi che non ha senso imparare una lingua particolare per essere un buon programmatore. Le mie esperienze con ciò che rende un buon programmatore è la capacità di pensare in modo da risolvere i problemi. Le lingue ti consentono solo di esprimere le tue capacità di problem solving. Ad esempio la semplicità di C consente di esprimere facilmente algoritmi, mentre Lisp consente di risolvere i problemi in modo ricorsivo. Quindi una lingua non ti rende un programmatore. Devi essere un risolutore di problemi prima di diventare un buon programmatore. Le lingue sono solo strumenti che usi per risolvere i problemi.


-1

Vale la pena imparare C bene semplicemente per acquisire una solida conoscenza della gestione della memoria. Idem per C ++ tranne con l'obiettivo di apprendere le strutture di dati.


Non importa quale lingua si usi per apprendere le strutture di dati.
kirk.burleson,

Credo che lo sia perché in molte altre lingue le strutture dati vengono utilizzate senza sapere come vengono gestite in memoria. C ++ (senza l'uso di STL) impone al programmatore di apprendere come le strutture di dati vengono gestite a basso livello.
acqua

-1

No. Ci sono molti programmatori scadenti che scrivono codice C / C ++. Ciò che ti renderà un buon programmatore è capire quando e perché dovresti scrivere qualcosa in C / C ++

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.