インタビューの中で「C#で嫌いな5つのことを教えてください」という質問に答えるのが難しいのはなぜですか [閉まっている]


32

ではポッドキャスト73、ジョエル・スポルスキとジェフ・アトウッドは、他の科目の中で、「誰もが自分の好きなプログラミング言語について憎むべきで5つのことを」について説明します。

現在のツールチェーンに満足している場合は、切り替える必要はありません。ただし、お気に入りのプログラミング言語について嫌いな5つのことをリストできない場合は、まだ判断するのに十分な知識がないと思います。代替案を認識し、使用しているものに健全な批判的な目を向けることは良いことです。

興味があるので、インタビューした候補者にこの質問をしました。C#¹について嫌いなことを少なくとも1つも引用できませんでした。

どうして?この質問で何がそんなに難しいのですか?インタビューのストレスの多いコンテキストのために、この質問がインタビュー対象者によって答えられないのはなぜですか?

この質問について、面接を悪くする何かがありますか?


明らかに、C#が完璧であることを意味するものではありません。私は自分がC#について嫌いな5つのことのリストを持っています:

  • ジェネリックに可変数の型がない(params引数の場合と同様)。
    Action<T>
    Action<T1, T2>
    Action<T1, T2, T3>
          ⁞ 真剣に!
    Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>

  • F#のような測定単位のサポートの欠如。

  • 読み取り専用プロパティの欠如。private readonly読み取り専用プロパティが必要なたびにバッキングフィールドを書き込むのは退屈です。

  • デフォルト値を持つプロパティの欠如。そして、はい、パラメーターなしのコンストラクターでそれらを初期化し、他のすべてのコンストラクターから呼び出すことができることを知っています。しかし、私はしたくありません。

  • 多重継承。はい、それは混乱を引き起こし、ほとんどの場合それを必要としません。いくつかの(非常にまれな)場合でも有用であり、混乱は同じ名前のメソッドを含むいくつかのインターフェイスを継承するクラスにも当てはまります(C#で解決されました)。

このリストは完全にはほど遠いものであり、強調すべき点ははるかに多く、特に私のものよりもはるかに優れています。


¹少数の人々は、.NET Frameworkの一部のアセンブリまたはフレームワークに一部のライブラリがないことを批判したり、CLRを批判したりしました。質問は言語自体に関するものであり、.NET Frameworkのコアにある否定的なもの(たとえばTryParse、文字列をいくつかの型に解析したい場合は、すべての型について繰り返す必要があります)、JSONまたはWCFについての答えは完全にトピック外です。


52
Why the question “give five things you hate about C#” is so difficult to answerそれはリストの質問であり、邪悪なmodがあなたに答える機会を得る前に「建設的ではない」としてそれを閉じるからです
;;

6
@Yannis Rizos:良い点。ところで、タイトルにこの質問を入力すると、Stack Overflowは「質問している質問は主観的であり、閉じられる可能性が高い」と
アルセニムルゼンコ

5
おそらく、プログラミング言語について嫌いなもののためのあなたの脳のストレージスペースは、あなたが対処しなければならない他の言語の側面でほとんど満たされているでしょう。
-whatsisname

9
おそらくほとんどの人が嫌いではないからです。憎しみはほとんどの人にとって非常に強い言葉です。あなたがC#について「嫌い」な本当に本当に些細なアイテムのリストから判断すると、実際に何かを憎む何らかの理由があるとき、私はあなたの近くのどこにもいたくありません。あなたの頭が爆発するのではないかと思います。また、リストを思い付くために本当にストレッチする必要があり、それを考える日があったので、リストを思い付くのはほとんどの人にとって難しいと思います。
ダンク

19
リストのすべての項目が、何か間違っているのではなく、何かが欠けているということに気づきましたか。私の見解では、あなたはインタビューの質問に失敗しました。誰もが言語に欠けている機能をリストし、それを嫌う理由として宣言できますが、最も嫌われる言語はすべての機能を備えた言語になります。
スティルガー

回答:


42

推測する必要がある場合:

  1. 一部のプログラマーは、多様な言語に触れることができません。より良いものが存在することを知らない場合、言語の問題を見つけるのは困難です。

  2. 一部のプログラマは単なるコードモンキーです。彼らは彼らの目の前の問題をかろうじて分析しているだけでなく、彼らのプログラミング言語の改善のようなものは言うまでもありません。

  3. 特に重要な人はほとんどいません。彼らは欠点ではなく、利点と機能を見ています。インタビューがそのように進んでいない場合、彼らがその思考様式に移行することは困難です。

  4. 少なくともここでは、過度に批判的であることは致命的な人格の欠陥と見なされます。「私が住んでいた一部の地域のように」常により良い方法を探している洞察力のある開発者である代わりに、彼らは「すべてを嫌う嫌いな人」です。自分の言語で嫌いなことを考えることができる人でさえ、面接の設定では控えめに見えるようになるかもしれません。


22
2番については、Software Simians、Sir。
トニエズウィエズ

@Tom私はそれがpan programmatoribusだと思った。
ステファノボリーニ

9
@Telastynはあなたの答えに5つの箇条書きがあるべきではありませんか?
ベンジャクソン

#4は、特にC#の使用に専念している作業環境で、すぐに思いついたものです。一般的なインタビューや職場での行動のアドバイスを考慮すると、就職の面接でこれを尋ねられることは、その人を雇いたくない「悪い態度」をつかむための餌のように思えるかもしれません。法的起訴とは異なり、就職面接では、わなは効果的な抗弁とはなりません。;-)
ドロンツ14年

35

次のような理由で、インタビュー中に質問に答えるのは非常に難しいと思います。

  1. 本当に予期しない

  2. 多くの思考が必要であり、インタビュー中に使用されたものとは非常に異なる方法で思考し、

  3. 一般的に短い時間で答えるのは難しい(面接の前に準備しない限り)。

1.予想外です

特にストレスの多い状況では、予期しない質問は本当に難しいです。インタビュー中に次のダイアログを想像してください。

-の違いは何だHashSet<T>とはList<T>
‒ハッシュセットは、要素の検索が非常に高速になるように最適化されています。たとえばset.Contains()、ループ内で何度も使用している場合、setfromリストをhashsetに移動すると、処理が速くなる場合があります。
‒読み取り専用プロパティを作成するにはどうすればよいですか?
readonlyゲッターのみを持つプロパティのバッキングフィールドとしてマークされたフィールドを使用します。
‒使用法はsealed何ですか?
‒継承してはならないクラスに使用します。
‒最後に歯科医を見たのはいつですか?
- 何?!

2.それには多くの異なる考え方が必要です

一般的なインタビュータイプの質問をするとき、あなたは記憶を使って、本や言語やフレームワークに関する実践から学んだことを思い出します。答えを見つけるために少し考えるかもしれませんが、あまり多くはありません。

一方、嫌いな5つのことについての質問には、より深い思考が必要です。本から学んだことを思い出すことはできず、類推によって何かを見つけることはできません。受身である代わりに、批評家になり、使用している言語で不快なものを見つけなければなりません。

3.時間を要する

率直に言って、私はC#について嫌いな5つの(実際にはもっと)もののリストを持っていますが、私は長い間それについて考えました。いくつかのものは.NET Framework 2時代のものです。.NET Framework 2についてリストしたほとんどの問題は削除されたため、もはや有効ではありません。一部はLINQとこのすべての機能プログラミングのもの、その他は動的プログラミングのものです。この質問を準備せずに、インタビュー中に5つの要素すべてを見つけることができるかどうかはわかりません。


3
一般的には正しいと思いますが、特定の言語で十分な時間プログラミングすると、特定の「特殊性」を嫌うようになります。ある種のヒットリストのように。または、少なくともこれまでに使用した言語/プラットフォームごとに1つあります。または多分私は甘やかされて、好き嫌いです。
K.ステフ

2
@ K.Steff:「ヒットリスト」は完璧な名前です:)。私のお気に入りのプラットフォームでさえ、5つ以上の問題があることは確かに考えられます。あなたが私が好きではないが使用することを余儀なくされている言語(例えば、JavaまたはPython)について私に尋ねる場合、私はおそらく何時間も続けることができます:
ティコンジャービス

