プログラミングを学ぶための言語として行く

tl; dr: Goは、かなり冗長で厳密なプログラミング言語であり、非常に予測可能で迅速な学習曲線を備えているため、新人プログラミングを教えるための非常に成功した技術です。


Google Code-In 2014 Grand Prize Tripの後に、リラックスして楽しい状態でアメリカから到着しました。 しばらくの間、勝者がそこで何をしていたのか、彼らがマウンテンビューでどのように私たちを受け入れたのかについてのレポートを書くことを考えていました。 ごく最近、偶然にも、自宅の友人にコンピューターサイエンスの分野で手を貸すことになっていた(選択のようなものがありました)。 Pascalでの実装が必要でしたが、私はPascalが非常に貧弱であり、Adaのような他の無関係な、少なくともプログラミング言語を知っています。



雷が私を襲い、ホリネズミはその後、私の体がカンフーに変身した。 言い換えれば、私は、新しいテクノロジーの中でもお気に入りのGoの可能性を、新しい到着者にプログラミングを教えるための言語として考えました(読んでください:小学生)。 Goには、原則として、同様のプログラムが必要とするすべてのものが含まれているようです(例えば、学校では、FPSが単純ではないため、影響を受けない並列のトピックに触れることはできません2つのコードを同時に駆動する方法を知っています)。 実際のところ、この問題についての私の考えではありません。 ちなみに、この機会に、私はdivan0に挨拶したいと思います! テーマハブでの教育活動に感謝します。Goは本当に公表する必要があります。多くの人々は、これが80年代の恐ろしいPlan9の一部であり、一般的なプログラミングなしで(すべてのジョークには冗談を共有します)、あなたは人々に彼らが理解する言語で非常に正しいことを伝えます! 免責条項はありませんが、記事の内容を絶対に真剣に受け止めることは強くお勧めしません。なぜなら、私は2匹のゴーファー(青とピンク)を持っているからです!





引数番号1。 冗長性と厳密さ



「冗長性」という言葉はめちゃくちゃイライラしますが、すでに記事を書くことを引き受けている場合は、詳細をロシア語に翻訳する必要があります。 冗長性が優れているのはなぜですか? 冗長性は、画面上のコードの理解を単純化します。冗長性が不十分な場合、読者は「このことは最終的に何をするのか」というレベルの質問をするかもしれません。 Haskell対Cobolのような極端な状況に長時間遭遇することもありますが、その本質は明らかです。 冗長性が悪いのはなぜですか? DRY宗教の支持者は、Goにはジェネリック(一般的なプログラミング)がないことを繰り返し思い出させてくれます。 ジェネリックの代わりに、ブートストラップまたはコード生成を提供します。 それにもかかわらず、プログラミング言語のアーキテクチャは常に特定のトランザクションです。ガベージコレクターに対する手動メモリ管理、ブートストラップに対するジェネリック、静的に対する動的型付けは、いつまでも継続できます。



厳密さについては、Goは私をとても幸せにします。 コンパイラは決してプログラマと譲歩することはなく、他の言語のコンパイラで目立たない警告をもたらす一見些細なことは、コンパイルエラーになります。 あなたは言語仕様のルールに従ってプレイしません-バイナリを取得せず、すべてがシンプルです。 コンパイラは非常にうるさいので、未使用のモジュールを見るとコンパイルに失敗します。 私の意見では、それはただのくだらないことです。特に15歳の場合、あなたはプログラミングに来て、すべてを「より速い方法で」やりたいと思っています。 私はすぐに寝て、プログラムをコンパイルしようとしているが失敗しているコンピューターで男子学生を見ます。 次に、彼が知っているすべてのマットを頭の中で話すと、エディターに戻り、インクルードリストからモジュール名を削除します。 タフ? もちろんそうです! しかし、あなたは知っている、そのような剛性、それが育ちます!



引数番号2。 素晴らしい学習曲線



Goアーキテクチャにはシンプルさがあります。 パイクはどこかに言った、私は彼らが本当にカットできるすべてをどこでカットしたかもう覚えていない。 この単純さのために、Goには3種類のループ(Cウェイ)がありませんが、1つだけです(これは表現力を失うことはありません!)、Goには高度な型システムがありません(しかし、魔法のインターフェースがあります!)など。 スリッパ(高価なスリッパ、ちなみに外国のスリッパ)を置く準備ができているので、そのような普通の学校の生徒は言語仕様を読まないので、言及しません。 いずれにせよ、この言語は、その単純さと中程度の冗長性により、高速で予測可能な学習曲線を提供します。 しかし、少なくともメモリが管理されているという事実は、レベルの問題を既に除去しています。 ありえない!」



