自主勉強継続するためにGitHub使ってタスク管理をやった話

# 自主学習を継続したい！！！！！！
　優秀なプログラマーは自分で最新の情報を仕入れて、プライベートでもコード書いているっていうよね。かっこいいなあ。私も優秀なプログラマーになりたいなー。とふわっと考えて、作りたいもの練って見るんだけど、凡人プログラマー未満の癖にやけに壮大なことを考えるせいで、大体アイデアだけで飽きる。時々、環境作ろうとはするものの、どうせならやったことない言語で描こうとして、完璧な環境構築しようとした結果、HelloWorldで満足してしまう。なんとか、継続できないかと悩んだ苦肉の策の話です。

# 目次
・初めに
・GitHubにプロジェクトを作る
・やりたいことをissueに書き出す
・ひとまずdevelopブランチを切る
・僅かにでも進捗得たらコミット
・issue単位でpush&pullrequest
・まとめ

# 初めに
　タグはほぼ詐欺です。私がたまたまチョイスしたのがReact、redux、ついでに言うと、firebaseでホームページを作ろうとしていただけです。環境構築方法については、他の方が非常にわかりやすくまとめているのでそちらを参考にしてください。
[React + redux + typescript](https://qiita.com/uryyyyyyy/items/3ad88cf9ca9393335f8c)
[React + Redux + Firebase](https://qiita.com/gonta616/items/278a7e81a8b624d9621e)
　今回、タスク管理のために、社内で行なっているアジャイル開発のノウハウを取り入れてみました。ベンチャー企業の行う理想的なアジャイル開発とは異なるため、「こんなのアジャイルじゃない！！」と言う方も多々いると思いますがご容赦ください。また、ここで紹介する方法は、３日坊主の方や、やりたいことが壮大になっちゃうんだけどすぐに飽きちゃうという、多少ぐうたらな人向けに書いています。タスク管理なんてできて当然と言う方は、私はぐうの音も出ないため戻った方が効率的です。ただし、gitについての知識はある前提になります。

# GitHubにプロジェクトを作る
　はいタイトルにあるようにGitHubを使います。アカウント無い人は作成してください。で、とりあえずプロジェクトを作成します。ここまではまあ調べてください。
そしたらcloneしましょう

```
git clone https://github.com/xxxxx/xxxxxxxx.git
```
　作成したら使用する言語を決めて、ローカル環境で**一番最初の作業** だけやったら、buildできることだけ確認してpushしてしまいましょう。私は初回はmasterにpushしてしまいました。直接が嫌な方はbranch切ってやってください。
<img width="1405" alt="スクリーンショット 2019-02-26 23.15.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/90521829-56f5-adf6-544a-055d3c85df60.png">

私はReactを使いたかったので、

```
create-react-app
```
コマンドで環境構築した時点でpushしてしまいました。

# やりたいことをissueに書き出す
　はい。面倒臭がりな私ですが、無駄に凝り性なので、やりたいことをissueに書きます。私の粒度は下記のような感じでした
<img width="977" alt="スクリーンショット 2019-02-26 23.19.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/6bc5c32c-bdaf-d93e-d990-94f18905a1f3.png">

で、issueの中に実際にやることを書きます
<img width="1056" alt="スクリーンショット 2019-02-26 23.22.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/5a0bd5da-77b6-d9cf-1f8f-0294b72e4137.png">

<img width="1056" alt="スクリーンショット 2019-02-26 23.21.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/d7e7e774-e1bb-d4ea-7e38-cd1afaecbd5a.png">

書いてみると、割とやること多いんですよね。そこでアジャイルの思想が出てくるのですが、基本的に完成版をイメージしてはいけません。あくまでも直近でやるべきことから書いていきます。私の場合は環境構築で挫折することが多い人間なので、環境構築ステップを一通り洗った時点で一度issueの洗い出しをやめました。

issue作成のポイントをまとめると
・作るものを決める
・作成のためのステップを出来るだけ細かくissueにする
・issueは作りすぎない

といった感じになります。issueをたくさん作りすぎると、こんなにたくさんできないやんけとなって、挫折するので、機能を実現できる最小単位で作るのがベストです。

# ひとまずdevelopブランチを切る
　gitなら作業はmasterからブランチ切るっしょ。と言うことで、ひとまずdevelopに切ります。

```
git checkout -b develop
```
　今回は作業者が私だけなのでdevelopとmasterブランチしかありませんが、複数人で作業する場合は都度branchを切ってください。ただ、今回はソロでのお勉強なので２つあれば十分だと思います。そうしたら、issueの中で最も重要だと思うものを１つ選択して、実装に取り掛かります。

# 僅かにでも進捗得たらコミット
　スキあらばcommitしましょう。buildが通ればcommit。UIの文言変わったらcommit。Qiitaで参考にしたコードコピペしたらcommitくらいの感じで。私は変更箇所が100行超えないように心がけています。
　人によっては、commitの単位も機能単位にした方が良いと言う方もいると思います。それはおっしゃる通りですが、勉強を継続するには、commitは細かいに越したことは無いと思います（異論は認める）。例えば、reactのbootstrapを導入した時は、以下のレベルでcommitしました。(下記は、react-bootstrapのサンプルをコピっただけ)
<img width="1397" alt="スクリーンショット 2019-02-26 23.39.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/ed1039b2-3591-5458-e8b4-198213784f9f.png">

# issue単位でpush&pullrequest
　動く単位でcommitを繰り返したら、リモートにpushしましょう

```
git push origin develop
```
そしたら、pullrequestを作成しましょう。（GitHubのbranchの横にあります。）
<img width="1000" alt="スクリーンショット 2019-02-26 23.52.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/18ec571a-5568-3a72-cbb0-0887cf723a02.png">

developからmasterに向けてのpullrequestを作成します。（私はpackage.lock.jsonでconflict起きちゃいましたが）
ここで、pullrequestに関連するissueを本文に追加しておくとタスク管理がかなり楽になります。
<img width="1056" alt="スクリーンショット 2019-02-26 23.56.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/d7898bad-8a44-9329-52e7-456a563139fb.png">

pullrequestを作成したら、スカッシュマージしてしまいましょう。（赤いのはレビュー通らないとマージできない設定入れているからです。通常は緑）
<img width="797" alt="スクリーンショット 2019-02-27 0.01.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/22def675-b33b-15ac-5717-652b42efd344.png">

スカッシュマージは、▼から選べます。基本的にスカッシュを推奨します。スカッシュマージは、pullrequestでマージする全てのcommitをpullrequestのタイトルcommit１つにまとめてくれるため、historyがすっきりします。また、コミット内容が確認したければ、githubのinsight > networkから、commitを辿ることで細かい修正も確認できます。
<img width="906" alt="スクリーンショット 2019-02-27 0.07.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/e8b3ee61-b868-60f7-5a37-51acbf256018.png">

<img width="598" alt="スクリーンショット 2019-02-27 0.03.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/dcd91ee9-3660-d3b1-cf58-ab6142c9e8be.png">

またpullrequestにissueの番号を入れておくことで、issueの方にも関連が持てます。(pullrequestで#3を説明部分に記載した時)
<img width="780" alt="スクリーンショット 2019-02-27 0.12.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/b093d5dd-f11a-4c42-8d5d-f53a31a6c60c.png">


明示的にissueが完了したことがわかるので、issueはcloseしちゃいましょう
<img width="780" alt="スクリーンショット 2019-02-27 0.14.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/188058/f17fbe53-ae56-a3cd-14a6-2df8c10c48fa.png">

あとは、developにブランチを切るところからの繰り返し

#まとめ
　タスク管理ツールなんていくらでもあるので適材適所だとは思いますが、今回はgithubだけで管理してみました。長い目で機能を考えると大抵挫折するので、アジャイルに細々としたリリースを心がけ、なおかつ直近にできるタスクをissue化して実装を繰り返していった方が、個人での実装なら良いのでは無いかと。
　まあ、本来のissueの使い方では無いと思いますが、私はこんな使い方をしてみましたと言う共有でした。

もっと便利に運用できるぜってコメントがあればぜひご教授ください。（本来の使い方じゃ無いぜ。とか、よくみたら変なcommit入っているやんけとかの意見もあると思いますが、勉強中の身ゆえ許してください）

# 補足
こんなふわっとしたやり方じゃダメでしょって人は、もっと丁寧に書いてくれた人がいました
https://qiita.com/suzuki-hoge/items/3a568dff36fd981082ba
ただ、個人の勉強レベルで期限決めたりテンプレ作ったりはその時点でめんどくさくなっちゃうので、これくらいなら一人でも継続できそうだなってレベルで今回の記事は書きました。