スクリプト言語はジュニアプログラマーにどのような影響を与えますか?[閉まっている]


18

先日、先生の一人と話し合いました。

シンプルなスクリプト言語(PythonやRubyなど)がジュニアプログラマーに与える影響について議論しました。

彼は、初心者が「内部」で何が起こっているのか理解していないので、スクリプト言語がずさんなコーディング技術を生むと主張した。彼はまた、スクリプト言語がプログラマーに効率、メモリ管理、操作の複雑さなどに関する懸念を無視させることが多い方法の他の例を引用しました。

低レベルの言語は一部の人々にとっては多すぎるかもしれず、プログラミングへの情熱を開発する前にgiveめるかもしれないと主張しました。最初のプログラミング言語(C)を学び始めたとき、私は指針に行き着き、概念が難しすぎるためにgaveめました(私の防御では、私はまだ14歳でした)。Javaがなかったら、私はプログラマーにならなかったかもしれません!もっとシンプルな言語から始めて、深く掘り下げていたら、あきらめずに、Cで始めたのと同じくらい学んだと思います。

どちらかの側が完全に探検される前に、クラスは終了しました。


ここまで、初心者はスクリプト言語から始めて、深く掘り下げるべきだと説教してきました。しかし、その議論の後、私はこれが誤った思考であるかどうか疑問に思い始めました。

それでは、スクリプト言語はジュニアプログラマにどのような影響を与えますか?


8
私はロバになるつもりはありませんが、grammar.quickanddirtytips.com / affect
シングルトン

4
私はオートマチックトランスミッションを搭載した車で運転することを学びました。後で、私はマニュアルトランスミッションを備えたものを手に入れました。学ぶのに時間がかかりましたが、他のすべてと一緒にクラッチとシフトを学ぶ必要がなかったのは幸運でした。
デビッドソーンリー

2
@Singletoned:True。どういうわけか私は考える必要がありましたxkcd.com/326 ...けれども


4
個人的には、低から高にプログラムすることを学ぶのは不自然だと思います。私たちはうことを学び、歩き、走り、話し、書きます。大学の自然秩序の逆転の論理が何であるかはわかりません。私は通常、「私が学ぶのが難しいなら、あなたのために頑張る必要があるから」と人々が結論するのを聞くだけです。ジョエルでさえこれを言った。サイクルが終わることはないと思います。
P.Brian.Mackey

回答:


26

同意しません。まず、スクリプト言語は抽象化のレベルが高く、これには何の問題もありません。最初は、原則を学ぼうとしています。実際、下位レベルの言語を選択すると、コーディングがうまくいかなくなる可能性があります。なぜなら、それらを理解する前にいくつかの詳細に対処する必要があるからです。代わりに、よりシンプルな言語で、最初からクリーンで簡潔なコードを書き始めることができます。

第二に、これらの言語で学ぶべきことがたくさんあります。言語を学ぶ限り、CはPythonより簡単だと思います。ポインターを処理するか、文字列を処理する必要がありますが、Pythonで学ぶべき概念は他にもたくさんあります。内包表記、オブジェクト指向、リフレクション、マジックメソッド、ファーストクラス関数、ラムダ、イテレータとジェネレータ、メタクラス:これらはすべて言語の一部です。

Pythonから始めることで、プログラミングについてより多くのことを学び、より緩やかな学習曲線で学ぶことができると思います。低レベルの言語は抽象化が少ないため、学ぶべき一般的な概念が少なくなります。


1
+1。ただし、CはPythonよりも簡単に学習できるとは思わない 全体的に学習する概念は少ないかもしれませんが、Pythonを使用すれば同じ時間でより多くを学習できます。そしてもちろん、Cがあまりにも簡単なら、C ++が常にあり、高レベル言語と低レベル言語の両方の複雑さを教えてくれます。;)
マーティン

+1、これは私の考えでした!私はクラスの前にこれを読んでいたらよかったのに:)
joe_coolish

22

どこから始めても構いません。開始、どこに行くかは重要です。

BASICは地球上で最もエレガントな言語ではないかもしれませんが、手続き型プログラミングの基礎を網羅しているので、始めるにはこれで十分です。

私はBASICから始めました。私はしませんでした滞在が。


完璧な答えを得るために+1-元の質問の置き忘れを簡潔に示します!(まったくの偶然として、私もBASICで始めました;-)
ペテル・トレック

5
何人の人がそこに滞在しているのか驚かされます。:o /
ゲイリーウィロビー

1
優れた答え。簡潔、正確、要点。私もBASICから始めました。
マイケルライリー-別名ガニー

