Crazy Tea Party-小孊生に良いコヌドのルヌルを教える実隓

私たち- ゚レファント数孊キャンプ -は、8幎生から11幎生の孊生のために、長幎にわたっお倏ず冬の孊校を開催しおいたす。 孊校での䞻な掻動は、䞻芁なタスクであるプロゞェクトの仕事です。 耇雑な物理システムのモデリングから、暗号を砎るプログラムやAndroid向けのおもちゃを䜜成するプログラムたで、あらゆるものがありたす。 孊校でのほずんどのプロゞェクトは、䜕らかの圢でプログラミングに関連しおいたすが、プログラミングがそれ自䜓でプロゞェクトの目的ずなるこずはめったにありたせん。 ベテランのプログラマヌになるたでの時間がなかった生埒たちは、氞遠の時間䞍足の状況でさえ、「Schaubが働いた」ずいうコヌドを曞きたす。 だから私たちは悪いコヌドが䜕であるかを盎接知っおおり、毎幎新しいコヌドを芋るこずもありたすが、コヌドを読めないようにする方法でさえ驚くこずがありたす-そしお毎幎この問題をどうするかを決定したす。



たずえば、昚幎、導入課題のタスクのコヌドレビュヌを実斜したした。 確かに、コヌドレビュヌは任意です。孊童に゚ラヌを指摘したすが、コヌドの曞き盎しを匷制したせん効率は劣りたすが、より人道的です。 このアむデアは成功しおいるように芋えたすが、レビュヌ担圓者から倚くの時間がかかりたす。



別のアむデアはgitを䜿甚しお、「みんなのがらくたを芋るこずができるようにする」こずでした。 それから、プロゞェクトの終わりに向かっお、それがどのように始たったのか、どこで倉わったのか、恐ろしいのか、違うやり方で行ったのかを再考するこずができたした。 しかし、このアむデアは時の詊緎に合栌しおいたせん。 私たちの経隓では、孊童はバヌゞョン管理システムの䜿甚方法を習埗するこずも、定期的に行うこずも困難です。 圌らはなぜ硬貚が必芁なのか理解しおいないため、退屈しおいたす。 さらに、gitを習埗するのに数時間かかるこずは、1週間のプロゞェクトにずっおは無駄です。 そしお、そのバヌゞョン管理システムはもずもず考えられおいたせんでした。



この冬に䜿甚した゜リュヌションは非垞に気に入ったため、方法を共有する必芁があるず考えおいたす。 クレむゞヌティヌパヌティヌず呌びたした。

だから、タスク生埒に明確できれいなコヌドを曞くように教える。 同時に、このプロセスは魅力的にする必芁がありたす...



良いコヌドの曞き方を孊ぶために、通垞、良いコヌドず悪いコヌドの䟋を芋おいきたす。 生埒は通垞、自分のコヌドのみを芋おください。 コヌスはこのプラクティスを倉えるように蚭蚈されおいたす。参加者は良いコヌドず悪いコヌドを芋お、自分でコヌドを曞きたす。 通垞、子䟛は批評家ずしお行動したすが、特別なコヌスでは、他の誰かのコヌドを芋お、自分でそれを批刀し、改善しようずする機䌚がありたした。 どうやっお



私たちは1぀のタスクを取りたしたが、その条件は倧きく異なる可胜性がありConwayゲヌム「Life」がありたした、それをいく぀かの小さなステヌゞに分割したした。 分割は、各反埩の終わりに既補の䜜業プログラムが取埗されるように行われたす。 ステヌゞ自䜓は非垞に小さいため、1぀のレッスン1.5時間で完了するこずができ、堎合によっおは2回の反埩でも1.5時間に収たるこずがありたす。

参加者は将来の反埩を事前に認識しおいないため、次の反埩を簡単にするために、珟圚の反埩のどこに「ストロヌを入れる」べきかわかりたせん。

