新しく言語を学ぶときに心がけていること

エンジニアは1年に1つの新しい言語を学ぶことを推奨されていますが、学び方の具体例についてはあまり言及されていなかったので、自分なりに心がけていることをまとめます。

ここでの内容は、「理論を読んで理解できる人」よりも「手を動かしてみないと理解できない人」向けになっています。

コードを書いて何かを作るのが好きな人や、ドキュメントを読んでいるだけだとよくわからずに眠くなってしまう人のための方法をまとめてみたので、良ければ参考にしてみてください。

※ ここでの「言語」には、JavaScriptやPythonなどの言語の他に、ReactやRailsなどのフレームワークやライブラリも想定しています。

# 1. 言語の歴史と特性を知る
いきなりコードの細かい内容に入っていくのではなくて、まずはその言語が生まれた歴史的背景や、その特性を知ることが大事だと思います。

例えばGoを勉強するときには、

> - Goは2009年にGoogleが作ったオープンソースの静的言語
> - 当時はPHPやJavaScriptなどの動的言語が流行する一方で、速くシンプルに動く静的言語の需要があった
> - プログラムの大規模化に伴って必要性が高まった並行処理がとても簡単に書ける
> - 型推論が優秀で、書き方もシンプルなので楽しく開発できる
> - マスコットのGopherさんが可愛い

などの情報を先に知っておくことで、具体的なコードを学び始めたときに「あれはこういうことだったのか」と実感する助けになるでしょう。

これらの情報は、公式ドキュメントに "Introduction" として書かれていたり、人気の言語であれば日本語でもまとまっていたりするので、探すのは難しくないはず。

言語の歴史と特性を知っておくと学習がちょっと楽しくなるのでおすすめです。

# 2. 何はともあれHello World
言語の概要が理解できたら、とりあえず "Hello World" を出してみます。

"Hello World" を出力する方法は、おそらく言語のドキュメントに書いてあると思うので、それに従ってコードを書いてみると良いです。

自分で環境構築をして "Hello World" のコードを写経することで、何となく開発のイメージはつかめるでしょう。

