Resultados de dos años de estudio "Estructura e interpretación de programas informáticos"





El original fue publicado en mi blog el 11/07/2020. Si entendí correctamente, esto no es un problema.



Creo que el desarrollo de software tiene mucho que ver con la programación en pseudocódigo. Si ha proporcionado un pseudocódigo, traducirlo a Python, C, lo que sea no es un problema. La principal dificultad radica en esta actividad conceptual, no en la codificación. Necesita saber cómo abordar ciertos problemas. Modularidad, abstracción. Flexibilidad, fiabilidad, sencillez. Patrones de diseño. Examen de la unidad. Ya sabes.



Existe en el mundo un curso de "Estructura e Interpretación de Programas de Computación" (en adelante SICP), que se posiciona como una introducción a la Informática y fue utilizado previamente en el MIT para enseñar a estudiantes de primer año. Hace dos años, con mucho gusto dominé un curso de conferencias sobre el tema. y tomó el libro. Primero, te contaré lo bueno.



El texto habla de cosas que están muy lejos de mi trabajo diario y me permitió dar una nueva mirada a la programación. La funcionalidad es todo un mundo que vive según sus propias leyes. El lenguaje Lisp es muy diferente del lenguaje C al que estoy acostumbrado debido a su frenética flexibilidad debido a la escritura dinámica, la gestión automática de la memoria y la capacidad de redefinir cualquier cosa en tiempo de ejecución. He desarrollado una idea más versátil de cómo, en principio, se pueden resolver diferentes problemas. Hablando en un idioma ajedrecístico, he ampliado enormemente mi repertorio de tareas que me resultan útiles en mi trabajo (aunque no todos los días). El ejercicio hizo que mi cerebro trabajara (a veces de forma muy intensa), repensar y sistematizar conocimientos anteriores. En general, estudiar SIKP me convirtió en un mejor desarrollador, amplió mis horizontes. estoy seguroComencé a mirar diferentes cosas con una visión más sistemática y madura.



El libro me incita constantemente a pensar, por lo que me inclino ante ella. Me di cuenta profundamente de cosas que todos parecen saber, pero que, por lo tanto, todos son demasiado vagos para mencionar. Por ejemplo, que todo el software se simplifica al principio y luego, inevitablemente, se vuelve más complejo para mejorar el rendimiento. Al usuario no le importa cuántas líneas de código fuente haya dentro, pero la velocidad es importante.



¿Qué hay de los efectos específicos con los que trabajar? Me volví mejor para ver las deficiencias durante la revisión del código (en primer lugar, mi propio código). Me encantaron las pequeñas funciones, preferiblemente lo más generales posible. Comencé a practicar el uso cuidadoso y apropiado de las macros; a veces en C puedes hacer algo con cuidado que no esté de acuerdo con las reglas, y todos solo ganarán con esto. La experiencia que adquirí al hacer los ejercicios del libro me ayudó con algunos de mis problemas laborales.



Pero esta es una cara de la moneda. Otra es que el enfoque de este curso para el aprendizaje se puede expresar en la unidad fraseológica en inglés "hundirse o nadar". Hay una barra transversal frente a ti, junto a ella está la tarea: tirar hacia arriba 10 veces. En principio, esto es suficiente para completar la tarea, pero no se puede decir que este enfoque sea agradable. ¡Diría que es bastante agotador! Te lanzan a la batalla medio preparado y aprendes parte del material no de las explicaciones, sino de tus errores. Quizás esta sea una forma aceptable de enseñar a las personas muy motivadas, pero él me exprimió como una persona perezosa. Apenas pude soportarlo durante 3 de los 5 capítulos (¡a veces me detuve durante varios meses!), Hice los ejercicios en ellos de principio a fin, pero parece que mi paciencia se agota.



