「好き」を自己啓発にする～個人開発とプロジェクトとの相互補完～

我々ITエンジニアの世界は変化が激しく、常に新しい技術が生まれ、成長し、数年経てば「デファクト・スタンダード」が変わってしまう世界です。
そのため、私たちは常にその変化をしっかりとキャッチアップしておかないといけません。

ただ、キャッチアップしている間は「利益にならない」ということが障壁になります。
普段の仕事をこなしながら、空き時間に己の爪を研ぐかの如く、新しい技術のキャッチアップをする必要があります。
そして、それを継続するにはモチベーションの維持が課題になります。

そのような技術のキャッチアップの課題に、自分も何度も直面し、その結果、自分には「個人開発」が合うと個人的に思いました。
本記事では、個人開発のススメとそれによって得られた学びや気付きを共有したいと思います。
技術のキャッチアップの方法にお悩みの方は、自己啓発の一例として、是非ご参考いただければと思います。

アウトラインは目次をご覧ください。

# 自己啓発に対する二つの悩みごと

まず初めに用語の定義をさせていただきます。本記事の「自己啓発」は「技術のキャッチアップ」に限定するものとします。
それでは、新しい技術を学習する際は、どのように行うでしょうか？

自分は入社して3年ほどは以下のような感じで技術のキャッチアップを行っていました。

* 学習する技術のターゲットを決める
  * トレンドとなる技術をテーマにする
  * プロジェクトでやっている技術を掘り下げる or 関連技術を探す
* そのターゲットについて学習する
  * サンプルやチュートリアル等を見て試す
  * 資格取得を目標にする

しかしながら、このやり方で進めて悩んだことが二つほどありました。

## サンプルを見ても実感が湧かない

ある技術を学習する際に、公式が公開しているサンプルやチュートリアルを触ることになると思うのですが、どうしても「できた気分になってしまう」のが多く、プロジェクト内で応用したり、お客様に説明したりするレベルには到底辿り着けないことが多いと思います。

自分で手を動かしたうえで、課題に直面して、考え、調査し、自分なりの答えを得るプロセスを経ないと、本当にその技術を理解したことにならないという場合が多いと思います。

## 本当にその技術がお金になるのか？

そもそも、勉強している技術って、プロジェクトで使われる可能性があるのでしょうか？選択した技術が最適でない可能性は？
自分の記憶上では、そのような不安に陥ることが多く、結局中途半端な知識になってしまうことが多かった気がします。

# 個人開発、やってみませんか？

そこで、上記の悩みを解決するために考えた答えが、「個人開発」つまり、「個人で何かプロダクトやサービスを作ってみる」ことでした。
**自分が作りたいもの、便利だと思うもの** を考え、その要件に必要な技術を学習しながら、実現させる進め方です。

「個人開発」という目的や目標を持ち、課題解決ベースで物事を進めた結果、それに関連した技術が身に付くといったスタンスです。
「自分でプロダクトを作る」という明確な目標があるので、モチベーションを上げやすく、課題解決力や応用力も身に付けられます。

ただ、「個人開発をする」にはハードルがかなり高いと思いますし、ネタが思いつかないかもしれません。
そんな時は、以下のような考え方で、使うユーザを限定して、段階的に手を広げていくのがよいと思います。

## Step 1: 自分だけが使うためのもの

ユーザを自分だけに限定します。自分が使うためのものなので、多少出来が悪くてもあまり気にする必要はありません。
自分の生活の中で改善したいもの、便利だと思うもの、または、自分がこだわりを持って突き詰めている趣味などをベースに、コンセプトを落とし込むとよいと思います。

* 自分専用のTODOリスト、スケジュール帳、メモ帳（旅行好きであれば旅の記録、旅のしおり等・・・）
* 家庭内の便利ツール（録画サーバ、学習型リモコン、タイマーアプリ等・・・）

ある程度の完成度に辿り着けたら、ユーザを少し広げて、知り合いなどに使ってもらうことのも良いと思います。

## Step 2: 自分がOUTPUTし、不特定多数の人が閲覧するもの

