¿Deberían los desarrolladores de .NET *realmente* dedicar tiempo a aprender C para una exposición de bajo nivel?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Cuando Joel Spolsky y Jeff Atwood comenzaron el desacuerdo en su podcast sobre si los programadores deberían aprender C, independientemente de su industria y plataforma de entrega, desató un debate bastante explosivo dentro de la comunidad de desarrolladores que probablemente todavía arrasa entre ciertos grupos hoy en día.He estado leyendo varios pasajes de varios blogueros programadores con su opinión sobre el asunto.Los argumentos de ambas partes ciertamente tienen peso, y lo que no encontré es una perspectiva que tenga un ángulo único desde el punto de vista de desarrolladores centrados únicamente en .NET Framework.Prácticamente todos comentaban desde el punto de vista general del programador.

¿A qué estoy tratando de llegar?Recuerde la opinión de Jeff Atwood de que la mayor parte del tiempo que los desarrolladores de niveles tan altos dedicarían a aprender el dominio de negocio, además de todo lo que sea necesario para aprender las tecnologías necesarias para lograr esos requisitos de dominio.En mi experiencia laboral, esa es una descripción muy precisa de la vida laboral de muchos.Ahora bien, suponiendo que los desarrolladores .NET puedan dedicar tiempo al aprendizaje "extracurricular", ¿deberían eso ser C?

Para que conste, yo mismo aprendí C en la escuela y puedo entender y apreciar absolutamente el razonamiento de los proponentes.Pero, al pensar detenidamente, personalmente creo que los desarrolladores de .NET no deberían sumergirse directamente en C.Porque lo que desearía que más desarrolladores se tomaran un tiempo para aprender es: MSIL y CLR.

Tal vez estoy atrapado con un grupo inusual de colegas, no lo sé, pero me parece que mucha gente no mantiene una alerta conciente que su código C# o VB se compila en IL primero antes de que entre JIT y lo convierta en código de máquina sin formato.La mayoría no conoce IL y no tiene interés en cómo exactamente el CLR maneja el código que escriben.Leyendo el libro de Jeffrey Richter CLR a través de C# fue una gran sorpresa para mí en muchas áreas;Me alegro de haberlo leído a pesar de que mis colegas lo descartaron como "de nivel demasiado bajo".No soy un experto en IL, pero con conocimientos de los conceptos básicos, me encontré siguiendo su texto más fácilmente porque ya estaba familiarizado con el comportamiento de la pila de IL.Me encuentro desmontando ensamblajes para ver cómo resulta el IL cuando escribo cierto código.

Aprendo CLR y MSIL porque sé que es la capa directa. debajo de mí.La capa que me permite realizar mi propia capa de trabajo.C, en realidad está más abajo.Más cerca de nuestra "realidad" están el CLR y el MSIL.Es por eso que recomendaría a otros que los prueben, porque no veo suficientes personas profundizando en esa capa.¿O su equipo ya está familiarizado con MSIL?

¿Fue útil?

Solución

Ya conozco C y eso me ayudó durante los días 1.1 donde hay muchas cosas que aún no están en las bibliotecas base de .NET y tengo que P/Invocar algo desde el SDK de la plataforma.

Mi opinión es que siempre debemos dedicar un tiempo a aprender algo que aún no sabemos.Para responder a tu pregunta, no creo que sea esencial que aprendas C, pero si tienes algo de tiempo libre, C es un buen lenguaje para aprender y es tan válido como cualquier otro lenguaje que existe.

Otros consejos

Por supuesto que deberías.La mejor manera de volverse demasiado especializado y decidido (y, en consecuencia, tener habilidades comerciales limitadas) es trabajar solo con un solo tipo de lenguaje y evitar todos los demás por considerarlos "no relacionados con su tarea actual".

Todo programador debe tener alguna experiencia con un lenguaje OO JIT moderno (C#/Java), un lenguaje más simple de nivel inferior (C, FORTRAN, etc.), un lenguaje interpretado de muy alto nivel (Python, Ruby, etc.) y un lenguaje funcional (Scheme, Lisp, Haskell, etc).Incluso si no los utiliza todos en el día a día, la ampliación de su proceso de pensamiento que otorga dicho conocimiento es bastante útil.

Es cierto que C está muy por debajo de la cadena.Conocer MSIL puede ayudar a los desarrolladores a comprender cómo optimizar mejor sus aplicaciones.En cuanto a aprender C o MSIL, ¿por qué no ambos?:)

Los desarrolladores de .NET deberían aprender sobre CLR.Pero también deberían aprender C.No veo cómo alguien puede realmente entender cómo funciona el CLR sin una comprensión de bajo nivel de lo que sucede en el metal desnudo.

Dedicar tiempo a aprender conceptos de nivel superior es ciertamente beneficioso, pero si te concentras demasiado en el nivel superior a expensas del nivel inferior, corres el riesgo de convertirte en uno de esos "arquitectos" que pueden dibujar cuadros y líneas en pizarras. pero que no pueden escribir ningún código real.