11

あなたの教師は正しいですが、彼は自分の結果が悪いことであると仮定しています。

言語の学習を、コンピューターの仕組みを学ぶための純粋に学術的な活動と見なすのであれば、彼は正しいです。あなたが物事を成し遂げるための方法としてそれらを見るなら、あなたは正しいです。


6
あなたに同意しないといけない。結果はある結果が無知であるので、悪いこと。これは、最終的に、何かが壊れ、問題があなたが理解しているよりも低い抽象化レベルにあるため、それを修正する方法が分からないことを意味します。それは常に悪いことです。
メイソンウィーラー

6
おっしゃるとおりです。フードの下で何が起こっているのかを知らないことの結果は、ハードウェアのニュアンスを心配せずに表現の深遠な単純さと直接性です。低レベルの抽象化は、アプリケーション開発者ではなく言語設計者向けです。
-S.ロット

1
@メイソン:もちろんです。私はかつて非常に多くのお金を稼ぎ、実際に内部で何が起こっているのかを知らなかったプログラマーのチームのロバを節約しました。(一度そのような仕事がひどいので。人生は短すぎます!)
ウィリアムピエトリ

1
@メイソン-あなたが言ったことに同意します。専門的にプログラムするつもりなら、その知識を持つことが重要です。ポインター、離散構造、およびラムダ計算の知識は非常に貴重であることがわかりました。私はチームメンバーがこれらのスキルを持っていなかったチームで立ち往生し、彼らは過度に複雑な、または非常にバグのあるコードを作成することになりました。彼らがよりよく知らなかったという理由だけで。大学がCS学生にミルクを与えすぎて十分な肉を与えていないように見えるかもしれませんが、逆に、最初のプログラマーに肉を与えると、彼らが脱落する危険があります。
-joe_coolish

1
@Joe:Joelによると、それを処理できない人をドロップアウトすることが全体のポイントです。そして、コンピュータープログラマーだけでなく、コンピューターユーザーとしても、私はただ無能なコーダーによって作成されたとしか思えない恐ろしいプログラムを定期的に操作しなければならないので、「ドロップアウトさせる」ビットがもっと成功したいのです。
メイソンウィーラー

5

「スクリプト言語」はひどい言葉であり、非常に時代遅れであるか、ドメイン固有の言語のクラスに最適です。あなたの教師は、彼が明らかに十分な理解を持っていないすべてを悪の軸に合わせているだけです。

賢明な区別は、高レベル言語と低レベル言語の間、または静的に型付けされた言語と動的に型付けされた言語との間であり、これらは真に直交しています。

アセンブラーは動的に型付けされた低レベルです(型と言えば意味があります)、静的に型付けされたCは低レベル、動的に型付けされたRubyは高レベル、静的に型付けされたHaskellです。Javaは高レベルでも低レベルでも静的に型付けされておらず、C ++は高レベルでも低レベルでも静的に型付けされています。等々。

議論ができるのは、このパラダイムがエントリーレベルのプログラマーにより適しているからです。
低レベルのプログラミングはおそらくそうではないと確信しています。90年代前半にさかのぼると、妥当な時間で実際に興味深い結果を出すことができたかもしれません。
しかし、プログラミングは情熱に支えられています。情熱は報酬によって養われます。したがって、エントリーレベルのプログラマーは、価値のあるツールから始める必要があります。低レベルのツールは、ごくわずかな時間で同じ結果を得る高レベルのツールの広大な海があるため、もはややりがいがありません。

人間の思考は抽象的です。世界を理解することを学ぶと、非常に粗い抽象化によってそれを行い、必要に応じて詳細に入ります。
子供がその環境を理解するために、数学、物理学、化学、生物学、歴史、社会学、哲学を教えるつもりはありません。あなたはそれに対処するための世界の非常にシンプルなモデルを与え、それ自体がそれを過ぎて長く到達し、若いときにあなたに無限に質問を発し、後であなたの権限を完全に否定します。

それが私たちの考え方です。人間の脳は限られた量の情報「単位」しか処理できませんが、情報の量子化では抽象度はほとんど重要ではありません。たとえば、「34 * 75」という表現を読むことは、計算するよりも簡単ですが、コンピューターの場合は逆です。黒いピクセルの束を波線に認識(そして抽象化)し、それを個々の数字として認識(さらには抽象化)できるのは、大変な作業です。
私の祖母はファイルを開くという考えを理解しています。しかし、彼女はそのレベルの下で理解していない。そして率直に言って、もし彼女がハードウェアとオペレーションシステムの内部の仕組みを調べてこれを学ばなければならなかったとしたら、彼女はそこに行ったことはなかっただろう。

