先日、先生の一人と話し合いました。
より簡単なスクリプト言語(PythonまたはRubyなど)がジュニアプログラマーに与える影響について議論しました。
彼は、スクリプト言語はずさんなコーディング技法を生み出すと主張しました。初心者は「内部」で何が起こっているのか理解していないからです。彼はまた、スクリプト言語がプログラマーに効率、メモリ管理、操作の複雑さなどに関する懸念を怠らせる原因となる他の例も挙げました。
低水準言語は一部の人にとっては多すぎるかもしれず、プログラミングへの情熱を発達させる前に彼らはあきらめるかもしれないと私は主張しました。私が最初のプログラミング言語(C)を学び始めたとき、概念が難しすぎたためにポインターに行き、あきらめました(私の防御上、私は14歳でした)。それがJavaでなければ、プログラマーになっていなかったかもしれません。単純な言語から始めて深く掘り下げたとしたら、私はあきらめず、Cから始めたのと同じくらい多くを学んだと思います。
クラスはどちらかが完全に探索される前に終了しました。
ここまでは、初心者はスクリプト言語から始めて、それからDigを深く理解するべきだと説得してきました。しかし、その議論の後、私はこれが誤った考えだったのではないかと思い始めました。
では、スクリプト言語はジュニアプログラマにどのような影響を与えるのでしょうか。
同意しません。まず、スクリプト言語は抽象化のレベルが高く、これには何の問題もありません。最初は原則を学ぼうとしているだけです。実際、私はより低いレベルの言語を選択することは悪いコーディングを助長するかもしれないと言うでしょう、なぜならそれらを理解することができる前にいくつかの詳細を扱わなければならないからです。代わりに、より単純な言語を使用して、最初からクリーンで簡潔なコードを書き始めることができます。
第二に、これらの言語で学ぶことはたくさんあります。言語を学ぶ限り、CはPythonよりも簡単だと思います。ポインターを処理したり、文字列を処理したりする必要がありますが、Pythonで学ぶにはさらに多くの概念があります。内包、オブジェクト指向、リフレクション、マジックメソッド、ファーストクラスの関数、ラムダ、イテレータとジェネレータ、メタクラス:これらはすべて言語の一部です。
Python=で始まると、プログラミングについてより多く、穏やかな学習曲線で学習できるようになると思います。低レベルの言語は、抽象化が少なく、学習する一般的な概念が少ないため、初心者を圧倒します。詳細なしでしたい場合があります。
どこから始めてもかまいません。あなたがどこに行くかあなたが始めた後が重要です。
BASICは地球上で最もエレガントな言語ではないかもしれませんが、手続き型プログラミングの基礎を網羅しているので、これで十分です。
BASICから始めました。私はしませんでしたstayそこに。
あなたの教師は正しいですが、彼の結果は悪いことだと思い込んでいます。
あなたが言語の学習を、コンピュータがどのように機能するかを学ぶための純粋に学術的な活動と見なすならば、彼は正しいです。あなたが物事を成し遂げる方法としてそれらを見るならば、あなたは正しいです。
「スクリプト言語」はひどい言葉で、非常に古いか、せいぜいドメイン固有の言語のクラスに適していると思います。あなたの教師は、彼が明らかに十分に理解していないすべてのものを悪の軸に合わせています。
賢明な違いは、高水準言語と低水準言語の間、または静的に型付けされた型と動的に型付けされた言語の間であり、これらは真に直交しています。
アセンブラーは低レベルの動的型付け(型について話すことがまったく意味がある場合)、Cは低レベルの静的型付け、Rubyは高レベルの動的型付け、Haskellは高レベルの静的型付けです。 Javaは静的でも高レベルでも低レベルでもありません。C++は静的でも高レベルでも低レベルでもあります。等々。
議論はただあり得、どのパラダイムは初心者レベルのプログラマーにより適しています。
低レベルのプログラミングはおそらく1つではないと確信しています。それは、90年代前半にさかのぼって、実際にそれを使用して妥当な時間内に興味深い結果を実際に生成できた可能性があります。
しかし、プログラミングは情熱によって支えられています。情熱は報酬によって養われます。したがって、エントリーレベルのプログラマーはやりがいのあるツールから始める必要があります。わずかな時間で同じ結果を得る高レベルのツールの膨大な海があるため、低レベルのツールはもはや価値がありません。
人間の思考は抽象的なものです。私たちは世界を理解することを学ぶとき、非常に粗い抽象化によってそれを行い、必要に応じて詳細に行きます。
子供がその環境を理解するためには、数学、物理学、化学、生物学、歴史、社会学、哲学を教えることはしません。あなたはそれに対処するための世界の非常に単純なモデルを与え、それ自体がそれを越えて到達するのに長い間、若いときに無限に質問を発し、後で完全にあなたの権威を否定します。
それが私たちの考え方です。人間の脳は限られた量の情報「単位」しか処理できませんが、情報の量子化では抽象的な程度はほとんど問題になりません。たとえば、式'34 * 75 'を読み取ることは、計算するよりも簡単ですが、コンピュータの場合はその逆です。一連の黒いピクセルを波線に認識(そして抽象化)し、それを個別の数字として認識(そしてさらに抽象化)することは、膨大な作業です。
私の祖母はファイルを開くアイデアを理解しています。しかし、彼女はそのレベルの下に理解がありません。そして率直に言って、もし彼女が最初にハードウェアとオペレーションシステムの内部の仕組みを研究することによってこれを学ばなければならなかったなら、彼女はそこに到達しなかっただろう。
明確で簡潔、それゆえにエレガントなソリューションについて考えるように教えられなかったため、物事を複雑にしてしまう人はたくさんいますが、交換可能な低レベルの詳細に悩まされ、それらに対する問題を解決するために多くの時間を費やしました。コンピュータのように考えるように人々に教えることは、プログラミングへの可能な最悪のアプローチです。
プログラミングの価値は、問題の解決策を見つけることにあります。それをコードとして表現することは、実際には退屈で機械的な作業であり、適切なツールを使用して実行する必要があります。
ああ、そしてポインターを理解していなくても心配しないでください。私は同じ年齢でほぼ同じ問題を抱えていました。ここでの問題は、抽象化の欠如でもあります。古典的には、いくつかのCの本からポインタについて学び、それらを理解するのに苦労している間、これはメモリ割り当てと、したがってスタックとヒープメモリなどと関連しています。ポインタの背後にある抽象的な概念は間接的です。特定の配列へのインデックスを保持する変数は、それだけです(実際には、特定の配列がアドレス空間であるCでも実際には同じです)。このためにポインター演算は必要ありません。
これは単に説明するためのものであり、高レベルの抽象化を選択すると、物事を非常に簡単に理解できるようになります。
編集:そしてタイピングに関しては、静的に型付けされた言語を好みます。エントリーレベルのプログラマーは、型の概念(抽象的なもの)を明確に理解する必要があると思います。
Pythonには単純なものは何もありません。 Unicodeとメタプログラミングを見てください。
別のもっと深い問題が見えます。
統一された言語は、型に注意を払い、型で考えることを強制しません。これは、気づかずに相互に変換されるいくつかの文字列と数値を含む小さなスクリプトがある限り、適切です。しかし、これが壊れる日が来るでしょう。突然、プログラムが壊れ、すべてのクイックフィックスが再び壊れます。
または、初心者のプログラマーは、タプルのリストではなくリストのタープが必要になることを理解しますが、「これを行う方法」というわずかなアイデアはありません。
私たちは大学でそれを逆に見ました、そしてそれは有用だと思います。 *低いレベルから始めました。ポインタ、メモリ管理、文字配列...はい、Cから始めました。アルゴリズムについても同じです。最初にリンクリスト、ハッシュテーブル、ツリーを実装します。その後、標準ライブラリを使用します。
その後、Java、C#、Perlなどのより強力な言語に移行しました。しかし、ベルトの下で何が起こっているかを知っているという利点があります。
これは機能しますが、スクリプト言語から下位言語に移行することも問題ないと思います。 高水準言語と低水準言語の両方を知っていると、何が起こっているのかを理解しながら、高水準言語の使いやすさが確実になります。学習する順序はそれほど重要ではありません。
正式な指導とメンタリングは、初心者のコード品質における言語の選択よりもはるかに大きな要素であると私は今でも主張しています。ただし、初心者向けに第一言語を選択する必要がある場合は、独学のプログラマーにはpythonを、大学の教育にはC++を選択します。
その理由は、有益な何かをする必要がある前に、強力な理論的基礎を築くための小さな些細なプログラムから始めることができる正式な指導です。時間の余裕があれば順序は理想的だと思います。C++では、講義間のコンパイラエラーやセグメンテーションフォールトについて多くの助けを借りて、基礎を理解していない場合に通知します。
これらの基本事項のいくつかは、自分で独学している場合、実際に経験を積むまでは、学ぶのが非常に難しいものです。また、通常はできるだけ早く何かを役立つものにする必要があり、必要に応じて理論的な基盤を得ることができますが、このアプローチでは最低限以上のことを学ぶことはありません。そのため、pythonのような言語をお勧めします。
スクリプト言語doはずさんなテクニックを奨励すると私は主張します。 (これは、言語がbadであると言っているわけではないことに注意してください。ただし、上記の言語で大きなコードベースを維持するのが難しいということです)。
プログラマーがプログラミング全体の基本的な理解を必要とする任意の言語を使用すると思います。ベクトル、ツリー、ハッシュテーブルなどの概念を理解していなければ、どこでも効果がありません。彼らは必ずしもこれらのものを実装できる必要はありませんが、その特性を知る必要があります。
だらしが効くと思うのはプログラミングスキルではなく、再利用可能なコンポーネントを作成する必要があるときです。これらの言語では、ライブラリにクライアントに制約を適用させるために、コードユニット間のメカニズムやメカニズムを定義する必要はありません。そのような言語で優れた再利用可能なコンポーネントを作成することは不可能ではありません。それはmuchより難しいだけです。
スクリプト言語は、初心者プログラマにとって魅力的です。短時間でより「ワンオフ」の作業を行えるためです。しかし、同じプログラマがメンテナンスプログラミングを始めると、これらの言語にすぐに問題が発生することがよくあります。
私はスクリプト言語が悪いと言っているわけではありません-それからは程遠いです。しかし、それらは膨大な(数百万行)コードベースを維持することを困難にします(これが、そのようなコードベースがスクリプト言語で実行されない理由の1つです)。比較的小規模な、または1回限りのソリューションが必要な場合、これらを使用すると、より少ない時間でより多くのコードを実行できます(ほとんどの場合、コードが少ないほど優れています)。
すべての仕事に最適なツールはないことを覚えておいてください。状況に最も適したツールを選択してください。これは、他のツールと同じように、プログラミング言語にも当てはまります。
スクリプト言語はプログラマーをずさんにさせません。問題の領域(プログラムが提供するビジネスなど)を明確に理解していないことが、だらしの原因です。
古いことわざにあるように、「COBOLは任意の言語で記述できます。」と思いますが、すべてのデータ型同じように見えるの場合、プログラムの本質的な側面を理解するのが難しくなります。 、COBOL化の主要な機能。
私はあなたの教師と一緒ですが、彼があなたの教師が結果(たとえば、パフォーマンスの知識がない)が悪いと想定していると言ったとき、@ Singletonedも一緒です。
スクリプト言語から始めるより、Cから始める方が良いと思います。教師として、フォンノイマンアーキテクチャの全体(ALU、レジスタ、メモリ、I/Oポートなど)に集中し、移動ストレートポインタへ(申し訳ありませんが、それは本当に重要な概念です[[VM言語はメモリリークの主な原因です)]で参照(つまり、ポインタ)を解放しない)、いくつかのデータ構造をヒットします(ツリー、リンクリスト、ハッシュテーブル1)、そしてthen ...抽象化レベルを他の何かに上げます(OO、関数型プログラミング、何か-強力な静的型付けrules、よ\ m /、「スクリプト言語」> :()はありません。
1ええと、多分私はあなたの先生とパフォーマンスの考慮について同意するでしょう。
モジュラー言語から始めて、もっと複雑なものに進むのが最善だと思います。私がPascalとCOBOLから始めて、サブルーチン、制御フロー変数などが何を意味するかを理解しようとしました。 Pascalに慣れた後になって初めて、C/C++などの言語に切り替えて、ジュニアプログラマーのアドオンとなる他のすべてのテクニックを学びたいと思いました。
あなたはどちらも正しい。
スクリプト言語は、初心者の開発者が実際に何が起こっているのかを理解することを確実に困難にします。 (データベース、フレームワーク、ライブラリーもそうです。そして、ブラウザー、サーバー、ネットワーク、ファイルシステムです。)若い開発者にインタビューすると、コンピューターが実際にどのように機能しているか、彼らが貨物に乗り込みやすいかについて、彼らがほとんど知らないことがよくわかりません。 -カルトプログラミング。
一方、私がインタビューで探す一番のことは完全な理解ではなく、彼らがものを作ることを愛しているということです。始めた頃は、なんでもできるコンピューターがかなり印象的だったので、私の小さなApple=基本的な6502アセンブラーのことは本当に素晴らしいと感じました。しかし、最近のコンピューターはたくさんの素晴らしいことをしているので、夢中になってしまうのであれば、かなり高いレベルから始めてもいいと思います。
基本的には、プールの浅いところから始めて、最終的にはより深い海を狙うのであれば問題ないと思います。
まず、私は間違いなく、より高い抽象化レベルの言語から始めます。現在、Pythonをお勧めします。スクリプト言語を第一言語として選択する最も重要な理由は、機能するものを簡単に組み合わせることができることです。ジョーが彼の質問で述べているように、プログラマーになるときの一番のことは、あなたが先へ進み、深く掘り下げる動機を持っているということです。この動機は、実用的で有用なソフトウェアを作成できるようになったときに得られます。
抽象化の理解(高レベル)と基礎となる実装(低レベル)の理解に関するポイントの他に、見逃されている3つ目のポイントがあります。今日、優れたプログラマーになるためには、上記の2つの点の両方を確実に習得する必要があります。さらに、新しいテクノロジーや視点を常に検討することは、あなたの能力にとって重要です。どの抽象化レベルから始めても、常に改善し、現在の方法に疑問を投げかける必要があります。
プログラミング言語は、仕事を成し遂げるための単なるツールであることは、最初から明確にすべきです。特定のタスクに適切なツールを選択することは非常に重要です。初心者プログラマーにとっては、高水準のスクリプト言語がこの点を強調するのに役立つと思います。より高いレベルの言語は、より広い視点を提供し、プログラマーをより深く掘り下げる動機を与えます。