Lo que aprenda al aprender C será útil para el resto de su carrera.Lo que aprenda sobre CLR quedará obsoleto a medida que Microsoft cambie su plataforma.

Mi opinión es que aprender algo de lenguaje compilado y ensamblador es una debe.Sin eso, no obtendrá la versatilidad necesaria para cambiar entre idiomas y pilas.

Para ser más específico, creo que cualquier buen/gran programador debe saber estas cosas por experiencia directa:

  • ¿Cuál es la diferencia entre un registro y una variable?
  • ¿Qué es DMA?
  • ¿Cómo se coloca un píxel en la pantalla (a bajo nivel)?
  • ¿Qué son las interrupciones?
  • ...

Saber estas cosas es la diferencia entre trabajar con un sistema que entender y un sistema que, por lo que sabes, funciona por arte de magia.:)

Para abordar algunos comentarios

Terminas teniendo dos tipos diferentes de desarrolladores:

  • personas que pueden hacer una cosa de 10 maneras en uno o dos idiomas
  • personas que pueden hacer una cosa de una o dos maneras en 10 idiomas diferentes

Creo firmemente que el segundo grupo son los mejores desarrolladores en general.

Lo pienso así:

  1. Los programadores probablemente deberían ser realmente laboral en el idioma de más alto nivel apropiado.Lo que es apropiado depende de su escenario.Un controlador de dispositivo o un sistema integrado pertenece a una clase diferente de una aplicación de escritorio o página web CRUD.
  2. Quiere que sus programadores tengan la mayor práctica posible en el lenguaje en el que trabajan.
  3. Dado que la mayoría de los programadores terminan trabajando en aplicaciones web y de escritorio genéricas, es recomendable que los estudiantes de programación pasen a lenguajes de nivel superior lo antes posible durante la escuela.
  4. Sin embargo, los lenguajes de nivel superior confunden algunos problemas básicos de programación, como los punteros.Si aplicamos nuestro principio de utilizar también lo que es apropiado para los estudiantes, esos idiomas de nivel superior pueden no ser apropiados para los estudiantes de primer año.Eso descarta Java, .Net, Python y muchos otros.
  5. Entonces los estudiantes deberían usar C (o mejor aún:C++ ya que es de "nivel superior" y cubre la mayoría de los mismos conceptos) durante el primer año o dos de la escuela para cubrir conceptos básicos, pero rápidamente pasa a un lenguaje de nivel superior para permitir programas más difíciles antes.

Para estar lo suficientemente avanzado en la escritura de C#, es necesario comprender los conceptos de C, incluso si no aprende el lenguaje propiamente dicho.

Sin embargo, en términos más generales, si te tomas en serio cualquier habilidad, debes saber lo que sucede al menos en un nivel de abstracción por debajo de tu nivel de trabajo principal.

  • La codificación en jQuery debe ir acompañada de una comprensión de JavaScript
  • Diseñar circuitos requiere conocimientos de física
  • Cualquier buen jugador de baloncesto aprenderá sobre músculos, huesos y nutrición.
  • Un violinista aprenderá sobre la interacción de la colofonia, la fricción, las cerdas del arco, las cuerdas y la sequedad de la madera.

Me gusta aprender un nuevo idioma cada año.No necesariamente para dominarlo, sino para obligar a mi cerebro a pensar de diferentes maneras.

Siento que aprender C es un buen lenguaje para aprender conceptos de bajo nivel sin la molestia de codificar en ensamblador.

Sin embargo, creo que aprender lecciones de lenguajes como Haskell, Python e incluso posiblemente regex (no es exactamente un lenguaje, pero ¿me entiendes?) es tan importante como las lecciones que se pueden extraer de C.

Por eso digo, aprenda sobre CLR y MSIL en el trabajo si esa es su área, y en su tiempo libre, intente aprender un idioma diferente de vez en cuando.Si resulta que este año es C, bien por ti y disfruta jugando con punteros;)

No veo ninguna razón por la que deberían hacerlo.Lenguajes como Java y C# fueron diseñados para que no tengas que preocuparte por los detalles de bajo nivel.Eso es lo mismo que preguntar si un desarrollador de WinForms debería dedicar tiempo a aprender la API de Win32 porque eso es lo que sucede debajo.

Si bien no está de más aprenderlo, probablemente ganarás más si dedicas más tiempo a aprender los idiomas y plataformas con los que estás familiarizado, a menos que exista una gran necesidad de aprender los detalles técnicos de bajo nivel.

No puede ser una mala idea aprender MSIL, pero en cierto modo es simplemente otro lenguaje .NET, pero con una sintaxis desagradable.Sin embargo, es otra capa más abajo, y creo que la gente debería tener al menos una comprensión vaga de todas las capas.

C, al ser algo así como un lenguaje ensamblador con una sintaxis más agradable, es una buena manera de tener una idea de lo que está sucediendo en un nivel bastante bajo (aunque algunas cosas todavía están ocultas para usted).

