Sobre el desarrollo de conocimientos profundos de programación

131

Ocasionalmente veo preguntas sobre casos de borde y otras rarezas en Stack Overflow que son contestadas fácilmente por gente como Jon Skeet y Eric Lippert, demostrando un profundo conocimiento del lenguaje y sus múltiples complejidades, < a href="http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx"> como este:

  

Podría pensar que para usar un bucle foreach , la colección   la iteración sobre debe implementar IEnumerable o IEnumerable<T> .   Pero como resulta, eso no es realmente un requisito. Que es   requerido es que el tipo de colección debe tener un método público.   se llama GetEnumerator , y eso debe devolver algún tipo que tenga un público   el captador de propiedades se llama Current y un método público MoveNext que   devuelve un bool . Si el compilador puede determinar que todos esos   se cumplen los requisitos y luego se genera el código para utilizar esos métodos.   Solo si esos requisitos no se cumplen, verificamos si el   el objeto implementa IEnumerable o IEnumerable<T> .

Eso es bueno saberlo. Puedo entender por qué Eric sabe esto; Él está en el equipo de compilación, por lo que tiene que saber. Pero ¿qué pasa con aquellos que demuestran un conocimiento tan profundo que no son expertos?

¿Cómo los simples mortales (que no están en el equipo del compilador de C #) se enteran de cosas como esta?

Específicamente, ¿existen métodos que usen estas personas para eliminar sistemáticamente ese conocimiento, explorarlo e interiorizarlo (hacer que sea suyo)?

    
pregunta Robert Harvey 11.07.2011 - 22:34
fuente

10 respuestas

164

En primer lugar, gracias por las amables palabras.

Si desea obtener un conocimiento profundo de C # es sin duda una ventaja para tener la especificación de idioma, diez años de notas de diseño, el código fuente, la base de datos de errores, y Anders, Mads, Scott y Peter en el pasillo. Ciertamente soy afortunado, no hay duda al respecto.

Sin embargo, incluso sin esas ventajas, todavía es posible obtener un conocimiento profundo del tema.

Cuando empecé en Microsoft, estaba trabajando en el intérprete de JScript que se entregaba con Internet Explorer 3. Mi gerente en ese momento me dijo algo que era uno de los mejores consejos que he recibido. Dijo que quería que me convirtiera en el experto reconocido de Microsoft en la sintaxis y la semántica del lenguaje JScript, y que debería hacerlo al buscar preguntas sobre esos aspectos de JScript y responderlas. Respondiendo particularmente a las preguntas de las que no sabía las respuestas, porque esas son las cosas de las que aprendería.

Obviamente, StackOverflow y otros foros públicos de preguntas y respuestas (A) son como beber de una manguera para ese tipo de cosas. En ese entonces, leí religiosamente comp.lang.javascript y nuestros foros internos de "Usuarios de JS" de Microsoft y seguí el consejo de mi gerente: cuando vi una pregunta sobre la semántica del idioma que no sabía La respuesta a, lo hice mi negocio para averiguarlo.

Si quieres hacer una "inmersión profunda" como esa, tienes que elegir cuidadosamente. Hasta el día de hoy, soy notablemente ignorante de cómo funciona el modelo de objetos del navegador. Desde que me he concentrado en convertirme en el experto en lenguaje C # en los últimos años, soy muy ignorante de cómo funcionan las diversas clases en las bibliotecas de clases básicas. Tengo la suerte de tener un trabajo que valora conocimientos profundos específicos; Si tu trabajo o tus talentos están más en línea con ser un generalista, es posible que no te vaya bien.

Escribir un blog también es tremendamente útil; Al exigirme que explique temas complejos a otras personas, me veo obligado a enfrentar mi propia comprensión inadecuada de varios temas todo el tiempo.

    
respondido por el Eric Lippert 13.07.2011 - 00:59
fuente
63

Habiendo estado en el lado del "gurú" de la conversación una o dos veces, puedo decirle que muchas veces lo que percibe como "conocimiento profundo" de un lenguaje o sistema de programación suele ser el resultado del "gurú" Recientemente luchando durante un mes para resolver exactamente el mismo problema. Esto es especialmente cierto en un foro donde las personas pueden elegir las preguntas que responderán. Incluso los gustos de Jon Skeet y Eric Lippert tuvieron que aprender hola mundo en un momento dado. Recogen sus conocimientos un concepto a la vez, igual que cualquier otra persona.

    
respondido por el Karl Bielefeldt 11.07.2011 - 23:58
fuente
47

Parafraseando a Yogi Bhajan:

  

"Si quieres aprender algo, lee sobre él; si quieres   entender algo, escribir sobre ello; si quieres dominar algo    programa it. "

La programación es como el desafío de enseñanza final. Enseñar a la computadora a hacer algo requiere que usted conozca sus cosas realmente bien, o aprenderá a dominarlo.

Por ejemplo, si quieres aprender física, escribe un motor de física. Si quieres aprender ajedrez, programa un juego de ajedrez. Si desea obtener un conocimiento profundo de C #, escriba un compilador de C # (o alguna otra herramienta).

    
respondido por el Maglob 11.07.2011 - 23:17
fuente
25

Por lo que sé, las formas de aprender esto son:

  • Léelo a alguien como Eric Lippert
  • Experimente y luego resuelva los problemas de primera mano.

La segunda forma puede tomar mucho más tiempo pero probablemente resultará en una comprensión más profunda (pero no siempre).

    
respondido por el FrustratedWithFormsDesigner 11.07.2011 - 22:39
fuente
22

Yo diría que haga lo siguiente:

Después de aprender una pila de idiomas relativamente útil (los que necesita para un trabajo real) en el nivel donde puede realizar las tareas más comunes, Deja de aprender más idiomas hasta que hayas estudiado al menos uno en profundidad. En mi opinión, parte del problema en nuestra industria en este momento es que las personas solo aprenden el primer 5-10% del idioma antes de pasar a otro idioma. Una vez que tenga la capacidad de realizar la mayoría de las tareas comunes en un trabajo, comience a analizar una cosa en profundidad. (Puede volver a obtener amplitud después de obtener algo de profundidad, y luego ir y venir entre las dos).

Hazte voluntario para las tareas más complejas y difíciles, las que te obligan a profundizar para resolver los problemas. Si no hay ninguno en el lugar donde trabajas, busca tareas de código abierto para hacer o comienza a trabajar en un proyecto personal que te hará profundizar. Si su trabajo no tiene problemas interesantes, considere buscar un trabajo más desafiante.

Lea los libros avanzados en un idioma (para SQl Server, por ejemplo, esto incluiría la lectura sobre el ajuste de rendimiento y las bases de datos de la base de datos) en lugar del tipo X de libros de 30 días.

Lea las preguntas interesantes aquí y otros lugares donde se hacen las preguntas y trate de resolver algunas usted mismo. Si desea aprender, intente resolver algunos sin leer primero las otras respuestas. Incluso si la pregunta ya ha sido respondida, aprenderá más si encuentra la respuesta usted mismo. Incluso puede encontrar una respuesta mejor que la que tenía la pregunta.

Haz algunas de las preguntas más difíciles. Evalúa las respuestas que te dan, no solo las uses. Asegúrese de entender por qué la respuesta funcionaría o no. Usa esas respuestas como punto de partida para investigar.

Encuentre algunos buenos blogs técnicos de expertos conocidos en el campo y léalos.

Deja de perder tu conocimiento una vez que hayas terminado con él. Aprende a retener. La mayoría de los expertos no tienen que buscar la sintaxis común. No tienen que reinventar la rueda cada vez que se enfrentan a un problema porque recuerdan cómo abordaron un problema similar antes. Pueden conectar los puntos y ver cómo el problema X que hicieron hace dos años es similar al problema Y que tienen en este momento (me sorprende que pocas personas parecen ser capaces de hacer conexiones de esa manera). En consecuencia, tienen más tiempo disponible para dedicar a investigar temas más interesantes.

    
respondido por el HLGEM 12.07.2011 - 00:57
fuente
9

Puede comenzar profundamente estudiando las especificaciones de idioma de las que desea ser un experto. Por ejemplo:

respondido por el Marcelo 11.07.2011 - 23:32
fuente
6

Obtenga Reflector o cualquier otro descompilador (ya que está pagando ahora), y comience a abrir algunas de las bibliotecas .NET más utilizadas para Aprende cómo funcionan los internos. Combinado con un libro como CLR a través de C # , será bastante profundo (más profundo de lo que la mayoría de nosotros iremos en su trabajo regular).

    
respondido por el Bart 11.07.2011 - 22:56
fuente
4

Desarrollé ese tipo de conocimiento en C ++ al quedarme en comp.lang.c++.moderated durante un par de años, a pesar de que realmente no estaba trabajando tan duro para codificarlo en ese momento. Sin embargo, no estoy seguro de cómo puedo decir que soy un guru.

Creo que hay dos tipos de conocimiento que uno puede aprender sobre un lenguaje de programación:

  1. Saber trivialidades sobre el idioma y saber cómo evitar las trampas.
  2. Saber cómo resolver problemas de manera efectiva.

El número 2 solo se puede lograr mediante la programación en el idioma y mirando el código de otras personas, pero el número 1 se puede lograr si se toma mucho tiempo para leer sobre el idioma en sus foros de discusión, viendo qué tipo de preguntas hace la gente. y cuales son las respuestas StackOverflow es un buen lugar para eso también.

    
respondido por el Ken Bloom 12.07.2011 - 03:48
fuente
4

El conocimiento profundo y la experiencia en programación significa sentirse cómodo en todos los niveles de abstracción. Es decir,

  • bibliotecas y API
  • semántica del lenguaje
  • optimizaciones del compilador
  • internos del compilador y generación de código
  • comportamiento del recolector de basura y tiempo de ejecución
  • problemas de conjunto de arquitectura e instrucciones

Todo lo que he visto en los últimos 15 años ha demostrado que solo si realmente puedes entrar en el compilador y en el tiempo de ejecución, tienes la oportunidad de llegar a ser profundamente competente. Es posible que deba forzarse para dar el paso y comenzar el software de razonamiento (y creación) en el siguiente nivel de abstracción más bajo en la pila , pero es la única forma de experiencia.

Todo lo que tenemos es lenguaje para la abstracción. Debe comprender cómo se diseñan y crean los lenguajes de programación para saber realmente lo que hace la máquina.

    
respondido por el Don Stewart 27.05.2012 - 23:07
fuente
3

Lea el manual fino Esto no es un conocimiento particularmente profundo. Se publica en la especificación del lenguaje C # en la sección 8.6.4. Debería tener la costumbre de al menos hojear las especificaciones de los idiomas que usa, así como la documentación de todas las bibliotecas integradas.

De todos modos, esta no es mi idea de conocimiento profundo; Es solo un detalle de implementación poco interesante. Podría ser más interesante si el diseñador explicara por qué se hizo de esta manera más dinámica, en lugar de solo comprobar que el objeto implementa Iterable.

    
respondido por el kevin cline 28.05.2012 - 08:08
fuente

Lea otras preguntas en las etiquetas