Os desenvolvedores devem .NET * realmente * ser passar o tempo de aprendizagem C para a exposição de baixo nível?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Quando Joel Spolsky e Jeff Atwood começou a discordância em seu podcast de sobre se programadores devem aprender C, independentemente da sua indústria e plataforma de entrega, que brilharam completamente um debate explosivo dentro da comunidade de desenvolvedores que provavelmente ainda grassa entre certos grupos hoje. Eu tenho lido um número de passagens a partir de um número de blogueiros programador com a sua opinião sobre o assunto. Os argumentos de ambos os lados certamente têm um peso, tanto que eu não encontrou é uma perspectiva que tem um ângulo exclusivamente do ponto de vista de desenvolvedores focados em apenas o .NET Framework . Praticamente todos eles estavam comentando sobre um ponto de vista geral programador.

O que estou tentando chegar? opinião da Recall Jeff Atwood que a maioria dos desenvolvedores de tempo em níveis tão elevados gastaria seria em aprender o negócio / domínio , no topo de tudo o que é necessário para aprender as tecnologias para atingir esses requisitos de domínio. Na minha experiência de trabalho que é uma descrição muito precisa da vida de trabalho de muitos. Agora supondo que os desenvolvedores .NET podem desembolsar o tempo para "extracurricular" aprendizagem, deve que ser C?

Para o registro, eu aprendi C de volta na escola eu mesmo, e posso absolutamente compreender e apreciar o que os proponentes estão raciocinando para. Mas, quando se pensa sobre as coisas, eu, pessoalmente, sinto desenvolvedores .NET reta não deve mergulhar C. Porque, a coisa que eu desejo mais desenvolvedores iria demorar algum tempo para aprender é - MSIL e CLR .

Talvez eu estou preso com o um bando incomum de colegas, eu não sei, mas parece-me que muitas pessoas não manter um consciência que o C # ou compila código VB na IL antes de JIT chega e torna o código de máquina cru. A maioria não sabe IL, e não tem nenhum interesse em como exatamente o CLR lida com o código que eles escrevem. da leitura Jeffrey Richter CLR via C # foi um choque para mim em muitas áreas; feliz que eu lê-lo, apesar colegas descartá-la como "nível muito baixo". Não sou especialista em IL, mas com o conhecimento dos princípios básicos, encontrei-me seguindo seu texto mais fácil que eu já estava familiarizado com o comportamento pilha de IL. Encontro-me desmontar assembléias para ter um olhar para a forma como a IL acontece quando escrevo determinado código.

I aprender a CLR e MSIL porque eu sei que é a camada direta abaixo de mim . A camada que me permite realizar minha própria camada de trabalho. C, é na verdade mais abaixo. Mais perto de nossa "realidade" é o CLR e MSIL. É por isso que eu recomendaria outros para ter um ir para aqueles, porque eu não vejo pessoas suficientes investigando nessa camada. Ou, é a sua equipe já todos familiarizados com MSIL?

Foi útil?

Solução

Eu já sei C e que me ajudou durante os 1,1 dias em que há um monte de coisas que ainda não estão nas bibliotecas de base .NET e tenho de P / Invoke algo do Platform SDK.

A minha opinião é que devemos sempre alocar um tempo para aprender algo que nós não sabemos ainda. Para responder à sua pergunta, eu não acho que isso é essencial para você aprender C, mas se você tiver algum tempo de sobra, C é uma linguagem boa para aprender e é tão válida quanto qualquer outra língua para fora lá.

Outras dicas

Claro que você deve. A melhor maneira de tornar-se excessivamente especializada e single-minded (e, correspondentemente, têm limitado habilidades comercializáveis) é a única obra com um único tipo de linguagem e evitar todos os outros como "não relacionadas com a sua tarefa atual."

Todo o programador deve ter alguma experiência com uma linguagem JIT'd OO moderna (C # / Java), a linguagem de um de nível inferior mais simples (C, Fortran, etc), um nível muito elevado interpretado linguagem (Python, Ruby, etc) , e uma linguagem funcional (Esquema, Lisp, Haskell, etc). Mesmo se você não usar todos eles em uma base dia-a-dia, a ampliação de seu processo de pensamento de que tais subsídios conhecimento é bastante útil.

Na verdade, C é muito abaixo da cadeia. Sabendo MSIL pode ajudar devs entender como otimizar melhor seus aplicativos. Como para aprender C ou MSIL, por que não ambos? :)

NET desenvolvedores devem aprender sobre a CLR. Mas eles também devem aprender C. Eu não vejo como alguém pode realmente entender como funciona o CLR sem algum conhecimento de baixo nível do que acontece no bare metal.

Gastar tempo aprendendo sobre os conceitos de nível superior é certamente benéfico, mas se você se concentrar demais no alto nível à custa do nível baixo, o risco de se tornar um daqueles "arquiteto" pessoas que podem desenhar caixas e linhas em quadros brancos, mas que são incapazes de escrever qualquer código real.

O que você aprende, aprendendo C será útil para o resto de sua carreira. O que você aprende sobre o CLR irá se tornar obsoleto e Microsoft muda sua plataforma.

