連休を機に考える、怠惰な私の自習戦略

#はじめに
普段は仕事でC#を使ってWindowsアプリケーションを開発している者ですが、以前からNode.jsに興味があったので学ぶことしました。
年末年始の時間を使ってやる気が続く限り自習していきたいと思って書き始めたわけですが、書いていくうちに考えが少しずつまとまってこのような形になりました。
先にことわっておきたいのですが、この記事内容は自己の性格に大きく依存しており、多くの人には直接参考にならないと思います。部分的にでも知見が得られることになれば幸いです。

#自習における基本原則
様々なことが続かなかった経験上、自習をするにあたって重要にして壁になるのはモチベーションだと感じます。
しかしながら何もかもやらずにいたわけではないので、自分がどういう時に自習できたかを思い出します。

- **こういうのあったらいいな～ってのがあるとき**
- **尻に火が付いたとき**

「こういうのがあったらいいな～」というポジティブなモチベーションだけで自習をやり遂げられるバイタリティを自分は持ち得ていません。
そこで、テスト前に一夜漬けしていた習性を活用します。これまであまり考えようとしなかった「20代の終わりが見えてきたのにC#でWindowsアプリくらいしか大して書けない」といったようなネガティブなプレッシャーさえ利用して行動に繋げます。
遠くにニンジンがぶら下がっているだけでは向かわず、尻に火がついただけではどこへ進むかもわからないわけですね。我ながらだらしない。
言うなればこれは「動機維持ドクトリン」でしょうか。モチベーションを維持すること自体は自習の目的ではないですが、方針を固めたり見直したりする時にはこれを最優先に考えようと思います。
他者によるクオリティコントロールであればチェックリストを作成するなどが考えれますが、自分のことなのでそんなものがなくても判断できると信じます。むしろ活動が非人間的で機械的作業が増えていくほど私のモチベーションが下がることでしょう。あえてふんわりさせたままにしておくことも必要です。

#自習の戦略
結局のところ自習してどうなりたいのか、抽象的でもいいから目標を立てます。

- **C#+WPFと同程度にはNode.jsを使ってアプリケーションが書けるようになりたい**
    - スムーズにプロジェクトを作成し、すぐに書き始められる
    - 何を調べたら良いのかすぐにわかり、調べて動作させられる
    - デバッグができる･･･etc.

抽象的な目標もブレイクダウンしていくと具体性が少しずつ出てきます。仕事では数値目標が基本ですが、ここではそれをしません。
他人に自習を評価してもらうわけではないですし、C#と同じくらい書けるようになったかなんてそれこそ自己満足に過ぎませんから。

#戦略目標を達成するための作戦
本をいちから読んで学ぶことを私は優等生の勉強法とかエリートスタイルと呼んでいます。無論エリートでない私にこの方法は適していません。
尻に火をつけるのはあくまで原動力であって目的地ではない一方で、「こういうのがあったらいいな～」というものを作ることは戦略目標を達成しうるでしょう。つまりほしいものを挙げ、それらをつくっていくことを作戦とします。

##つくりたいもの
今これを書いている時点では大体こんなものができたらいいなとイメージしています。詳細は重要ではないので説明しません。作った結果を記事にしたときにすればいいやと思います。

- 特定のRequestがきたらHeader付きのRequestにする中継サーバー
- URLから特定要素を組み替えるダウンローダー
- ボドゲ会用の日程調整アプリ

##作戦目標の分割
ものづくりにおいて、特にアプリケーションは作り込み始めると際限なくタスクが浮かんできます。
やることがいきなり多くなると萎えるため、目標は大原則のモチベ維持が簡単なものから段階的に設定するべきです。
ガワが苦手でロジックの方が得意である私には、このように設定できるとすぐに浮かびました。

目標1. 自分だけが使うなら十分といえる最低限の目標
目標2. 他の人でも使えるようにするために必要な機能
目標3. あると便利な機能

