Résultats de deux années d'étude "Structure et interprétation des programmes informatiques"





L'original a été publié sur mon blog le 07/11/2020. Si j'ai bien compris, ce n'est pas un problème.



Je pense que le développement de logiciels concerne essentiellement la programmation en pseudocode. Si vous avez fourni un pseudocode, le traduire en Python, C, ce n'est pas un problème. La principale difficulté réside dans cette activité conceptuelle et non dans le codage. Vous devez savoir comment aborder certains problèmes. Modularité, abstraction. Flexibilité, fiabilité, simplicité. Modèles de conception. Tests unitaires. Tu sais.



Il existe dans le monde un cours «Structure et interprétation des programmes informatiques» (ci-après CICP), qui se positionne comme une introduction à l'informatique et était auparavant utilisé au MIT pour enseigner aux étudiants de première année. Il y a deux ans, j'ai volontiers maîtrisé un cours de conférences sur le sujet. et a pris le livre. Tout d'abord, je vais vous parler du bien.



Le texte raconte des choses très éloignées de mon travail quotidien et m'a permis de jeter un regard neuf sur la programmation. La fonctionnalité est un monde entier qui vit selon ses propres lois. Le langage Lisp est très différent du langage C auquel je suis habitué en raison de sa flexibilité effrénée due au typage dynamique, à la gestion automatique de la mémoire, à la possibilité de redéfinir quoi que ce soit à l'exécution. J'ai développé une idée plus polyvalente de la façon dont, en principe, vous pouvez résoudre différents problèmes. Parlant dans une langue d'échecs, j'ai considérablement élargi mon répertoire de devoirs qui me sont utiles dans mon travail (mais pas tous les jours). L'exercice a fait travailler mon cerveau (parfois très intensément), repenser et systématiser les connaissances antérieures. En général, étudier SIKP a fait de moi un meilleur développeur, élargi mes horizons. je suis sûrJ'ai commencé à regarder différentes choses avec une vision plus systématique et mature.



Le livre m'a constamment incité à réfléchir, ce pour quoi je m'incline devant elle. J'ai profondément réalisé des choses qui semblent connues de tout le monde, mais que, par conséquent, tout le monde est trop paresseux pour mentionner. Par exemple, tout logiciel est simplifié au début, puis devient inévitablement plus complexe afin d'améliorer les performances. L'utilisateur ne se soucie pas du nombre de lignes de code source à l'intérieur, mais la vitesse compte.



Qu'en est-il des effets spécifiques avec lesquels travailler? Je suis devenu meilleur pour voir les lacunes lors de la révision du code (tout d'abord, mon propre code). J'ai adoré les petites fonctions, de préférence aussi générales que possible. J'ai commencé à pratiquer l'utilisation prudente et appropriée des macros - parfois, en C, vous pouvez faire quelque chose qui ne respecte pas les règles, et tout le monde n'y gagnera que. L'expérience que j'ai acquise en faisant les exercices du livre m'a aidé à résoudre certains de mes problèmes de travail.



Mais c'est un côté de la médaille. Une autre est que l'approche de ce cours d'apprentissage peut être exprimée dans l'unité phraséologique anglaise «sink or swim». Il y a une barre transversale devant vous, à côté c'est la tâche: remonter 10 fois. En principe, cela suffit pour la tâche, mais cette approche ne peut être considérée comme agréable. Je dirais qu'il est assez épuisant! Vous êtes jeté au combat à moitié préparé et vous apprenez une partie du matériel non pas à partir d'explications, mais de vos erreurs. C'est peut-être une manière acceptable d'enseigner à des personnes très motivées, mais il m'a évincé comme une personne paresseuse. Je pouvais à peine l'endurer pendant 3 chapitres sur 5 (parfois je me suis arrêté pendant plusieurs mois!), J'ai fait les exercices du début à la fin, mais il semble que ma patience est épuisée.