1
あなたが言語で嫌いなものを簡単に思い出せるかどうかは、「特異性」があなたが対処しなければならない他のものと比較してどれだけ厄介であるかに依存します。たとえば、私の仕事のほとんどは、特定の(特にひどい)外部システムとそのAPIとの対話を伴います。C#/。NETについてのほとんどの不満は、比較すると見劣りし、私の心の奥に押しやられます。
ダンライオンズ

各言語/プラットフォームの「ヒットリスト」を追跡し、「十分な時間」特定の言語でプログラミングを行っているときに持ち歩くことができるのは素晴らしいことです。それから、「十分な時間」のプログラミングの後にこれらの問題を持ち歩くことに煩わされない人もいます。他の人が行うことは、ヒットリストの問題の解決策を見つけ出し、ヒットリストの問題を解消するために再び心配する必要がないことです。リストを持ち歩くのに十分な問題であれば、彼らは自分の好みに応じて解決するのに時間をかけるのに十分な問題だと考えたに違いありません。
ダンク14

21

5という言葉のために難しいと思います。憎しみという言葉のせいで、それほどではありません。

ファイブ?4つしか考えられない場合はどうでしょうか?質問に答えられませんでしたか?5つ以上ある場合はどうなりますか?さて、その場で、どれを使用するのがベスト5かを把握する必要があります。

