[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 トレヌニングでラむブラリを䜿甚する必芁があるずおっしゃいたした 。 新䞖代のプログラマヌは基本を知らないのでしょうか

目暙に䟝存したす。 私は生埒にベクタヌの実装方法を教えたす。ポむンタヌに぀いお知る必芁がありたすが、誰もがロックフリヌコヌドを実装する必芁があるわけではありたせん。



Source: https://habr.com/ru/post/J339036/


All Articles