私はすでに私の会社のためにいくつかのインタビューをしました、主に開発者のポジションのためのコンピューター科学者だけでなく、何人かのテスターとプロジェクトマネージャーも。次に、R&D部門内の私たちの研究グループの欠員を埋める必要があります(補足:「研究」とは、大学、他の企業、研究センターと共同で研究プロジェクトでソフトウェアを使用して、専門分野/市場ニッチの問題を解決しようとすることを意味しますこれはコンピュータサイエンスの研究ではなく、P = NP問題を解決するつもりはありません)。
今、私たちは化学の修士号を持っている人を招待しました(彼のCVにも多くの物理学が含まれています)。私はすでに地元の大学のキャリアデーで彼と約30分話しました、そして彼が賢いのは間違いありません。また、彼の成績は優秀であり、彼は区別して卒業しました。彼の学士号のために、彼はMathematicaでプログラミングを教える必要があり、彼はプログラミングがとても好きだと信じていました。また、彼は理学修士論文のためにMathematicaで実装された彼自身のソフトウェアを使用しておそらく理解できないいくつかの物理化学の問題を解決しました。 GUIと8,000 LoCの注目すべきサイズが含まれています。彼は私たちの研究グループで行っていることに非常に惹かれているようで、正直に言うとSME私たちのように優秀な人材を獲得することは非常に困難です。私も彼を雇うことに非常に興味がありますプロジェクトの提案、レポートの作成、プレゼンテーションの作成などを手伝ってくれたので、彼もおそらく私たちのチームに合うでしょう。
残っている質問は次のとおりです:プロジェクトでソフトウェアを実装するために必要なプログラミングスキルが得られるかどうかを確認するにはどうすればよいですか?仕事の一部?
もちろん、私は彼にそれが何であるかを尋ねます、それはプログラミングについて彼を魅了しています。また、彼が自然科学ソフトウェアをどのように作成し、どのように構築したかについても尋ねます。彼がどのようにして彼が必要とするソフトウェア開発に関するスキルと情報をどのようにして得たかについて尋ねます。しかし、もっと質問できることはありますか?何かもっと具体的なことはありますか?彼に彼のMathematicaソリューションを説明するように頼むべきですか?
明確にするために、私は特定の言語や技術スタックの知識を探しているのではありません。私たちは製品開発の.NETショップですが、私は研究プロジェクトに自由な選択肢を持ちたいと思っています。だから私は、メタ能力が実際に必要なものを何でも学ぶことができることに興味があります。
私はこの質問に答えることができ、自由回答ではないことを願っています。私は、仕事でさらにプログラミングスキルをgetする能力をチェックするデフォルトの方法があるかどうかを知りたいのです。ご不明な点がございましたら、コメントをお寄せください。質問を改善させていただきます。
皆さんの回答に感謝します。それらのほとんどは非常に役立つので、私はたくさん賛成しました! Tom Squiresの回答 が最も多くの票を獲得しましたが、 Prince Goulashの回答 を受け入れます。もちろんトムは客観的に正しいですが、プリンスの答えは私にとってはより役に立ち、FAQ thatthisis a基準答えを受け入れます。
The Camel Has Two HumpsChris Burt-Brownによる言及 の例のような簡単な割り当てを彼に説明させます。
おそらくグラフィカルな表記で、より高度な制御フローについて説明するように彼に依頼します。
数学の例を使用して、再帰についての彼の理解を確認します。
彼に自然言語で選択したアルゴリズムを説明させてください。
Mathematicaのソリューションについて彼に説明させてください。特に、彼の手順モデル、ツールの使用法、コードとソフトウェアの一般的な構造、およびさまざまな抽象化レイヤーについて尋ねます。
彼の動機をチェックするために、私は彼のソフトウェア開発の魅力を求めます。
エンタープライズソフトウェア開発について何を学ぶ必要があるかを彼が知っているかどうか、彼に尋ねます。特に、彼が自分の修士課程で作業した後は彼がこれについて多くを知らないことを期待しているので、チーム、ペアプログラミング、TDDでの作業の方向に議論を向けたいと思います。
長いインタビューになると思います;)
再びあなたの良い答えをありがとう。彼は色とりどりのインタビューに合格しました。申請者にこれ以上満足したことはありません。彼のMathematicaソリューションは非常によく構成されているようです。彼が高階関数をどこで使用したかを説明することができましたが、これらがこのように呼ばれることを知りませんでした。彼は私の数学ベースの再帰の質問に加えて、単純な割り当てと制御フローの事柄に The Camel Has Two Humps から回答しました。彼がいくつかのアルゴリズムを説明していたとき、非線形フィッティングについて多くのことを学びました;)また、彼は正直に言って、もちろん、これまで知らなかった専門的なソフトウェア開発について学ぶことができるとは保証できません。しかし、彼は自分自身でさえも常に新しい概念を学ぶのが得意であり、ソフトウェア開発に本当に興味があると彼は信じていると信じています。彼はまた、プロジェクトのテクノロジースタックを要求しました。彼は、最初にそれを適用して、自宅でそれを見ることになります。彼はペアプログラミングとチームワークにも興味がありました。雇用契約が結ばれることを期待しています。
私は、数年前に物理学の博士号を取得してソフトウェア開発者として始めたが、コーディングの経験はほとんどない(Fortranの学部課程に相当する)ため、ここでは非常に偏見があります。明らかにそれは開発しているソフトウェアの種類に依存しますが、私の見解では、コーディングスキルは、科学的/問題解決能力が半ば上手な人なら誰でも簡単に習得できると思います。コンピュータサイエンスを研究してきた生涯にわたるプログラマへの侮辱として、私はそれを意図していません。もちろん、習得するために真剣なトレーニングを必要とする技術的な側面があります(たとえば、マルチスレッドや非常に低レベルのアーキテクチャ)。埋めようとしている位置ではありません。
私の現在の地位に関する技術面接では、かなり複雑な数学的問題に直面し、それを解決するプログラムを設計するように求められました。重点が置かれたのは、一度実装されると問題を解決するアルゴリズムを作成することでした。自分の解決策を説明するために純粋に言葉を使って答えを書くこともできましたが、私が望むなら、私の選択した言語でコードを書くことを許可されました。テストは、問題解決能力と、「プログラマーのように考える」ことができたかどうかに関するものでした。明らかに、同等の能力を持つ候補者がいて、直接コーディングの経験がある人がいれば、彼は最上位に出てきたはずですが、私にはそれで十分だと思います。
肝心な点は、候補者を採用するスキルの候補者を検討することです。候補者が達成することを期待している理想ではありません。
必要なプログラミングスキルを習得できるかどうかを確認するにはどうすればよいですか
できません。彼がまだ持っていないスキルを正確にテストすることは不可能です。あなたは彼の知性と態度に基づいて判断を下さなければなりません。最終的には常にリスクが伴います。
個人的な経験から、科学からプログラミングに移行することは非常に可能だと言えます。どちらも基本的に、複雑なパズルを解くためにあなたの脳を使用することに要約されます。
このペーパーを検証する二次的な情報源がないので、保証することはできません。
ラクダには2つのこぶがあります
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
プログラミング適性のテストを見つけました。その詳細を説明します。学生が非常に高い精度でプログラミング言語に触れる前であっても、数週間の暴露後に同じ機器で非常に正確にテストすることで、成功または失敗を予測できます。
彼が必要なプログラミングスキルを取得できるかどうかを確認するにはどうすればよいですか?
とても簡単です。彼にスキルを与えなさい。
さて、それはあまり満足のいく答えではありませんが、詳しく説明させてください。
土木工学で3年間過ごした後、プログラミングに来ました。 適用物理学と数学では、これはかなり堅実な背景です。 CSの学位が与える理論的な数学ではありませんが、何かの価値があります。私がエンジニアリングの経験から引き出したのは、問題解決の確かな背景でした。数学の背景を持つ人なら誰でも、問題の解決策について話すときにeleganceの概念を高く評価しています。彼らは、6ページのチキンスクラッチを取り、提出用にエレガントな半ページのプルーフに変換する時間を費やしていたため、リファクタリングの教育をすでに受けています。
物理学を学んだ人なら誰でも、基本的なフレームワークからソリューションを一緒に作成する直感的なアプローチを開発しました。
そして、これらのスキル以外のプログラミングは何ですか? -言語、イディオム、パターン、フレームワーク。これらは教えるのが簡単です。解決できないのは問題解決です。これらの領域で指示を与えることができれば、優れた開発者になります。
質問は「彼がスピードアップするのをどれくらい待つことができるか」になります。
tl; dr;タイピングを教えることができます。賢く教えることはできません。
私はマテリアルサイエンスの学士号を取得していますが、ソフトウェア開発で私のキャリアのすべてを働いてきました。
私はあなたの候補者が基本的なプログラミングとアルゴリズムにおそらく問題がないことをお勧めしますが、より「エンジニアリング」型の要件になると、彼はいくつかのガイダンスを必要とするかもしれません。つまり、彼のコードを適切に構造化し、500行の関数を持たず、効果的にテストし、効率を高めるように設計することです...
これのほとんどは教えることができますが、これをチェックするためにいくつかの質問を設計することができます。
また、彼は理学修士論文のためにMathematicaで実装された彼自身のソフトウェアを使用しておそらく理解できないいくつかの物理化学の問題を解決しました。 GUIと8,000 LoCの注目すべきサイズが含まれています。
候補者は専任の開発者としての経験があまりないかもしれないが、候補者はすでにプログラミングの方法を知っているように思えますが、彼らが完了した実証可能なプロジェクトがあり、かなりの量の作業を完了する必要がありました。そのため、買い物客が使用する言語とは異なる言語を使用する開発者と同じ方法で、候補者を面接することができます。
Mathematicaが使用する言語はかなり高度であり、Mathematicaのソフトウェアを書くのが上手な人は他の領域でもかなり有能であるべきなので、その経験に焦点を合わせ、それをコーディング経験の基礎として使用することはインタビューにアプローチする良い方法かもしれません。
航空宇宙工学の卒業生であるプログラマーといえば、自然科学からプログラミングに飛躍することは確かに可能です。ただし、問題を解決できることは、必ずしもコードを書くことができるとは限りません。あなたはこれを理解しているようで、それは良いことです。
私にとって、彼が把握していることを確認するための最も重要な概念は制御フローと再帰です(そして一般にこれのサブセットとしてループします)。候補者を採用する前に、明らかに非常に頭のいい人でも、問題を解決するためにプレーンワードアルゴリズムを書き出せることを確認してください。彼がそのプレーンワードアルゴリズムを使用して、少なくとも疑似コードに変換できることを確認してください。彼が多態性の概念を少なくとも理解できるかどうかを調べるために調査することさえできますが、これがこの状況で必要な知識であるかどうかはわかりません。
また、Mathematica/MatLab /何かが科学の問題を解決する能力に注意してください。彼が良いコードを書くことができるわけではありません。それは単に彼が基本的な(時には非常に基本的な)プログラミングの原則、通常はif/elseステートメントを適用できることを意味します。良いプログラマーになることを学ぶことは、一般的にこの段階で誰かに対して個人的および雇用主の両方のコミットメントをとることになります。 警告:私は紙の袋から出て行く方法をプログラムできず、正直に基本的な言語の基礎を理解できなかった優れたエンジニアである非常にインテリジェントな人々に会いました。
個人的な経験
私は工学の学位を取得し、プログラミングの経験を少し身につけて学校を卒業しました。私は非常に少量のC、かなりの量のMatLabおよびいくつかのVB + Accessで作業しました。VBのプログラマーとして本当に役立つようになるまでに約3か月の勉強が必要でした。 NETショップ。完全に熟練するまでにさらに9か月かかりました。しかし、私の問題解決スキルは、自分の仕事で出会った他のプログラマーの99%より優れていると確信できます。私を彼らのより価値のある資産の1つと考えました。
結論
それはリスク/報酬の命題ですが、純粋な問題解決スキルを持っている誰かを引き受けることは、彼らがプログラミングの概念を学ぶことができ、両方とも彼のプログラミングの拡大に時間を費やすことを望んでいる限り、長期的に見返りが得られることがよくあります知識。しかし、私は彼があなたに仕事を提供する前に、プログラミングの基礎の少なくとも基本的な理解を持っている必要があると私は固く信じています。私の経験では、この時点で、さらに進んでいくことができます。
基本的なアルゴリズムの質問と基本から始めて、彼がアルゴリズムとプログラミングのロジックに興味があるかどうかを確認します。アルゴリズムとは何かを理解できれば、最終的には具体的なことを行うために必要なスキルを身に付けることができます。
これが仕事の重要な部分になるので、彼が私たちのプロジェクトでソフトウェアの実装を行うために必要なプログラミングスキルを得られるかどうかを確認するにはどうすればよいですか
正直なところ、この情報は1時間または2時間のインタビューでは得られないでしょう。彼にC#でのプログラミングの割り当て(あまり技術的ではないもの)と1〜2週間の問題解決を与えます。 Mathematicaでプログラミングをすでに学んだ人にとっては、言語の基礎を学ぶのに十分な時間であるはずです。次に、彼とコードレビューを行い、そのベースを決定します。
自然科学のプログラミング文化がどのようなものかを理解するには、 科学的環境でのプログラミングの実践? (スタックオーバーフローについて)をご覧ください。このようにして、あなたは彼の準備を彼の仲間の準備と比較する立場にいます。
さらに言えば、他のやり方があることを知っているかどうかを知るために、彼が慣れ親しんだプログラミング方法を説明するように頼むかもしれません 。
私のビジネスには多くの「優れたプログラマー」がいます。彼らの資格は、いくつかの機能するコードをまとめるのに十分な状態を頭の中で保持できますが、その作業は構造化されておらず、維持するのが難しい傾向があります。一般的に彼らは教えることができますが...彼らは教える必要があります。
私が勤務する別の部門では、標準テストのバリエーションを使用しています。最初のタスクは、文字列内の単語を元に戻すことです。次に、そのコードを使用して、文字列内の単語の順序を逆順にします。プログラミング言語を使用する代わりに、候補者にアルゴリズムを紙に書いてもらい、スクラブルボードを使用して実行させます。
物理学から何かを計算するためのアルゴリズムを(自然言語を使用して)記述してほしいと思います。単純な式よりも少し複雑なことをしてから、彼の計算がオブジェクトにカプセル化されているのをどのように見るかを尋ねます(OOP知識は必要ありません。オブジェクトの期待値を説明できます)。 。このようにして、彼の論理的思考を見ることができます。これは、プログラミングスキルよりも重要です。
まず、彼らはおそらく非常に賢いので、最悪のシナリオでは、ガイダンスで優れたプログラマーになる方法を学ぶことができます。ただし、彼らが飛び込んで、最初からまともなプログラマーになる必要がある場合は、彼らが書いたサンプルコードを送ってもらいます。
1つまたは2つの巨大な多目的機能ですか、それとも適切な抽象化レベルで機能をカプセル化しましたか?マジックナンバーは全体にハードコードされていますか?コードはDRYですか?それらは変数に妥当な名前を付けましたか、それともすべてが判読不可能な略語または1文字の変数ですか?主にコードのロジックをたどることができますか?彼らはOO基本を理解していますか?
バージョン管理に何を使用するか尋ねます(git/hg/svn/cvs/bzrなど)。彼らはコードのプロファイルを作成したり、デバッガーを使用したりしたことがありますか?
彼らがこのテストに失敗し、最初から優れたコーダーが必要な場合は、この人をスキップしてください。それ以外の場合は、それらを雇って、一般的なプログラミング/ CSの本に加えて、ソフトウェアエンジニアリングの本(Code Completeなど)を読むことを勧めます。
(記録のために、私は物理科学者もプログラマーになりました。)