「コンピュータプログラムの構造と解釈」を2年間研究した結果





オリジナルは2020年7月11日に私のブログに公開されました。私が正しく理解していれば、これは問題ではありません。



ソフトウェア開発は、疑似コードでのプログラミングが非常に重要だと思います。疑似コードを提供した場合は、それをPython、Cに変換しますが、問題はありません。主な問題は、コーディングではなく、この概念的なアクティビティにあります。特定の問題に取り組む方法を知る必要があります。モジュール性、抽象化。柔軟性、信頼性、シンプルさ。デザインパターン。ユニットテスト。ゆう知ってる。



コンピュータサイエンスの紹介として位置付けられ、以前はMITで新入生を教えるために使用されたコース「コンピュータプログラムの構造と解釈」(以下、SICP)が世界にあります。2年前、私はそれについての講義のコース喜んで習得しました。 そしてその本を取り上げた。 まず、良いことについてお話します。



このテキストは、私の日常業務とはかけ離れたものについて語っていて、プログラミングを新たに見直すことができました。機能性は、独自の法則に従って生きる全世界です。 Lisp言語は、動的型付け、自動メモリ管理、実行時にすべてをオーバーライドする機能による熱狂的な柔軟性のために、私が慣れているC言語とは大きく異なります。私は、原則として、さまざまな問題をどのように解決できるかについて、より用途の広いアイデアを形成しました。チェス言語で話すと、仕事に役立つ宿題のレパートリーを大幅に拡大しました(毎日ではありませんが)。運動は私の脳を(時には非常に激しく)働かせ、以前に習得した知識を再考し体系化しました。一般的に、SIKPを研究することで、私はより優れた開発者になり、視野が広がりました。確信してます私はより体系的で成熟した見方でさまざまなものを見始めました。



その本はいつも私に考えさせました、これのために彼女は深くお辞儀をします。誰もが知っているように見えることを深く実感しましたが、それゆえ、誰もが怠惰すぎて言及できません。たとえば、すべてのソフトウェアは最初は単純になり、その後、パフォーマンスを向上させるために必然的に複雑になります。ユーザーはソースコードの行数を気にしませんが、速度は重要です。



使用する特定の効果はどうですか?コードレビュー中に欠点を見つけるのが上手になりました(まず、自分のコード)。小さな機能、できればできるだけ一般的な機能が大好きです。私はマクロの注意深く適切な使用法を練習し始めました-時々Cであなたは規則に従わない何かを注意深くすることができます、そして誰もがこれから勝つだけです。この本の練習をすることで得た経験は、私の仕事上の問題のいくつかを助けてくれました。



しかし、これはコインの片面です。もう1つは、このコースの学習へのアプローチは、英語の表現単位「シンクまたはスイム」で表現できることです。あなたの前にクロスバーがあり、その隣にタスクがあります:10回引き上げます。原則として、これでタスクを完了できますが、このアプローチは快適とは言えません。彼はかなり疲れていると思います!あなたは半分準備された戦いに投げ込まれ、説明からではなく、あなたの過ちから資料の一部を学びます。おそらくこれは意欲的な人々を教えるための許容できる方法ですが、彼は私を怠惰な人として搾り出しました。 5章中3章は我慢できず(数ヶ月間休止することもありました!)、最初から最後まで練習をしましたが、我慢できなくなったようです。



たとえば、この本には、ワークフローを整理する方法については何も書かれていません。 「デバッグ」(ここで具体的に)、「IDE」(ここで具体的に)、「ユニットテスト」、「ファイルに分割して再利用する」などの概念については、大まかな考慮事項すらありません。特定の複雑なシステムが開発されている断片があり、それは章の終わりまでに完全に準備が整い、タスクはテキストの各段落の後に表示されます。それら。厳密に言えば、ページNまで読んだ後、後続のページからコードをドラッグしないと、このページから問題を解決できない場合があります。ノートは自明ではない微妙な点について説明している可能性があるため、コードは慎重にドラッグする必要があります。また、壊れたアイデアの例としてコードが示されている場合もあります。これは迷惑です!はい、それは実際の生活と同じです。自分でタスクを定義し、インターネットで何かを探す必要があります。しかしくそー...これはチュートリアルです!私は仕事での難しい仕事にうんざりしています、そして多分著者はテキストについてもっとペダンシーであるはずでしたか?さて、私は高速インターネットアクセスを備えたプロのpogromistですが、80年代のMITの新入生はどうですか?甘くないと思います...