A minha opinião é que aprender alguma linguagem compilada e montagem é um deve . Sem isso, você não vai ter a versatilidade necessário para alternar entre idiomas e pilhas.

Para ser mais específico - Eu acho que qualquer bom / grande programador deve saber estas coisas por experiência direta:

  • O que é a diferença entre um registo e uma variável?
  • O que é DMA?
  • Como é uma put pixel na tela (em nível baixo)?
  • Quais são as interrupções?
  • ...

Sabendo estas coisas é a diferença entre trabalhar com um sistema que você entender e um sistema que, para todos sabem, funciona por magia. :)

Para abordar alguns comentários

Você acaba tendo dois tipos diferentes de desenvolvedores:

  • as pessoas que podem fazer uma coisa em 10 maneiras em uma ou duas línguas
  • as pessoas que podem fazer uma coisa em uma ou duas maneiras em 10 línguas diferentes

Eu acho fortemente que o segundo grupo são os melhores desenvolvedores em geral.

Eu penso nisso como este:

  1. Os programadores devem provavelmente ser realmente trabalho no idioma apropriado de mais alto nível. O que é apropriado depende do seu cenário. Um driver de dispositivo ou sistema embutido está em uma classe diferente de uma página de aplicativo de desktop CRUD ou web.
  2. Você quer que seus programadores para ter tanto prática quanto possível na língua em que eles estão trabalhando.
  3. Uma vez que a maioria dos programadores acabam trabalhando em genéricos desktop e web apps, você quer que os alunos de programação para se deslocar para as linguagens de alto nível o mais rápido possível durante a escola.
  4. No entanto, as linguagens de alto nível ofuscar alguns problemas básicos de programação, como ponteiros. Se aplicarmos o nosso princípio de usar o que é apropriado para os alunos, bem como, aquelas linguagens de alto nível não pode ser apropriado para os alunos do primeiro ano. Que joga fora Java, .Net, Python, e muitos outros.
  5. Assim, os alunos devem utilizar C (ou melhor ainda: C ++, já que é "de alto nível" e cobre a maior parte dos mesmos conceitos) para o primeiro ano ou dois de escola para cobrir conceitos básicos, mas rapidamente se deslocar até um superior que linguagem de nível para ativar programas mais difíceis no início.

Para ser suficientemente avançada, por escrito, C #, você precisa entender os conceitos em C, mesmo se você não aprender a linguagem adequada.

De modo mais geral, porém, se você é sério sobre qualquer habilidade, você deve saber o que se passa em pelo menos um nível de abstração abaixo do seu nível de trabalho primário.

  • Codificação em jQuery deve ser emparelhado com um entendimento de JavaScript
  • projetar circuitos necessita saber física
  • Qualquer bom jogador de basquete vai aprender sobre músculos, ossos e nutrição
  • Um violinista vai aprender sobre a interação de resina, fricção, cabelos arco, corda e madeira secura

Eu gosto de aprender uma nova língua a cada ano. Não necessariamente para dominá-lo, mas para forçar meu cérebro a pensar em maneiras diferentes.

Eu me sinto aprendendo C é uma linguagem boa para aprender sobre os conceitos de nível baixo sem a dor de codificação em assembly.

No entanto eu sinto que aprender lições de linguagens como Haskell, python, e até mesmo indiscutivelmente regex (não exatamente uma língua, mas você me entende?) É tão importante quanto as lições a ser adquirida a partir C.

Então eu digo, aprender sobre a CLR e MSIL no trabalho se é sua área, e em seu tempo livre, tente pegar uma linguagem diferente, uma vez a cada tantas vezes. Se isso acontecer a ser C deste ano, bom para você e gosta de jogar com ponteiros;)

Eu não vejo nenhuma razão para que eles deveriam. Linguagens como Java e C # foram projetadas de modo que você não precisa se preocupar com os detalhes de baixo nível. Essa é a mesma como perguntar se um desenvolvedor WinForms deve gastar tempo aprendendo a API Win32, porque isso é o que está acontecendo por baixo.

Enquanto não faz mal para aprender isso, você provavelmente ganho de mais de gastar mais tempo aprendendo as linguagens e plataformas que você está familiarizado, a menos que haja uma boa necessidade de aprender o baixo nível detalhes técnicos.

Não pode ser uma má idéia para aprender MSIL, mas de uma forma que é apenas uma outra linguagem .NET, mas com sintaxe desagradável. É uma outra para baixo camada, embora, e eu acho que as pessoas devem ter pelo menos uma vaga compreensão de todas as camadas.

C, sendo um pouco como linguagem assembly com a sintaxe mais agradável, é uma boa maneira de ter uma idéia do que está acontecendo em um nível bastante baixo (embora algumas coisas ainda estão escondidas de você).

