2008-09-24 10 views
15

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 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 única desde el punto de vista de los desarrolladores de enfocados en .NET Framework. Prácticamente todos comentaban desde el punto de vista del programador general.¿Deberían los programadores de .NET * realmente * pasar tiempo aprendiendo C para la exposición de bajo nivel?

¿Qué estoy tratando de obtener? Recuerde la opinión de Jeff Atwood de que la mayoría de las veces que los desarrolladores en niveles tan altos gastarían en aprender 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 ahorrar 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 completamente lo que los defensores están razonando. Pero, al pensarlo bien, personalmente siento que los desarrolladores de .NET no deberían sumergirse directamente en C. Porque, lo que deseo que más desarrolladores tomen un tiempo para aprender es - MSIL y CLR.

Tal vez estoy atascado con el un montón inusual de los colegas, no sé, pero me parece que mucha gente no tenga un conocimiento consciente que su código C# o VB compila en IL primero antes de que llegue JIT y lo convierte en código de máquina sin formato. 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. La lectura de 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 los 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?

Respuesta

6

Ya sé C y eso me ayudó durante los 1.1 días donde hay un montón de cosas que aún no están en .NET bibliotecas base 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 conocemos. 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.

+0

Sí, es un área notable donde el conocimiento de WIN32 ayuda mucho. – icelava

+0

Creo que esta respuesta se refiere a la API Win32 en lugar del lenguaje de programación C. – MarkJ

+0

@ Markk, creo que debe recordar que esto se pide desde el punto de vista práctico de los desarrolladores de .NET que profundizan en Windows. – icelava

0

El CLR es una máquina virtual así que si eso es todo lo que se aprende, entonces sólo se sabe lo que está sucediendo a nivel virtual.

Aprender C le enseñará más sobre la física equipo hasta el uso de la memoria se va, que como se menciona es lo que el CLR utiliza 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, usted realmente aprecia lo que implica la administración de la memoria.

Aprendiendo CIL por el contrario, le dice un poco más sobre la ejecución en.NET de lo que aprendería C. Aún así, cómo los mapas de IL con el lenguaje de la 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 útil en términos de comprender lo que realmente sucede. son opacos en su mayor parte. Aprendiendo C y punteros, sin embargo, le informarán sobre algunos de esos aspectos.

35

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 cierta 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.

+1

Me gusta mucho esta respuesta, pero debería voltear los párrafos, porque suena como si pensara que todo el mundo debería saber 'C'. No obstante, estoy de acuerdo con el hecho de que tener experiencia en todos los tipos de idiomas es clave para ser un gran desarrollador y no solo uno bueno. No recuerdo cuántas veces mencioné en el trabajo que algo se haría mejor en lenguaje x, y la gente me mira sin comprender. – msarchet

5

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? :)

+0

Recuerde, se trata de entre el tiempo disponible. Como desarrolladores de aplicaciones de alto nivel, pasamos mucho tiempo en asuntos de negocios/dominios. – icelava

1

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, siendo 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).

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 introducidas en C# 3 en una forma más limpia)

3

Mi opinión es que el aprendizaje de un lenguaje compilado y ensamblado es un debe. Sin eso, no obtendrás la versatilidad necesaria para alternar entre idiomas y pilas.

Para ser más específicos - Creo que cualquier buen gran programador/debe saber estas cosas por la 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 las interrupciones?
  • ...

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

Para hacer frente a algunos comentarios

al final tener dos tipos diferentes de desarrolladores:

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

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

+1

Aprecio el sentimiento, sin embargo, el advenimiento de multiplataforma, tiempos de ejecución multilenguaje (como Mono) realmente hace que sea una noción redundante. –

+0

Recuerde que estoy hablando de desarrollo de aplicaciones a nivel empresarial/empresarial. Seguro que siempre existen requisitos especiales que tienen que ver con hardware y dispositivos únicos, pero la mayoría de los casos se trata de interactuar con la entrada del usuario, la base de datos y los servicios web. Interacción comercial y con el cliente, no hardware. – icelava

+1

Dudo en admitir esto, pero prefiero la magia :) – Benjol

2

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 sobre conceptos de bajo nivel sin el dolor de la codificación en el montaje.

Sin embargo, creo que el aprendizaje de lecciones de idiomas como Haskell, pitón, e incluso podría decirse que la expresión regular (no es exactamente un lenguaje, pero lo que me refiero?) Es tan importante como las lecciones que se pueden extraer 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;)