明確で簡潔でエレガントなソリューションの観点から考えるように教えられたことはありませんが、交換可能な低レベルの詳細に悩まされ、それらに対する問題を解決するのに時間がかかりすぎたため、物事を複雑にしている人がたくさんいます。コンピュータのように考えるように人々に教えることは、プログラミングに対する最悪のアプローチです。
プログラミングの価値は、問題の解決策を見つけることにあります。それをコードとして表現することは、本当に退屈で機械的な作業であり、適切なツールであれば何でも簡単に実行する必要があります。

ああ、ポインタを理解していなくても心配しないでください。私は同じ年齢でほぼ同じ問題を抱えていました。ここでの問題は、抽象化の欠如でもあります。古典的には、Cの本からポインターについて学びます。ポインターを理解するのに苦労している間、これはメモリーの割り当て、つまりスタックおよびヒープのメモリーなどと連動します。ポインターの背後にある抽象的な概念は、間接指定です。特定の配列へのインデックスを保持する変数は、それだけです(実際には、特定の配列がアドレス空間であるCでは実際に同じです)。これにはポインター演算は必要ありません。
これは、単に高レベルの抽象化を選択することで物事を把握しやすくなることを説明するためのものです。

編集:そして、タイピングに関しては、静的に型付けされた言語を好みます。そして、エントリーレベルのプログラマーは型の概念(抽象概念)を明確に理解する必要があると思います。


3

Pythonには簡単なものはありません。Unicodeとメタプログラミングを見てください。


Pythonは非常に複雑で非常に強力であることに同意します。しかし、基本(文字列操作、配列操作など)はCよりもPythonの方がはるかに簡単です。
joe_coolish

1
Pythonは、開始するのが非常に簡単であり、多くの日常的なタスクは、たとえばシステム言語の場合よりもはるかに簡単です。いいえ、言語全体、その詳細な機能、および高度な機能は単純ではありません(これはすべての非玩具言語に当てはまります)。しかし、それは問題ではありませんでした。

1
次に、filecontent.lower()のsearchstring.lower()が動作していなかったのはなぜですか?Python2.7を使用するWindows上のtfsのUTF-16LE sqlファイルの障害のため。面白くなかった。動いた。数時間かかりました。string.find()も機能していませんでした... Argghhh!
クリストファーマハン

1
UnicodeはCでどのように簡単に処理できますか?
dan04

3

さらに深い問題があります。

統一された言語は、型に注意を払わせたり、型を考えさせたりしません。これは、気付かずに相互に変換されるいくつかの文字列と数値を持つ小さなスクリプトがある限り、うまく機能します。しかし、これが壊れる日が来るでしょう。突然、プログラムが破損し、すべての迅速な修正によりプログラムが再び破損します。

または、初心者志望のプログラマーは、タプルのリストの代わりにリストのタペが必要であるが、「これを行う方法」という少しのアイデアも持っていないことを理解し、彼は絶対的な無力であるスタックオーバーフローについて質問します。


6
しかし、PythonとRubyは強く型付けされています。これは、動的に型指定されることに直交しています。文字列と数値は、暗黙的に相互に変換されません
dsimcha

3
@dsimcha:はい-そして、それは@Ingoが言ったことをどのように反論しますか?
ジムG.

1
この質問は主にRubyとPythonに関するものだからです。私は彼がRubyとPythonが弱い型付けであると考えていることを暗示していると思いました。これはよくある誤解です。
-dsimcha

1
@ davidk01-それが私のポイントです。値には、それが必要かどうかに関係なく型があります。しかし、動的に型付けされた(その用語があなたにもっと喜ばれるなら)言語では、変数はそうではありません。代わりに、Unitypeの多くのバリアントを区別するために、実行時に型チェックが行われます。
インゴ

2
@Ingo:少なくとも、静的型付けの欠如が利点(実際には、オプションの静的型付け、エラーチェックまたはパフォーマンスの目的で使用可能)であると考えているCommon Lispユーザーを見つけることができました。静的型付けで回避できたであろうエラーは、実際には見つけて修正するのが困難であることが判明しませんでした。私はどちらかといえば意見以上のものを見ていません。
デビッドソーンリー

2

フォーマルな指導とメンタリングは、初心者のコード品質において言語を選択するよりもはるかに大きな要因であると今でも主張しています。ただし、初心者向けに最初の言語を選択する必要がある場合は、独学のプログラマにはpythonを、大学の指導にはC ++を選択します。