この本の主な利点を強調しましょう。それはあなたが個人的な経験を積み、あなた自身の円錐を満たし、そして一般的に複雑な問題について考えることを可能にします。不利な点はそれらに直接関係しています:それは複雑で、何かを理解するための手がかりをほとんど与えません。たとえば、ある種の戦闘経験がある場合、ユニットテストのないコードは解決策とは言えないことを知っていますが、本ではそれについては説明していません。あなたは自分でこれに到達しなければなりません!どう思いました?まあ、または私が嘘をついている、本はそれについてあなたに教えますが、最もサディスティックな方法で。前のタスクに基づいて次のタスクがあります(これは多くの場合そこにあります)。以前に1つのテストケースを取得していて、「すばらしい、さらに進んでください!」と決めた場合は、角を曲がったところで2つのタスクのソリューションを一度にデバッグできます。おそらく、これが数回発生すると、何か間違ったことをしていることに気付くでしょう。重要なこと、そのような瞬間にあなたはコースをあきらめずに理解するように、そうすればすべてがうまくいくでしょう!



テキストのもう1つの厄介な機能:タスク(これも実際の生活のように)が明確に定義されていない場合があります。私は先日運動をしていましたが、30分で解決策をスケッチし、問題の説明を読み直し始めました。あなたが辛抱強く考えるならば、私はそれを95%達成し、努力の約40%を費やしたことがわかりました。私がチェックしたほとんどの男は同じことをしました。 1つはそれを完全に行いましたが、別のLispインタープリターからのハックを使用しました。近い将来続ける意欲を失い、私は動揺して唾を吐きました。問題の本質を繰り返します。すべてが単純かつ論理的に解決されるタスクがありますが、それはあなたが自分自身に厳密でない場合に限られます。ですから、実生活では理解できますが、教科書とは違った期待を持っていました。自由時間にエクササイズをして自分でチェックするときは、問題を100%解決したい、「現在の反復には十分ではありません」。



ユニットテストの問題は実際には同じ種類です。それらをシステムに単純に実装するために、少し汗をかいて考える必要がある場合があります。私はそれらなしではどこにも存在しないことを知っていますが、より単純な人はチェックせずに解決策をスケッチして先に進みます!あなたがより厳格で、より注意深く、より経験豊富であるほど、あなたにとってより困難な仕事になります。時々だけ!ここでは、仕事とは異なり、彼らはそれを賞賛したり、お金を払ったりせず、反復的なアプローチはあまり適用できないため、これは意欲をそそります。実生活で役立つ知識とスキルは、学生の問題を解決するときに手を傷つけます!



この本にはたくさんの数学が含まれていると言う価値があります。演習を解いて、この科学の美しさと力を理解しましたが、解決されている問題に間接的に関連しているだけで、これらの特定の質問のために正確に難しい場合がありました。著者が統合の例で何かを示すことに決めたというだけなので、覚えておいてください!



一般的に、私はこの冒険に参加したことを後悔していません、それは私にとって役に立ちました。しかし、私は他の人にもっと良いものを探すことをお勧めします。たとえば、SIKPに基づいて、彼の過ちを考慮して(彼らが言うように、私はチェックしませんでした)、コース「プログラムの設計方法」が最近作成されました。私も彼を切望するべきだったと思いますが、あなたは時間を無駄にすることはありません。



PS PeterNorvigがSIKPのすばらしいレビューを書きました



All Articles