Par exemple, le livre ne dit pas un mot sur la façon d'organiser votre flux de travail. Il n'y a même pas de prise en compte grossière de concepts tels que "débogage" (c'est spécifique ici), "IDE" (ils sont spécifiques ici), "tests unitaires", "fractionnement en fichiers pour réutilisation". Il y a des fragments où un certain système complexe est en cours de développement, qui ne sera entièrement prêt qu'à la fin du chapitre, et les tâches apparaissent après chaque paragraphe du texte. Ceux. à proprement parler, après avoir lu jusqu'à la page N, dans certains cas, vous ne pouvez pas résoudre le problème à partir de cette page sans faire glisser le code des pages suivantes. Le code doit être glissé avec précaution, car dans les notes des subtilités peu évidentes peuvent être discutées, et parfois du code est donné comme exemple d'une idée brisée. C'est énervant! Oui, c'est comme dans la vraie vie - vous devez définir vous-même la tâche, chercher quelque chose sur Internet,mais putain ... c'est un tutoriel! Je suis plein de tâches difficiles au travail, et peut-être que les auteurs auraient dû être plus pédants sur le texte? D'accord, je suis un pogromiste professionnel avec un accès Internet rapide, mais qu'en est-il d'un étudiant de première année du MIT dans les années quatre-vingt? Je suis sûr que ce n'est pas doux ...



Permettez-moi de souligner les principaux avantages du livre: il vous permet d'acquérir une expérience personnelle, de vous faire une idée et de réfléchir à des problèmes complexes en termes généraux. Les inconvénients sont directement liés à eux: c'est complexe et vous donne souvent peu d'indices pour comprendre quelque chose. Par exemple, si vous avez une certaine expérience de combat, vous savez que le code sans tests unitaires ne peut pas être qualifié de solution, mais le livre ne vous en parlera pas. Vous devez y arriver vous-même! Qu'as-tu pensé? Eh bien, ou je mens, le livre vous en parlera, mais de la manière la plus sadique. Vous aurez la tâche suivante basée sur la précédente (c'est souvent là). Si vous avez déjà gagné un cas de test et que vous avez décidé «Ok, allons plus loin!», Alors au coin de la rue, vous serez heureux de déboguer les solutions de deux tâches à la fois. Probablement, lorsque cela se produit plusieurs fois, vous vous rendrez compte que vous faites quelque chose de mal. La chose principale,pour qu'à de tels moments vous n'abandonniez pas le cours, mais compreniez, alors tout ira bien!



Autre caractéristique ennuyeuse du texte: les tâches (encore une fois, comme dans la vraie vie) ne sont parfois pas bien définies. J'ai fait un exercice l'autre jour, en une demi-heure j'ai esquissé une solution, j'ai commencé à relire l'énoncé du problème. Il s'est avéré que si vous réfléchissez de manière pédante, alors je l'ai rempli à 95%, en dépensant environ 40% de l'effort. La plupart des mecs avec qui j'ai vérifié ont fait de même. On l'a fait complètement, mais a utilisé un hack d'un autre interpréteur Lisp. Je me suis énervé et j'ai craché, ayant perdu la motivation de continuer dans un proche avenir. Permettez-moi de rappeler l’essence du problème: il y a des tâches dans lesquelles tout est résolu simplement et logiquement, mais seulement si vous n’êtes pas strict avec vous-même. Donc, dans la vraie vie, je comprends, mais j'avais des attentes différentes du manuel. Lorsque vous faites un exercice pendant votre temps libre et que vous vous vérifiez, vous voulez résoudre le problème à 100%,pas «assez bon pour l'itération actuelle».



Le problème des tests unitaires est en fait du même genre. Parfois, vous devez transpirer un peu et réfléchir afin de simplement les implémenter dans le système. Je sais qu'il n'y a pas moyen sans eux, mais les gars plus simples esquissent simplement des solutions sans vérifier et passer à autre chose! Plus vous êtes strict, attentif, expérimenté, plus les tâches deviennent difficiles pour vous. Parfois juste à certains moments! C'est démotivant, car ici, contrairement au travail, ils ne le louent ni ne le paient, et l'approche itérative est mal applicable. Les connaissances et les compétences, utiles dans la vraie vie, font mal aux mains lors de la résolution des problèmes des élèves!



Cela vaut la peine de dire que le livre contient beaucoup de mathématiques. En résolvant les exercices, j'ai compris la beauté et la puissance de cette science, mais parfois c'était difficile pour moi précisément à cause de ces problèmes spécifiques, uniquement indirectement liés aux problèmes à résoudre. C'est juste que les auteurs ont décidé de montrer quelque chose avec un exemple d'intégration, alors souvenez-vous et botay!



En général, je ne regrette pas de m'intégrer dans cette aventure, cela m'a été utile. Cependant, je recommande à d'autres personnes de chercher quelque chose de mieux. Par exemple, sur la base du SIKP, en tenant compte de ses erreurs (comme on dit, je n'ai pas vérifié), un cours «Comment concevoir des programmes» a été récemment fait. J'imagine que j'aurais dû le convoiter aussi, mais vous n'allez pas tarder.



PS Peter Norvig a écrit une merveilleuse critique de SIKP .



All Articles