Salesforce JavaScript Developer Iの資格を取りました！

<div align="center" width="100%">
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2262/93bb471f-ef6f-d093-c096-bd27865b402f.png" />
</div>

# JavaScript Developer Iとは
SalesforceではJavaScript Developer Iという資格があります。ご存知でしょうか。Salesforceとしてはデベロッパー向けの資格が珍しいかと思います。
https://trailhead.salesforce.com/credentials/javascriptdeveloperi

# 資格の概要
9月にJavaScript Developer I（以降：JSDEV I）の資格を取得することができましたので、情報共有としてこちらで投稿させていただきます。

JSDEV Iの資格を取得するのは「Lightning Web Component Specialist」というTrailheadのスーパーバッジとJSDEV Iの資格試験を合格しなければいけません。「Lightning Web Component Specialist」のスーパーバッジはLWCのスキルを高めて他のスーパーバッジのように一つ一つ課題をクリアすることです。複数の課題をさえクリアすれば何度でも挑戦しても良いです。
![2020-06_JSDI+Credential+Structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2262/eda6f5c6-5f9e-ab54-da92-7457bd5e342d.png)


# 試験問題の割合
**JSDEV Iの資格試験はLWCやSalesforceの知識を使わず**、JavaScript全体的かつ基本的な問題が出てきました。資格試験は英語で行います。
試験の問題の割合はこちらです：
Variables, types, and collections: 23%
Objects, functions, and classes: 25%
Browsers and events: 17%
Debugging and error handling: 7%
Asynchronous programming: 13%
Server-side JavaScript: 8%
Testing: 7%
当時受験してみてそこまで準備はしてませんでしたので、まさか合格ラインギリギリで合格できちゃいましたが、
今後他の方にも合格できるために私なりにこちらの勉強方法を考えました。興味ある方是非ご参考ください。
こちらの投稿では難関のセクションの勉強方法のみを紹介します。

# 勉強方法

## JSプログミングで基本的なことを磨きましょう。
Variables, types, and collections: 23%
Objects, functions, and classes: 25%
Browsers and events: 17%

こちらのセクションでは少し遠回りするや落とし穴的な問題が多かったと思います。そのためにJSの基本をしっかりしなければいけません。
こちらのGithubで基本を磨けることができます。https://github.com/lydiahallie/javascript-questions

私的には[Type coercion (型強制)](https://developer.mozilla.org/ja/docs/Glossary/Type_coercion) の落とし穴が一番危険です。

そのためにこちらのType coercion (型強制)のサイトで練習して、落とし穴に慣れるしかありません。（英文）
- https://dorey.github.io/JavaScript-Equality-Table/
- https://wtfjs.com/
- https://www.freecodecamp.org/news/js-type-coercion-explained-27ba3d9a2839/

もしJSやブラウザの機能などがわからないことがあれば、**すぐMozillaの[MDNサイト](https://developer.mozilla.org/en-US/docs/Web/JavaScript)で調べるのは一番大事**です。MDNはJavaScriptのSingle source of truthです.

## 非同期を理解しましょう。
Asynchronous programming: 13%

JavaScriptには非同期処理を定義することができますが、
JavaScript自体はシングルスレッドの言語なので非同期と言っても全ての処理がスレッド持ってるわけではなく、ただ処理キューに入るだけなので**一度に一つの処理しか行えません**。
Promise、Function Generator、setTimeout, setInterval, requestAnimationFrameなどはMicroTaskの種類で、これらの処理を定義されたら、処理キューに入ります。
非同期（Event Loop）を理解するにはこちらの動画が一番適切です。（英語）
- https://www.youtube.com/watch?v=cCOL7MC4Pl0
- https://www.youtube.com/watch?v=8aGhZQkoFbQ

## NodeJSを深く理解しましょう。
Server-side JavaScript: 8%

NodeJS環境でサーバーサイドを開発するのはExpressJSやKoaなどのサードパーティーを使用するのが多いかと思いますが、NodeJS単体でサーバーサイドを開発することは中々ないです。**資格試験にはNodeJS単体の視点**で開発を行うので、もっとNodeJSについて深く理解する必要があります。

こちらの記事ではNodeJSのリクエスト仕組みを理解することができます。（英文）
https://itnext.io/how-to-handle-the-post-request-body-in-node-js-without-using-a-framework-cd2038b93190

後、デバッグの問題も出てきましたのでこちらのNodeJS公式ドキュメントもご参考ください。
https://nodejs.org/dist/latest-v6.x/docs/api/debugger.html

## テストはコードだけではなく理論も理解しましょう。
Testing: 7%

テストに関する問題は[Jest](https://jestjs.io/)中心にMockなどが出てきました。
テスト理論に関する問題もいくつか出てきました。WhiteboxとBlackboxの違いだったり、false positiveとfalse negativeなどの問題がありました。
テスト理論に関する問題はこちらの記事で細かく書いてありますのでご参考ください。（英文）
https://kentcdodds.com/blog/testing-implementation-details

# 最後に
JavaScriptは見た目的には簡単なやつと思い込んでる人が多いかと思いますが、意外と奥が深いのでまだまだ勉強する余地が凄くあります。