作成・編集は自分が行い、不特定多数の人が閲覧できるものです。ホームページやブログ（コメント機能除く）がこれにあたると思います。
編集する場合は、最悪FTPでのファイル転送やDBの直接編集でなんとかなるので、認証機構を自分で実装する必要はありません。

もちろん、すでにホームページを作成するサービスはいくらでもありますが、技術の勉強のためであれば、自分で作る意味は十分あると思います。
実際に、自分はここをスタート地点としています。

## Step 3: 不特定多数の人に使ってもらうもの

ユーザを不特定多数の人まで広げます。開発側はツールを提供し、ユーザに使ってもらうことを目的とします。
SNSなどの一般的なWebサービスはすべてここに入ります。

不特定多数の人に使ってもらう都合上、セキュリティや可用性、パフォーマンス等、非機能的な箇所で考慮すべきことが一気に増えます。
ユーザを限定する（ニッチな分野を狙う、知り合いに限定する等）ことで、多少軽減されます。
まず100～1,000ユーザ程度が1日に1回使うかどうか程度を目安に、作りたいものをターゲッティングしていけば良いと思います。

考慮する点は増えますが、学べることはとても多いです。
自分は、システム全体の構成を検討したり、認証・認可などのセキュリティ面を勉強する良いきっかけになりました。

## 筆者が作ったもの

プライバシーの関係上、詳しい名称はお話しできませんが、以下のWebサービスを個人で開発・運営しています。