その理由は、あなたが役に立つ何かをする必要がある何年も前に、強力な理論的基礎を築くための小さな、ささいなプログラムから始めることができる正式な指導です。時間に余裕があれば順序は理想的だと思います。C++は、講義間のコンパイラエラーやセグメンテーションフォールトに関して多くの助けを与えて、基礎を理解していないかどうかを知らせます。

これらの基礎の一部は、独学で習得するのは、経験を積むまで習得するのが非常に困難です。また、通常はできるだけ早く何か有用なものを作成する必要があり、必要に応じて理論的基盤を得ることができますが、このアプローチでは最低限以上のことを学ぶことはありません。そのため、Pythonのような言語をお勧めします。


2

私たちは大学でそれを逆に見ましたが、それは有用だと思います。*私たちは低レベルで始めました。ポインター、メモリ管理、文字配列...だから、はい、Cから始めました。アルゴリズムについても同じです。最初にリンクリスト、ハッシュテーブル、ツリーを実装します...そして標準ライブラリを使用します。

その後、Java、C#、perlなどのより強力な言語に移行しました。しかし、ベルトの下で何が起こっているかを知っているという利点があります。

これは機能しますが、スクリプト言語から下位レベルの言語に移行しても問題ないと思います。高水準言語と低水準言語の両方を知っていると、何が起こっているのかを理解しながら、高水準言語の使いやすさが確保されます。それらを学ぶ順序はそれほど重要ではありません。


1

スクリプト言語はプログラマをだらしなくさせません。問題の領域(プログラムが提供するビジネスなど)を理解することの明確性の欠如が、ずさんなことの原因です。

「COBOLは任意の言語で記述できます。」と言われていますが、すべてのデータ型が同じよう見えると、プログラムの重要な側面であるCOBOLの主要な機能を確認することが難しくなります。化。


1
疑う前に試してみてください。主な違いは、FooどちらにBarせよ、それがどこにあるのか、まったく違うものに気をつけないことです.frobnicate()。明示的なインターフェイスなし。

私の仕事はRuby on Railsであるため、動的言語にはかなり精通しています。はい、それは動的言語コミュニティ内の主要な慣習です。一般的に、これは「ダックタイピング」と呼ばれます。研究文献では、それらは構造型と呼ばれ、「quackable type」がどのように見えるかを示すことができるいくつかの構文規則があります。それだけでなく、それらを認識し、プログラムがアヒルを親切に扱っていることを確認できる型システムがあります。
ファーリーナイト

