背景として、AutoCADのようなUIを使用したデスクトップエンジニアリングアプリケーションを etabs のように実行しています。
本当に私を悩ませているのは、最高の開発者を雇う必要があるかということです。まず第一に、私たちは募集で大きな困難を経験しています。私たちが目にするほとんどの履歴書は、単純なCRUDアプリを実行するか、SharePointのカスタマイズを行っているため、ハードコアプログラミングはあまり必要ないと思います。私たちがインタビューを求めている人でさえ、ほとんどはフィボナッチ数列と単純な二分探索を行うことができません、そして私たちはヒントを与え、問題を明示的に説明するのに十分に礼儀正しいです「フィボナッチ数列」の意味を確認するために候補者が辞書を検索する必要がないようにします。
これは私に考えさせました:はい、計算幾何学/線形計画法を行うときにある程度のプログラミング適性が必要であり、ソフトウェアアーキテクチャを設計するとき、または使用するソフトウェアパターンを決定するときにある程度のプログラミング適性が必要ですが、それを超えて、私たちのコードの多くは単にコードを配管しているだけだと思いますが、これはプログラミングにある程度精通している人が実行できます。
今はプログラミングの才能が本当に必要であり、スーパースターの開発者を雇うのは非常に難しいので、私は自分の水準を下げ、まあまあのものだけを雇いたいと思います Joel preaches 。
どう思いますか?
編集:計算幾何学/線形計画法ライブラリ全体を書き直す必要はありません。私のアプリケーションに関する限り、あなたがしなければならないことは、問題を適切な計算幾何学/線形プログラミング用語にキャストする方法を知り、既存のライブラリをいつ/どのように使用するかを知ることができることです。したがって、見た目ほど難しくはありません。
Joelを読みすぎないようにしてください。彼がブログに書いた内容は、このサイトでの彼の回答と矛盾しているので、私は彼の言葉をあまり取り上げません。
スーパースターを作るものと、なぜスーパースターが長くてどこにも行かない議論を開く必要がある理由。それはエリート主義であり、実際的ではありません。
必要なのは、以下の人です。
残りは重要ではありません。
この種のCSの強いプロジェクトに飛び込み、CRUDアプリケーションのコーディングに目を向ける以外に何も望んでいない若い卒業生がどれほどいるのか信じられないでしょう。昔、私はそのうちの1人でしたが、コンパイラー開発に関するプロジェクトに参加することを夢見ていましたが、見つけることができませんでした。それらの1つにチャンスを与えませんか?
AutoCADがスーパーマンによって書かれたとは思いません。成功したプロジェクトのほとんどは、物事を成し遂げたかっただけで本当に望んでいた人々によって行われました。
私たちが見るほとんどの履歴書は、単純なCRUDアプリを実行しているか、SharePointのカスタマイズを行っています
ほとんどの仕事がそれだけを必要とする場合はどうなりますか?大学でCSを勉強したことはありますが、CSは本当に得意だったかもしれませんが、実際のプログラミングで10年間これを使用したことがない場合は、CSを覚えているとは期待できません。明らかに、この知識がどこにも使用されていない場合に備えて、常に最新のCSブックを読むために、だれも古いCSブックを読むことはありません。
私が本当に好きな本は まずすべてのルールを破る です。それは平均的なマネージャーと良いマネージャーの違いについての多くの情報を持っています。優れたマネージャーが何度も何度も言った重要な洞察の1つは、文章の中で彼らのうちの1人によって要約されました私は適切な採用者を見つけるのにあまりにも長い間待ったことはなく、解雇したこともありませんはい、採用するのに長い時間がかかるのはイライラしますが、それだけの価値はあります。
留意すべき2番目のポイントは、プロジェクトのスループットで測定すると、5〜8人のチームの生産性がピークになることです。 20人を超えるチームができるまで、同じ生産性に戻ることはできません。小さなチームのダイナミクスが機能するサイズを超えてチームを成長させる場合は、非常に注意深く行ってください。そして、もしあなたがそのしきい値以下に留まるつもりなら、あなたは本当にそれらの5-8人が良いことを望んでいます。
どちらのポイントも、適切な人材の採用に力を入れていることを強く示しています。
誰もが「上位1パーセンタイルのみを採用する」と主張しています。それが本当なら、雇用された人々の100%はすべての人々の「トップ1パーセンタイル」にいるので、すべての人々の99%が(任意の特定の分野で)失業しています。これは明らかにそうではなく、私たちは皆、明らかにそのグループに属していない経験豊富な人々を抱えているため(なぜ他にこの質問をするのでしょう...)、これは真実ではないと知っています。
実際、そのような人々だけで構成されている組織は非常に不安定です。あまりにも多くのエゴ、あまりにも多くの矛盾するアイデア。それは、誰もが自分のことをするときにバラバラになり、すべての相対的なメリットについての理論的な議論を決して終わらせないことに没頭するか、決断を下さなければならないときはいつでも感情が燃え上がるにつれて、絶えず叫ぶ試合に発展します。
あなたが最初に尋ねる必要があるのは、なぜあなたが望む標準に達していない履歴書を手に入れているのかということです。私は多くの善良な人々と協力してきたので、彼らはそこにいて、アプリケーションは私にとって非常に興味深く聞こえます。フィボナッチ数列とバイナリ検索を実行できる人を見つけることができない場合(これは見かけよりも困難です。Knuthによると、最初の発行から最初の正しい発行までに数年かかりました)、何かを推進しています。いいもの離れて。
あなたが支払う意思があるよりも多くのスキルを求めていますか?間違った場所に広告を出していませんか?あなたの会社は場所や評判によって魅力がありませんか?これは最初で最も基本的な問題であり、緊急に解決する必要がある問題です。あなたとあなたの同僚は、あなたのために働いていない善良な人々を疑いなく知っています。あなたが持っているものを彼らに見せて、彼らが誘惑されるかどうか、そしてそうでない場合はなぜそうでないか尋ねてください。あなたは問題に近づきすぎて、それを支援なしでは理解できないかもしれません。
彼らが適用された最高であるため、人々を雇わないでください。あなたがやりたいことをできるようになるので、人を雇ってください。それがすべて当てはまるので普通の人を雇うと、あなたはゆっくりと良い人を失い、計算幾何学を使って物事をやろうとする代数が不安定な人に巻き込まれます。 (平凡なプログラマー数人の仕事があるので平凡な人を雇うことも別のことですが、必要な場所で優秀な人を雇うことができなければなりません。)
「ほとんどはフィボナッチ数列と単純な二分探索を行うことができない」
あなたの基準は確かに間違っています。私のグループでは、私たちはすべて物理学者またはエンジニアです。私たちはCSコースに参加しなかったので、だれもバイナリ検索を実行できなかったに違いありません。実際の生活では、そのためにライブラリを使用しています。 binsearchを自分で書く人は、重要なことに集中する方法を知りません。
候補者が賢く、グループに適している場合、それははるかに重要です。彼のプログラミングの才能を確認したい場合は、自宅で仕事をするように依頼してください。それが彼/彼女にかかった時間に注意し、それが候補者の本物の仕事であるかどうかを見つけるために結果を話し合ってください。
「最高の人材を採用すること」はカルトになりすぎていると思います。
ほとんどのプログラミング作業はルーチンであり、創造的ではありません。本当にクリエイティブな新しいプロジェクトに取り組んでいるときでも。それのほとんどは、外傷であり、多くの場合、パターンに基づいています。これは特にUIに当てはまります。
最近のほとんどのシステムでは、非常に多くの人がそれらを作成する必要があります。つまり、本質的にすべてが最高とは限りません。ほとんどの人は平均的であり、そうでなくても、多くの「平均的な」人の仕事をしなければなりません。
そうは言っても、基本的な能力と最低限の賢明な要件を要求することは不合理ではなく、妥協すべきものではありません。
定期的な手術について考えてください。リスク許容度によっては、医学部長が時間を費やすのを10年間待つよりも、平均的な医師に手術を依頼する方がよいでしょう。だからといって、整然とした手術をさせましょう。
とにかく「最高の人材を雇う」とは、「現在のところ大まかに利用できる現在最も優れた人材を雇用する」ことを意味する傾向があり、会社によって異なることを意味します。ロックスターコーダーを求めている人もいれば、細心の注意を払ったソフトウェアエンジニアが求めている人もいます。次の人は経験豊富なソフトウェア職人を求めています。 「普遍的なベスト」というものはないので、それを覚えておいてください。おそらく、あなたの仕事の仕様では、あるタイプのプログラマーを探していることが示され、インタビューでは別のタイプのプログラマーを探していると言っています。突然、あなたはマッチを得られません。
そうは言っても、まあまあのプログラマーと一緒に働くのは好きではありません。まあまあの経験とは何の関係もありません(彼らは20年間プログラミングをしているかもしれませんが、それでもまだそれほど上手ではありません)が、適性と熱意と関係があります。 so-soがこれら2つのいずれかに影響する場合は、問題があります。また、コードが不十分なため、チームの他のメンバーがコントリビューションをやり直す必要がある人を採用しても意味がありません。座席に火傷を負うことは必ずしも解決策とは限りません。座席に火傷を負うことは、残念ながら、チームのより良いメンバーが仕事をしようとしているときに仕事が増えることも意味しますand混乱を取り除きますまあまあのプログラマが提供しています。
ロックスターとしては出会わない人もいますが、中堅レベルのプログラマーです。彼らはチームに参加するのは良いことであり、それは「まあまあのプログラマー」という意味ではありません。後者は、パフォーマンスレビュー時に毎年解雇されるのをやっと避けている人です。
マネージャーのタイプとして、「上位1%」を採用することは現実的ではなく、必要もないことに同意します。私のアドバイスは、製品のビルドとメンテナンスを行う適切なチームを雇うことです(ビルドとメンテナンスではニーズが大きく異なるため、2つの非常に異なるチームになる可能性があります)。
チームに現在所属している「キーパーソン」である人(たとえば、物事を成し遂げること、態度が良いこと、不確実性/高レベルの要件にうまく対応できることなど)を特定し、その人を雇うことを強くお勧めします過去に(そして尊敬すべきことは明らかに)一緒に働いた。これにより、面接プロセスに関する多くの不確実性が排除され、チームのゲル化に役立ちます。
また、より「長期」-インターンプログラムに多額の投資を行います。プログラミングチームが20人の場合は、年間5人のインターンを取得して、実際の仕事に従事してください。毎年好きな1つまたは2つを持ち帰り、さらに5つのランダム変数を取り入れます。これはおそらく、チームを優れたプログラマーで満たすための最良の方法です。その後、日和見的に社外で採用し、候補者の基準を引き上げることができます。
すでに述べたように、面接プロセスに注意してください。候補者にコードを記述させ(より良いのは、「1時間の家に持ち帰る」問題の解決策を説明する)、チームで昼食をとらせるようにすることです。彼らの技術的および対人スキルを知るようになる。また、来週始まる大きなプロジェクトで20人以上の人が必死になっても、「いいえ」と言うのを恐れないでください。
私の経験では、Paretto Principleはプログラミングにも適用されます。作業の80%は開発者の20%によって行われ、その逆も同様です。数字は誇張されているかもしれません。実際には、従業員の20%が50%の仕事をしているようなものになります(仕事とは、単なるコード行ではなく、良い仕事を意味します)。それは実際にはベルカーブのようなものです。つまり、10人のチームでは、ヒーローが1人、偉人が2人、平均が4人、哀れな人が2〜3人います。
多くの企業がベルカーブを使用して評価を比較検討しています。だからあなたの候補者がどんなに優秀であっても、彼らは彼らのレベルに落ちるでしょう。全員が同じレベルのチームを持つことはできません。起こりません。
ここにはすでにたくさんの答えがありますが、私は議論する必要があるポイントがあると思います:まあまあの人を雇うことがあなたのソフトウェアの品質に与える影響とそれがマネージャーとしてのあなたの人生をいかに困難にするか。
「最高の開発者を雇う必要はありますか?」に対する答え。常に大きな脂肪ですはい。もちろん、実際には、これが常に可能であるとは限りません。この質問を考慮してもあなたがやっていると思う危険な間違いは、「私たちのソフトウェアはとてもまあまあでも簡単にできる」と考えることです。これは間違っています。
あなたのソフトウェアは完成しますが、疑いはありませんが、優秀なチームとまあまあのチームとでは非常に異なる結果を期待しています。バグ、パフォーマンスの問題、保守性とスケーラビリティの問題などが増えます。あなたはまあまあの人たちをもっと複雑な問題を通してベビーシッターしなければならないでしょう。適切なアーキテクチャの決定を行っても、まあまあの人をベビーシッターする必要があります。
これを受け入れて、これを管理する準備ができている場合、それは問題ありません。プロセスと結果に備えるだけです。
あなたの質問のタイトルは「通常のデスクトップアプリケーション」について言及していますが、あなたのテキストは計算幾何学と線形計画法の知識を適用する必要性について話します。これらは、あらゆる進歩の大きな社会的結果を伴う巨大な数十年にわたる研究プログラムを生み出したアプリケーション領域です(リコール、線形計画の要約リソース割り当て)。その結果、これらの領域の問題を解決するための非常にうまく機能する高度なアプローチが数多くあります。
悪い雇い
言い換えれば、あなたが本当に何か歩行者に取り組んでいるかどうかについて考えてください。もしそうなら、素晴らしい、雇用ははるかに簡単になるはずです。そうでない場合は、必要なことを実行できる人を待ってください。
一歩戻りましょう。
私たちは何をしようとしているのですか?ソフトウェアを書きます。
なぜ私たちは最高のものを雇う必要があると思いますか?その奇抜なアーノルドの子供は濡れた紙袋から彼の方法をハックできなかったので、SQLがすべてねじ込まれ、ログに記録できませんに。
OK、それで最高は何ですか?わからない、多分お金が欲しい人で、素晴らしいポートフォリオを備えた長さ6フィートの履歴書で、Googleなどで働いていました。彼は学位を持っている必要があり、おそらく名前の最後にいくつかの手紙があります。ええ、それは私にとって最高のように聞こえます、そして最高の意味で、私はその異常なアーノルドの子供ではない誰かを意味します。ああ、そして彼は私が学校で聞いた「バブルソートを書く」などと呼ばれている本当に難しいがらくたをする方法を知っているべきです。ええ、他の人に学校でやらなければならなかったいくつかのトリッキーなことを挙げてもらいます。
おかしいアーノルドの子供が欲しくないような音?あなたは?私はバグのあるコードにうんざりしていて、物事が完了するまでに永遠にかかります、そして私がインタビューするこれらの新しい人たちはすべてを書き直す必要があると私に言っています!
そうです、それであなたは何をするのがおかしいアーノルドの子供に何を求めますか? PHP Webサイトを作成し、jQueryを書き、PHPに基本的なCRUDを実行してもらいますMSSQLを使用して、周りの背景色を変更します。
それは、最高の人にのみ適しているタスクのように聞こえますか?最高の人がそれを実行できると確信していますが、これに一致する適切なスキルセットを持っている人なら誰でもこれを実行できます。
だから、あなたは最高のものを必要としませんか?そうです、私は私の目標を達成するスキルセットを持つ誰かが必要です。
Oh。ええ。
優秀な開発者を雇うことは本当に問題ではないと思います。本当の挑戦はそれらを作ることですwantあなたのために働くために==。
最高のものを雇う必要はありますか?
私はそう信じています。優れた開発者は、すべてを予定どおりに完了するだけのものではありません。そのような個人だけが他の人よりはるかに生産的であるだけではありません。優れた開発者も模範を示し、他のチームメンバーに刺激を与えます。他の人たちは彼らと一緒に働いている間、かなり進歩することができました。
OK、それであなたはあなたの基準を下げるつもりです。それはかっこいいです。恐らく本当にひどい人を雇った後で、あなたは気が変わるでしょう。すべてのCSの質問に完璧に答えますが、実際には1行の量産コードを書くことはできません。それで頑張ってください:)
確かに私はジョエルの基準ではスーパースターのプログラマーではありません。それにもかかわらず、私は開発者としての20年のキャリアの中で、いくつかの成功したプロジェクトを書きました。私はあなたの質問を解決できたでしょう。しかし、実際には、データベースまたはライブラリー関数にそれを実行するように依頼することによって、より複雑な作業の多くが行われる、私の職場での経験からはそれほどではありません。
ただし、経験の浅い人を採用する場合は、扱いやすいテクノロジーの使用を検討する必要があります。たとえば、プロジェクト全体でC++を使用することを計画している場合は、C++の部分を最高の人が作成したライブラリに制限し、他の人がVisual Basicでユーザーインターフェイスを実装できるようにします。
ランクに加わる従業員で検索した値を書き留めます。
唯一の高く評価される価値がプログラミング能力であるとき、あなたはそれだけを大切にする人々にすぐに囲まれていることに気づくでしょう。ほとんどの真に有能なプログラマーは、より手の込んだ価値体系を持っているので、彼らはあなたのチームに加わることを控えます。
ただし、革新的で創造的、信頼できる、好奇心旺盛、好奇心旺盛、自己学習、社交的、有能で献身的な人々を探している可能性が高くなります。あなたの会社がこれらの価値を理解し、尊重し、従業員がそれらをさらに発展させるのをいとわないことを示してください。
現在の従業員の価値を理解して受け入れ、仕事のアプリケーションでそれらを伝えます。持続可能な価値体系を持つ優れた企業は、優れた従業員を引き付けます。
確かにあなたは最高のものだけを雇うことを熱望すべきです。だからといって、自動的に成功するわけではありません。「最高の」数は限られているため、勝者と敗者が集まって戦います。それの多くは、問題に懸命に取り組むあなたの適性と意欲、そしてあなたが利用できるリソースから来ます。
あなたが始める前にあきらめることは失うための最も確実な方法です。
バイナリ検索は興味深い問題です。なぜなら、ほとんどのプログラマーが実際に正しく書くのに苦労することはよく知られているからです( Programing Pearlsでそれについて熱心に書いています )。おそらく、候補者が問題を解決できなかったことに基づいて候補者を除外しない限り、それをテストすることはそれほど悪くありません。彼らがそれを迅速かつ正確に解決すれば、少なくともそれは彼らがどのタイプのプログラマーであるかを示唆しているので、その特定のケースでより多くの情報を得ることができます。
最高のものを雇う必要があります。しかし、この用語は文脈から何度も引用されてきました。全体的な意味での最高のプログラマーではなく、そのポジションに必要なスキルを持つ最高の候補者を見つける必要があります。ソフトウェア開発は幅広く、すべての職種が同じ技術知識を必要とするわけではありません。
この質問を自問してみてください(あなたはすでにそうしていました。):別のエンジニアが同じ地位に5年間いる場合、彼女がフィボナンシシリーズとバイナリ検索を覚えていると思いますか?
答えが「いいえ」の場合は、面接パターンを変更してください。 googleやbingなどの検索アプリケーションで作業したい場合は、12個の検索アルゴリズムを知る必要があるかもしれません。他のすべての人は単にmap.get( "");を使用します。
面接の対象は、教科書一般的な優れたプログラマーではなく、職務に必要なものに絞ってください。
あなたが本当に品質を気にしないなら、私はアウトソーシングのウェブサイトの1つを使って小さなプロジェクトから始めることを勧めます。そうすれば、彼らが仕事をすることができれば彼らにお金を払うことができ、彼らができない場合には簡単に保釈することができます。
しかし、私はデスクトップエンジニアリングアプリケーションにルーチンコーディングが本当にたくさんあるかどうか疑問に思っています。それらは非常に複雑になる可能性があり、ほとんどのプログラマーは複雑さの管理がそれほど得意ではありません。何年もの間チームを拘束する多くのインスタントレガシーコードを簡単に作成できます。一般に、新しいプロジェクトの最初の採用は最も重要であり、プロジェクト全体の雰囲気を整えます。
どの組織でも、経験が豊富な人と経験が少ない人がいます。それだけでなく、ある分野の専門家が別の分野の初心者になることもできます。確かに熱狂的なアマチュアはコードベースに害を及ぼすよりも害を及ぼす可能性がありますが、それは彼らが学ぶ方法です-彼らの過ちを修正し、経験豊富な同僚と彼らの経験を話し合うことから。
私の提案は、スーパースターを雇おうとするのではなく、適度に明るく、会社の文化に適合し、学び、自分の限界を理解したいと思っている人を雇おうとすることです。
個人を問題に適合させることに関する上記のコメントのほとんどに完全に同意します。これは通常、定期的な問題に取り組むためにスーパースターを雇うのではなく、長期的な関係をもたらします-それは彼がすぐに去るのに欲求不満になるでしょう。
とは言っても、特定のポジションではなく、常に会社で採用を試みる必要があります。これは、同じ人が遅かれ早かれ個人の連絡先などを使ってチームを切り替えようとするため、どこか他の場所で重荷になる可能性があるためです。会社に非常に厳格な社内異動ガイドラインがあること、および会社の基準を満たしていない可能性があると思われる人物を採用する前に、今後数年間チームで何をするかを明確に把握していることを確認してください(ただし、現在の問題は解決します) )。開発者の平凡さが原因でチームが作業に追従するのが非常に難しくなっているケースをあまりにも多く見ました。