（Goで "Hello World" を出してみる - [Go Getting Started](https://golang.org/doc/install)）

```go:index.go
package main

import "fmt"

func main() {
	fmt.Printf("hello, world\n")
}
```

自分でコードを動かすことで、達成感を得ることも大切です。

学び始めはわからないことが多すぎて挫折しそうになりますが、それを防ぐためにまずはこういった小さな成功体験を積み重ねていきましょう。

# 3. ノートを取りながら言語の仕様を学ぶ
"Hello World" が出せたら、次は言語の仕様について学んでいくのが良いと思うのですが、そこではノートを取りながら学ぶのがおすすめです。

ドキュメントを読むだけではすぐに忘れてしまいます。記憶を定着させるために、自分の言葉や自分のコードで記録しながら学ぶのはとても大事です。

読んでいて大事だと思ったことは、後から見返せるようにノートにまとめておきましょう。

ノートを取るおすすめの方法は、自分専用のSlackで言語別にチャンネルを立てて、そこに集約することです。

（TypeScriptを学習したときのSlackメモ）

<img width="782" alt="スクリーンショット 2019-05-12 12.06.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227196/5e77d06a-2b21-c4c0-5811-01a76271db73.png">

Slackの便利なところは、

- コードスニペットが貼れる
- URLがサムネイルつきで自動的に展開される
- 書いた日付が自動で記録される
- 検索機能がついている
- スマホからも操作がしやすい

といった部分なので、プログラミングに関するノートを取るには優れていると思います。

参考になったコードをそのまま貼ったり、大事な記事のURLを貼ったり、電車での移動中にスマホで見返したりしながら、言語についての理解を深めると学習の効率が上がります。

他のツールだと[Evernote](https://evernote.com/intl/jp)や[Boostnote](https://boostnote.io/ja/)を使っても良いと思います。

いずれにしろ、読んだことを自分でまとめることはとても大事なので、ドキュメントを読むときには必ずノートを取っています。

# 4. お約束のプログラムを作る
ノートを取りながらドキュメントを読んで、ある程度の理解ができてきたら、お約束のプログラムを作ることにしています。

## フロントエンドの場合

### TODOアプリ
フロントエンドの勉強を始めたら、まずはTODOアプリを作ってみます。

理由としては、TODOアプリを作ることによって、formからの入力を受け取って、それを表示・削除するまでのCRUDの流れを1ページで実装できるからです。

細かい仕様については以下の記事を参考にしてみてください。

[Vue.jsミニハンズオン（TODOリスト作成）](https://qiita.com/moonglows76/items/358ef3cd1566c38ece3a)
[NEXT.jsとReact Hooksを使ってTodoアプリを10分で作る](https://qiita.com/hiraike32/items/71b14755f56208a8a133)

### Portfolioの作成
フロントエンドが理解できたら、自分のPortfolioを作ってみると良いです。

実際にデザインをしたり、どこかのホスティングサービスにデプロイをしてみることで、フロントエンドの一連の開発を体験することができます。

自分のPortfolioのイメージが湧かない方は、こちらにエンジニアが作ったPortfolioがまとめられているので、参考にしてみてください。

[エンジニア向けのポートフォリオサイトまとめ](https://qiita.com/turmericN/items/37c3fbe00ee6bbc7e201)

## サーバーサイドの場合

### ブラックジャック
ブラックジャックを作ってみるのが良い理由は、以下の記事にまとまっているのでここでは割愛しますが、適度に色々な言語の機能を使うことになるので程よい難易度のコードが書けるでしょう。

[プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)

### 簡易SNS
ユーザーのログイン、プロフィール編集、文字の投稿、いいね！などの機能を備えた簡易的なSNSを作ることで、本格的なアプリケーション開発について学ぶことができます。

DBの設計とデータのアクセス方法を学んだり、ログイン情報を保持したり、Viewにデータを渡したりと実装することは多いですが、そうやって実際に手を動かすことで大きな学びに繋がるはずです。

以下の記事のように、自分のオリジナリティを組み込むと開発がより一層楽しくなるかもしれません。

[360°写真が楽しすぎるので、360°用SNSを作ってみた話](https://qiita.com/KanyeEast/items/3cac537300827dfa1fd3)
[RailsとReactでSNSオリジナルアプリケーションを作ってみた。](https://qiita.com/yoshimo123/items/e9929c7c914b8ef7981a)

## その他
もっと色々なプログラムを作りたい場合は、こちらにプログラムのお題がまとまっているので参考にしてみてください。

[ペアプロ・TDDの『お題』をまとめてみた #tddbc #coderetreat #pp_con](https://absj31.hatenadiary.com/entry/20120721/1342880403)

# 5. Twitterを活用する
最後に、学んだ言語の変化についていけるように、Twitterでその言語のアカウントや、OSSでのコミッター、言語の第一人者などをフォローしておくと良いでしょう。

(Reactのアカウント。アップデートに追従するのはとても大事)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">We’ve just released React 16.8 with a stable version of Hooks. React Hooks let you use features like local state and lifecycle without writing a class. They’re fully backwards-compatible and you can start using them today. <a href="https://t.co/didbtI06Ie">https://t.co/didbtI06Ie</a> <a href="https://t.co/YfS6Z37O7a">pic.twitter.com/YfS6Z37O7a</a></p>&mdash; React (@reactjs) <a href="https://twitter.com/reactjs/status/1093138486587199488?ref_src=twsrc%5Etfw">2019年2月6日</a></blockquote>

言語の第一人者がよくわからなければ、その言語名で検索をかけてみて、プロフィールにその言語を書いていて、かつフォロワー数が多い人を探してみてください。

ドキュメントを読むだけではわからなかったり、見落としてしまっている情報が手に入ったりするので、Twitterもうまく活用していきましょう。

以上、新しく言語を学ぶときに心がけていることをまとめました。
少しでも参考になるところがあれば幸いです。