憎悪は非常に否定的な言葉です。面接で避けるように言われるのは一種の否定的態度です。また、私はそれは彼らがすべての日のプログラミングを過ごすことになります言語について、彼らは「憎悪」という多くのものを持っている多くの人々に奇妙に聞こえるだろうと思う一部の人々も、それはトリックの質問だと思うかもしれません:。彼らは実際にいる場合来ます5つのことを考えると、C#を嫌いすぎてうまくプログラムできないために失格になります。残念ながら、この種のひねくれた質問はインタビューでは前代未聞ではありません。

代わりに、C#についてはあなた次第で何を改善しますかと尋ねることができますか? これにより、インタビュイーはいくつでも答えることができます。この言い回しは、「憎しみ」という言葉の否定性を、比較的前向きな「改善」と引き換えにします。


2
「5」に対するあなたのポイントは良いものです-多くの人はおそらくさまざまな程度で嫌いなものを連続しているでしょうが、トップ5を表すものを決定できる唯一の方法は、近いかもしれないものすべてをランク付けすることです。誰かが一般的にささいな不快感を伴う何かに問題を抱えたばかりの場合、彼らはそれが本当にトップ5になるべきかどうか、またはそれがそう最近問題だったので思いついただけなのかを把握するためにしばらく考える必要があるかもしれません。さらに、C#は.NETと非常に絡み合っているため、何に責任を負うべきかを言うのは困難です。たとえば...
supercat

1
...すべての言語、コンストラクターがスローした場合、部分的に構築されたオブジェクトが取得されること保証Disposedする必要があるが、すべての言語がそれを強制するという要件がない場合、そうする言語は誤った期待を招くと主張できると仮定する。したがって、C#コンストラクターの障害時のリソースリークを回避する難しさを、C#またはCLSのせいにする必要があるかどうかは不明です。
supercat

