Write Code Every Dayを実践するための方法

いよいよアドベントカレンダーも最終日になりました。

本日は**「Write Code Every Day」**を実践するための方法について書かせていただきたいと思います。

## Write Code Every Dayとは
Write Code Every Dayとは、毎日コードを書く習慣のことです。John Resigという人が考案した習慣で、ようはとにかく毎日GitHubに草つけていこうっていうことです。

言うだけなら簡単なのですが、仕事以外で毎日コードを書くということは、想像以上に大変でした。実は9月末に一回挑戦しようとしてみたのですが、そのときは一週間しか続きませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176572/3cf78444-25ad-989d-13dc-e301e4ddbb33.png)

ローカルとGitHub上のメールアドレスが一致していないとcommitしても草がつかないということに気づかず、開始して2日目でいきなり草が途絶えてしまいました。さらに4日目、5日目は環境構築や実装で詰まってしまいcommitするに至らず、その後は飲み会でその日中に帰られないなどで草がつかない日々が続き、やる気がなくなってしまいました。

プログラミングや開発が大好きで、家に帰ってからもプライベートで実装しまくっているという人ならまだしも、毎日プログラミングをするということにそこまでモチベーションが高くなかった私にとってはかなりハードルが高かったです。

それでも、**そんな私がなんとか「Write Code Every Day」を続けるために考えた方法**を紹介したいと思います。

## 失敗理由の考察
そもそもなぜ失敗してしまったのかを考えてみることにしました。一回目の挑戦では、自分の役に立つものを作りたいという気持ちがあり、自分用のWebアプリを開発しようとしました。コーディングのモチベーションはとても高かったのですが、「Write Code Every Day」を続けるにあたってはよくないところもありました。

- 設計でつまる
- フレームワークやライブラリの選定でつまる
- 環境構築でつまる
- 実装でつまる

これは私のスキル不足に起因するところもありますが、毎日1時間も時間がとれない場合がある中で、手を動かさずに考えるだけの時間があると、何もcommitせずにその日が終わってしまうということもありました。

また、以下のようなことも失敗の原因でした。

- git commitを忘れる
- 飲み会から帰ってきたときには24時を過ぎていた

それくらいなんとかしろと思われるかと思いますが、こういう些細なことでも草はつかなくなるのです。これらが重なると、何日も草が生えなくなり、結果的にやる気がなくなってしまいます。

## 改善案：競技プログラミングの問題を解く
Write Code Every Dayによって何かを得たかった私は、どうしたらWrite Code Every Dayを続けることができるかだけを考えることにしました。つまり世間一般的にはよくないとされている**「手段の目的化」**をすることにしました。

私は以下の条件が満たされていれば続けられると思いました。

1. 一日30分のプログラミングで必ずcommitできる。
1. 設計が不要
1. 実装で詰まらない
1. 続けることで何かしらの力がつく

これらの条件を満たすものは一体何かを考えたときに、**「競技プログラミング」**の問題を解くことにしました。具体的には[AIZU ONLINE JUDGE](http://judge.u-aizu.ac.jp/onlinejudge/)の問題や、[プログラミングコンテストチャレンジブック](https://www.amazon.co.jp/dp/B00CY9256C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)の問題に挑戦し、解けなかった場合は解けるまで続けるというルールを敷いて毎日1問解くことにしました。

これによって、

- 問題設計の時間が省略される（既に問題は用意されている）
- クイズを解いているような感覚になるので楽しい（モチベーションも高い）
- C言語、C++の書き方も少しだけ身につく

というような効果があり、以前よりも続けることのモチベーションがあがりました。

## 再挑戦してから
改善案を実践してからの私のGitHubは以下のようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176572/bcc07775-af57-d9ea-6563-36eddd5922a1.png)

**「結局できてない日あるじゃん！」**と思われるかと思いますが、全くその通りで恥ずかしい限りです。やったのにcommitし忘れたり、飲み会がある日はできなかったりなどほんのちょっとした原因で草を途絶えさせてしまいました。それでも、以前よりは続いているので、確実に効果はあったと思います。

（私ははじめてからちょうど三週間で抜けてしまいました。一回抜けるとモチベーションが一気に下がるので気をつけましょう。）

## 続けた結果
Write Code Every Dayを続けたことによる何かしらの成果を出したいと思い、AtcoderというプログラミングコンテストのBeginner Contestに挑戦しました。以下が私のレーティングです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176572/ab6051a4-6c08-6ba3-8bd0-cef780bb3a18.png)

毎日問題を解き始めてから、少しずつコンテストで解ける問題の数も増え、スコアも少しずつ上がりました。競技プログラミング経験者からしてみたら本当に低いスコアだと思われるかと思いますが、未経験の私にとってはスコアを上げることがかなり難しく、挑戦しがいがあります。これからもこのスコアを上げられるように頑張っていきたいと思います。

## 続けてみた感想
コードを毎日書く習慣ができたことはいいと思いました。仕事では毎日書いているのですが、仕事以外でも書くことによって、普段の業務では身につかないような知識が身につくし、コーディング自体の苦手意識はなくなってきたように思います。

## 今後は
毎日コードを書くということもかなり習慣化してきたので、そろそろ最初にやりたかったWebアプリ開発にも挑戦したいと思います。今までのように問題が初めから設定されているわけではなく、自分で設計する必要があるので難易度が上がりますが、問題の設計から含めて短時間で毎日やるようになることで、より短時間で実装する能力などが身につくのではと考えています。

## まとめ
私がWrite Code Every Dayを続けるためにしたことは

- 「競技プログラミングの問題を解く。」

この一点です。

いろんな方法があるかと思いますが、今まで全然続かなかった人は、この方法で挑戦してみるのも手だと思います。特に意識しなくても毎日草くらい生えるというような意識の高い方からすると、かなりしょうもない内容だったかと思いますが、これを読んでWrite Code Every Dayを始めてみようかなとか、興味を持ってくれる方がいれば嬉しいです。

それでは良いお年をお迎えください。

## 参考
https://johnresig.com/blog/write-code-every-day/