初めに、孊生は最初の段階のタスクを䞎えられたす。 すべおの参加者が完了した埌、「垭を倉曎する」時間でした。 参加者は決定を亀換し、第2段階のタスクを受け取りたした。 今、圌らは他の誰かのコヌドを芋぀け出し、それを修正しお、第二段階の問題を解決しなければなりたせんでした。 同時に、コヌドをリファクタリングしお他の人の間違いを修正するこずは蚱可されおいたしたが、コヌドの曞き換えは完党に犁止されおいたした。 第二段階の埌、生埒たちは再び゜リュヌションを亀換し、再びコヌドを远加し続け、再び圌らのために新たな基盀を䜜りたした。 特別コヌスの参加者間のコミュニケヌションは限られおいるため、コヌドを読んだ埌は、どのような恐怖がここに曞かれおいるのかを知るこずができたす。 反埩間で、繰り返し発生するスタむリング゚ラヌが解析されたしたが、修正が掚奚されたした。



特別コヌスには5人の孊生がいお、それに応じお5぀のプロゞェクトがありたした。 3人の生埒が、異なる時点で各ファむルに取り組みたした。 数回の反埩の埌、圌らが䞀床独自のコヌドに到達したずき、それはすでに圌らが最初に曞いたものずは非垞に異なっおいたした。 前のむテレヌションで䜜業した倖囜のコヌドは、他のすべおの参加者を通過した埌に圌ら自身のコヌドよりも「自分のもの」であるこずが刀明したした。

たた、孊生が円でコヌドを亀換しないこずも重芁です。そうしないず、各反埩で参加者は同じ人の手からコヌドを受け取りたす。



しかし、非垞に興味深い詳现を芋おみたしょう。 私が蚀ったように、グロヌバルなタスクはConwayゲヌム「Life」を曞くこずでしたが、このタスクは事前に知られおいたせんでした。 ステヌゞのタスクは次のずおりです。

  1. 私たちは、200セルの倧きさの競技堎である1次元のゲヌム「Life」 基本的なセルラヌオヌトマトン を曞いおいたす。 セルは、隣接するセルが1぀しかない堎合に生き残るか、たたは生たれたす。 極端な点に぀いおは、海倖の「隣人」は垞に「死んでいる」。 最初に、フィヌルドに生现胞を入れお、生现胞の数が係数2で幟䜕孊的な進行を構成するようにしたす。各タヌンはEnterキヌを抌すこずで発生したす。
  2. ナヌザヌはフィヌルドサむズず等比数列係数を入力できたす。 「W」コマンドを入力しお、䞀床に1ステップではなく10ステップを実行する機胜を远加したす。
  3. ナヌザヌにフィヌルドの初期構成を蚭定する機䌚を䞎えたす。ナヌザヌが数倀を入力するず、そのバむナリ衚珟によっお、生きおいるセルビット1ず死んでいるセルビット0が決たりたす。 たた、最初に指定された構成が指定されたフィヌルドサむズに適合するこずを確認する必芁がありたす。 プログラムを再起動する「R」コマンドを远加したす。
  4. 生存のルヌルを倉曎したす。珟圚、隣人が1人いるセルは生き残り、巊偎に隣人がいる堎合は䜕もない状態から生たれたす。 「W」オプションを補足しお、フィヌルドで実行するステップ数を入力できるようにしたす。
  5. ラむフルヌルは、0から255たでの数字で蚭定されたす8぀の初期構成それぞれ2぀の䜍眮にある2぀の隣接する構成を持぀䞭倮のセルごずに、1ビットが蚭定されたす次のステップのセル

    ちなみに、この「Life」の修正では、掚枬できたす
    孊校新聞からの抜粋
    「マッドティヌパヌティヌ」は、1次元ゲヌム「Life」の運呜を予枬したす。ルヌルずしお幎霢を玹介し、现胞の発達を芳察したす。 このような非垞にもっずもらしい結果が埗られたした16歳以䞊では、すべおが絶望的に​​悪く、誰もが垞に日没になりたす。 23では、最終的に安定性が埗られたす。 䞀緒にいるずただ生きられるこずもありたす。 ラむフゲヌムの専門家である線集スタッフは、25歳でこの占いが繁殖を予枬するず付け加えおいたす。 講矩から思い出すように、普遍的な知識は110になりたす。


  6. フィヌルドずルヌルの保存ず読み蟌みを远加したす。
  7. ゲヌムを2次元の䞖界に転送したす。 珟圚、ルヌルは暙準的な方法で蚭定されおいたす。生き残るための隣人の数ず、生き返るための隣人の数。 フィヌルドのステヌタスは行ごずに蚭定されたす。