14
  • ほとんどの候補者は、対比するために複数の言語やパラダイムに深く関わっていません。私は今、5年以上にわたり、他のオブジェクト指向言語で働いていない、と私は(PowerBuilderの)で働いていた一つは、私が持っていた多くのことをとのぞきの。大学を卒業したばかりのほとんどの人は、1つ、おそらく2つの言語で(または彼らであると思う)ホットなものであり、3つまたは4つ以上の「暴露」を受けていますそれを勉強するコース)。それは言語の何が問題なのかを本当に知るのに十分な知識や経験ではありません。現実の世界で仕事に就くと、その焦点はかなり狭まります。あなたは給料を受け取る言語について他のどの言語よりも多くを学び、その過程で、あなたが覚えていないところまで、その言語がしない、または奇妙な方法で行うことを受け入れるようになります別にそれをやって。

  • Java / C / C ++と比較するほとんどのC#に精通した候補者は、かなり満足しています。C#は、Javaよりも多くのこと(イベント、コールバック、グラフィックライブラリ、データベース作業)を行うためにゼロから設計されました。Javaは、C ++よりも使いやすく、正しいコードに重点を置いて設計されています。驚異的なパフォーマンスと回路レベルに近い制御が重要な必需品ではない環境で、C ++に戻りたいC#プログラマーにまだ会っていません。

言い換えれば、See-Sharpersにはかなり優れた機能があり、すべてが考慮されています。

私のリストは次のとおりです。

  • Lambdaステートメントは監視/評価できません。名前付きメソッドの呼び出しは、VSのQuickWatchにプラグインできます。式もできます。しかし、ラムダ?いいえ(VS2010では少なくとも)。Linqチェーンのデバッグを非常に面倒にします。

  • string以外の参照型のオプションのパラメーター値はnullのみです。オーバーロードスタックを作成している場合は、他のデフォルトを使用することもできます。プロパティまたは別のパラメーターに基づいた単純な式に基づいて1つの値をデフォルト設定できる場合があります。しかし、私はできません。そのため、オプションパラメーターのオプションが大幅に制限されると、オーバーロードスタック(ボイラープレートを処理するReSharperのようなリファクタリングアシスタントではマイナー)を作成する必要がないという価値が低下します。

  • C#は、深刻なレガシーコードの問題を抱えるほど古くなっています。もともと1.1向けに記述されたコードは、4.0に慣れていた人ならだれでも恐ろしくなります。2.0コードでさえ、多くを見逃しています。同時に、サードパーティのライブラリが登場し、ADO.NETのようなものはひどく原始的なように見えます(そしてADO.NETの「接続モデル」の多くは大きなアンチパターンになりました)。しかし、後方互換性のために、.NETはこのすべての古くて悪いコードのサポートに沿って急いで、「ArrayListはそれを行う安っぽい方法でした。申し訳ありませんが、それを入れてしまいました。代わりにListを使用し、さまざまな型のリストが絶対に必要な場合は、として宣言しますList<Object>

  • 深刻に制限されたswitchステートメントルール。おそらく、PowerBuilderについて私が言える最高のことの1つは、Choose Caseステートメント(switchと同等)が変数に基づいたブール式を許可したことです。また、コードがあったとしてもswitchステートメントが通過することを許可しました。私はその2番目のものが許可されない理由を理解しています(それは意図的よりも意図せずに行われる可能性が高い)が、次のようなステートメントを書くことはまだ良いでしょう:

    switch(someInt)
    {
        case < 0: //all negative values enter here
           //...
           break;
        case 0: 
           //...
           break;
        case 1:
           //...
           //no break; continue through to the code for > 1
        case > 1 // all positive values enter here (including 1)
           //...
           break;
    }
    
  • INumericインターフェイスはありません。数値の場合、それを使用して数学を行うことができます。多くの場合、実際のメソッドは、どのタイプがプラグインされているかを正確に気にする必要はありません。精度は呼び出し元の責任です。しかし、数値型のみをGTPとして受け入れることができるジェネリックメソッドまたはクラスを作成することはできません。

3
「Java / C / C ++と比較するほとんどのC#に精通した候補者は、これにかなり満足しています」。これが私の考えでした。C#を嫌うことはそれほど多くありません。C#を使用すると、技術的な問題の解決策ではなく、ビジネスの問題の解決策に集中できます。私がこの言語で持っている最大の不満は、技術的に変数であり定数ではないため、スイッチケーステストでリソース文字列を使用できないことです。
スティーブン