Por ejemplo, el libro no dice una palabra sobre cómo organizar su flujo de trabajo. Ni siquiera hay una consideración aproximada de conceptos como "depuración" (es específico aquí), "IDE" (son específicos aquí), "pruebas unitarias", "dividir en archivos para su reutilización". Hay fragmentos donde se está desarrollando un cierto sistema complejo, que estará completamente listo solo al final del capítulo, y las tareas aparecen después de cada párrafo del texto. Aquellos. estrictamente hablando, habiendo leído hasta la página N, en algunos casos no se puede resolver el problema desde esta página sin arrastrar el código de las páginas siguientes. El código debe arrastrarse con cuidado, porque las notas pueden discutir sutilezas no obvias y, a veces, se da algún código como ejemplo de una idea rota. ¡Esto es molesto! Sí, es como en la vida real: debe definir la tarea usted mismo, buscar algo en Internet,pero maldita sea ... ¡esto es un tutorial! Estoy harto de tareas difíciles en el trabajo, ¿y tal vez los autores deberían haber sido más pedantes con el texto? De acuerdo, soy un pogromista profesional con acceso rápido a Internet, pero ¿qué pasa con un estudiante de primer año del MIT en los ochenta? Estoy seguro de que no es dulce ...



Permítanme enfatizar las principales ventajas del libro: le permite ganar experiencia personal, llenar sus propios conos y pensar en problemas complejos en general. Las desventajas están directamente relacionadas con ellos: es complejo y muchas veces te da pocas pistas para entender algo. Por ejemplo, si tiene algún tipo de experiencia en combate, entonces sabe que el código sin pruebas unitarias no puede considerarse una solución, pero el libro no le informará al respecto. ¡Tienes que llegar a esto tú mismo! Qué pensaste? Bueno, o miento, el libro te lo dirá, pero de la manera más sádica. Tendrá la siguiente tarea basada en la anterior (esto suele estar ahí). Si anteriormente obtuvo un caso de prueba y decidió "¡Genial, vamos más allá!", Entonces estará feliz de depurar las soluciones de dos tareas a la vez. Probablemente, cuando esto suceda varias veces, se dará cuenta de que está haciendo algo mal. Lo principal,para que en esos momentos no abandones el curso, pero entiendas, ¡entonces todo estará bien!



Otra característica molesta del texto: las tareas (de nuevo, como en la vida real) a veces no están bien definidas. El otro día estaba haciendo un ejercicio, en media hora esbocé una solución, comencé a releer el planteamiento del problema. Resultó que si piensas de manera pedante, lo cumplí al 95%, gastando alrededor del 40% del esfuerzo. La mayoría de los tipos con los que consulté hicieron lo mismo. Uno lo hizo completamente, pero usó un truco de otro intérprete Lisp. Me enojé y escupí, habiendo perdido la motivación para continuar en un futuro cercano. Una vez más te diré la esencia del problema: hay tareas en las que todo se resuelve de forma sencilla y lógica, pero solo si no eres estricto contigo mismo. Entonces, en la vida real, lo entiendo, pero tenía expectativas diferentes a las del libro de texto. Cuando haces el ejercicio en tu tiempo libre y te revisas a ti mismo, quieres resolver el problema al 100%,no "suficientemente bueno para la iteración actual".



El problema con las pruebas unitarias es en realidad del mismo tipo. A veces es necesario sudar un poco y pensar para simplemente implementarlos en el sistema. Sé que no hay ningún lugar sin ellos, pero los tipos más simples simplemente esbozan soluciones sin verificar y siguen adelante. Cuanto más estricto, más atento, más experimentado sea, más difíciles se volverán las tareas para usted. ¡A veces solo a veces! Esto es desmotivador, porque aquí, a diferencia del trabajo, no elogian ni pagan por él, y el enfoque iterativo es poco aplicable. ¡El conocimiento y las habilidades, útiles en la vida real, lastiman las manos al resolver problemas de los estudiantes!



Vale la pena decir que el libro contiene muchas matemáticas. Resolviendo los ejercicios, entendí la belleza y el poder de esta ciencia, pero a veces me resultaba difícil precisamente por estos problemas específicos, solo indirectamente relacionados con los problemas que se estaban resolviendo. Es solo que los autores decidieron mostrar algo con un ejemplo de integración, ¡así que recuerda y deja de hacerlo!



En general, no me arrepiento de haber encajado en esta aventura, me fue útil. Sin embargo, recomiendo a otras personas que busquen algo mejor. Por ejemplo, sobre la base del SIKP, teniendo en cuenta sus errores (como dicen, no marqué), recientemente se realizó el curso "Cómo diseñar programas". Supongo que también debería haberlo codiciado, pero el tiempo no se correrá.



PS Peter Norvig escribió una maravillosa reseña de SIKP .



All Articles