Gli sviluppatori .NET * dovrebbero davvero * passare il tempo ad imparare C per un'esposizione di basso livello?

StackOverflow https://stackoverflow.com/questions/125791

  •  02-07-2019
  •  | 
  •  

Domanda

Quando Joel Spolsky e Jeff Atwood hanno iniziato il disaccordo nel loro podcast sul fatto che i programmatori dovessero imparare il C, indipendentemente dal loro settore e dalla piattaforma di consegna, ha scatenato un dibattito piuttosto esplosivo all'interno della comunità degli sviluppatori che probabilmente infuria ancora oggi tra alcuni gruppi. Ho letto diversi passaggi da un certo numero di programmatori blogger con la loro opinione sulla questione. Gli argomenti di entrambe le parti hanno sicuramente un peso, sia ciò che non ho trovato è una prospettiva che è angolata in modo univoco dal punto di vista di sviluppatori focalizzati solo su .NET Framework . Praticamente tutti stavano commentando un punto di vista generale del programmatore.

A cosa sto cercando di arrivare? Ricordiamo l'opinione di Jeff Atwood secondo cui la maggior parte del tempo che gli sviluppatori a livelli così elevati spenderebbero sarebbe per imparare il business / dominio , oltre a tutto ciò che è necessario per apprendere le tecnologie per raggiungere tali requisiti di dominio. Nella mia esperienza lavorativa questa è una descrizione molto accurata della vita lavorativa di molti. Supponiamo ora che gli sviluppatori .NET possano passare il tempo per "extra curriculare" apprendendo, che dovrebbe essere C?

Per la cronaca, ho imparato C a scuola da solo, e posso assolutamente capire e apprezzare ciò che i sostenitori stanno ragionando. Ma, quando penso alle cose, personalmente sento che gli sviluppatori .NET non dovrebbero immergersi direttamente in C. Perché, la cosa che vorrei che più sviluppatori impiegassero un po 'di tempo per imparare è - MSIL e CLR .

Forse sono bloccato con un insolito gruppo di colleghi, non lo so, ma mi sembra che molte persone non mantengano una consapevolezza cosciente che il loro codice C # o VB compila in IL prima che JIT arrivi e lo rende codice macchina grezzo. Molti non conoscono IL e non hanno interesse a come esattamente il CLR gestisca il codice che scrivono. Leggere il CLR di Jeffrey Richter tramite C # è stato piuttosto scioccante per me in così tante aree; felice di averlo letto nonostante i colleghi lo abbiano respinto come "livello troppo basso". Non sono un esperto di IL ma con la conoscenza delle basi, mi sono ritrovato a seguire il suo testo più facilmente dato che avevo già familiarità con il comportamento dello stack di IL. Mi ritrovo a smontare le assemblee per dare un'occhiata a come l'IL si presenta quando scrivo un determinato codice.

Imparo CLR e MSIL perché so che è il livello diretto sotto di me . Il livello che mi consente di eseguire il mio livello di lavoro. C, in realtà è più in basso. Più vicino alla nostra "realtà" è il CLR e MSIL. Questo è il motivo per cui consiglierei ad altri di provare quelli, perché non vedo abbastanza persone scavare a quel livello. Oppure, la tua squadra è già in contatto con MSIL?

È stato utile?

Soluzione

Conosco già C e questo mi ha aiutato durante gli 1.1 giorni in cui ci sono molte cose che non sono ancora nelle librerie di base .NET e devo P / Invocare qualcosa dal Platform SDK.

La mia opinione è che dovremmo sempre dedicare un tempo all'apprendimento di qualcosa che non conosciamo ancora. Per rispondere alla tua domanda, non credo sia essenziale per te imparare C ma se hai del tempo libero, C è una buona lingua da imparare ed è valida quanto qualsiasi altra lingua là fuori.

Altri suggerimenti