4
ジェネリックとコンテナのビット-ジェネリックで拡張するスーパーと不明瞭な有用な例?少し説明します。割り当てるBag<Fruit> bag = Bag<Huckleberry>ことは、あなたがそれbag.add(new Watermelon())を保持することができなかったことができることを意味します。

4
数字なしの場合は+1。まれですが、迷惑です。
jmoreno

仮定Thing<out T>インスタンスメソッドと静的メソッドの両方によってアクセスされる静的フィールドを有しています。場合Thing<Cat>期待メソッドに渡されThing<Animal>、その方法は、前述のインスタンスとに静的メソッド呼び出しThing<Animal>参照、静的フィールド(S)べきこれらのメソッドへのアクセスを?
supercat

11

問題の一部は悪い答えを与えることの恐怖であることをお勧めします-あなたはあなたがXを嫌い、インタビュアーがXを愛している、またはXを嫌うあなたの理由はばかげていると思います、あなたはそれが大丈夫だと思うことはあまり議論の余地がないように見えるかもしれないと言って。

これはおそらく、ほとんどの人があまり考えていないことです。彼らには現在の問題と過去の問題があり、言語によって引き起こされた過去の問題は終わりました。そのため、人々は主に解決策を考えており、それはより重要な問題ではなく、言語によって引き起こされた現在の問題を抱えている人はほとんどいません。


7

インタビューについては、1つまたは2つだけをお願いしますが、使用するツールの制限に名前を付けられない場合、おそらくあまりよく知らないでしょう。私たちはSSISについてこの正確な質問をしますが、これは小麦をもみ殻から分離するのに本当に役立ちます。この質問に答えた私たちが雇ったすべての人は、素晴らしい従業員になりました。数回見た人ではなく、高度な知識を持つ人が必要です。そして、それもあなたが望むものだと思います。

これは妥当な質問であり、多くの人が答えられなかったという事実は、仕事の候補者の多くが実際にどれだけ貧弱であるかの例に過ぎません。誰かがツールの制限を把握できるほど分析的でない場合、難しいプログラミングの問題を解決するために、分析的に十分なものになるのはどうでしょうか?


1
+1 Fiveは威圧的です。そのため、1または2はおそらくより多くの答えを得るでしょう。
ローランクーヴィドゥ

2
憎しみは制限とはまったく異なります
......- mattnz

4

あなたが言ったように、C#の詳細な経験の欠如や他の言語への露出の欠如があります。私は、C#の表面の小さな傷でも明らかになるはずのいくつかの質問に答えることができなかった、自分たちが年長だと思っている多くの開発者にインタビューしました。

十分な掘り抜きがなければ、言語の限界に達せず、それらが消えることを望みません。誰かが疑問に思っている場合の私のトップ5

  1. 不変オブジェクトの作成には、多くのセレモニーが必要です(オブジェクトがデフォルトで不変である関数型言語とは対照的に)。
  2. メタプログラミングを行うのは困難です。タイプ放出をLispマクロと比較します。(コンパイラサービスは、今後これに大いに役立ちます)。
  3. 拡張メソッドは素晴らしい...拡張プロパティであり、拡張演算子(具体的には暗黙的および明示的な演算子)の方が良いでしょう。
  4. 明示的なキャストは、実行時ではなくコンパイル時に解決されます。
  5. シーケンスマッチングがないため、関数のオーバーロードよりもずっとクリーンです。

最初の2つの点に同意しますが、拡張機能の暗黙的な変換という考えに身震いします。
-CodesInChaos

3

私は彼のラウンドで彼が言っている方法について考えています。それが壊れていると思うなら、おそらくそれがそのままである理由を理解しないでしょう。あなたの知識に穴があるかもしれません。