私は構造タイプについて知っていて、それらをかなりきちんとしたアイデアと考えています。しかし、それらを使用する単一の成熟した、リモートで広く使用されている(O'Camlレベルのユーザーベースがよいでしょう)言語はないので、動的タイピングの実用的な代替手段とは考えません。悲しいが、事実。

広く使われている言語はそうではありませんが、それはあなたがあなた自身の型システムを広く使われているものにブートストラップすることを妨げるものではありません。動的言語の型推論などに関する論文を見たことがあると思います。
ファーリーナイト

繰り返しますが、私と隣の人が使用するものを実用的な選択肢とは考えていません。プログラマーには、ライブラリ、安定した構文、ツールなどのようなものが必要です。

1

私は、スクリプト言語ずさんなテクニックを奨励していると主張します。(これは言語が悪いと言っているのではないことに注意してください、ただその言語で大きなコードベースを維持するのは難しいというだけです)しかし、私はここで他の答えとは異なる理由でそれを考える。

プログラマーがプログラミング全体の基本的な理解を必要とする言語を使用すると思います。ベクトル、ツリー、ハッシュテーブルなどの概念を理解していないと、どこでも効果を発揮しません。彼らは必ずしもこれらのものを実装できる必要はありませんが、彼らの特性を知る必要があります。

ずさんなところが出てくると思うのは、プログラミングスキルではなく、再利用可能なコンポーネントを作成する必要がある場合です。これらの言語では、コードユニット間で適切なインターフェイスを定義したり、ライブラリがクライアントに制約を強制するメカニズムを定義したりする必要はありません。そのような言語で優れた再利用可能なコンポーネントを作成することは不可能ではありませんが、それははるかに困難です。

スクリプト言語は初心者プログラマーにアピールします。なぜなら、より短い時間でより多くの「一回限りの」作業を行うことができるからです。

スクリプト言語が悪いと言っているわけではありません。ただし、膨大な(数百万行の)コードベースを維持することは難しくなります(スクリプト言語でこのようなコードベースが実行されない理由の1つです)。比較的小さなソリューションまたは1回限りのソリューションが必要な場合は、より短い時間でより少ないコードでより多くのことを達成できます(ほとんどの場合、コードが少ないほど優れています)。

すべての仕事に最適なツールはないことに注意してください。状況に最も適したツールを選択してください。他のツールと同じように、プログラミング言語でも同様です。


0

私はあなたの先生と一緒にいますが、あなたの先生が結果(例えば、パフォーマンスの知識がない)が悪いと仮定していると彼が言うとき、@ Singletonedとも一緒です。

スクリプト言語で始めるよりもCで始める方が良いと思います。教師として、私はフォン・ノイマンのアーキテクチャー全体(ALU、レジスター、メモリー、I / Oポートなど)に集中し、ポインターに直行します(ごめん、本当に重要な概念です[リリースしていませんVM言語での参照(つまり、ポインター)はメモリリークの主な原因です)])、いくつかのデータ構造(ツリー、リンクリスト、ハッシュテーブル1)をヒットし、...抽象レベルを他の何か(OO、関数型プログラミング、何か-強力な静的型付け規則、よ\ m /なので、「スクリプト言語」はありません> :()。

1うーん、多分私はパフォーマンスの考慮事項についてあなたの先生に同意するでしょう、結局のところ。


ずさんなプログラミングはメモリリークの原因であり、ファイルハンドルなどのリソースを追跡するよう人々に教えるのにそれほど時間はかかりません。メモリリークのあるCプログラムは数え切れないほどあるので、ポインターについてできるだけ早く人々に教えることで何が得られるのかわかりません。
-davidk01

それは事実ですが、...()いくつかの悪いコードに基本リードを理解していない(経由でハッキング-it's右ゴマやずさんなプログラミング)私はやる気にしようとしていた、と(b)は、なぜポインタは、まだ関係ありませんメモリリークに関して、ガベージコレクション言語よりもCの方が優れていると断言します。できるだけ早くポインターに到達する目的は、Cから抜け出すことができるようにすることです。
JohnL411年

0

モジュラー言語から始めて、より複雑なものに進むのが最善だと思います。私は、PascalとCOBOLから始めて、サブルーチン、制御フロー変数などの意味を理解しようとしました。Pascalに慣れて初めて、C / C ++のような言語に切り替えて、ジュニアプログラマーに追加された他のすべてのテクニックを学びたいとさえ思いました。


0

あなたは両方とも正しい。

スクリプト言語は、初心者の開発者が実際に何が起こっているのかを理解することを間違いなく困難にします。(データベース、フレームワーク、ライブラリもそうです。そして、ブラウザ、サーバー、ネットワーク、ファイルシステムもそうです。)若い開発者にインタビューすると、コンピューターが実際にどのように機能し、貨物になりやすいかについてほとんど知らないことにしばしば驚かされます。 -カルトプログラミング。

他方、インタビューで私が探す一番のことは完全な理解ではなく、彼らはものを作るのが好きだということです。始めたときは、何でもしているコンピューターがとても印象的だったので、私の小さなApple Basicと6502のアセンブラーは本当にすごかった。しかし、最近のコンピューターは多くの驚くべきことをしているので、人々が夢中になるのにそれが必要なのであれば、かなり高いレベルで始めても大丈夫だと思います。

基本的には、最終的により深い水域を狙う限り、プールの浅い端から始めても構いません。


0

まず、抽象レベルの高い言語から始めようと思います。現在、Pythonをお勧めします。スクリプト言語を最初の言語として選択する最も重要な理由は、機能するものを簡単にまとめることができるからです。ジョーが彼の質問で言及しているように、プログラマーになりつつある最たるものは、あなたがもっと深く掘り下げていくモチベーションがあるということです。この動機は、実用的で便利なソフトウェアを作成できるときに得られます。

抽象化を理解する(高レベル)および基礎となる実装を理解する(低レベル)という点に加えて、逃した3番目の点があります。優れたプログラマーになるためには、上記の2つの点の両方を確実にマスターする必要があります。さらに、新しい技術と視点を常に見つめることは、能力にとって重要です。どの抽象レベルから始めても、常に改善し、現在の方法に疑問を呈する必要があります。

プログラミング言語は仕事を成し遂げるための単なるツールであることを最初から明確にすべきです。特定のタスクに適したツールを選択することは非常に重要です。初心者のプログラマーにとって、高レベルのスクリプト言語はこの点を強調するのに役立つと思います。より高いレベルの言語は、より広い視野を与え、プログラマーがより深く掘り下げるように動機付けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.