Certo che dovresti. Il modo migliore per diventare eccessivamente specializzato e risoluto (e, di conseguenza, avere competenze limitate sul mercato) è quello di lavorare solo con un solo tipo di linguaggio e evitare tutti gli altri come "non correlati al tuo compito attuale."

Ogni programmatore dovrebbe avere una certa esperienza con un moderno linguaggio OIT JIT'd (C # / Java), un linguaggio più semplice di livello inferiore (C, FORTRAN, ecc.), un linguaggio interpretato di altissimo livello (Python, Ruby, ecc.) e un linguaggio funzionale (Scheme, Lisp, Haskell, ecc.). Anche se non li usi tutti su una base quotidiana, l'ampliamento del tuo processo di pensiero che tale conoscenza concede è abbastanza utile.

Vero, C è molto al di sotto della catena. Conoscere MSIL può aiutare gli sviluppatori a capire come ottimizzare meglio le loro app. Per quanto riguarda l'apprendimento di C o MSIL, perché non entrambi? :)

Gli sviluppatori .NET dovrebbero conoscere il CLR. Ma dovrebbero anche imparare C. Non vedo come nessuno possa davvero capire come funziona il CLR senza una comprensione di basso livello di ciò che accade sul bare metal.

Trascorrere del tempo a conoscere concetti di livello superiore è certamente vantaggioso, ma se ti concentri troppo sull'alto livello a spese del livello basso, rischi di diventare uno di quelli "architetto". persone che possono disegnare caselle e linee su lavagne ma che non sono in grado di scrivere alcun codice reale.

Ciò che apprendi imparando C sarà utile per il resto della tua carriera. Ciò che apprendi sul CLR diventerà obsoleto quando Microsoft cambierà la sua piattaforma.

La mia opinione è che imparare un po 'di lingua e assembly compilati sia un must . Senza questo, non otterrai la versatilità necessaria per passare da una lingua all'altra e allo stack.

Per essere più precisi, penso che ogni programmatore buono / grande debba conoscere queste cose per esperienza diretta:

  • Qual è la differenza tra un registro e una variabile?
  • Che cos'è DMA?
  • Come viene posizionato un pixel sullo schermo (a basso livello)?
  • Cosa sono gli interrupt?
  • ...

Conoscere queste cose è la differenza tra lavorare con un sistema che capisci e un sistema che, per quanto ne sai, funziona per magia. :)

Per rispondere ad alcuni commenti

Alla fine hai due diversi tipi di sviluppatori:

  • persone che possono fare una cosa in 10 modi in una o due lingue
  • persone che possono fare una cosa in uno o due modi in 10 lingue diverse

Penso fermamente che il secondo gruppo sia il miglior sviluppatore in generale.

Ci penso in questo modo:

  1. Probabilmente i programmatori dovrebbero effettivamente lavorare nella lingua di livello più alto appropriata. Ciò che è appropriato dipende dal tuo scenario. Un driver di dispositivo o un sistema incorporato si trova in una classe diversa da un'app desktop CRUD o da una pagina Web.
  2. Desideri che i tuoi programmatori abbiano quanta più pratica possibile nella lingua in cui lavorano.
  3. Poiché la maggior parte dei programmatori finisce per lavorare su applicazioni desktop e Web generiche, si desidera che gli studenti programmatori passino al più presto alle lingue di livello superiore durante la scuola.
  4. Tuttavia, i linguaggi di livello superiore offuscano alcuni problemi di programmazione di base, come i puntatori. Se applichiamo il nostro principio di utilizzare ciò che è appropriato anche per gli studenti, quelle lingue di livello superiore potrebbero non essere appropriate per gli studenti del primo anno. Questo butta fuori Java, .Net, Python e molti altri.
  5. Quindi gli studenti dovrebbero usare C (o meglio ancora: C ++ poiché è "di livello superiore" e copre la maggior parte degli stessi concetti) per il primo o due anni di scuola per coprire concetti di base, ma passare rapidamente a un livello superiore lingua di livello per consentire programmi più difficili in precedenza.

