specification - ¿Deberían los desarrolladores de.NET*realmente*pasar tiempo aprendiendo C para la exposición de bajo nivel?
common language specification (15)
¿Deberían los desarrolladores de .net estar aprendiendo C? Yo diría "no necesariamente", pero siempre deberíamos incursionar en algún idioma fuera de nuestra bailía 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 Perl.
Aparte de C ++, no enumero ninguno de ellos en mi currículum porque no estoy buscando 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 saber para ser un buen programador.
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, centelleó un debate bastante explosivo dentro de la comunidad de desarrolladores que probablemente todavía se desata entre ciertos grupos hoy en día. He estado leyendo varios pasajes de un número de bloggers programadores con su opinión sobre el asunto. Los argumentos de ambos lados sin duda tienen peso, lo que no encontré es una perspectiva que sea única desde el punto de vista de los desarrolladores enfocados en .NET Framework . Prácticamente todos comentaban desde el punto de vista del programador general.
¿A qué estoy tratando de llegar? Recuérdese la opinión de Jeff Atwood de que la mayoría de las veces los desarrolladores de niveles tan altos gastarían en aprender el negocio / dominio , además de lo que sea necesario para aprender las tecnologías para lograr esos requisitos de dominio. En mi experiencia laboral, esta es una descripción muy precisa de la vida laboral de muchos. Ahora, suponiendo que los desarrolladores de .NET puedan aprovechar el tiempo para el aprendizaje "extracurricular", ¿debería ser C?
Para el registro, aprendí a C de nuevo en la escuela, y puedo comprender y apreciar por completo lo que los defensores están razonando. Pero, cuando pienso en las cosas, personalmente siento que los desarrolladores de .NET no deben sumergirse directamente en C. Porque, lo que deseo que más desarrolladores necesiten más tiempo para aprender es MSIL y CLR .
Tal vez estoy atrapado con un grupo inusual de colegas, no sé, pero me parece que muchas personas no tienen conciencia de que su código C # o VB se compila en IL primero antes de que JIT entre y lo convierte en máquina cruda código. La mayoría no conoce IL, y no tiene ningún interés en cómo exactamente el CLR maneja el código que escriben. Leer el CLR de Jeffrey Richter a través de C # fue bastante impactante para mí en tantas áreas; Me alegro de haberlo leído a pesar de que sus colegas lo descartaron como "de muy bajo nivel". No soy un experto en IL, pero con el conocimiento de los conceptos básicos, me encontré siguiendo su texto más fácil, ya que ya estaba familiarizado con el comportamiento de la pila de IL. Me encuentro desmontando ensambles para ver cómo resulta IL cuando escribo cierto código.
Aprendo el CLR y MSIL porque sé que es la capa directa debajo de mí . La capa que me permite llevar a cabo mi propia capa de trabajo. C, en realidad está más abajo. Más cerca de nuestra "realidad" está el CLR y MSIL. Es por eso que recomendaría a otros que se ocupen de eso, porque no veo suficientes personas investigando esa capa. O bien, ¿su equipo ya está familiarizado con MSIL?
¿El problema es aprender C o MSIL, o es más fundamental? Diría que, en general, más desarrolladores podrían soportar aprender más sobre cómo funcionan las computadoras , físicas o virtuales. Una persona puede llegar a ser un programador bastante competente solo al entender un idioma y API en una caja. Para llevar la profesión al próximo nivel, creo que los desarrolladores realmente necesitan comprender toda la pila. No necesariamente en detalle, pero con suficiente generalidad para ayudar a resolver problemas.
Muchas de estas habilidades que se comentan aquí se pueden adquirir aprendiendo más sobre compiladores y diseño de lenguaje. Probablemente necesites aprender C para hacer esto (whoops, sneaky), pero la escritura del compilador es un gran contexto para aprender C in. Steve Yegge habla de esto en su blog, y estoy de acuerdo con él en este punto. Mi curso de escritura de compilador en la universidad fue uno de los cursos más reveladores que haya tomado, y realmente desearía que hubiese sido un curso de 200 niveles, en lugar de uno de 400 niveles.
El CLR es una máquina virtual , de modo que si eso es todo lo que aprendes, entonces solo sabes lo que sucede a nivel virtual.
Aprendizaje C le enseñará más acerca de la máquina física en lo que respecta al uso de la memoria, que como usted menciona es lo que CLR usa debajo. Aprender cómo funciona el CLR no le dará tanta información sobre, por ejemplo, recolección de basura, como aprender C. Con C, realmente aprecia lo que implica el manejo de la memoria.
Aprendiendo CIL, por otro lado, te dice un poco más sobre la ejecución en .NET que si aprendieras C. Aún así, la forma en que los mapas de IL para el lenguaje de máquina seguirán siendo un misterio en su mayor parte, así 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 entender lo que realmente está sucediendo ya que '' re opaco en su mayor parte. Aprender C y punteros, sin embargo, lo iluminarán en algunos de esos aspectos.
Es cierto, C está muy por debajo de la cadena. Conocer MSIL puede ayudar a los desarrolladores a entender mejor cómo optimizar sus aplicaciones. En cuanto a aprender C o MSIL, ¿por qué no ambos? :)
Lo pienso así:
- Los programadores probablemente deberían estar trabajando en el lenguaje de nivel más alto apropiado. Lo que es apropiado depende de tu situación. Un controlador de dispositivo o sistema integrado pertenece a una clase diferente de una aplicación de escritorio CRUD o una página web.
- Desea que sus programadores tengan tanta práctica como sea posible en el idioma en el que están trabajando.
- Dado que la mayoría de los programadores terminan trabajando en aplicaciones de escritorio y web genéricas, desea que los estudiantes de programación se trasladen a los idiomas de nivel más alto lo antes posible durante la escuela.
- Sin embargo, los lenguajes de alto nivel ofuscan algunos problemas básicos de programación, como los punteros. Si aplicamos nuestro principio de usar lo que es apropiado para los estudiantes también, esos idiomas de nivel superior pueden no ser apropiados para los estudiantes de primer año. Eso arroja Java, .Net, Python y muchos otros.
- Así que 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 pasar rápidamente a un lenguaje de nivel superior para habilitar programas más difíciles antes.
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 el dolor de la codificación en el ensamblaje.
Sin embargo, creo que aprender lecciones de idiomas como Haskell, Python e incluso posiblemente expresiones regulares (no es exactamente un idioma, pero ¿entiendes mi deriva?) Es tan importante como las lecciones que se extraerán de C.
Así que digo, aprenda sobre CLR y MSIL en el trabajo, si esa es su área, y en su tiempo libre, intente elegir un idioma diferente cada cierto tiempo. Si resulta ser C este año, es bueno para ti y disfrutas jugando con punteros;)
Mi opinión es que aprender un poco de lenguaje compilado y ensamblado es imprescindible . Sin eso, no obtendrás la versatilidad necesaria para alternar entre idiomas y pilas.
Para ser más específico, creo que cualquier programador bueno / gran debe saber estas cosas por experiencia directa:
- ¿Cuál es la diferencia entre un registro y una variable?
- ¿Qué es DMA?
- ¿Cómo se pone un píxel en la pantalla (a bajo nivel)?
- ¿Qué son interrupciones?
- ...
Conocer estas cosas es la diferencia entre trabajar con un sistema que comprendes 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.
No puede ser una mala idea aprender MSIL, pero de alguna manera es solo otro lenguaje .NET, pero con una sintaxis desagradable. Sin embargo, es otra capa más, y creo que la gente debería tener al menos una vaga comprensión de todas las capas.
C, que es algo así como el lenguaje ensamblador con una sintaxis más agradable, es una buena manera de hacerse una idea de lo que está sucediendo en un nivel bastante bajo (aunque algunas cosas aún están ocultas para usted).
Y desde el otro extremo, creo que todos deberían saber algo como Haskell o Lisp para tener una idea de cosas de más alto nivel (y ver algunas de las ideas que se presentan en C # 3 en una forma más limpia)
No veo ninguna razón por la que deberían. Los lenguajes como Java y C # fueron diseñados para que no tenga que preocuparse por los detalles de bajo nivel. Eso es lo mismo que preguntar si un desarrollador de WinForms debe pasar tiempo aprendiendo la API de Win32 porque eso es lo que está sucediendo debajo.
Aunque no hace daño aprenderlo, probablemente ganarás más si pasas más tiempo aprendiendo los idiomas y plataformas con los que estás familiarizado, a menos que haya una buena necesidad de aprender los detalles técnicos de bajo nivel.
Por supuesto que deberías. La mejor manera de volverse demasiado especializado y de mente única (y, en consecuencia, tener habilidades comercializables limitadas) es trabajar solo con un solo tipo de lenguaje y evitar todos los demás como "no relacionados con su tarea actual".
Cada programador debe tener alguna experiencia con un lenguaje JIT''d OO 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 usa todos los días, la ampliación de su proceso de pensamiento que tal conocimiento concede es bastante útil.
Publiqué esto en otro hilo, pero se aplica aquí a:
Creo que necesita una buena base, pero dedique la mayor parte de su tiempo a aprender lo que va a utilizar.
- Aprenda lo suficiente ensamblador para agregar dos números y mostrar el resultado en una consola. Comprenderá mucho mejor qué está pasando realmente con la computadora y tendrá sentido en cuanto a por qué usamos binary / Hex. (Esto se puede hacer en un día y se puede hacer con depuración desde cmd.exe ).
- Aprenda lo suficiente C para tener que asignar memoria y usar punteros. Una simple lista vinculada es suficiente. (Esto se puede hacer en un día o dos).
- Dedique más tiempo a aprender un idioma que va a utilizar. Dejaría que tus intereses te dirijan a qué idioma (C #, Java, Ruby, Python, etc.).
Si te consideras un programador, diría que sí, aprende C.
Muchas personas que escriben código no se consideran programadores. Escribo aplicaciones .NET quizás 3 horas al día en el trabajo, pero no me etiqueto a mí mismo 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 harás que toda tu carrera gire en torno a la programación, entonces es mejor que te asegures de conocer tus cosas. Aprender C probablemente te ayude a construir una base de conocimiento que sería útil si vas a profundizar en las habilidades de programación.
Con todo, hay compensaciones. Cuantos más idiomas aprenda y cuanto más tiempo dedique a la tecnología, menos tiempo tendrá 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? Aprende C. Pasa horas y horas escribiendo códigos y dedicándote al arte. ¿Alguna vez quieres administrar a alguien más en lugar de codificar todo el día? Use el tiempo que pondría en la programación y encuentre maneras de mejorar sus habilidades blandas.
Ya sé C y eso me ayudó durante los 1.1 días donde hay muchas cosas que aún no están en las bibliotecas base de .NET y tengo que P / invocar algo desde Platform SDK.
Mi opinión es que siempre debemos asignar un tiempo para aprender algo que aún no sabemos. Para responder a su pregunta, no creo que sea esencial que aprenda C, pero si tiene tiempo, C es un buen idioma para aprender y es tan válido como cualquier otro idioma.
Para estar lo suficientemente avanzado escribiendo C #, necesita comprender los conceptos en C, incluso si no aprende el idioma propiamente dicho.
En términos más generales, si es serio acerca de cualquier habilidad, debe saber qué sucede al menos con un nivel de abstracción por debajo de su nivel de trabajo principal.
- La codificación en jQuery debe combinarse con una comprensión de JavaScript
- Diseñar circuitos requiere conocer la 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, los pelos del arco, la cuerda y la sequedad de la madera
Los desarrolladores de .NET deben aprender sobre el CLR. Pero también deberían aprender C. No veo cómo alguien realmente puede entender cómo funciona el CLR sin un entendimiento de bajo nivel de lo que sucede en el metal desnudo.
Pasar tiempo aprendiendo sobre conceptos de alto nivel es ciertamente beneficioso, pero si te concentras demasiado en el alto nivel a expensas del bajo nivel, te arriesgas a ser uno de esos "arquitectos" que pueden dibujar cajas y líneas en pizarras blancas. pero que no pueden escribir ningún código real.
Lo que aprendes aprendiendo C te será útil por el resto de tu carrera. Lo que aprenda sobre el CLR se volverá obsoleto a medida que Microsoft cambie su plataforma.