E do outro lado, eu acho que todo mundo deve saber um pouco de algo como Haskell ou Lisp para ter uma idéia de coisas de nível superior (e veja algumas das idéias que está sendo introduzido em C # 3 em uma forma mais limpa)

Se você se considera um programador, eu diria que sim, aprender C.

Muitas pessoas que escrever código não se consideram programadores. Eu escrevo .NET aplicativos talvez 3 horas por dia no trabalho, mas eu não me rotular um "programador". Eu faço um monte de coisas que nada têm a ver com a programação.

Se você gastar sua programação dia inteiro ou pensar sobre programação, e você está indo para fazer a sua carreira inteira giram programação espalhados, então é melhor você ter certeza que você sabe seu material. Aprender C provavelmente iria ajudar a construir uma base de conhecimento que seria útil se você estiver indo para ir muito fundo em habilidades de programação.

Com Everthing, existem trade-offs. Quanto mais idiomas você aprender, e quanto mais tempo você gasta dedicada à tecnologia, menos tempo você tem para aprender outras habilidades. Por exemplo, seria melhor para aprender C, ou ler livros sobre gerenciamento de projetos? Depende de seus objetivos. Você quer ser o melhor EVAR programador? Saiba C. passar horas e horas escrevendo código e dedicar-se ao ofício. Você sempre deseja gerenciar outra pessoa em vez de codificação durante todo o dia? Use o tempo que você iria colocar em programação e encontrar maneiras de melhorar suas habilidades sociais.

Os desenvolvedores devem .net estar aprendendo C? Eu diria que "não necessariamente", mas devemos sempre ser meter em alguma fora da linguagem do nosso bailiwick profissional, porque cada língua traz consigo uma nova forma de pensar sobre problemas. Durante a minha carreira profissional como .net (e antes disso, VB 2-6) desenvolvedor, eu escrevi pequenos projetos em Pascal, LISP, C, C ++, PHP, JavaScript, Ruby e Python e atualmente estou intrometendo em Lua e Perl.

Além de C ++, eu não listar qualquer um deles no meu currículo, porque eu não estou olhando para ser um profissional em nenhum deles. Em vez disso, eu trazer de volta idéias interessantes de cada um deles para usar no meu trabalho baseado em .NET.

C é interessante na medida em que realmente você fica perto do OS, mas que quase o único nível que você precisa saber sobre ser um bom programador.

O CLR é um virtual máquina para se isso é tudo que você aprende, então você só sabe o que está acontecendo em um nível virtual.

Aprendizagem C irá lhe ensinar mais sobre o física máquina, tanto quanto o uso de memória vai, que, como você mencionou é o que os usos CLR embaixo. Aprender como funciona o CLR não vai lhe dar o máximo de conhecimento sobre, digamos, coleta de lixo, como aprender C. Com C, você realmente apreciar o que está envolvido no gerenciamento de memória.

Aprendizagem CIL , por outro lado, diz-lhe um pouco mais sobre a execução em .NET que você faria por aprender C . Ainda assim, como IL mapeia para linguagem de máquina ainda será um mistério para a maior parte para saber alguns dos opcodes de alto nível, como os para lançar tipos, que não é útil em termos de compreensão o que está realmente acontecendo como eles são opacos para a maior parte. Aprender C e ponteiros, no entanto, vai esclarecer sobre alguns desses aspectos.

É a questão aprender C ou MSIL, ou é mais fundamental? Eu diria que, em geral, mais desenvolvedores poderia estar a aprender mais sobre como computadores , físico ou virtual, trabalho. Uma pessoa pode chegar a ser um programador bastante competente apenas por compreender a linguagem e API em uma caixa. Para tirar a profissão para o próximo nível, eu sinto que os desenvolvedores realmente precisa entender toda a pilha. Não necessariamente em detalhe, mas na generalidade suficiente para ajudar a resolver problemas.

Muitas dessas habilidades são sendo falado aqui pode ser adquirido por aprender mais sobre compiladores e design de linguagem. Você provavelmente precisa aprender C para fazer isso (whoops, sorrateira), mas compilador escrita é um grande contexto para aprender C em. Steve Yegge fala sobre este em seu blog, e eu em grande parte concordo com ele neste ponto. Meu compilador escrevendo curso na universidade era um dos mais cursos abertura dos olhos que eu já tomadas, e eu realmente gostaria que tivesse sido um curso de nível 200, em vez de um nível 400.

Eu postei isso em outro segmento, mas ele se aplica aqui para:

Eu acredito que você precisa de uma boa base, mas dedicar a maior parte de seu tempo para aprender o que você estará usando.

  • Saiba assembler suficiente para adicionar dois números juntos e exibir o resultado em um console. Você terá uma melhor compreensão do que está realmente acontecendo com o computador e ele vai fazer sentido a respeito de porque nós usamos binário / Hex. (Isso pode ser feito em um dia e pode ser feito com depuração do cmd.exe ).
  • Saiba o suficiente C ter que alocar alguns ponteiros de memória e de uso. Um simples lista ligada é suficiente. (Isso pode ser feito em um dia ou dois).
  • Passe mais tempo a aprender uma língua que você está indo para uso. Gostaria de deixar seus interesses dirigi-lo para que a linguagem (C #, Java, Ruby, Python, etc.).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top