[CppCon 2017]BjörnStraustrup:モダンC ++の学習と指導

現在、CppCon 2017カンファレンスが開催されており、そこからのビデオはすでにYouTubeチャンネルに表示され始めています。 そして、興味深い講義の要約を作ってみませんか。 もちろん、私が長続きするかどうかは、あなたがどれだけ気に入っているか次第です。







これは最初の紹介ビデオです。 それは私にとってそれほど面白くないですが、私も見逃せませんでした、それはストラウストルプです。 次に、彼に代わってテキスト。 スライドから取られた見出し。









免責事項:以下のテキストはすべて、私の認識の仕事から生じた短い説明であり、「水」とみなされ無視されたことがあなたにとって重要である可能性があります。 時々、プレゼンテーションは次のようになりました:「(重要な考え1)(水の分)(重要な考え2)。」 これら2つの考えはスムーズに流れ込み、私は非常に鋭い飛躍を遂げました。 テキストを滑らかにすることはできたが、テキストを完全にとかすことは不適切であると考えると、多くの時間がかかります。







エントリー



会議のオープニングで話をするように頼まれたとき、私はあなたにとって何が重要であり、何百回も聞いたことがないことについて話すことができるのだろうかと思いました。 そして、C ++言語の学習について話すことにしました。







私たちはすべて教師であり、私たちはすべて学生です



誰に何を教えているのか、何を、なぜ、どのように教えているのかを自問します。 もっと良くする必要があります。 特に批判する人はいませんが、もっとうまくやるべきだと思います。 私たち全員が教師であるわけではありませんが、それにもかかわらず、私たちがトレーニングに従事している場合が常にあります。 たとえば、同僚に最新の機能について教えたり、アドバイスをしたりします。 StackOverflow、Reddit、ブログなどでコミュニケーションを取ります。 しかし、良いアドバイスを与える必要があります。 世界を前進させるヒント。







気になる点が1つあります。多くの場合、C ++とは何かについて非常に奇妙な考えを持っています。 少し後でこの問題に戻ります。







教えるとき、達成したいことを考えてください。 そして、このスタートから。 「すでにやったこと」や「始めるのが簡単なこと」から始めてはいけません。あなたが教師なら、「確認するのが簡単なこと」から始めてください。







プログラミングトレーニング



言語機能に集中する必要はありません。 たとえば、 signed short



からunsigned int



へのキャストの問題を説明する例に出くわしました[ C ++の機能についてではなく、一般に言語を教えることについて話します ]。 これはおもしろくなく、デバッガで見ることも、マニュアルで読むこともできます。 このような問題が発生しないように指導してください。







すべてを教えようとしないでください;できません。 言語のサブセットを慎重に選択します。







C ++学習の直面する問題の1つは、言語がライブラリとは別に独自に学習されることです。 697ページのベクトル、100ページのソート。 これは、stlが退屈で複雑なでたらめであることを教えています。 同時に:リンクリストまたはハッシュテーブルはクールで、stlよりもクールです。







あまりスマートにならないでください



[ 彼のスピーチでは、著者はネガティブな意味合いを持つ巧妙な単語を使用しています。賢いように見える人のようなものです ]







「最新」を望み、要求する人々は、基本を知らないことがよくあります。 基本を確認します。







より簡単に。 最も複雑で洗練されたものに突入しないでください。 あなたが見つけることができる最も高度なアルゴリズムを使用しないでください。 私はバブルソートを選択しませんが、「すべての完全な一般的なアルゴリズム」も選択しません。 テクニックまたは機能を説明する最も簡単な例を提供します。







一般的なケースに焦点を当てます。 合理的である。 生徒に「それだけでいい、そうだ、性格を和らげます。そうすれば、トップ5を獲得できます。」と言わないでください。 ルールに従う必要がある理由を説明し、生徒に良い理想、アイデア、技術を与える必要があります。







もちろん、教えることは、同僚や人々のグループの前に立ち、見た目をすべて見せることは非常に魅力的です。「見てください、これはあなたが理解できなかった難しいことです。これは私が賢いことを意味します。」 これはあまり良いトレーニングではありません。







プログラミングトレーニング



言語自体のみを学習する場合、実際には一度「drれさせる」ことができます。

