プログラマーがなじみのない言語のコードをどの程度理解できるかに関する研究?[閉まっている]


15

言語Xを知っている経験豊富なプログラマーが、言語Yを使用して有能なプログラマーによって書かれたコードを、XおよびYなどの広く使用されているさまざまな言語でどれだけよく理解できるかについて、真剣な研究はありますか?

もちろん、プログラマーが1つの言語しか知らないので、現実の世界はそれほど単純ではありません。私たちが知りたいのは、たとえばC#でプロジェクトを行い、いつかFortranとAlgolだけを知っている古い物理学者がそれを見ると、彼らにはどの程度意味がありますか?それらのいくつかのランダムな句読点を無視すると、数学的な部分はうまく読み込めます。または、Pythonの専門家が私の賢いRubyスクリプトの欠陥を見つけることができますか?

表面的な構文のレベルから、オブジェクト、テンプレートのメタプログラミング、機能などの壮大な概念のレベルまでの問題がある可能性があります。あるプログラマーが「外国語」のコードのすべての構文の詳細を完全に理解することや、ある壮大な概念の宗教に従うことを期待しているわけではありませんが、主な制御の流れをどこまで得られるのか、その場所を見つけること画面に何かが描かれ、その色やサイズを決定する場所で、車を運転するようにプログラムされたロボットが、完了時にエンジンをオフにすることを確認します。

質の高い研究には、出版された学術研究、ある業界グループまたは大手ソフトウェア会社からの公式レポートが含まれますが、ワークショップやクラスの経験豊富なリーダーやその他の情報源による体系的な公平な観察を行います。短いブログ、シングルケースの例、逸話には興味がありません。(まあ、良い読みをするなら、いくつかの逸話かもしれません。)


1
勉強があるかどうかはわかりませんが、私の個人的な経験から言えば、はい、言語を知らなくてもプログラムを理解できました。
superM

2
これは、1組の言語に依存します。C#とJavaを選択します。これにより、すぐに慣れることができます。Algol vs. Cを選択してください。1ページのチートシートで親しみが得られます。CとPrologまたはWhitespaceとAdaを選ぶのは幸運です-イライラするでしょう。ちなみに、プログラムを理解する上で役立つのは言語だけではありません。Cで記述されたMFCコードを理解しようとする組み込み設計に特化したCの専門家は、かなり残念な光景です(これは実際の経験です)。
-dasblinkenlight

代数を理解している人にとって、三角法を理解するのと、微積分を理解している人の場合、どれほど簡単ですか?それは言語とパラダイムに依存します。言語は絶えず進化しているため、言語間の違いを検出して分離するのは非常に困難です。私は、誰もが合理的な量の正確さで理解を評価できると真剣に信じています。
エヴァンプライス14

回答:


9

それは明らかに、言語が互いにどの程度関連しているかに依存します。たとえば、CまたはC ++のバックグラウンドがあり、C#またはJavaプログラミングを行っている場合、その2つの言語(JavaまたはC#)のもう一方を簡単に読んで理解できるはずです。Lispをよく知っていれば、Schemeはそれほど問題にならないはずです。C、C ++、Perlの知識があるだけで、PHPに関する知識がなくてもPHPプログラムをデバッグしたことがあります。そのプログラムがHaskellやSmalltalkで書かれていたとしたら、それは私にとって不可能に近いほど大変なことでした。

実際、このトピックに関する学術研究が意味をなさないと思います(少なくとも、深刻なものではありません)。「言語Xを知っている標準的な経験豊富なプログラマー」のようなものはないので、どの研究でも保証された基礎データが失われます。人々は異なる知識を持ち、たとえ同じ学校に通ったとしても、才能や意欲は異なります。

しかし、彼らはどの程度まで主制御の流れを得るのだろうか、画面上で何かが描かれている場所を見つける

コードの品質が非常に低いか、使用されているフレームワークが非常に複雑であるか、コードベースが非常に大きいため、言語に精通している場合でも難しいかもしれません。


6

学術的に実施された研究リファレンスについてはわかりませんが、C#/ C ++ / Java / Pythonなどの言語のメソッド、クラス、および関数のわかりやすい命名は、コードベースとビジネスプロセスフローを理解しやすくする必要があります。

プロジェクト内および一般にソフトウェア開発における命名規則は、非常に重要な側面です。ただし、its importance品質の高いソフトウェアの構築との関連性は、しばしば見過ごされたり無視されたりします。

.NET Frameworkで使用される命名ガイドラインと.NETで使用される一般的な命名規則も、参照するのに適しています。


優れたAPI設計と命名規則は役立ちますが、言語ベースの命名規則でさえも、その言語にのみ適用される方法で「意見が多い」ことがよくあります。C#/ Java(ほぼ同一)のほかに、ほとんどの言語は、その言語に固有の独自のワークフローと実装を持つ異なる原則で動作します。たとえば、メガモノリシックコアフレームワークモデルに従わない言語では、通常、共通のパッケージマネージャーを使用して結合するパッケージの巨大なエコシステムが見つかります。
エヴァンアカガレイ

3

それは個々のプログラマーと、彼らがどのように言語を内部化するかに大きく依存します。何十もの言語で仕事をするのに全く問題はありませんが、C ++しか知らない友人がいます。彼は私よりもプログラミングの方が悪くなく、違う方法を学んだだけです。

個人的には、関連する質問がより興味深いことに気付きました。コードにバグがある(つまり、プログラマX someFunction(x, y)が書いたと思っていたが、実際に何か他のものを書いた)場合、2番目の開発者がバグを特定するのはどれほど難しいですか?優れたプログラマーXは、コンピューターが望んでいたことを非常に明白にし、それは読みやすくなります。しかし、彼が間違いを犯した場合、それは大きな問題になる可能性があります。次のC ++バグのようなもの:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

あなたが言語を知らない限り、検出することは非常に困難です。


1

他の人が言ったようにプログラマーに依存するだけでなく、構文、哲学、実装の両方の言語間の類似性にも依存します。

多くの異なる言語がC派生構文を使用しているため、そのタイプの構文に精通していれば、制御フローに従うのが簡単になります。同じことは、強く型付けされた言語と緩やかに型付けされた言語、高次関数をサポートする言語、抽象化のレベル、およびプログラム哲学についても言えます。構文を読むことができるかどうかだけでなく、言語の概念と哲学にも精通している必要があります。

たとえば、Cを学んだ場合、C#、Java、またはC ++などから制御フローを導出できると期待するのが妥当だと思います。構文の違いにより、VBを解読するのは少し難しいでしょう。クロージャ、弱いタイピング、高階関数のためのJavaScript(Cでこれを実行できることは知っていますが、少し不安定です)。ただし、Lisp、F#、R、または完全に異なるプログラミングパラダイムを使用しているアセンブリをデバッグできるとは思わないでしょう。

TL; DR構文を認識できることが重要であるだけでなく、ほとんどの場合、宣言またはメソッド呼び出しを解読できますが、プログラムが特定の方法で記述されている理由の背後にある理由を理解できることは、コードの理解と読み取りの核心です。

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