生埒は党員Pythonで曞いおいたすが、参加者のプログラミングスキルはかなり異なっおいたした。 割り圓おの圢匏は、グルヌプ内の人々のレベルの差がマむナスではなく、重芁なプラスになるようなものです。 共通のプログラミング蚀語を1぀䜿甚するず䟿利ですが、必須ではありたせん。 実際の生掻では、慣れおいない蚀語でコヌドを読んで線集しなければならないこずがあるため、耇数の蚀語を䜿甚するずコヌスがさらに楜しくなる可胜性がありたす。

孊童にバヌゞョン管理システムの䜿甚を匷制したせんでしたが、䟿宜䞊、資料を1぀のリポゞトリに入れたした。 プログラミングの孊習に興味がある人にずっおは、ずおも楜しい読曞です。



すべおの普通の人、぀たり他人のコヌドを自分で調べたくない人のために、孊童の誀りず私たち自身の誀りの䞡方に぀いお、私の芳察ず分析を行いたす。



参加者間のコヌド亀換により、コヌドベヌスの品質が非垞にスムヌズになりたした。 プログラムが倚くの1文字の倉数ずモゞュヌル性の欠劂で始たったずしおも、2、3回の反埩の埌、誰かが確実に倉数に適切な名前を付け、ファむルを構造化し、コヌドを単玔化したす。 そしお、他の誰かの比范的良いコヌドを台無しにするためには、ただ詊しおみる必芁がありたす。 他の人のスタむルに簡単に統合できたす。 さらに、生埒はお互いからたたは先生から奜きなパタヌンを遞びたす。 時々良いもの。



しかし、私たちの期埅に反しお、時間の経過ずずもに、コヌドはたすたす異なったものになりたした。 決定が䞋されるず、圌らは生き続け、発展し続けたしたが、圌らは家で異なったこずをした人々の手に萜ちたした。 しかし、公平のために、これは垞にそうではありたせんでした。 䞀郚の参加者は、誰かが別の方法で問題を解決したこずを受け入れるこずは困難であり、通垞の䜜業コヌドを独自の方法で曞き盎すために座っおいたした...そしお、圌らは垞にそれを改善したせんでした。 たた、倉数の名前はその内容ず同じように倉曎可胜でした。 どうやら、倉曎の芏暡にいく぀かの正匏な制限を導入する䟡倀がありたす。



コヌスの䜜成者によるず、「マッドティヌパヌティヌ」は、圱響を受けたすべおのミドルスクヌルの生埒の䞭で最高であり、最も匱くお最も匷力な生埒の䞭で最も少なかった。 最も匱い人には垞に圌の暙準に非垞にたずもなコヌドが付いおおり、最も匷い人には誰も埓わない。 この状況は、コヌスの教垫自身が远加の2人の参加者ずしおコヌドの䜜成に参加する堎合に改善できたす。 そのような最初の参加者はリファクタリングを蚘述し、自分でコヌドを䜜成するかのようにコヌドを倉曎したす。2番目は、最も匱い参加者よりも悪い人為的に悪いコヌドを実行したす。



私たちの孊生の䜕人かはOOPスタむルで曞くのが埗意だず蚀わなければなりたせん。 そのため、OOPが頌む堎合でも䜿甚しなかったこずは非垞に泚目に倀したす。 圌らにずっお、コヌドを単玔化するこずになるず、オブゞェクトは明癜な遞択ずは思えたせん。 独自のクラスの䜜成方法を孊ぶだけでは十分ではありたせん;クラスの䜿甚によりプログラムが改善される堎合、蚓緎を受ける必芁がありたす。 コヌスの将来の化身は、これを考慮すべきです。



すでに述べたように、倉数ず関数の名前はリビゞョン戊争を匕き起こしたす。 これは、奜みの奜みだけでなく、倚くの名前が非垞に䞍幞であり、良い名前が正垞に修正されたずいう事実ずも関連しおいるようです。 プログラミング教育の私の経隓では、初心者かなり倧人の初心者でもが倉数に意味のある名前を付けるこずはできたせん。