さまざまなツールを使用します。 コンパイラとチュートリアルだけでなく、IDE、デバッガ、バージョン管理システム、プロファイラ、単体テスト、静的アナライザー、オンラインコンパイラも含まれます。 ツールは最新のものである必要があります(Turbo C ++ 4.0について質問がある場合があります:()







原則を研究し、実際に修正する必要があります。 グラフィック、ネットワーク、インターネット、Raspberry Pi、ロボティクスなどを使用してください。これはあなたには明らかですが、大学には明らかではありません。 簡単で速いとは言わないでください。 そして、誰もがすべてを行うことはできないことを忘れないでください。







言語は構文だけではありません



私たちはどのようによく教えますか? 言語に加えて、少し標準的なライブラリを説明します。 グラフィックス、ユーザーインターフェイス、Web、電子メール、データベースなしで...そして多くの学生は、C ++を退屈で役に立たない言語だと感じています。 しかし、これはそうではありません。ブラウザー、DBMS、CADなどがC ++で書かれているためです。 講義を開始する前に、実用的なアプリケーションについて5分間費やしてください。







もっとうまくやらなければならない



C ++コミュニティである私たちにとって、開始を簡素化すること、「今すぐ」それを使用する能力が非常に重要です。







プログラミングは写真を撮るようなものですか?



さまざまな業界のユーザーはどのようにグループに分けられていますか? 写真で例を示します。 結果は、機器とユーザーによって異なります。 個人的には、写真は初めてです。 プロ用カメラのほとんどの機能は役に立たないでしょう。 彼女は重く、高価です。 彼女のために、あなたがdrれることができる多くのアクセサリーがあります。 しかし、それを使えば、学習に多くの時間を費やすなら、素晴らしい写真を撮ることができます。 同様に、さまざまな言語機能やライブラリを使用できない人も多くいます。







マスマーケット



一方、すぐに使用できるデバイスがあります。 このようなデバイスは、安価でシンプルな「かわいい」デバイスです。 間違いを許し、習得するのに多くの努力を必要としません。 それは「それ自体」です。 存在する場合、拡張と追加はほとんどありません。 交換可能な部品はありません。







授業中にどういうわけか、学生にGUIライブラリをインストールする必要がありました。 学生のMac、Linux、Windowsに同じライブラリをインストールするのは非常に苦痛でした。







言語には「システム」が必要



写真機器の各メーカーは「システム」を提供しています。これは、機器を徐々にアップグレードし、学習するにつれて次のレベルに移行できることを前提としています。







初心者にプロのカメラにすべての添えものを付ける必要はありません。 この場合、彼は困難を抱え、結果はおそらく「石鹸箱」を使用した場合よりも悪いでしょう。 したがって、1つのソリューションがすべての人に適しているわけではありません。







主な配布物は何ですか?



言語は、3つの分布で表される必要があります。 初心者、アマチュア、専門家向け。







モジュールが役立ちます



ベース:







 import bundle.entry_level; //  import bundle.enthusiast_level; //  import bundle.professional_level; // 
      
      





拡張機能(データベースに含まれていない):







 import grahics.2d; import grahics.3d; import professional.graphics.3d; import physlib.linear_algebra; import boost.XML; import 3rd_party.image_filtering;
      
      





優れたパッケージマネージャーとビルドシステムを探している



学生は、トレーニング開始後2週間で、グラフィカルインターフェイスのライブラリをインストールし、データベースを操作する方法を教えてください。 さまざまなライブラリとシステムがさまざまな方法で組み立てられます。 異なるライブラリは互換性が低い場合があります。 多数の互換性のないパッケージマネージャーは解決策ではありません。 簡単なタスクを簡単に実行できます。







 > download gui_xyz > install gui_xyz
      
      





または同等の方法で、たとえばIDEで:







 import gui_xyz; // 
      
      





モダンC ++



現代のC ++の私のビジョン(いつものように):









変えるのは難しい



現代のC ++は、C、Java、C ++ 98ではなく、10年前にプログラミングした言語でもありません。 慣性は良いコードの敵です。 教師は、現代の基準を使用しないことを正当化し、「これをやらない」、「これを私のカリキュラムに挿入できない」、「5年後には」と言います。 生徒は教師よりもインターネットに自信を持っています。 教師よりも賢いと信じている人もいますし、時には正しい人もいます。 私は毎年、プログラミングの点で私よりも賢いという絶対的な確信を持った学生を常に抱えています。 これらの特定の場合、私は彼らが正しくないことを合理的に確信しています[ 笑い ]。







現代のC ++とは何ですか?





これを実装するために、2年前、 C ++ Core Guidelinesプロジェクトが開かれました。 彼は質問に具体的な答えを与えます。 彼には、MicrosoftやRed Hatを含む多くのメンバーがいます。







コード例



例と説明を分けないでください。 5ページのむき出しの理論は無駄です。 それらに例と説明を与えます。 説明がなければ、人々は一般化しません。 彼らは単純にコピー&ペーストして自分自身で解釈を考案し、時にはそれは非常に奇妙です。







コード改善



常に理由を説明してください。 例:







 //1 int max = v.size(); for(int i = 0; i < max; ++i) //2 for (auto x : v)
      
      





2が1よりも優れているのはなぜですか? 例2は意図を明確に示しており、ループを書き換えることなくvを変更でき、エラーが発生しにくくなっています。 1はより柔軟なオプションを提供することに注意してください。 しかし、gotoはさらに普遍的であるため、回避します。









[ I.4はコアガイドラインの段落を意味する ]







 void blink_led1(int time_to_blink) // -   void blink_led2(milliseconds time_to_blink) // void use() { blink_led2(1500); //:   ? blink_led2(1500ms); blink_led2(1500s); //:    }
      
      





[ ここで、ミリ秒は、Chronoライブラリからではなく、ある種の単純型であるため、最後の行はエラーになります。 以下は、Chronoから取得した測定単位のタイプの一般化です。 興味があればこのライブラリの説明を読むことができます ]







 template<class ep, class period> void blink_led(duration<rep, period> time_to_blink) { auto ms_to_blink = duration_cast<milliseconds>(time_to_blink); } void use() { blink_led(2s); blink_led(1500ms); }
      
      







 Error_code err; //:   //... Channel ch = Channel::open(s, &err); //out-:   if(err) { ... } : auto [ch, err] = Channel::open(s) //structured binding if(err) ...
      
      





このコードは2つのパラメーターの戻り値を使用する必要がありますか?









 auto ch = Channel::open(s);
      
      





良いですか? はい、失敗した発見がプログラムで提供された場合。







コード強化:あまりにもスマートにしないでください



C ++を使用する文脈でのスマートという言葉は虐待的です。 バグを見つけます:







 istream& init_io() { if(argc > 1) return *new istream { argv[1], "r" }; else return cin; }
      
      







コメントする





 // auto x = m * v1 + vv // m  v1   vv // void stable_sort(Sortable& c) // "c"  ,  "<" //     ( "==") { //...    }
      
      





哲学のルール



githubにアクセスして、基本的な概念を含む哲学ルールセクションを読むことをお勧めします。







コアガイドライン



私の目標は非常に単純です。 リーク、メモリ破損、ガベージコレクタ、表現力の制限、パフォーマンスの低下なしに、タイプセーフおよびリソースセーフのコードを書くことができます。







現在、2つのオープンプロジェクトが開発されています。コアガイドラインルールをチェックするためのアナライザーと、GSLライブラリ-ガイドラインサポートライブラリ( Microsoftからの実装 )。







ガベージコレクターなし!







ご質問は? コメント?



いいえ、トレーニングについてすべてを説明しませんでした。 表面をかろうじて引っ掻いた。







聴衆からの質問



[ Straustrupには、簡単な質問に5分間答える超能力があるので、彼の答えと質問自体も大幅に減らしました ]







コアガイドラインは包括的すぎます。 教え方

すべてを読む必要はありません。 はじめに、次に哲学セクションをお読みください。 ルールを探す必要はありません。ルールがあなたを見つけます。







標準ライブラリには単純な関数が必要ですか? たとえば、ランダム[ 初期値を設定する必要のない関数と、分布則を設定する機能を意味すると思います ]?

はい、そうです。







3つのC ++ディストリビューションについてお話しました。 誰がこれを行うべきですか?

委員会がこれに対処する可能性は低いため、これはコミュニティによって行われるべきだと思います。 単一のパッケージマネージャーとモジュールの開発により簡単になります。







私の娘は大学にいて、一緒にサーモスタットプロジェクトを行いました。 そのため、温度を取得して画面に表示するには、C ++の学習に1学期かかりました。 これについてどう思いますか?

はい、そのような問題があります。 モジュールを使用すると、改善されます。







数学だけでなく、一般的な科目としてプログラミングを教える必要がありますか

私はこの問題に関して能力がありません。







mmatrosov :トレーニングでライブラリを使用する必要があるとおっしゃいました 。 新世代のプログラマーは基本を知らないのでしょうか?

目標に依存します。 私は生徒にベクターの実装方法を教えます。ポインターについて知る必要がありますが、誰もがロックフリーコードを実装する必要があるわけではありません。








All Articles