【個人開発】学生エンジニアが今までの集大成として3ヶ月でアプリを作った話

**スケジュール**と**タスク**と**Wiki（ドキュメント）**をまとめて1つの**プロジェクト**として管理ができるアプリ**Gestee（ジェスティー）**を作りました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/e7c0b0f8-412a-0667-a466-b287234882b2.png" width="480" alt="GesteeLogo" />



# アプリを作ったきっかけ

私は学生なのですが、さまざまなことを同時にやっています。

- 研究
- インターン
- 個人開発 etc

いろいろな開発をやっていると、所属先によってgoogleアカウントを切り替えたりしなけらばなりません。
また、研究室ではドキュメント管理にesaを使っているけど、インターン先ではkibelaを使っているなど、別々に管理せざるを得なく、いちいちChromeのタブを増やしたりしなければなりません。

これらが嫌で、**スケジュール**と**タスク**と**Wiki（ドキュメント）**をまとめて1つの**プロジェクト**として管理ができるアプリ**Gestee（ジェスティー）**を作りました。

Gestee（ジェスティー）という名前は、フランス語で「管理する」という意味の**Gestione（ジェスティオーネ）**という単語を少しいじって命名しました。

また、Notionと比べられやすいかと思いますが、個人的にNotionは、あまりにも自由度が高く、見えない部分（ex. ディレクトリ構成）を自分で決めなくてはならないものが多いと感じたので、もう少しフォーマットが決まっているものが欲しいなと思いました。


# アプリの機能

まず、プロジェクトを作成します。
作成すると、その中でスケジュールやタスク、Wikiを管理することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/a31fac10-98c6-cd58-b134-3ae5e6c98e7d.png" width="480" alt="GesteeFunctions" style="margin:0 auto;" />



## スケジュール

シンプルなカレンダー機能です。
設定によっては、締め切りを入力しているタスクも表示することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/95b988a2-39b3-de7c-8969-e1262f935653.png" width="680" />



## タスク

タスクの表示方法には、リスト表示とボード表示の2種類があります。
そのほかにも、ステータスやキーワード、締め切りなどの複雑な検索ができます。


- **リスト表示**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/7cb60581-d521-df76-453c-0a9a377c8346.png" width="680" />

- **ボード表示**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/6733e8f2-380d-cfde-ddfc-9782de0b3f3c.png" width="680" />

## Wiki

**Markdown**もしくは、**リッチテキスト**で書くことができます。
ちなみにここの実装は`@toast-ui/editor`というpackageを利用させていただいています。
Wikiも、タスクと同様に複雑な検索ができるようになっています。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/d6ddc08e-d67c-a4cb-b943-4e12fe7cf954.png" width="680" />



## サブ機能

### 全てのプロジェクト

スクショだと上で載せたものと変わらないので載せませんが、
全プロジェクトのスケジュールやタスクやWikiなどをそれぞれ一覧で表示することができます！
そのため、どのプロジェクトに保存したかわからなくなっても、すぐに確認できるので安心です。


### スケジュールやタスク、Wiki同士の連携

このセクションでは、スケジュールやタスク、Wikiのことを**レコード**と表記させていただきます。

レコードは、同じプロジェクト内の他のレコードと紐づけることができ、詳細ページで同時に1つのページで閲覧できます。
また、ドロップダウンで表示/非表示を切り替えることができるため、表示に大きく邪魔をしたりもしません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/911d0527-4b6e-cff2-29e8-4ab4d963669b.png" width="680" />



### 全検索

すべてのプロジェクトの**スケジュール**、**タスク**、**Wiki**のキーワードで全検索することができます。
個人的には、かなり便利な機能だと思っています :thumbsup:


### タグ

スケジュールやタスク、Wikiをカテゴリ分けする時に使うことができます
以下の画像は、「コードの書き方のガイドライン」というWikiに「RubyonRails」と「環境構築」というタグを紐づけした時の例です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/63c2f3f4-5d6a-68a6-e784-e4e99f4b1e72.png" width="480" />



### テーマカラー


現在、テーマカラーは**5種類**あります。

画面表示全体もテーマカラーで変わるのですが、この記事ではサイドバーのキャプチャでテーマカラーを表示します。
※ 手動でキャプチャしているので、少し表示が変わってしまっていますがご了承ください:bow:

##### プロジェクト1を選択している状況のサイドバーです。