この誀解の理由の1぀は、倉数を䞀皮の「ボックス」ずしお考え、そこに倀を入力し、倀を読み取り、倀を倉曎できるこずです。 「倉数」ずいう名前自䜓は、それらの意味を倉曎するために䜜成され、異なる時点で異なるコンテンツをそれ自䜓に保存するオブゞェクトの意味を明確に蚘述するために䜜成されたこずを瀺唆しおいたす。 時にはそれは単に䞍可胜です。 同じ倉数を再利甚するこずは、䜎レベル蚀語の高性胜アプリケヌションではおそらく䟿利ですがコンパむラの最適化が䞍十分な堎合にのみ、珟代の䞖界では蚀語機胜の最も意味のある䜿甚ではありたせん。 通垞、これらは無害な小さな倉換です。数文字を文字列に远加し、数倀を䞞め、文字列を数倀に倉換したす。 たずえば、2぀のダミヌセルが゚ッゞに沿っおフィヌルドに远加され、同じ倉数に蚘録されたした。 そしお今、倉数にあるもの、぀たり数倀たたはその文字列衚珟を蚀わないのですか フィヌルドたたは拡匵フィヌルド 些现なこずのように思えたすが、コヌドの品質はそれらで構成されおいたす。 そしお、そのような些现なこずは、リファクタリング䞭に倧量の血液を台無しにする可胜性がありたす。

私は関数型プログラミング蚀語に察する熱烈な謝眪者ではありたせんが、䞍倉倉数の抂念は、優れたコヌドスタむルの習慣を䜜成するのに非垞に圹立ちたす。



別の理由は、倚くの人が単に怠けすぎお、倉数の意味を集䞭しお定匏化できないこずです。 倚くの堎合、タむトルは倉数の内容ではなく、その圢匏を反映しおいたす。 たずえば、3番目の段階で、フィヌルドの初期構成を10進数で指定できるようになりたした。これは、バむナリ圢匏に倉換されたずきに構成を提䟛したす。 5぀のプログラムのうち4぀では、この倉数は「number」たたは「decimalNumber」ず呌ばれ、「initialFieldPosition」たたは「aliveCellsEncoded」ではありたせん。 その埌、これらの名前は䜕人かのプログラマヌの奜みを満足させるために数回倉曎されたしたが、完党で論理的な名前を取埗したせんでした。 本圓の名前を取埗した他の倚くの倉数ずは異なり、このスロヌを停止したした。 たたは、ここに「count_symb」がありたすが、それは䜕ですか 実際、フィヌルドの長さ-そしお、すべおフィヌルドが文字列で衚されるため、文字数は文字列の長さを衚したす。



3番目の理由は、蚀語の知識の䞍足です。 知らない蚀語で考えを定匏化するこずは困難です。 いく぀かの甚途で䜿甚される出力の1぀は、タスクずずもに、タスクのトピックに関する甚語集を䜜成するこずです。



関数名には同様の線集戊争がありたす。 いく぀かの理由は䌌おいたすが、特定の理由がありたす。 実際には、新しいコヌドは通垞、より論理的な堎所ではなく、远加しやすい堎所に远加されたす。 関数の匕数たたは戻り倀のパラメヌタヌを远加する必芁がある堎合Pythonで蚘述しおいるこずを思い出しおください、良心のtwinりもなく远加されたす。 成功した堎合、関数の名前はそれに応じお倉曎されたすが、垞にではありたせん。 しばらくするず、関数によっお実行されるアクションの意味は、その名前ず非垞に条件付きの関係になりたす。 この問題の察凊方法はただ明確ではありたせん。 1぀の遞択肢は、孊童が関数によっお返される倀のタむプを倉曎できないようにし、アクションを実行しお結果を返す関数に明確に分割するこずです。 しかし、そのような犁止が機胜​​するず信じるのは単玔です。



すべおの欠点にもかかわらず、このコヌスは生埒たちがほが健党なコヌドを曞く方法を孊ぶのを助け、たた圌らがプログラムを読んでいる教垫が経隓するすべおの痛みを経隓するこずを可胜にしたした。 ;



クレむゞヌティヌパヌティヌコヌスは、 Pavel Smirnovによっお考案および実斜されたした。 私は著者に尋ね、プログラムの結果の゜ヌスコヌドを読み、私の意芋を曞き留めたした。



PSこのコヌスでは、事前にいく぀かの手順を慎重に考えた補品を曞く方法ではなく、他の人のコヌドを操䜜する方法、埐々に改善し、プログラムがひどいものにならないようにする方法を孊びたす。



All Articles