+0

Utilicé mi tiempo libre para aprender IL/CLR. Trabajé horas extras para aprender otras suites tecnológicas directamente requeridas para el trabajo. :-D – icelava

+0

:-D Sin embargo, ¡funciona para usted!Lo importante es que los buenos programadores toman el tiempo libre para aprender en primer lugar. –

3

lo pienso así:

  1. programadores probablemente deberían ser en realidad trabajando en el lenguaje de más alto nivel apropiado. Lo que es apropiado depende de tu situación. Un controlador de dispositivo o sistema incorporado pertenece a una clase diferente de una aplicación de escritorio CRUD o una página web.
  2. Desea que sus programadores tengan la mayor práctica posible en el idioma en el que están trabajando.
  3. 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.
  4. Sin embargo, los lenguajes de nivel superior 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.
  5. Así que los estudiantes deberían usar C (o mejor aún: C++ ya que es de "alto nivel" 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 nivel superior nivel de lenguaje para permitir programas más difíciles antes.
+1

¿Qué tipo de escuela? Si te refieres a vocacional, entonces estoy de acuerdo. Si está hablando de un título de CS, entonces no, un título se trata de la teoría y la comprensión de cómo funciona una computadora, no de hacer que haga cosas bonitas. – tloach

1

Si se considera un programador, yo diría que sí, aprenda 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 vas a hacer girar toda tu carrera 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.

+0

De hecho. Por mucho que quiera ser un programador puro, soy un desarrollador y consultor práctico. Existe un desafío para equilibrar la tecnología y el conocimiento de negocios/dominio. Los requisitos de los clientes vienen primero desafortunadamente. – icelava

4

.Los desarrolladores de .NET deben conocer 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.

Dedicar tiempo a aprender conceptos de alto nivel es ciertamente beneficioso, pero si se concentra demasiado en el alto nivel a expensas del bajo nivel, corre el riesgo de convertirse en una de esas personas "arquitectas" que pueden dibujar cajas y líneas en pizarras blancas, pero que no pueden escribir ningún código real.

Lo que aprenda aprendiendo C le será útil para el resto de su carrera. Lo que aprenda sobre el CLR se volverá obsoleto a medida que Microsoft cambie su plataforma.

+0

Si continúo con el código C# y IL, ¿me convertiré en arquitecto? :-) Me gusta lo que señala en el tercer pasaje. – icelava

+2

Los conceptos en el CLR (o cualquier otra máquina virtual moderna, como Java) durarán más que la implementación. No espero que los desarrolladores de aplicaciones vuelvan a un entorno no administrado en el futuro, por lo que aprender CLR también será útil para el resto de su carrera. –

1

¿Los desarrolladores de .net deberían 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 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 saber para ser un buen programador.

2

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.

Si bien no hace daño aprenderlo, es probable que ganes más por pasar 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.

+0

¿Se da una pregunta X cantidad de tiempo disponible, debe pasar ese tiempo en MSIL/CLR o C? – icelava

0

¿El problema es aprender C o MSIL, o es más fundamental? Yo 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 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 en. Steve Yegge talks about this 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.

0

he publicado esto en otro hilo, pero se aplica aquí a:

Creo que necesita una buena base, sino dedicar la mayor parte de su tiempo para aprender lo que va a utilizar.

  • Aprenda lo suficiente ensamblador para sumar 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 debug from cmd.exe).
  • Aprenda lo suficiente C para tener que asignar algo de memoria y usar punteros. Un simple linked list es suficiente. (Esto se puede hacer en un día o dos).
  • Pase más tiempo aprendiendo el idioma que va a utilizar. Dejaría que tus intereses te dirijan a qué idioma (C#, Java, Ruby, Python, etc.).
3

Para ser lo suficientemente avanzado en la escritura C#, necesita comprender los conceptos en C, incluso si no aprende el idioma propiamente dicho.

En términos más generales, si habla en serio acerca de cualquier habilidad de, debe saber qué ocurre al menos con un nivel de abstracción por debajo de su nivel de trabajo principal.

  • Codificación en jQuery debe ser emparejado con una comprensión de JavaScript
  • circuitos de Proyectos requiere conocer la física
  • Cualquier buen jugador de baloncesto va a aprender sobre los músculos, los huesos, y la nutrición
  • Un violinista aprenderá acerca de la interacción de colofonia, fricción, pelos de proa, cuerda y sequedad de madera
Cuestiones relacionadas