これは「コードクリサリスへの入学方法」の続きにあたる記事になります。コードクリサリスの選考プロセスに興味のある方はぜひそちらも読んでみてくださいね。
この記事は、コードクリサリス・イマーシブコースに入学するための、第2選考についての記事です。第2選考では、みなさんは私やほかの講師とペアを組み、JavaScript を使った一連のクイズや問題を解いていくことになっています。
こうしたテクニカル・インタビューを実施するのには、3つの目的があります:
また、このテクニカル・インタビューを行うことで、みなさんは実際の採用面接に近い状況を経験することができます。コードクリサリス側が評価し、フィードバックを返す根拠としているものは、企業が応募者に求めているのと同じものです。
その意味で、コードクリサリスでの学習は、みなさんが 12 週間のコースを受ける何ヶ月も前から始まっていることになります。
ここからは、応募者のみなさんがよくつまづく、10 個のポイントをご紹介します。
コードクリサリスでは、直接答えを教える代わりに、問題の本質を見直して、間違いを犯し、自分で調べ抜くためのヒントと勇気を提供しています。
次のようなオブジェクト・リテラルを考えましょう。
const object = {
a: 1,
b: 2,
c: 3
};
(ちなみにオブジェクト・リテラルとは、上記のようなオブジェクトの使い方を指す、ちょっと洒落た言葉のことです。文字通りのオブジェクトです)
ブラケット記法では、このオブジェクトのキーを使うことで、それぞれの値にアクセスすることができます。
object[‘a’]
// 1
object[‘b’]
// 2
object[‘c’]
// 3
ドット記法でも同様ですね。
object.a
// 1
object.b
// 2
object.c
// 3
では一体、この2つの違いは何でしょうか? 以下のコードをコンソールで実行してみてください。
const object = {
a: 1,
b: 2,
c: 3
};
let key = ‘a’;
console.log(object.key);
console.log(object[key]);
console.log(object.a);
console.log(object[a]);
結果はどうなったでしょうか? そうなった理由は何でしょうか?
とても基本的な例を見てみましょう。
function sayHi() {
console.log(‘Hello’);
return ‘Hi’;
}
let foo = sayHi();
console.log(foo);
console.log(foo);
上のコードは、HelloとHiを何回コンソールに表示するでしょうか?
こちらはもう少し発展的な例です。
function foo() {
console.log(‘foo’);
bar();
}
function bar() {
console.log(‘bar’);
}
function baz(fn) {
console.log(‘baz’);
fn();
}
baz(foo);
ここでは何が起きているでしょうか? そしてその理由を説明できますか?
もう一つ例を見てみましょう。
function getNumber() {
return 5;
}
function invokeSomething(fn) {
return fn();
}
次のどちらの行が、問題なく動くでしょうか?
invokeSomething(getNumber()); // Choice A
invokeSomething(getNumber); // Choice B
その理由は何でしょう?
Return は、関数の宣言の中身でのみ利用できる唯一のキーワードで、2つの役割を担っています。それは、関数にアウトプットを渡すことと、その関数のさらなる実行を止めることです。
もしアウトプットが渡されなかったら(つまりreturnキーワードが使われていなかったら)、その関数はundefinedを返します。
下記の例を見てみましょう。
function noReturn() {
console.log(‘Print!’);
}
let whatsMyReturn = noReturn();
console.log(whatsMyReturn);
コンソールには何が表示されますか? その理由は?
また、すでに述べた通り、returnキーワードにはその関数が実行され続けるのを防ぐ役割もあります。つまり、もしforループのなかにreturnキーワードがあるようなコードの場合、そのループは最初のきっかけで終了することになります。
どういう意味でしょうか? 自分のコードで実際に試してみてください。
もしあなたが、あらゆる状況で.forEachや.mapを使っているとしたら、それらを使わずに問題を解く練習をすることをおすすめします。
ビルトインのコードを使う前に、それらがどうやって動くのか理解できるようになりましょう。もしもその理解が十分でないままだと、いつも半ば盲目的にコードを書く羽目になります。必ず、何を書いているか自覚的になりましょう。あなたのキャリアは、それができるかどうかで大きく変わってきます。
エレガントな解き方ができなくても、不満に思う必要はありません。まずは、ちゃんと動くコードを書きましょう。そのあとに見返して、改善していければ問題ありません。
動いていても汚いコードは、一度壊れて、まだ壊れたままのコードより断然マシです!
{}と[]は一見似ていますが、同じものではありません。
両者の違いに関しては数え切れないほどのブログ記事が存在するので、時間を見つけて机の前に座り、読んで、練習をこなしていきましょう。
以下の質問には答えられるようにしておきましょう。
注:もしもprototypeやthisについて言及している記事を見かけた場合は、いったんその部分を読み飛ばすのも手です。つまづきやすい重要なコンセプトであることには変わりありませんが、コードクリサリスのテクニカル・インタビューでこれらについて問うことはないので、後日の学習に回しておきましょう。まずは基本を固めることに集中してください。
イマーシブコースの選考プロセスで出されるコーディング・チャレンジでは、みなさんが書く関数のインプットやアウトプットについて非常に厳密な要求が課されています。
コードのロジックに手を出す前に、必ずどのような関数を要求されているのか整理しましょう。
function nameOfFunctionHere(/* いま問われているインプットは? */) {
return /* (もし存在するなら)どのようなアウトプットが必要か? */
}
もし問題の意図がよくわからなければ、聞いて確かめましょう!
要求されている関数の大枠がはっきりしたら、ロジックに移りましょう。次のような質問に自分で答えていってみましょう。
関数は JavaScript における値の一種にすぎません。JavaScript の値には、たとえばどんなものがあるでしょうか?
以下は、ごく基本的なデータ型とその例です(一覧を見たい方は、下記のリンクを参照してください)。
これらは値として、変数に格納することができます。
let myNumber = 10;
let myString = ‘Hello!’;
let myBoolean = true;
let myUndefined; // ← なぜmyUndefinedには何も代入しなくて良いのでしょうか?
let myObject = {a: 1, b: 2};
let myFunction = function() {
return ‘This is my function output!’;
};
補足: 関数を定義したいとき、上記のように関数式(function expression)として書くことができることに注意しましょう。上の例では、関数がmyFunctionという変数に代入されていますね。関数を定義する際は、次の例のように関数宣言(function declaration)として書くこともできます。
function myFunction() {
return ‘This is my function output!’;
}
この2つはほぼ同じ挙動をします。両者の違いについて興味のある方は巻き上げについて読んでみてください。ただし、この相違点に関しては現時点で知っておく必要はありません。
returnキーワードを使うことで、これらの値を関数から「リターン」することもできます(アウトプットがそれですね!)。
function getNumber() {
return 10;
}
function getString() {
return ‘Hello!’;
}
function getBoolean() {
return true;
}
function getUndefined() {
}
function getObject() {
return {a: 1, b: 2};
}
関数自体を関数から返すことも可能です。
function getFunction() {
return function() {
return ‘This is my function’s function output!’;
}
}
上記の関数に、 `This is my function’s function output!’ を表示させるにはどうすればよいでしょうか?
以下のコードをコンソールで実行してみてください。ただし、実行する前に、次の質問の答えを考えてみましょう。
getFunction();
getFunction()();
let whatIsThis = getFunction();
console.log(typeof whatIsThis);
whatIsThis();
エラーメッセージはみなさんの親友です!頻繁に出くわすエラーメッセージに慣れて、その意味がわかるようになりましょう。無視するのはご法度です。
エラーメッセージは、エラーの内容だけでなく、エラーが発生したコードの行番号も教えてくれます。これらに細心の注意を払って、その意味を Google で調べる習慣を身につけましょう。
初心者プログラマがよく出くわすエラーメッセージの例
Uncaught ReferenceError: _______ is not defined
これは変数や関数の名前が見つからないときによく出てくるメッセージです。JavaScript エンジンは、その名前が何を指しているのか理解できていない、というわけです。
スペルの誤りはないでしょうか? 変数は全て宣言されていますか? コピペしたりしませんでしたか?(内容を理解せずにコピペするのはやめましょう)
Uncaught SyntaxError: Function statements require a function name
Uncaught SyntaxError: Unexpected identifier
カッコで始めたり、カッコを閉じたりするのを忘れてはいませんか? これは大概そういったときに出てくるエラーです。
Uncaught TypeError: Cannot read property
これは大抵、定義されていないオブジェクトに対しプロパティを読み込もうとしたり、メソッドを呼び出そうとしたりしたときに表示されるエラーです。オブジェクトに存在しないメソッドを使おうとはしていませんか? そもそもそのオブジェクトは定義されていますか?
コードを書くときは、遠慮せずにconsole.logで変数をコンソールに表示しましょう。このテクニカル・インタビューでは、何度コードを実行しても大丈夫です。あなたの仮説を実証するためにコードを実行しましょう。本当にその変数の中身は関数でしょうか? それとも文字列? 数値型?
あなたが 2だと思っていたものが実際には ’2’だったりすると、それは結果に大きな違いを生みがちです。console.logやtypeofを使って、あなたの考えが考えで終わらず、実際に正しいことをダブルチェックしておきましょう。
この習慣は、バグを防ぐことにも繋がります。たくさんのコードを書き終えて最後に実行したとき、初めて間違っているものがあると気づくようでは、イライラするかもしれませんよね。そんな間違いを犯す事態に陥らないよう、バグから自分自身を守りましょう。
もっと知りたいという方は、こちら
Code Chrysalis は日本・東京にあるプログラミングブートキャンプです。3 ヶ月間で強靭なソフトウェアエンジニアになるイマーシブは、オンサイトではもちろんリモートでも受講可能です。
いつでもお気軽にお問い合わせください!
お問い合わせ
サービスご利用についてのご相談や資料請求は
お問い合わせフォームよりご連絡ください。