皮肉なことに、それをインタビューの質問として使用して「偉大なジョエル」を引用していると思うインタビュアーは、おそらくその点を見失っています。


私はこれが常にそうであるとは限りません。たとえば、ダグラス・クロックフォードは「JavaScript:The Good Parts」で、言語の特定の機能を避けるべきだと言っていますが、使用するには「ハードコアすぎる」とは考えていません。
K.ステフ

10
彼は反対を言っていると思います-プラットフォームがまったく壊れていないと思うなら、あなたはそれを十分に知りません。つまり、彼のポイントは、あなたがその欠点を盲目にしない限り、単一のプラットフォームに固執することは問題ないということです。
ティコンジャービス

3

彼らは、彼らがあればという印象の下にあるかもしれないので、彼らは答えに消極的であるかもしれないことができます彼らはインタビュアーが振り向くと言うかもしれない言語について嫌い5つの事をリストアップ忍者「ああ、私たちは、C#を探している『』とあなたがいないようです言語が好き」、または「言語が気に入らないのになぜ仕事に応募したのですか?」

インタビュイーは、インタビュー中に前向きな姿勢を保つよう、多くの圧力を受けています。


ある言語で何かを嫌うなら、それはその言語を嫌うという意味ではありません。この質問には<del> </ del>肯定的な方法で回答する必要があります。HTML4で何も嫌わないのに、なぜHTML5が必要なのですか?:)
e-MEE

3

言語は私たちの考え方を形作るからです。毎日C#を使用することで、言語の問題を自然に回避する方法でコードを考え、設計する習慣を身に付けました。

あなたは今、あなたがそれをすることを知らずに、考えずにそれをします。これが、悪いことを指摘するのが非常に難しい理由です。C#の学習を始めた日には、多くの問題を発見したことは間違いありませんが、今ではもう問題は見当たりません。習慣は強力なものです。思考習慣、さらに

これの良い面は、C#の欠陥をリストするのが難しい場合、それはあなたが優れたC#プログラマーであり、言語が好きであり、他の言語よりも多く使用しているためであるに違いありません。

しかし、C#の欠陥をもっと見られるようにしたい場合は、考え方を変える必要があります。より多くのプログラミング言語を学び、それらに慣れてください。最も可能性のある言語を目指します。静的型付けに慣れていますか?PythonまたはRubyを試してください。オブジェクト指向と命令型に慣れていますか?Haskellはまったく別の世界です。

そして、C#に戻ると、「Haskellのたった1行であるこの単純なことを行うのに、なぜ100行のC#が必要なのでしょうか?」C#について多くのことを嫌います。

  • C#には、null不可の参照型はありません。
  • 代数データ型はありません。
  • 文字列補間なし。
  • 構文はどこでも過度に冗長です。
  • マクロシステムはありません。
  • 型推論は制限されています。
  • 正規表現リテラルはありません。
  • 構造的な型付けはありません。
  • 不変性に対する不十分なサポート。
  • C#構造体はエラーを起こしやすいです。
  • 標準コレクションライブラリは非常に限られています。
  • コンストラクターのパラメーターに制約を定義できません。
  • 数学演算子の制約で一般的にプログラムすることはできません。
  • 「newtype」はありません。
  • 配列スライス、範囲リテラルはありません。
  • 関数には、そのタイプの一部として実行できる副作用はリストされていません。:)

(もちろん、言語にすべてを含めることはできません。言語設計は非常に難しく、すべての機能を同じ言語に追加することはできません。目的に応じて異なるツールを使用します。)

はい、特にインタビュー中に、質問にうまく答えることは困難です。しかし、それに答えることができる人々は、彼らがそれについて考えたこと、ある視点を持っていることを証明します。


+1。素晴らしい点。実際、私がC#で実際に嫌う多くのことは、他の言語には同じ欠点がないという事実から来ています。実際のタプルの欠如(つまり(a, b) = this.something();、Pythonのように実行できないこと)が最初に思い浮かびます。
Arseni Mourzenko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.