Y desde el otro extremo, creo que todos deberían saber un poco de algo como Haskell o Lisp para tener una idea de cosas de nivel superior (y ver algunas de las ideas que se introducen en C# 3 de una forma más clara).

Si te consideras programador, diría que sí, aprende C.

Muchas personas que escriben código no se consideran programadores.Escribo aplicaciones .NET, tal vez 3 horas al día en el trabajo, pero no me etiqueto como un "programador". Hago muchas cosas que no tienen nada que ver con la programación.

Si pasas todo el día programando o pensando en programación, y vas a hacer que toda tu carrera gire en torno a la programación, entonces será mejor que te asegures de saber lo que haces.Aprender C probablemente ayudaría a construir una base de conocimientos que sería útil si vas a profundizar mucho en las habilidades de programación.

En todo hay compensaciones.Cuantos más idiomas aprendas y más tiempo dediques a la tecnología, menos tiempo tendrás para aprender otras habilidades.Por ejemplo, ¿sería mejor aprender C o leer libros sobre gestión de proyectos?Depende de tus objetivos.¿Quieres ser el mejor programador EVAR?aprender c.Pasa horas y horas escribiendo código y dedicándote al oficio.¿Alguna vez quisiste administrar a alguien más en lugar de codificar todo el día?Utilice el tiempo que dedicaría a la programación y encuentre formas de mejorar sus habilidades interpersonales.

¿Deberían los desarrolladores .net aprender C?Yo diría "no necesariamente", pero siempre deberíamos incursionar en algún lenguaje fuera de nuestra competencia profesional porque cada idioma trae consigo una nueva forma de pensar sobre los problemas.Durante mi carrera profesional como desarrollador de .net (y antes de eso, VB 2-6), he escrito pequeños proyectos en Pascal, LISP, C, C++, PHP, JavaScript, Ruby y Python y actualmente estoy incursionando en Lua y Perla.

Aparte de C++, no incluyo ninguno de ellos en mi currículum porque no busco ser un profesional en ninguno de ellos.En cambio, traigo ideas interesantes de cada uno de ellos para usar en mi trabajo basado en .net.

C es interesante porque realmente te acerca al sistema operativo, pero ese no es el único nivel que necesitas conocer para ser un buen programador.

El CLR es un virtual máquina, así que si eso es todo lo que aprendes, entonces sólo sabrás lo que sucede a nivel virtual.

Aprendiendo C te enseñará más sobre el físico máquina en lo que respecta al uso de memoria, que, como usted menciona, es lo que usa CLR debajo.Aprender cómo funciona CLR no le brindará tanta información sobre, por ejemplo, la recolección de basura, como aprender C.Con C, tu en realidad apreciar lo que implica la gestión de la memoria.

Aprendiendo cil por otro lado, le informa un poco más sobre la ejecución en .NET que si aprendiera C.Aún así, ¿cómo ILLINOIS Los mapas al lenguaje de máquina seguirán siendo un misterio en su mayor parte, por lo que conocer algunos de los códigos de operación de alto nivel, como los de los tipos de conversión, no es tan útil en términos de comprender lo que realmente está sucediendo, ya que son opacos para el la mayor parte.Aprendiendo C y algunos consejos, sin embargo, le iluminarán sobre algunos de esos aspectos.

¿El problema es aprender C o MSIL, o es más fundamental?Yo diría que, en general, más desarrolladores podrían aprender más sobre cómo ordenadores, físico o virtual, trabajo.Una persona puede llegar a ser un programador bastante competente con sólo comprender un lenguaje y una API en una caja.Para llevar la profesión al siguiente nivel, creo que los desarrolladores realmente necesitan comprender todo el conjunto.No necesariamente en detalle, pero sí con suficiente generalidad para ayudar a resolver problemas.

Muchas de estas habilidades de las que se habla aquí se pueden adquirir aprendiendo más sobre compiladores y diseño de lenguajes.Probablemente necesites aprender C para hacer esto (vaya, astuto), pero la escritura del compilador es un excelente contexto para aprender C.Steve Yege habla de esto en su blog, y estoy en gran medida de acuerdo con él en este punto.Mi curso de redacción de compiladores en la universidad fue uno de los cursos más reveladores que he tomado y realmente desearía que hubiera sido un curso de nivel 200, en lugar de uno de nivel 400.

Publiqué esto en otro hilo pero se aplica aquí a:

Creo que necesitas una buena base, pero dedica la mayor parte de tu tiempo a aprender lo que usarás.

  • Aprenda suficiente ensamblador para sumar dos números y mostrar el resultado en una consola.Comprenderá mucho mejor lo que realmente sucede con la computadora y tendrá sentido por qué usamos binario/hexadecimal.(esto se puede hacer en un día y se puede hacer con depurar desde cmd.exe).
  • Aprenda suficiente C para tener que asignar algo de memoria y usar punteros.Un simple lista enlazada es suficiente.(Esto se puede hacer en uno o dos días).
  • Dedica más tiempo a aprender un idioma que vas a utilizar.Dejaría que tus intereses te guíen hacia qué idioma (C#, Java, Ruby, Python, etc.).
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top