Per essere sufficientemente avanzati nello scrivere C #, devi capire i concetti in C, anche se non impari la lingua in modo appropriato.

Più in generale, tuttavia, se prendi sul serio qualsiasi abilità, dovresti sapere cosa succede ad almeno un livello di astrazione al di sotto del tuo livello di lavoro principale.

  • La codifica in jQuery deve essere associata a una comprensione di JavaScript
  • La progettazione di circuiti richiede la conoscenza della fisica
  • Ogni buon giocatore di basket imparerà a conoscere muscoli, ossa e nutrizione
  • Un violinista imparerà l'interazione di colofonia, frizione, peli dell'arco, spago e aridità del legno

Mi piace imparare una nuova lingua ogni anno. Non necessariamente per dominarlo, ma per costringere il mio cervello a pensare in modi diversi.

Sento che l'apprendimento del C è una buona lingua per conoscere concetti di basso livello senza il dolore della codifica in assembly.

Tuttavia ritengo che l'apprendimento di lezioni da lingue come Haskell, Python e persino probabilmente regex (non esattamente una lingua, ma tu catturi la mia deriva?) sia importante quanto le lezioni da trarre da C.

Quindi, dico, informati sul CLR e MSIL sul lavoro se è la tua zona e, nel tuo tempo libero, prova a imparare una lingua diversa una volta ogni tanto. Se questo accade in C quest'anno, buon per te e divertiti a giocare con i puntatori;)

Non vedo alcun motivo per cui dovrebbero. Linguaggi come Java e C # sono stati progettati in modo da non doverti preoccupare dei dettagli di basso livello. È come chiedere a uno sviluppatore WinForms di dedicare del tempo all'apprendimento dell'API Win32 perché è quello che sta succedendo sotto.

Anche se non è male apprenderlo, probabilmente guadagneresti di più spendendo più tempo a imparare le lingue e le piattaforme che conosci, a meno che non sia necessario imparare i dettagli tecnici di basso livello.

Non può essere una cattiva idea imparare MSIL, ma in un certo senso è solo un altro linguaggio .NET, ma con una sintassi cattiva. Tuttavia, è un altro livello verso il basso e penso che le persone dovrebbero avere almeno una vaga comprensione di tutti i livelli.

C, essendo un po 'come un linguaggio assembly con una sintassi migliore, è un bel modo per farsi un'idea di ciò che sta accadendo a un livello abbastanza basso (anche se alcune cose sono ancora nascoste da te).