当然ですが今の時点で目標3まで熟考して設定しません。
実際にコードを書いている時に「いやこれべつに必要ではないよね」と覚めた時などに押し込んで後回しにします（やるかどうかも今は考えない）
まずは目標1だけをしっかり考えます。**そして各作戦の目標1をクリアすることを目指します。**

##作戦目標の設定
目標という字がゲシュタルト崩壊してきました。上記に従い今の感覚で目標を分割して設定します。C#+.NETFrameworksと違ってNode.js関連は様々なフレームワークがあるため、それらを使うことを目標に組込んでもいいですね。

<details><summary>特定のWebRequestをHeader付きのRequestにする中継サーバー</summary><div>

- 目標1
    - HTTP Requestを受けて、特定のHTTP Requestを送る。返ってきたResponseをそのまま返す
    - 借りているVPSに置いて動かす
    - コードはNode.jsだけで良さそうだが、サーバーサイドのnginxから繋ぐ作業が必要そう
    - Node.jsをデーモンにする
    - 超簡単そうだから一番最初にできそう
    - ExpressやTypescriptを使い始められると尚良し
- 目標2
    - GUIに送って欲しいRequsetを入力して登録すると、それのトリガーとなるRequestの生成をする
    - GUIをイチから書くのはイヤ。Vue.jsやpugを使いたい
    - 登録となるとDBが必要
    - 誰でも発行できるといやなのでユーザー認証の仕組み
    - 一気に面倒くさそうになったが、よくある仕組みは作れそう

</div></details>

<details><summary>URLから特定要素を組み替えるダウンローダー</summary><div>

- 目標1
    - デスクトップのアプリを作る。Electronの出番だ
    - 最低限の入力フォーム
    - URLから取得したページの特定要素を探す
    - 特定要素を組み替えて新しいURLを作るロジック
    - 出来上がった新しいURLからファイルをダウンロードする
    - GUIを極限まで手抜きすれば年末年始の間にいけそう
- 目標2
    - インタラクティブなコントロール
    - 今時っぽいGUI
    - 自分しか使わないだろうから想像する気がイマイチ起きない

</div></details>

<details><summary>ボドゲ会用の日程調整アプリ</summary><div>

- 目標1
    - 人に入力してもらう必要があるから必然的に目標1で済まない
- 目標2
    - レベルが足りていないからか、必要な機能が多くてまだうまく想像できない
    - 中継サーバーの目標2くらいまでやれるようになると見えてくる気がする

</div></details>

#性格に合わせた戦術
私は環境構築やビルド方法などが何やってるかよくわからないままエイヤでコードにフォーカスできる質ではありません。兵站に不安があると戦えないタイプです。AoEなどのストラテジーゲームでもブーム（内政重視）をする傾向があります。
それを踏まえて環境構築や公開周りをしっかり記録します。例えばこういう部分です

- Node.jsの導入（バージョンスイッチする方法）や各フレームワークのインストール方法。複数マシンを持っているから1回きりじゃなくて何度でも簡単に作れるようにする。
- GitからDownloadしてきた時にどういうオペレーションが必要か、逆にどういう形態でUploadするべきなのか
- TypescriptのビルドやデバッグをVSCodeでGUIから行うには？どこに何を書いて実行されるのかなど
- サーバーへのデプロイ方法や複数のWebサービスをどのドメインで運用するか

この辺りがわかっていると、クソコードしか書けなくても経験値を貯める土壌ができるため、新しく書き始める精神的ハードルが下がることが経験上わかっています。

#おわりに
書き始めた当初のタイトルは「年末年始Webアプリ開発自習の記録1 目的の整理」であったのに、書いていくうちにあれやこれやと変わり、気がつけば自身の自習戦略論を語る記事になっていました。
しかもこれを書くだけで貴重な年末年始休みの1日目が終わる上に、そもそもこういう話は成功したという事実を基に語るべきであって、今の段階では妄想も甚だしく説得力皆無です。ほんまにそういうとこやぞ。
まぁでも、普段はバラバラに考えていたものを言葉にすることでなんとなく体系的にできたことは良かったと思います。