地元の大学は、プログラミング経験のない初年度の大学生(16歳)にC ++を教えています。
最初のプログラミング言語として、C ++は適していますか?
地元の大学は、プログラミング経験のない初年度の大学生(16歳)にC ++を教えています。
最初のプログラミング言語として、C ++は適していますか?
回答:
強調はありません。
あなたが学生のために考えている目標については、別の言語または言語のシーケンスがより速く、より良いでしょう。例。
「学生は低レベルの概念を理解する必要があります。」
「低レベル」コーディングはnew
、オブジェクトをから取得したり、にフィードバックしたりdelete
、場合によってはそうでない場所を指すポインターを持つことではありません。関数、クラス、およびテンプレートは低レベルではありません。RAII、使用するための12個の方法const
、std::ostream::operator<<
、protected
および new
低レベルの概念ではありません。これらのことは低レベルの意味を持ち、あなたはそれらを数ヶ月間、または将来のクラスまでスキップし、代わりにC ++セマンティクスの山を教えています。
私は、MIPSやMMIXのような優れた環境と教材を備えたアセンブラをお勧めします。お急ぎの場合は、少なくともアセンブラの出力を見て回り道でCを教えてください。これにより、C ++が行うすべての低レベルの理解が得られ、一部はより高速になります。
「学生はオブジェクト指向を理解する必要があります。」
C ++に組み込まれたオブジェクト指向は、OOの概念、または他のほぼすべての高レベルの概念を教えるには複雑すぎます。潜在的な理由の素晴らしい、長いリストについては、C ++ FAQを参照してください。そのすべてをヒットする必要がありますが、新しいプログラマーにとっては非常に長い時間がかかります。さもなければ、多くのことを飛ばして、新しいプログラマーを暗闇の中に残しておく必要があります-事実上、実際にはC ++を知らないのです!
C ++をまったく教える必要がある場合は、最初にオブジェクト(Python、Ruby、Squeak、Common Lisp、Racket)を使用して、よりシンプルで高レベルの言語を学習することをお勧めします。それを超えて、関数型言語にアクセスして、オブジェクト指向とは別の概念として多態性を学びます。
「学生はテンプレートとテンプレートのメタプログラミングを理解する必要があります。」
誰も本当にこれを尋ねませんが、私は彼らがそうすることを望みます。C ++には素晴らしいテンプレートがあり、STLはクールですが、C ++を最初に教えるのに十分な優先順位であってはなりません。とにかく、OCamlまたはHaskellの型システムを教えてから、それらの概念を改良する方が速いかもしれません。
「生徒は問題解決を学ぶ必要があります。」
ええ、これはどの言語でも入手できます。手荷物が少ないため、C ++以外のほぼすべての言語で入手できます。繰り返しますが、問題解決スキルの代わりに学生が学習するすべてのことのリストについては、C ++ FAQを参照してください。
「上記のすべて。1つの言語のみを使用する必要があります。」または「雇用主はそれを望んでいます。」または「Cスタイルの言語が必要です。」または...
複数の言語を教える。
1つの言語のみを教えたり学習したりすることで時間やエネルギーを節約できるという考えは、まったくばかげています。これは、特定の言語の学習には正確にXヶ月(HINT!HINT!)を要するという考えに基づいています。ここで、Xは単一の数字または言語ごとに1つの数字です。これは、すべての「要件」と「テスト」ガベージをスキップすることで時間とお金を節約できるという考えとほぼ同じです。
複数の構文については、他の言語に対して過度に偏らせることにより、すべての言語でC構文を期待するように教えると、生徒を危険にさらすことになります。
ほとんどすべてのパスは、C ++で開始するよりも高速で優れています。単純な高レベル言語を学習してからC ++を学習する方が速くなります。アセンブラを学習してからC ++を学習する方が高速です。C ++以外のものは、学生をそこに早く連れて行き、彼らはより多くの起動方法を知っているでしょう。最初にC ++を教えないでください。
いいえ、C ++は経験豊富なC ++開発者にとっても難しい言語です。最も単純なアルゴリズムであっても、言語の微妙な点の多くを説明する必要があります。Hello Worldの例を考えてみましょう。
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
}
その#include
コマンドは何ですか?何std::cout
。なぜ::
?なに<<
?ああ、それはオーバーロードされたオペレーターです!オーバーロードされた演算子とは何ですか?Sooo、のためにints
、それはビットシフトstd::cout
を行いますが、それが何であれ、それはものをコンソールに出力します。ああ、std::cout
ストリームであり、ストリームには<<
and >>
演算子がオーバーロードされています。
Pythonで同じサンプルを見てみましょう:
print("Hello World!")
それだけです、いくつかのアルゴリズムをコーディングしましょう。
おそらく、良い第一言語ではありません。複雑な構文、多くのルール、古い言語、エラーが発生しやすいメモリ管理です。Smalltalkのようなオブジェクト指向の何かを生徒に教えるのが良いでしょう。PythonのようなプログラムやHaskellのような機能的なプログラムのほうが良いです。
彼らは、より良い言語を学んだ後、C ++を後の人生で学習することができます(助けられない場合)。
短い答え:はい!
私はと言うでしょう任意の言語は、適切な開始が、特にC ++(またはequivivalent)です。最近ではC#とJavaが使用されている主要な言語であり、これらを使用してAPIやIDEに頼ることをすぐに学べますが、C ++を使用すると、パフォーマンスの最適化など、プログラミングを一から学ぶ機会が得られます。
.Sort();で構築された言語に盲目的に頼る前に、プログラミング、ループ、ソートの基本を学ぶことは決して悪い考えではありません。
実際、私はおそらく非常に実用的な理由で第一言語としてそれが良い選択であると信じています:C ++を学んだ後、あなたが遭遇する他の言語は学ぶのが簡単に思えます。
15〜16歳のときにC ++を独学しました。
魔法を他の人に任せて、物事の内なる働きを自分で学ぶほうがよい。
簡単に言えば、エントリーレベルのC ++構文とセマンティクスを理解できない場合、コンピューターはそれほど得意ではありません。そんなに難しくありません。「C with Classes」を避ける正当な理由はありません。
学生がテンプレートメタプログラミングの作業を開始し、多態性の呼び出しを推測し、複数の継承階層のもつれを解くことを期待している場合、どのような種類の言語のエントリレベルクラスにとってもばかげています。
学生にとってプログラミングの複雑さを隠したいという非常に悪い傾向があります。それはうまくいきません(SpolskyのJava Schoolsのエッセイを参照)。それらの人々は、頭をまっすぐにしないと、DailyWTFになります。抽象化がリークし、抽象化がリークする場合(そうでない場合)、それは対処するよりも悪いです。私は入門レベルのC ++学生のTAとして働いてきました。物事をすべて隠しておくか、調べるために光の中に持っていく必要があります。魔法は学習者の敵です。
マシンコードにコンパイルされた開始言語を推奨する必要がある場合は、おそらくPascalバリアントが最適なアプローチでしょう。私が思い出すところから、それはCファミリーよりも規則的で構造化されたアプローチを持っています。
私は「いいえ」と言うだろう-私はプログラミングを学びたいという熱意と欲求を持っていて、すぐにC ++を使って大学の入門年度に入りました。C ++を別の言語であるかのように教えていた教師(言語または現実世界のアプリケーションの概念ではなく、彼らにとって意味のある概念)、および毎週私たちに投げられたプロジェクトと相まって、私はクラッシュして燃えましたクラスの半分。教えられたことを消化し、実験し、適用することさえできるようになるまでに、テストを兼ねたプロジェクトの宿題に苦労しました。私はそれが100よりも200レベルのコースだったと主張します。
本当に頑張りました。私は同情を求めませんでした、それが挑戦になることは知っていましたが、先生は私を助けさえしませんでした。私がやっていたように、教科書を読みに行くように言われました。
私は、RubyまたはPythonが誰かをプログラミングの世界に引き込むためのはるかに優れた言語であると主張します(そして、一部は反対します)。簡潔で読みやすく、明確な構文。
いや
教授言語として、C ++はCに比べてわずかに優れていますが、Cは周りの最悪の教授言語の1つです。前もって多くの複雑さをもたらし、言語の一部は非常に直感的ではなく、ほとんどの場合、プログラミング全般よりもC ++について多くを学んでいます。
それは、C ++(またはC)が悪い言語である、または学習する価値がないと言っているわけではありません。Pythonなどの優れた教育言語が利用できるというだけです。
string
のようなオーバーロード演算子というデータ型+
、=
およびは、==
学生が多かれ少なかれ期待して、文字列したがって、「わずかに」C.で行われる必要があるの処理方法に比べてという事を行うには。教育言語としてもお勧めしません。
中等後教育には、大学と専門学校の2つの必須タイプがあります。違いは、卒業後に何を準備するかです。自動車の分野では、メカニックになるか機械エンジニアになるかが重要です。
とはいえ、C ++は、エンジニアになりたい場合は素晴らしい第一言語であり、メカニックに相当するプログラミングになりたい場合はお粗末な言語です。
C ++のイントロクラスは、データ型、定義、宣言、ポインター、メモリ割り当てなどについて多くの時間を費やします。いくつかの学期を費やして有用なことをできるようにしたいが、そこに着いたらどんな複雑さにも対処できる基盤があることを知りたい場合、これらは素晴らしい基盤です。
一方、何か便利なことをより迅速に行えるようにしたいが、ドメインと複雑さが制限されているかどうかを気にしない場合、それらの低レベルの概念に前もってすべての時間を費やすことは無駄になります。優れたhtmlフォームバリデータを作成できるプログラマーはたくさんいますが、デバイスドライバーの設計方法を知る手掛かりがありません。
確かに。私の最初の言語はCでしたが、それは本当にクラスをC ++に簡単にするためでした。大学に着いたら、Javaの処理がずっと簡単になりました。C ++の学習曲線はやや急ですが、適切に教えられていれば問題ありません。
いいえ、C ++は第一言語としては適していません。ここに示すように、多くのプロのプログラマーがこの意見を共有していますが、これはプロの教師が持っている意見でもあります。
ここでは何の報告カーネギーメロン大学の学部長からは新入生のためのプログラミングへの入門コースのためのC ++を使用してについて言いたいことがあります。
CやC ++などの標準言語は、その複雑さと欠陥が非公式の推論手法と機械化された推論手法の両方を妨げるため、このコースには適していません。
CMUでは、必須のコースと機能的なコースの2つの入門コースを提供しています。SMLは関数型プログラミングに選択されました。命令型コースに何が選ばれたかはわかりませんが、レポートではCのサブセットを使用することに言及しています。
間違いなくC ++が最初の言語になります。しかし、それはどれだけうまく教えられているかについてです。
誰もが、第一言語は非常に理解しやすいものだと言います。しかし、私のポイントは、ほとんどの人が学部レベルでプログラミングを始めます。ですから、彼らが把握できる何かを教えることができます。また、C ++では、低レベルから高レベルのプログラミングに移行できます。
いいえ、まったく違います。
私のやり方があったら、ほとんどすべての学問的環境での使用を許可しません。すでに作成されたものとは反対の理由ではなく、C ++(またはそのバリエーション)がほぼすべての問題の答えであると考える人が多すぎるため、ほぼすべての状況で使用できるためです。プログラミングのドライバーです。
一部の人々は、仕事のために完全に合理的なツールであるネジを締めるためにそれを使用します。他の人はそれをプリバーのように使用しますが、多くの場合効果的ですが、父親はあなたが何を言っても、ドライバーはプリバーではなく、シャンクの構成が意図的に構築されていないため、誤用により壊滅的に失敗する可能性があるため、本当に理想的ではありませんプリバーが遭遇するような種類の力のために。さらに他の人はそれをパンチまたはノミとして使用しようとしますが、ドライバーのハンドルはパンチまたはノミが耐えるように設計されているような著しい虐待のために構築されていないため、ほとんど常に問題が発生します。
私の意見では、プログラマーの仕事は一般に、実際の問題をある程度の効率化(タスクへのリソースのコミットメントの減少)、速度(タスクの実行時間の減少)、予測可能性(再現性の向上)を提供する自動化に変換することですタスク)、または組織(タスク間の関係の認識を高めます)。
プログラムを実行するすべての人が、コンピューターの低レベルの操作、特にデバイスIOとメモリ割り当てに関する一般的な知識を持っている必要があることは理解できますが、それを活用することはもちろんのこと、その知識をかなりの程度まで実際に使用しなければならないことは間違いなく珍しいことです大半のタスク。問題のより広い文脈を理解せずにそうしようとすると、努力に不必要なリスクが挿入されます。
Cとその派生物が解決する問題のクラスは、現在および将来の問題の任意の大きな割合に適切ではないため、最初のプログラミング言語はC / C ++または類似のバリアントである必要があります(救助する必要がある場合を除く)以前は、ドライバーを使用したプログラム)、実際には、今後発生する問題のごくわずかなセットです。ほとんどのプログラマーは、相互接続された小型のモバイルデバイスがますます普及しているにもかかわらず、コアOS機能や直接的なデバイスインターフェイスの開発に近づくことはありません。ほとんどが私たちと同じように機能し、生きます。2世代以上前のコードを修正して段階的に廃止し、既に年齢を示しているテクノロジーに実装するか、killer(x + 1)アプリのテクノロジーの周辺で作業します。
最初の言語として、軽量でありながら機能が豊富なLabViewのバリアントであるLego NXTを検討します。Lego NXTは商業ベンチャーでは広く使用されていませんが、「センサーリッチ」な方法でプログラムすることの基本的な性質を示します。JavascriptやTCL / TKのようなプラットフォームに中立なスクリプト言語と組み合わせることもあります。どちらも、非常に基本的かつ効果的なタスクを実行するために発見しなければならないことに関しては比較的影響が少なく、フィードバックループと高いレベルの問題の複雑さを導入および解決する柔軟性の観点から高いリターンがあります。さらに、学生が缶詰環境で提供されるものを超える可能性を探求するための良い機会を提供します:暗闇、湿気、
4シリンダーを自動運転することを学んだ後、大きなv8手動ホットロッドにステップアップします(興味があり、やる気がある場合)。ジョエルが足元の石の下にロックスタープログラマーを見つけられない場合、彼はどこか他の場所を探し続けるか、ツールボックスにたくさんのドライバーが必要な理由を考え直さなければならないかもしれません。
初心者がC ++で間違いを犯しやすいいくつかのポイントは次のとおりです。
テストしたい場所に割り当てを行う= vs ==
行方不明;
中括弧の読みやすさと、例えばパスカルの開始-終了
そして、混乱するすべてのインクルードファイル、マクロ、メモリ管理などがあります。
ですから、C ++は最初から最適な言語ではないと思いますが、学習したときに非常に役立つことは間違いありません。
他の人も示唆しているように、C#、Java、またはVBを使用し、構文の強調表示やデバッガーなどを備えた優れたIDEを使用して、エラーからの回復を容易にします。
私が大学にいたとき、C ++は大学1年を通して教えられた基礎言語でした。理論としては、複雑なプログラミングの概念がいくつか含まれていたため、それをマスターできれば、他の言語を習得できます。良い基盤として私に役立った。
そうは言っても、私は4年生の間、コア言語をJavaに切り替えるかどうかを決定する委員会に参加しました。いくつかの著名な雇用主や学部の卒業生と話をした後、Javaに切り替えることが学生の最大の関心事であると判断されました。私たちが話していた雇用主は、人々が彼らを雇うために彼らが使っていた言語での経験を持つことを望んでいました。10年経った今でも、彼らはJavaをコア言語として使用していると思います。
同様の注意事項として、私たちは本当に優れたC ++スキルを持つ最近の大学卒業生を数人雇うことを検討しています。見つけることができませんでした。
はいと言うでしょう。しかし、どの言語も本当に第一言語になり得ます。C ++は優れていると思います。なぜなら、C ++は複雑で時には難しいことですが、実際に何ができるかを示しているからです(制限は少ない)。また、他の言語を使用する準備を整えるのに役立つオブジェクト指向の設計もあります。
C ++は私の最初の言語であり、嬉しかったです。早い段階でOOPの考え方を考えるようになり、そのことに感謝しています。しかし、最終的に、それは本当にあなたがやりたいことになります。ある言語でうまくいくことができれば、別の言語を拾うのに何の問題も起こらない可能性があるため、言語はそれほど重要ではありません。何をしたいですか?ゲームを作る?携帯電話向けプログラム?それぞれに適したツールと言語があります。
C ++は初心者向けの言語ではなく、エキスパート言語です... Java、C#、Pythonではなく、最初にCと言います...なぜですか?Cは、記憶や、すべての言語で「隠されている」ポインタなど、いくつかのトリッキーな概念に注意することを教えていますが、どこにでも存在しています。メモリを時々解放する理由さえ理解していない若い開発者がたくさんいるのを見てきましたが、ガベージコレクターはすべてのコーディングクラップスをきれいにする小さなドワーフではないと考えています。 RAM ...しかし、ガベージコレクターが単にすべてを魔法のようにクリーニングしない理由を理解していません!そして、私はこの種の開発者がC ++でコーディングしているのを見たことがあります(そしてCorbaではさらにクレイジーです)、それは虐殺でした!!!!!!!!!! ですから、Cでコーディングを学び、Python / Java / C#にアクセスしてオブジェクトの概念とすべてのシュガーを学ぶことをお勧めします。それからすべてを理解したら、C ++に行き、C ++の力を感じますが、C ++のすべての危険性と、なぜそれを誰にも使用してはならないのかを発見します;)
「適切」が「可能」を表す場合、はい。「良い」場合、間違いなくいいえ。
C ++を好きになったり、C ++を愛したりすることも可能ですが、そのためにはいくつかの言語を学び、10年ほど腐ったコードベースで作業し、「実際に機能する重要なソフトウェアの作成」の経験を積んでください。C++には魅力があります。
あなたが処女であるとき、最初ではなく、小さくて単純な(しかしおそらく面白くて楽しい)問題をいじります。
私はpythonから始め、その後にSICP(スキーム)、またはそれに似たものが続きます。リバースまたはインターリーブされる可能性があります。それらを使えば、問題に対処することができます。システムと戦う代わりに、深い泥の中を歩き、あらゆる種類の非論理的な癖とその歴史的理由を学びます。
後で、紙袋から抜け出す方法をすでにプログラムできる場合は、ベアメタルに切り替えます。アセンブリの方法といくつかのアーキテクチャ、さらにはKnuthのMixを学びます。メモリ、レジスタ、ALU、キャッシュ、割り込みを理解し、読み取りレベルに到達するためだけに、オペコードを記憶したり、実際に多くのことをしたりするつもりはありません。
その後、その基盤を使用して、C ++などの他の言語に触れることができます。間に「言語の歴史と進化」を追加することをお勧めします。
私は中学校でC ++から始めました。私はこの本のコピーを取りました:C ++ How to Program by Deitel and Deitel。この本はとても良いです。
率直に言って、ここには正解も不正解もありませんが、個人的にはC ++が理解可能であることがわかりました。私はそれをOOPまでずっと学びました(「これ」につまずいたのですが、どうやってそれを手に入れることができなかったかはわかりません)。それを試して、落胆しないでください。行き詰まったら、他の言語を調べて、新しい言語を学び続けてください。考え方は、同じ概念を2〜3の異なる形式で見ると、よりよく理解できるようになるということです。私が言ったように、「this」ポインタの概念は私を混乱させましたが、Pythonで同じこと(selfという名前)を見たとき、C ++で理解できたのですぐに意味がありました。多くの大学がJavaを教えることができれば、Javaを学んでください。Pythonかrubyが言語du jourであり、Clojure(および他のすべてのlisps)、Haskell、Scalaのようなよりニッチ/新しいものを探索できるなら、学びましょう。
いいえ。JavaまたはC#から始めます。C ++を学習したい場合は、クラスとは何か、ループとフォーク(if、thenステートメント)の実行方法などの基本を学習した後、おそらく簡単になります。見方を学習することの方がはるかに重要です。問題や数学の方程式とそれをプログラムして、すべてのメモリを解放したかどうかを判断します。
この質問の背後にある仮定は、「C ++は非常に複雑に見えるので、16歳の人はそれを最初の(コンピュータープログラミング)言語として選択できるでしょうか?」
私たちが4才か5才になるまでに、母国語のほとんどの構成要素を取り上げます。すばらしい文章を作成するには一生かかります。
C ++は、たとえばほとんどの人間の言語よりもはるかに複雑/複雑ではありません。16歳の方は必ず手に入れることができます。彼らはそれで素晴らしいコードを書くでしょうか?待って見に行きました。