E dall'altra parte, penso che tutti dovrebbero sapere qualcosa di simile a Haskell o Lisp per farsi un'idea di cose di livello superiore (e vedere alcune delle idee introdotte in C # 3 in una forma più pulita)

Se ti consideri un programmatore, direi di sì, impara C.

Molte persone che scrivono codice non si considerano programmatori. Scrivo app .NET forse 3 ore al giorno al lavoro, ma non mi etichetto un "programmatore". Faccio molte cose che non hanno nulla a che fare con la programmazione.

Se passi tutta la giornata a programmare o pensare alla programmazione e farai girare la tua intera carriera intorno alla programmazione, allora assicurati di conoscere le tue cose. L'apprendimento del C probabilmente aiuterebbe a costruire una base di conoscenza che sarebbe utile se intendi approfondire le capacità di programmazione.

Con tutto, ci sono dei compromessi. Più lingue impari e più tempo dedichi alla tecnologia, meno tempo hai a disposizione per apprendere altre competenze. Ad esempio, sarebbe meglio imparare C o leggere libri sulla gestione dei progetti? Dipende dai tuoi obiettivi. Vuoi essere il miglior programmatore EVAR? Impara C. Trascorri ore e ore scrivendo codice e dedicandoti al mestiere. Hai mai voluto gestire qualcun altro invece di programmare tutto il giorno? Usa il tempo che dedichi alla programmazione e trova modi per migliorare le tue competenze trasversali.

Gli sviluppatori .net dovrebbero imparare C? Direi "non necessariamente", ma dovremmo sempre dilettarci in qualche lingua al di fuori del nostro baliato professionale perché ogni lingua porta con sé un nuovo modo di pensare ai problemi. Durante la mia carriera professionale come sviluppatore .net (e prima ancora, VB 2-6), ho scritto piccoli progetti in Pascal, LISP, C, C ++, PHP, JavaScript, Ruby e Python e attualmente mi diletto a Lua e Perl.

Oltre al C ++, non ne elenco nessuno nel mio curriculum perché non sto cercando di essere un professionista in nessuno di essi. Invece, porto indietro idee interessanti da ciascuno di loro da usare nel mio lavoro basato su .net.

C è interessante in quanto ti avvicina davvero al sistema operativo, ma non è certo l'unico livello che devi sapere per essere un buon programmatore.

Il CLR è una macchina virtuale quindi se questo è tutto ciò che impari, allora sai solo cosa sta succedendo a livello virtuale.

Imparare C ti insegnerà di più sulla macchina fisica per quanto riguarda l'utilizzo della memoria, che come dici è ciò che il CLR usa sotto. Imparare come funziona il CLR non ti fornirà più informazioni, ad esempio, sulla raccolta dei rifiuti, come sull'apprendimento di C. Con C, davvero apprezzi ciò che è coinvolto nella gestione della memoria.

Imparare CIL , d'altra parte, ti dice qualcosa in più sull'esecuzione in .NET di quanto faresti imparando C . Tuttavia, come IL si associ al linguaggio macchina sarà ancora un mistero per la maggior parte, quindi conoscere alcuni dei codici operativi di alto livello, come quelli per i tipi di casting, non è così utile in termini di comprensione cosa sta realmente succedendo perché sono per lo più opachi. Imparare C e gli indicatori, tuttavia, ti illuminerà su alcuni di questi aspetti.

Il problema sta imparando C o MSIL o è più fondamentale? Direi che in generale un numero maggiore di sviluppatori potrebbe imparare di più su come funzionano i computer , fisici o virtuali. Una persona può diventare un programmatore abbastanza competente solo comprendendo una lingua e un'API in una scatola. Per portare la professione al livello successivo, sento che gli sviluppatori hanno davvero bisogno di capire l'intero stack. Non necessariamente nei dettagli, ma in una generalità sufficiente per aiutare a risolvere i problemi.

Molte di queste abilità di cui si parla qui possono essere acquisite imparando di più sui compilatori e sulla progettazione del linguaggio. Probabilmente dovrai imparare C per farlo (whoops, subdolo), ma la scrittura del compilatore è un ottimo contesto per imparare C in. Steve Yegge ne parla sul suo blog, e in gran parte sono d'accordo con lui su questo punto. Il mio corso di scrittura di compilatore all'università è stato uno dei corsi più aperti che io abbia mai seguito, e vorrei davvero che fosse stato un corso di livello 200, anziché uno di livello 400.

L'ho pubblicato su un'altra discussione ma si applica qui a:

Credo che tu abbia bisogno di una buona base, ma dedichi la maggior parte del tuo tempo all'apprendimento di ciò che utilizzerai.

  • Impara abbastanza assemblatore per aggiungere due numeri insieme e visualizzare il risultato su una console. Avrai una comprensione molto migliore di ciò che sta realmente accadendo con il computer e avrà senso il motivo per cui usiamo binario / Hex. (questo può essere fatto in un giorno e può essere fatto con debug da cmd.exe ).
  • Impara abbastanza C da dover allocare un po 'di memoria e usare i puntatori. È sufficiente un semplice elenco collegato . (questo può essere fatto in un giorno o due).
  • Dedica più tempo all'apprendimento di una lingua che intendi utilizzare. Lascerei che i tuoi interessi ti guidino in quale lingua (C #, Java, Ruby, Python, ecc.).
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top