|オーシャン|ローズ|ティール|アンバー|フューシャ|
|:---:|:---:|:---:|:---:|:---:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/c80feb5d-46cc-4bd1-0034-34508e0b7dd8.png" width="60" />|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/0b5fd2f2-2688-19d9-a753-c3e23160c763.png" width="56" />|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/708edbd6-4c1e-fbcf-a778-308ef091b239.png" width="58" />|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/3c4e9645-002e-26db-8853-3c58bff135b1.png" width="60" />|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/6133908f-7951-5e70-e8bf-c36d63b3cdf5.png" width="60" />|


### ダークモード / 言語設定 / PWA

ダークモードと英語にも対応しています。
レスポンシブ対応しており、PWAにも対応しています。

|日本語/ライト|英語/ダーク|
|:---:|:---:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/11afe842-352e-4575-327f-c69b30361843.png" width="320" />|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256444/ebe20173-9c55-06af-7b8d-abb23a70f2a3.png" width="320" />|


# 技術関連

### フレームワークなど

- フレームワーク
    - Ruby on Rails
    - Stimulus.js（フロントで一部使用）
- UIフレームワーク
    - tailwindcss
- gem
    - Sidekiq（非同期処理）
    - pundit (権限管理)
    - RSpec （テストフレームワーク）
    - view_component
    - slim-rails（テンプレートエンジン）
- ミドルウェア
    - PostgreSQL
    - Redis
- SaaS
    - Algolia
    - Sendgrid
    - NewRelic


### インフラ

[この記事](https://zenn.dev/katsumanarisawa/articles/c9da48652f399d)でRender.comというサービスを知り、今回初めて使用しました。
今までAWSやGCP、herokuなど、ある程度王道なIaaSは一通り触ってきましたが、とても便利だと思いました。
難しく複雑な設定は、全部いい感じに設定してくれるのが強みかと思います。
個人的には、herokuとAWSの中間くらいかなって感じがしました。


## 苦労点

### アプリを開発するモチベーション

アイディアが浮かび作り始めると淡々と作業できましたが、ある程度基盤を作り見返してみると、意外と自分のアプリに自信が持てなくなってきたりして不安になりました。

特に最近は、個人開発で作成されたアプリやポートフォリオ、個人のブログサービスなどを見てもすごいなと感心させられていたので、他の方々と比べてしまい、余計に不安に感じていました。

また、公開するとなると、データ保存の担保もかなり不安な点かと思います。
もちろん知識や技術に自信をもって作っていますが、それでもやはり心配になりました。

このような不安な点についての対策を、個人開発されている方々と共有できたらいいなと思っています。

個人的な解決方法として、以下を実施しました。

- とにかく毎日コミットするというルールを自分の中で設ける
- AdventCalendarの記事で書くなどの、絶対的な締め切りを決める

### UI/UX

**見た目** や **ユーザーが使う時の動線**は、自分なりにとてもこだわったつもりです。
例えば、

- プロジェクトをすぐに切り替えたりできるように、プロジェクトの選択を**サイドバー**でできるようにしたり、
- ユーザーの目的のページまで辿り着くまでに多くても2ページしか跨がないようにしたり、
- キーボードから手を離したくない人のために、キーバインドでページを遷移できる

ようにしました。

あとは、このような管理系のアプリだと、**カスタマイズ性**も重要だと思っています。
Gesteeでは、

- テーマカラー
- 言語設定
- ライト/ダークのテーマ
- その他、細かな設定など

をカスタマイズできるようにしました。

### モバイル対応

このような管理系アプリは、いつでも簡単に利用できるようにした方がいいと思ったので、PWAに対応させるように頑張りました。
基本的には以下のGoogleのページを参考にして実装できたのですが、フロントエンドの知識が薄かったのでこのアプリに対応させるようにすることに少しつまづきました。
ただ、いい勉強になったので結果的によかったと思いました。

[参考ページ](https://developers.google.com/web/fundamentals/primers/service-workers?hl=ja)

# 今後について

#### 機能面

まだまだ不足している機能があります。

- ポータルページ
- 通知
- モバイルアプリの作成
- サブスク機能

#### リリース予定

現在、研究でこのGesteeを利用しているため、まだリリースしていません。:bow:
ちなみに、研究ではこのアプリのユーザビリティ調査をしていますが、ありがたいことにかなり好評です。:clap:
**2021年2月**にリリース予定ですので、もう少々お待ちください:bow:

---

最後まで読んでいただきありがとうございました:bow:
なにかご質問やご要望などがある場合は是非コメント欄からお願いいたします。