É claro que o conhecimento de coisas de baixo nível é muito importante em nosso trabalho.
Mas em uma situação em que você já está desenvolvendo software comercial em alto nível, e quando você já tem uma direção escolhida, mas não possui nenhuma habilidade de montagem, não é mais razoável se concentrar em estudar coisas relacionadas à sua direção? Ou existe algum motivo para você dedicar algum tempo para aprender o básico de baixo nível?
Quando é tarde demais e quando não é? E se é não tarde demais, então como é que um vá sobre a aprendizagem de forma ideal (no sentido de não gastar tempo excessivo para obter alguma profundidade e entender)?
Respostas:
Não posso acreditar que ninguém tenha mencionado a depuração ...
Não escrevo uma linha de código de montagem há muitos anos. Mas eu li com bastante frequência. A depuração de alto nível é excelente quando você tem as informações de origem e símbolo, mas quando sua biblioteca sofisticada está lançando uma exceção sem tratamento nas máquinas dos clientes, é tarde demais para exigir que isso seja incluído na licença ...
Mas ainda posso abrir o desmontador e ver o que sua lógica de alto nível acabou fazendo , rastrear dados ruins de volta à sua origem, descobrir quem alterou o registro de controle da FPU ...
Isso salvou meu bacon mais frequentemente do que eu gostaria de pensar. E nunca é tarde para aprender - existem muitas ótimas referências e tutoriais na Internet, e praticamente qualquer programa em execução em sua máquina pode fornecer um ambiente prático.
fonte
Você não precisa aprender a linguagem assembly, apenas precisa entender como ela funciona. Você precisa saber o que é XOR e contar em binário enquanto dorme, etc. Mas nunca precisei de código de montagem em meu trabalho.
Então, como você diz, o conhecimento de coisas de baixo nível é importante, mas o conhecimento prático em montagem não é.
fonte
Se você realmente não tem habilidades de programação de baixo nível, eu altamente recomendo aprender alguns em seu tempo livre. Você não precisa se tornar um especialista nisso; basta atingir algum nível de proficiência. Você precisa fazer muito trabalho matemático, em vez de depender do compilador ou das bibliotecas para fazer isso por você. Isso ajudará você a entender a legibilidade na programação, pois a maioria das instruções de montagem corresponde a uma instrução do processador. Você precisa gerenciar a complexidade em programas um pouco maiores, sem o benefício de coisas como essa
if...else
. Isso o ajudará a escrever programas mais simples de alto nível, porque a experiência em montagem ensinaria a você como é mais fácil ler.Lembre-se também de que o assembly não é um idioma! É um termo genérico, que basicamente significa o conjunto de instruções de um processador que foi abstraído para uma linguagem simbólica. Processadores diferentes têm conjuntos de instruções diferentes e, portanto, linguagens de montagem diferentes. Quando você aprende 'montagem', aprende um processo, não um idioma.
fonte
Você sempre se beneficiará de olhar por baixo das cobertas e entender um pouco mais sobre o que está por baixo da abstração em que você está. Como um professor universitário afirmou uma vez: "Todos os bons programadores entendem o hardware" - você não precisa criar e manipular circuitos, mas deve ter alguma noção do que está acontecendo lá em baixo - isso só fará com que você é melhor.
Experimente a organização e o design do computador
fonte
Sim - o aprendizado contínuo e ao longo da vida é um componente essencial de uma carreira no desenvolvimento de software. Se você estiver interessado em continuar aprendendo sobre programação e como melhorar seu ofício, sim, em algum momento você deve aprender montagem, pois isso o exporá a uma linguagem completamente nova e à maneira de escrever código. Pelo mesmo motivo, recomendo experimentar várias linguagens / estilos de programação, incluindo Ruby / Python (linguagem dinâmica), Haskell / F # (linguagem funcional pura), Lisp / Scheme (linguagem funcional), etc.
Eu diria que é tarde demais se você não estiver mais interessado em aprender mais sobre o ofício da programação. Por exemplo, se você alcançou o ponto de sua carreira, em breve poderá passar da programação para outra área, como Gerenciamento, Engenharia de Sistemas, Vendas / Marketing, etc. Se você acha que pode querer mudar para uma nova área em Nos próximos anos, eu me concentraria mais nas habilidades necessárias para desenvolver nessa área, em vez de na arte da programação.
fonte
Você deve saber o que é e o que o computador está fazendo. Aprender algo como o MIX de Knuth o ajudará. Principalmente poder julgar a eficiência do seu código. Vá pegar a arte da programação de computadores e leia-a. Isso fará de você um programador mais inteligente.
fonte
Responda:
fonte
Eu acho que você alcança um ponto de retornos decrescentes à medida que sua carreira avança. Ou seja, você deve aprender a linguagem assembly mais cedo, pois isso leva a uma melhor compreensão fundamental de tudo o que vem depois. No entanto, se você já faz parte da força de trabalho e tem alguns anos de experiência, já terá uma ideia do modo como as coisas funcionam, portanto, aprender os detalhes reais dos parafusos e porcas pode não fornecer muitas informações .
fonte
Não sei o quanto seria útil estudar a montagem. Mas pelo menos fazer alguma programação em uma linguagem como C seria benéfico. Recentemente, tive que fazer alguma programação em C e achei isso bastante esclarecedor. C remove grande parte da abstração presente em idiomas de nível superior. Essas abstrações não vêm sem custo. Você precisa gerenciar mais detalhes de nível inferior em C, onde, em um idioma de nível superior, esses detalhes estão sendo gerenciados por você. Ao fazer alguma programação em C, você precisará conhecer esses detalhes. Portanto, quando você voltar à sua linguagem cotidiana, ainda terá essa consciência e apreciará melhor o que realmente está acontecendo. Isso deve ajudar a torná-lo um programador melhor.
fonte
Na profissão de professor, pelo menos aqui no Reino Unido, os professores precisam ser qualificados muito além do que ensinam. Espera-se que um professor do ensino médio tenha um diploma na matéria que lecionou, e os professores do ensino fundamental também têm diploma e devem ser proficientes em todas as disciplinas principais até um bom nível GCSE (ensino médio) exames de saída ?, nenhum equivalente real nos EUA).
Por quê? Porque para ensinar algo bem, ou de fato usar algo bem, você precisa entender. Isso requer a compreensão da estrutura subjacente, a cadeia de decisões antes da que você está trabalhando e que levou a ela. Para entender adequadamente o código de alto nível, você deve entender a camada sobre a qual ele é construído, como ele opera, onde estão seus pontos fortes e fracos. Isso é recursivo, para entender a camada abaixo, você também deve entender a camada abaixo.
No final, é por isso que os cursos decentes de universidades / faculdades em Computação pedem boa habilidade matemática antes de tudo, pois esse é efetivamente o nível mais baixo.
Se você não tiver conhecimento nessas áreas, seu entendimento ficará comprometido. Quanto mais próximo do nível em que você opera outra camada, mais importante é ter uma base nela.
Então: Você precisa conhecer o assembler como um codificador de alto nível? Isso vai ajudar.
fonte
Tinha sido muito importante na minha vida anterior como um guru do supercomputador. Naquela época, senti que você não entendia uma máquina até escrever pelo menos várias centenas de linhas de montador e mexer com ela tentando reduzir o desempenho. Como poucos programadores queriam ir tão fundo, isso me tornou realmente indispensável. E ainda tenho um idioma comum ao conversar com os tipos de designer de HW.
Mas, na verdade, a necessidade / benefício disso ocorre quase duas décadas atrás. Entre os avanços do compilador e a execução avançada fora de ordem do HW, há muito pouco espaço para ser capaz de interpretar o herói, escrevendo mais o assembler. Embora eu ache útil entender como as coisas funcionam. Eu pretendo ensinar meus filhos (calouros de nível superior em CS) a programar em um montador muito simplificado em uma máquina virtual simples, para que eles tenham uma ideia do que acontece. Espero que possamos brincar com coisas como desenrolamento, pipelining de software, caches e pré-buscas, carregamento inferior etc. Então, pelo menos, eles saberão que em algum nível essas coisas estão acontecendo.
fonte