経験豊富なプログラマーが週末にかけてすべての落とし穴でGoを完全にマスターしているという事実は繰り返し述べられてきましたが、これはこの記事の文脈では意味がありません。 私はGoで子供たちを教えていないので、ハードな数字はありませんが、それをねじることをお勧めします。 トレーニング段階で最も時間がかかる3つのことは何ですか? チャンピオン、これは明らかに手動メモリ管理であり、管理メモリを使用する言語の「ガベージコレクターを半分のランタイムで処理することができました」氏。 2番目の場所は、もちろん、異なるコンテキスト(「参照ではなく値によって割り当てられた」レベルのジャム)のリンクポインターのトピックで占められています。 OOP氏は、OOP実装で発生する3つの問題、つまり「プライベートかどうか」、「デストラクタを仮想化する必要がありますか?」、「2つのクラスを同時に継承できますか?」などを閉じます。



Goでは、メモリは自動的に制御されるため、ここで修正することは困難です。 (ほとんどの場合)値または参照によって変数を明確に定義し、渡すことができるルールがあります。「変数の所有権を譲渡する場合は、参照で渡す必要があります。そうでない場合は、値で渡します。 Goはオブジェクト指向プログラミングに関して非常に優れたソリューションを使用しているため、OOPの標準的な問題は表示されません。 すなわち、パイク&Co. クラス、「曖昧な」継承、その他のカプセル化、構造、インターフェース、埋め込みを提供しました。 カプセル化の問題は、不名誉なことに決めました。大文字で始まる構造体のすべてのフィールドは外部に移動し、他のすべては内部に残ります。



写真の概要を説明しましたが、すでに結論を出しているはずです。 すべてが非常に魔法のように思えます。



引数番号3。 マルチスレッドプログラミング



すでに学校に通っている子供たちがマルチスレッドアプリケーションを操作するスキルを身に付けることは非常に重要だと思います。 ご存知のように、laba3レベルのプロジェクトに経験が何らかの形で減少する学生が実際のプロジェクトに参加することはそれほどクールではありません。コンピュータは、プロセッサのアーキテクチャにより、いくつかのタスクを並行して(パラレル!=コンカレント)実行できるようになっており、これを使用する必要があります。 いくつかのアルゴリズムのいくつかの古典的な実装とともに、並列実装も提供されるべきだと思います。 たとえば、同じ選択ソート。



Goは、ゴルーチンによって置き換えられた邪悪で恐ろしいストリームを取り除きました。 コルーチン(=タスク)の作業は、理解のレベルで、スレッドを使用するよりもはるかに簡単だと思います。 チャンネルは単なるキューのように見えますが、構文レベルの利点により、直感的に操作できるようになり、より明確になりました。 コルーチン、チャネル、および選択をどれほど長く称賛しても、いまだにmutexに遭遇します。 それにもかかわらず、これは他の言語、特に学習の文脈で今日見られるものよりも優れていると思います。



Pythonについて少し



しばらくの間、Pythonは学習に非常に適した言語と見なされています。 引数:解釈、入力、中括弧-行かないと! もう一度率直に考えたくはありませんが、学習曲線の観点から言えば、Pythonは非常に卑劣なものであると言えます。 また、プログラマーが静的型付けに一定の時間を費やした後にのみ、動的型付けの利点を理解し、欠点を尊重し始めるという意見もあります。 新人は、一般的にどのタイプなのかを本当に理解するまで、動的なタイプで自転車キュラーをするべきだとは思いません。 残念ながら、8Aの才能あるプログラマーAlyoshaにとって、これはそれほど明白ではありません。



終わり



まあ、それだけです。 私の意識のこのダンプをマスターしたすべての人のおかげで、私はそれが誰かにとって興味深いものであったことを願っています。 教育スキルを持つイニシアチブが読まれ、その後、実用的な教育システムが誕生すればクールです! いいえ、本当に素晴らしいでしょう! ああ、そうです、私に質問をすることをheしないでください:コメントとPMでさえ!



All Articles