1. **写真作品を掲載するホームページ** - 
   趣味が写真撮影ということもあり、自分が撮影した写真を掲載し、公開するホームページを運営しています。
   上記「[Step 2: 自分がOUTPUTし、不特定多数の人が閲覧するもの](#step-2-自分がoutputし不特定多数の人が閲覧するもの)」にあたります。
    * 採用している技術
        * サーバ: さくらのサーバ スタンダードプラン
        * フロントエンド: Vue.js
        * バックエンド: PHP/Laravel
        * DB: MySQL
        * その他: AWS S3(バックアップ), Azure DevOps(Git, CI/CD)
1. **「回路図のようなモノ」作成アプリ** - 
      かなりぼかした言い方になってしまい恐縮ですが、とある分野の回路図のような図を描くWebアプリを個人で開発し、公開しています。
      上記「[Step 3: 不特定多数の人に使ってもらうもの](#step-3-不特定多数の人に使ってもらうもの)」にあたります。
       * 採用している技術
           * サーバ: さくらのサーバ スタンダードプラン
           * フロントエンド: Vue.js
           * バックエンド: PHP/Laravel
           * DB: MySQL
           * その他: AWS Cognito(認証), AWS S3(バックアップ), Azure DevOps(Git, CI/CD), Azure Functions(簡易的なマイクロサービス構築)

# 個人開発の利点と欠点

ここまで、自己啓発（技術研鑽）の悩みと、それを解決するためのアプローチとして **「個人開発」** を提案しました。
次は、「個人開発」をする利点と欠点を簡単にまとめます。

## 利点

### 自由な目標設定ができる

個人開発なので、いい意味で気楽です。期限やミッションもなく、途中でやめて他のことをやってもいいし、失敗しても（プロジェクトでの失敗と比較すれば）大きな影響はありません。

ただし、身に付いた知識や技術は、今後のプロジェクトや個人開発で活かす意識はとても大切です。
成功しても失敗しても、前向きにとらえ、どこかでその個人開発の経験が活かされたと感じる喜びをかみしめるようにしましょう。

### 好きな技術を試すことができる

仕事で携わっているプロジェクトがレガシーで、成長につながる実感がなかなか得られないといった悩みは、よくある悩みだと思います。もちろんその中でも学べることは多少なりともあるとは思いますが、やるなら新しい技術を触りたいという欲望は少なからずあると思います。

個人開発は自分のやりたいようできるので、新しい技術に触れる機会づくりにもなります。
例えば「プロジェクトは Java だから、個人開発では .NET を勉強したい」など、類似の技術に置き換えるのも良い手法だと思います。

### プロジェクトでは経験できない喜びがある

まず、お手製のプロダクトができた時の達成感は非常に大きいものです。紆余曲折しながら少しずつ要件を整理し、技術選定と開発を経た後は、サンプルやチュートリアルだけでは得られない、たくさんのことを学んでいると思います。

さらに、これは「不特定多数の人に使ってもらうもの」に限定されるとは思うのですが、ユーザの方々のフィードバックは非常にモチベーションに向上につながっていると思います。

自分は趣味に特化した作品を投稿してもらうサービスを作ったのですが、ユーザさんの作品にはどれも熱意がこもっていました。
その熱意に自分も応えたい！と思えたのは、普段プロジェクトでは経験できない喜びだったと思います。

## 欠点

### ターゲットとする技術が最適解でない場合がある

課題解決をベースとした進め方になりますので、端的に言うと、「プログラムなんて動けば正解」という思考に陥りがちになります。
使用するフレームワークが古かったり、ベストプラクティスが提示されているのに、それと異なる対応をしてしまったり・・・。

しかしながら、そのほころびは徐々に分かっていって、「あの時ああするのが正解だったんだ」と気付くのも、貴重な経験の一つになると思います。

### 収益化ができない／しづらい

個人開発なので、当然と言えば当然かもしれません。
収益化しようと思うと、様々なハードルを乗り越える必要があります。法的な拘束力が強くなったり、副業を禁止している企業も少なくありません。

### 時間やコストを割きづらい

個人開発なので、もちろんですが業務外の時間に開発を進める必要があります。プロジェクトが多忙になれば、個人開発をする時間はほとんど取れません。
同様に、コスト面も自腹なので割きづらいと思います。

## 欠点に対する考え方

### 新規開発やリプレースで技術をアップデートする

「[ターゲットとする技術が最適解でない場合がある](#ターゲットとする技術が最適解でない場合がある)」という欠点についてですが、新規に別のプロダクトを開発するときや、既存のプロダクトを置き換える際に新しい技術を取り込むように意識していけばよいと思います。
言い換えると、作ったプロダクトに長期間固執せず、定期的に新しい個人開発を始めることが重要だと思います。

実際に、自分は上記の「[写真作品を掲載するホームページ](#筆者が作ったもの)」を、およそ5年間のスパンで、2回ほど作り直しています。
理由はデザインが時代遅れだったり、運営方針を見直したいと思ったり様々ですが、その度にその時自分が身に付けている技術で作り直しました。
そのおかげで、常に自分が持つ知識を個人開発で実践することができました。

![self_developing_fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171449/c0e6ee7d-6f9c-f944-8c16-430dcc90fea4.png)


### 目標を高く設定しすぎない

時間を割きづらいという欠点については、なるべく目標を高く設定せず、焦らないようにするという考え方が重要になります。
個人開発で焦ってストレスが溜まってしまうと元も子もないので、なるべく気楽に進めていくよう心掛けることが大切です。

また、WBSなどのスケジュールはあまり組まない方がいいと思います。
自分の経験則として、業務の多忙さや気分によってその日の進捗が左右されることが多く、スケジュールを組んでも上手くいった試しがありません。
短時間でちょこちょこっと開発して終わらせられるよう、なるべくタスクを細かくすることも大切です。

### 自己投資として割り切る

コストに対する考え方については、無理して収益化を目指さず、あくまで自己投資として考える方が良いと思います。
書籍を買ったり、通信教育を受けたりするのと同じように、運営費がかかるものと割り切りましょう。

個人の意見ですが、「1ヶ月に自己投資に使える予算」を一旦決めておくと良いと思います。
予算を決めておくことで、使い過ぎを防ぐこともできます。

また、Webサービスに限定されることですが、Azure, AWS, GCP等のクラウドサービスは利用せず、レンタルサーバやVPSを利用するとコスト削減が可能です。
使用できるリソースや言語に制限がある場合や、環境の準備の手間がありますが、クラウドサービスよりも安い費用で運用できます。自分は月1,000円ほどで済んでいます。

# 個人開発とプロジェクトを相互補完できる関係に

以上、個人開発の利点と欠点を述べていきましたが、一方で、業務やプロジェクト開発側にも利点や欠点はあります。
個人開発とプロジェクト、双方に利点と欠点があると思うので、それらを組み合わせて相互補完できる関係が、ベストな関係ではないかと自分は思います。

個人開発とプロジェクトを別々で考えるのではなく、双方を関連付け、ノウハウを共有できる関係にしていくことで、より自己成長が見込めるのではないかと考えています。

![self_developing_fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171449/3695a848-f791-7e71-d568-e8b4a4b12317.png)



## 実例

実際に、自分が携わらせていただいているプロジェクトと個人開発が相互補完できたと感じられたシーンがありますので、実例をお出しします。

![self_developing_fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171449/97083d18-3ac7-3ec3-5b1e-f5d38a62f32d.png)


Aプロジェクト、Bプロジェクトでの経験から、派生技術や興味のある技術を試す目的で個人開発（「回路図のようなモノ」作成アプリ）に活かしました。
その結果、新しく、Vue.js, AWS Cognito, Azure Functions を体験し、経験として身に付けることができました。
そして、異動先のCプロジェクトでは、個人開発で経験したことが、プロジェクトの理解の手助けになったと感じるシーンが多々ありました。
また、Vue.jsを採用している別のプロジェクトの社員から相談を受けたりする機会もありました。

このように、どこかで「個人開発やっといてよかったな」と思える機会が得られると思います。
その気付きを大切に、個人開発側でより幅広く、深く技術研鑽を行っていけば、より実現できるものが大きくなるのではないかと思います。

# まとめ

最後に、本記事を簡単にまとめます。

* 自己啓発（技術研鑽）は欠かせないものですが、モチベーションの維持に課題があります。
  * 直接の利益にはならず、かけられる時間が少ない
    かといって、サンプルやチュートリアルを試しても、身に付いたことにはできない
  * 技術テーマが本当にプロジェクトに寄与するのか？という漠然な不安に苛まれる
* 自己啓発（技術研鑽）のアプローチの一つとして、「個人開発」を提案しました。
  個人開発は以下のような利点があります。
  * 自由な目標設定ができる
  * 好きな技術を試せる
  * プロジェクト（普段の業務）では経験できない喜びがある
* 一方で、個人開発には以下のような欠点があります。
  * ターゲットとする技術が最適解でない場合がある
  * 収益化できない／しづらい
  * 時間やコストを割きづらい
* 個人開発とプロジェクト（業務）との相互補完、ノウハウの共有が、より自己成長につながると思います。
  * プロジェクトで経験した技術を個人開発に活かすことで、関連技術の経験や、技術の深掘りができる
  * 個人開発で経験した技術をプロジェクトに活かすことで、プロジェクトへの貢献度を高めることができる

自己啓発のやり方は人それぞれですし、必ずしも個人開発が自分に合うものだという保証はありません。
しかしながら、「個人開発」は、目的や目標をもって取り組め、結果的にモチベーションにつながる良い自己啓発の方法だと思います。
冒頭でもお話ししましたが、是非自己啓発の一例として、参考にしていただければ幸いです。

# What to do next...?

じゃあ個人開発、やってみよう！と思った方に次のアクションを簡単にまとめます。

* 何を作りたいか考える
  * 自分が使っていて助かるもの
  * 自分の生活が1段階上がるもの
  * 自分の趣味に関わるもの
  * 自分が情熱をもって取り組めるもの
* ベースとなる技術を考える
  * スタンドアロン？Webアプリ？モバイルアプリ？
  * 自身のプロジェクト経験に関連付けられそうな技術ならより良い
* 参考にできそうな既存のプロダクトを調べる
  * スケジュール帳なら、Google Calendar、Todoアプリ等
  * 図形描画系なら、Windowsペイント等
* ほしい機能と優先順位を考える
  * 重要度と実装難易度をざっくり考えて、重要度の高い順、実装難易度の低い順で並べ替える

# 留意事項・免責事項

プロジェクトと個人開発の間には明確なラインを設けるように必ず意識してください。
会社やプロジェクトのセキュリティポリシー、プライバシーポリシーに則り、個人が有するノウハウのレベルを超えた情報を、個人開発・プロジェクト間で共有しないようにご留意ください。

なお、本記事を参考にしたことによって発生した損害について、筆者および当社は一切責任を負いません。