あなたが「専門家」であることを示す3つの主要なプログラミング言語の機能は何ですか?インデントなどの「実用的な」スキルは除外してください。
C++で習得するのが最も難しいのはSTL /ジェネリックスだと言ってもいいでしょうか。 Javaは、メモリが処理されるため、はるかに簡単に見えます。C#でも完全にはわかりませんか?
これを使用して、現在のレベルの能力と私が目指したいことを判断しようとしています。
pSこれはstackoverflowに投稿されましたが、議論のためにビンに入れられました、私は皆からの回答に本当に興味があるのでそれを市民に保つようにしてください:)
正直なところ、この3つの言語をこのような質問にまとめることはできないと思います。 JavaとC#は連携して動作するのに十分近い可能性があります。ただし、C#のより興味深い機能の一部がより困難で、したがって「エキスパート」レルムでより多くの機能があったとしても、驚きはしません。 C#とJavaには共通点がありますが、C++はまったく別のリーグに属しています。正しく使用しないと、おかしなことをすることが多すぎます。いくつかの機能-テンプレートのようにway JavaまたはC#よりもC++の方が強力で複雑です。これらの3つの言語に共通している機能として、 「エキスパート」レベル。一般的に、ある言語のエキスパートになる要素は、他の言語に必ずしも備わっているとは限らない難解な要素であり、他の言語に引っかかる可能性が高くなります。
プログラミング言語に関係なく、プログラマーとしての知識を測定するということは、アルゴリズムやデータ構造に沿ってより多くのものを測定することを意味します。デザインパターンと優れたソフトウェアエンジニアリングの原則をどの程度理解しているかは、インデントの方法よりもはるかに重要です。
一般にプログラマーの専門家になるスキルのタイプは、特定のプログラミング言語の専門家になるスキルのタイプとは異なります。両方を持っていることは良いことです(そして、使用する言語で少なくとも適度な能力がない場合、非言語固有の知識はあまり役に立ちません)が、2つの非常に異なることについて話しているとき誰かが特定のプログラミング言語の専門家になっている理由や、一般に彼らが専門家のプログラマになっている理由について話しています。そして、C++、C#、およびJavaなどの比較的類似した言語でも、特に言語自体の専門家としての資格がある傾向がある言語)はかなり詳細が異なるため、何があなたを専門家にしているのかを判断しようとするときに、それらをグループ化して、実際には機能しません。
C++の最も複雑な機能はテンプレートです。テンプレートは、その強力さと厄介な構文のためです。事前に記述されたものを使用することは難しくありません。単純なテンプレート化されたクラスや関数を記述することも難しくありませんが、C++テンプレートは、コンパイラーが実行するチューリング完全言語です。
私はむしろあなたがリストするそれらの言語のそれぞれの構文は全く学ぶことは難しくないと思います。私の意見では、「難しい」部分は2つあります。
それらに付属するフレームワーク(C++のSTL、JavaのJRE、C#の.NET Framework)は膨大であり、マスターするのにlong時間がかかります。
パターン、実践、パラダイム。あなたが言及する3つの言語は、オブジェクト指向プログラミング言語の特徴であり、「猫は動物のサブクラスです」以来、長い道のりを歩んできました。適切なテクニックを知る( [〜#〜] solid [〜#〜] 、 GoFパターン など)
プログラムをスレッドセーフにし、多くのコアにスケーラブルにする。
しかし、それはどの言語でも難しいことです。
Programmer Competency Matrix は、言語にとらわれない方法でスキルレベルと目標を評価するのに適した方法です。
次に、Xを特定の言語で確実に実行できるかどうかを自問することで、言語固有にすることができます。
C#で把握するのが最も難しいのは、デリゲートとラムダです。私は、SQLクエリ形式を使用してすべてのLINQクエリを記述しています。私はF#を学んでいるので、C#ラムダはずっと簡単になり、本当に楽しんでいます。デリゲートに必要なのは、少し集中した努力(私は怠惰にならないことを要求しました)であり、それから彼らは理にかなっています。
Microsoftは完全なドキュメント(IMO)を持っているので、全体として、C#ライブラリはそれほど大きな問題ではないと思います(サードパーティのライブラリについて話さない限り)。
C#では、最も難しい機能は簡単に一般的な共分散と反分散です。移動 ここ 、下にスクロールして、下から上に1つずつブログの投稿を読みます。そのすべての言葉、特にすべての例を理解するようにしてください。警告:あなたの脳は傷つきます。
すべてを理解したら、実際にそれを理解してみてください。共変スタックを作成できる理由を理解します(ソースコードはリンクしたページの投稿の1つに表示されます)が、共変キューは作成できません(少なくとも、大幅な速度低下はありません)。
最後に、それらの使用法を見つけて(ささいな^^ではありません)、自分で実装してみます。再帰的な構造でそれを使用する場合は、ボーナス称賛を与えます。そして、すべてを機能させるためには、コンパイラーからジェネリックを「隠す」必要があることを理解します。
それをすべて実行したら、おめでとうございます!あなたは、おそらく二度と使用しない非常に複雑なC#言語のスキルをなんとか身につけました。
言語についての最も難しい部分は、機能を知ることではなく、いつ使用するかを知ることだと思います。例としてC#のイテレータを見てみましょう。
IEnumerable<int> Ints()
{
yield return 1;
yield return 2;
yield return 3;
}
ええ、それは実際の例ですが、機能の適切な使用法ですか?私はそうは思いません。同じことが、どの言語の機能にも当てはまります。私はF#で計算式を扱ってきましたが、それらは理解しています。それらをいつ使用するかについて、いくつかの良い例を知っています。問題は、私がまだそれらを新しい問題に適用できるほど熟練していないことです。