技術的にはエンジニアの採用におけるインターネット企業の技術的な側面に多くの注目が紙の上(その代わりに、後に「ペーパーコード」付き)、ライトコードの候補者が必要になります、インタビュアーはこの道を指し示すものを調査したいですか?候補者は、どのようなポイントに注意を払いますか?インタビューの質問の比較的高い程度を区別するために使用され、数年前に米国のグループに基づいて詳細に説明しない、私は、この質問にはまだ顔あまりにも多くの人々だけど、コードの紙部分はターン数うちにお答えできるようにするには少ないです。
この記事では、「あるフロントエンドの閉鎖記事、DOM記事:ここでは2つのリンクの前に、3のインタビュー」シリーズ。
なぜ紙コード?
ペーパーコード(も可能ホワイトボード上の書き込みに)プラクティスではない人間の一見、しかし、あなたはチームのリーダーであれば、親切な人の何がより良いチームに統合することができますか?あなたが上司であれば、あなたはどのようなスタッフのサポートを支払うことを喜んでいますか?紙の基本的な目的は、彼らは候補者が柔軟な発想、幅広い知識が付属していますかどうかを検討しているかどうか、ライブでコードに候補者の能力を調べることです。
コードのリンクはライブ容量にどのように紙を調査しますか?最初のライブの速度であり、生きて速いの人々のコーディングなし基本的なスキルの確率が百度やIDE上極めて低く、100%依存しているオートコンプリート専門の技術者と考えることができないエンジニアの完全な基本的なタスクに、ライブで品質が続き、加えて、紙のコードでも主導権を受諾し、タスクを完了するために候補者を理解することができ、タスクを完了するために、どのチームのニーズを受け入れることを望んでいない、コーディングスタイル、考え方などについての学習や研修を通じて蓄積した候補者について学ぶことができ、プロセスを符号化することにより、 。
フロントエンドの学習qun438905713を作成し、グループのほとんどは、ゼロベースの学習者である、私たちはお互いにお答えし、また学習教材の多くを準備するために、お互いを助けるには、為替のゼロベースのジュニアパートナーを歓迎しました。
ある程度までは、紙・コードのプロセスが、その場合には、インタビューはそれをリハーサルでは非常に良いではありません、仕事の未来の縮図でありますか?
ペーパーコードはどのように行うことですか?
一般的に言えば、紙タグは、特に複雑な問題を聞いていない、それだけで非常に一般的なニーズを完了し、遭遇した実際のビジネス上の問題を解決する、または言語を利用したアルゴリズムを実装してもよいです。コードの問題実際のビジネス上の問題を提示する前に、インタビュアーは、ビジネス上の問題を解決するために候補者について学習します知識の習得を必要とし、問題の前部で、必要に応じて補足知識を提供します。
例えば、コードの問題は、米国のグループが言及する前に道があること:下記URL文字列からすべてのパラメータからJS関数パースで書かれたサードパーティのライブラリの助けを借りずに:
フロントエンドの学習qun438905713を作成し、グループのほとんどは、ゼロベースの学習者である、私たちはお互いにお答えし、また学習教材の多くを準備するために、お互いを助けるには、為替のゼロベースのジュニアパートナーを歓迎しました。
期待リターンは、次の形式の結果:
- {
- ユーザー:「匿名」、
- ID:[123、456]、キーは、アレイに組み立てること繰り返し、それがデジタルにデジタル方式に変換することができる//
- 市:「北京」、//中国
- 有効:真、キー//不定値がtrueの慣習です
- }
クエリ文字列またはNode.jsのコミュニティ適量で使用される、この学生uri.jsモジュールはすべてあまりにもおなじみの可能性、およびHTTP GETリクエストパラメータがモード必要ない心配を運ぶための良好な候補ではない人たち、このような状況理由のためにインタビュアーの下で建設規則のURLパラメータを説明します、ネットワークの知識の習得にとして、それは懸念の別のポイントです。私はこの問題を思い付く前に、実際には、我々は候補者に、より多くのHTTP話題を話をしています。
1.手の前に
問題を得るために候補者のかなりの割合は、すぐにインタビュアーが見たいですコードを書き始めるためにペンをピックアップし、かつ異なるフィル学校の試験では、コードの一部として、紙の全体的な品質は、インタビュアーは、包括的に見たいです仕事のニーズは同じ方法で取得する場合は、関係なく、無差別の最終結果は、多くの場合、あまり効果があり、開けました。
すべての意思決定を行う前に、手が問題を把握する必要があり前に。どのような問題は把握しているのですか?入力機能をクリアするには、(この文字列内の脳は通常、悪いではなく、インタビュアーが慎重に確認し、あなたが考えることができるかが表示されます)奇妙な入力のすべての種類があるかどうか、それは他のソリューションに明らかにすることをこのような時の複雑さ、空間的な複雑さなどの制約、。この方法は、上記のコードのために、あなたが質問をすることができ、例えば、問題把握するインタビュアーを依頼することです:
不特定のキー値が繰り返されますされていますか?どのように繰り返された場合に対処するには?
デジタルは整数のみが含まれていますか?これは、フロートが含まれていますか?科学的表記法?
コードのパフォーマンス要件は何ですか?心の候補がすでにマルチ方式のアプローチを有することができるとき、私たちは、この問題を提起します。
ただ、実用的な仕事のように、時間を必要とし、パートナーがスケジュールに期待する様々な可能特別な事情の境界を知っている必要があり、さまざまな点は、より把握するために、ビューの決定理論ポイントの観点から優先順位のニーズを定義しあなたの技術的な複雑さを作るために十分な情報が、より合理的なスケジュールの見積もり、回避を要求するか、半分行わない、それは実際の需要と一致しないことが判明しました。
問題を考え出すした後、私はあなたがすでに心の中で基本的な考え方を持っていると信じていますが、特定のポイントを無視するかどうかを所有している場合ハンズオン時間がまだ到着していない、あなたがインタビュアーを導入する考えを置く必要があり、自問してみてください、これはコミュニケーション能力を証明する良い機会です私たちはされているものを知って効果的なコミュニケーションの学生の重要性は、ソースに確認メッセージを受信した後に理解することができるはずです。
あなたが生きピックしているという印象を多くの質問を提起し、それは良いことだと思われる学生の強い精神が手の前に疑問点に留意する必要がありますが、あなただけの疑いのレベルにとどまる場合は、参加したくない、インタビュアーに委ねられます人々。私が会ったら、問題を解決するために、コードの問題は、書き込みコードを拒否しても意味がありませんと思うので、人を雇う私の経験では、私は彼を離れて置くために礼儀正しくすることができないだけ。ので許容範囲の低レベルの何かに同意しない、それがチームに悪趣味を持って来ることは非常に簡単です。
境界問題や問題を解決するためのアイデアを決定し、その後、コーディング上の手を、開始することができます。
2.符号化処理
そのような文字列メソッドは、文字列の分割方法、正規表現の方法、私はオフに直面人々を横断線形として、優れた品種の問題を解決するためのQueryStringパラメータを解決するためのアイデアがありますが、文字列の分割方法とほとんどの人は、以下の議論我々この方法を中心に展開。線形トラバーサル方法を達成するため、基準は、クエリ文字列のNode.jsモジュールを構築することができます。
それの何の要素を検討するプロセスをコードしていますか?分析するには、以下の具体的な例では、例えば、私は多くの場合、この結果コードを取得します:
- 関数解析(STR){
- VAR OBJ = {};
- VAR進= str.split( '&');
- 以下のために(; I <ary.length; VAR iが0 = I ++){
- VAR TMP =進[I] .split( '=')。
- IF(!OBJ [TMP [0]]){
- OBJ [TMP [0] = tmpに[1] || 真;
- } そうしないと {
- VaRのTMP2 = [OBJ [TMP [0]、TMP [1] || ]はtrue。
- OBJ [TMP [0] = TMP2。
- }
- }
- OBJ返します。
- }
私はあなたが眉をひそめていると信じて、このコードを参照してください、このコードの厳しさは、堅牢性、表面に問題がある、ロジックは、より深刻であることができ、コードを通じて需要の数値パラメータを満たしていません候補高い確率推論学ぶことは良くありません。
皮膚の問題
皮膚の問題は主に、コードの可読性を意味し、評価基準は以下のとおりです。ルックスの簡単なていますか?それが何をしているかを理解することが一目でわかるかどうか?問題は、上記の結果がそれを持っている表面比は何ですか?フロントエンドの学習qun438905713を作成し、グループのほとんどは、ゼロベースの学習者である、私たちはお互いにお答えし、また学習教材の多くを準備するために、お互いを助けるには、為替のゼロベースのジュニアパートナーを歓迎しました。
可読性、あなたが解決のキーと値のペアにトラックの内側ループになりたい場合は、マッピングキーを維持する必要性=脳内TMP [0]、値= TMP [1];
このようtmpの複数使用などの変数の命名、配列aryそれはより多くのARRとコミュニティを代表して言うことができるが、多変数の命名規則が良くなります。
次のように表面の改善は、基準コードを作りました。
- 関数解析(STR){
- VAR paramObj = {};
- VAR paramArr = str.split( '&');
- {(; I <paramArr.length I ++ varがI = 0)するため
- VAR TMP = paramArr [I] .split( '=')。
- //個別にキーと値を開く、多くは明らかであろう
- そこキー= tmpに[0];
- VaRの値= TMP [1] || 真;
- (もし!paramObj [キー]){
- paramObj [キー] =値。
- } そうしないと {
- VAR newValueに= [paramObj [キー]、値]。
- paramObj [キー] = newValueに。
- }
- }
- paramObjを返します。
- }
論理の問題
ロジックコードは、異なる入力条件の下で厳密な結果ではない、特定のパフォーマンス不安定です。
OBJ [TMP [0]ではないが正しく発生し得るように、キー結果があるかどうかを決定するときには値0。
上記のコードは正常にインタビュー理由を理解したくないの最後に2倍以上のキーを繰り返し、候補者の一部を処理しません。
仕様によれば、様々なパラメータは、エンコード、対応する分析ニーズのデコード時にURLの後にURLをスプライスする必要があります。
次のように論理的な問題は、参照コードを取り除きます:
- 関数解析(STR){
- VAR paramObj = {};
- VAR paramArr = decoeURI(STR).split( '&'); //第1の復号
- {(; I <paramArr.length I ++ varがI = 0)するため
- VAR TMP = paramArr [I] .split( '=')。
- そこキー= tmpに[0];
- VaRの値= TMP [1] || 真;
- (paramObj [キー] === '未定義' typeof演算){//キーが存在するか否かを判定した場合
- paramObj [キー] =値。
- } そうしないと {
- VAR newValueに= Array.isArray(paramObj [キー])paramObj [キー] :? [paramObj [キー]]; //正しい処理アレイ
- newValue.push(値)。
- paramObj [キー] = newValueに。
- }
- }
- paramObjを返します。
- }
堅牢な問題
コードのセクション全体では、防御的プログラミングのいずれかを実行していなかった、それは非常に耐性がエラーになりますし、どこ守備のプログラミングを行うにはちょうどいい質問の価値があります。少なくとも、自分の引数を要求する分析関数をクエリ文字列、右列、ありますか?良くなる関数の先頭に次のコードを追加します。
- // ...
- もし(typeof演算STR!== '文字列'){
- } {返します。
- }
- // ...
のニーズ
任意のデジタル処理のためではないのコードを実行し、問題はほとんどこの問題は、エネルギーがデジタルにデジタル値に変換される方法です。この問題は、テストセンターを持って埋葬ライト・コードへの候補を取得することです。さてどのようにあなたはそれが好きですか?使用のparseInt?またはparseFloatはを使うのか?
以下の参照コードは正しく数値を処理しています。
- 関数解析(STR){
- もし(typeof演算STR!== '文字列'){
- } {返します。
- }
- VAR paramObj = {};
- VAR paramArr = decodeURI(STR).split( '&');
- {(; I <paramArr.length I ++ varがI = 0)するため
- VAR TMP = paramArr [I] .split( '=')。
- そこキー= tmpに[0];
- VaRの値= TMP [1] || 真;
- //デジタルハンドル:多くの人がこちらの判断の種類を無視し、ブール値を数値に渡される数字を解析します
- IF(typeof演算値=== 'string' は&&ますisNaN(数(値))===偽){
- 値=数(値)。
- }
- IF(typeof演算paramObj [キー] === '不定'){
- paramObj [キー] =値。
- } そうしないと {
- VAR newValueに= Array.isArray(paramObj [キー])?paramObj [キー]:[paramObj [キー]];
- newValue.push(値)。
- paramObj [キー] = newValueに。
- }
- }
- paramObjを返します。
- }
問題は問題ではありません
以下の2点が問題ではありませんが、候補者が行うことができれば、間違いなくボーナスアイテム。
ES6の下に例新しい標準言語になり、候補者は、しかし、まだ間違って使用するvarの多くではありませんが、あなたは何より良い方法がありません。
メソッドのJSの配列は、あなたが知っていれば、私は無事に面接を使用することができ、そのようなマップとして、より多くのセマンティックコードを整理減らすために使用することができます。
ES6は、以下の参照符号を用いて調製しました。
- 関数解析(STR){
- もし(typeof演算STR!== '文字列'){
- } {返します。
- }
- リターンdecodeURI(STR).split( '&')地図(PARAM => {
- CONST TMP = param.split( '=')。
- CONSTキー= TMP [0]。
- [1]値= TMPせ|| 真;
- IF(typeof演算値=== 'string' は&&ますisNaN(数(値))===偽){
- 値=数(値)。
- }
- リターン{キー、値}。
- })。減らす((paramsは、項目)=> {
- CONST {キー、値} =項目。
- IF(typeof演算のparams [キー] === '不定'){
- paramsは[キー] =値。
- } そうしないと {
- params [キー] = Array.isArray(のparams [キー])?params [キー]:[のparams [キー]];
- paramsは[キー] .push(値)。
- }
- paramsを返します。
- }、{})。
- }
また、懸念のフロントエンド技術進歩の学生は、現代のブラウザの一部がサポートURLSearchParamsを提供気づくことが、あなたはコードの要件の1行を取得するには、この機能を使用することができます。
符号化後の3
書かれたコードの最初の版の後、完全な開発のための需要のように、インタビュアーを示すために、すぐに心配しないで、あなたは少なくとも、単純な控除や国境を行うには、自分のコードに元のタイトルの代わりに、コードを入力し、文書を越えるために、独自のプレスニーズを持っていますテストは、その後、コードと説明するインタビュアーが直面しています。驚くことではないが、その後、演繹プロセスは、あなたが、これはあなたの能力を示す機会であるため、問題の一部、または大幅な改善点は、あなたが、面接でこれらの要素を作ることができることがわかります。
概要
私はあなたが、紙の上に深プロセスを通じて候補者の基本的な品質の研究とコードの結果で仕事を理解する必要が信じて、これを読むために時間を割いていただき、ありがとうございます、Chuhuo能力だけでなく、どのようなノートの質問に答えるために、コードのさまざまな側面を知っています重要:この問題を考え出す前に手;注意を払うコーディングスタイル、論理的な厳密さ、プログラムの堅牢性をコーディングするには、まず自分のテストや控除をコードしていました。あなたが前にそれを気づいていない場合はもちろん、私たちはより多くの次の練習を動作する必要があります。最後に、私はあなたが欲しい仕事を見つけることがしたいです。