はじめに
こんにちは。フィヨルドブートキャンプ で学習中のはるぐちです。
フィヨルド ブートキャンプでは、最終課題として自作のWebサービス を作って公開するというプラク ティスがあります。
今回、僕は技術書を読み返すための読書管理Webサービス 「re:Read」をリリースしました。
reread-book.herokuapp.com
github.com
このエントリでは開発・自作サービスを作るにあたってよかったことや苦労したことなどを書いていきたいと思います。
自己紹介
改めて自己紹介をします。はるぐちといいます。フィヨルド ブートキャンプには2019年の10月末から参加しています。
途中までは公立中学校の数学の教師をしながら参加していましたが、あまりにも進むのが遅いので今年度から仕事を辞めて無職で1年間学習を進めてきました。
現在はWebエンジニアになるべく転職活動と学習を並行して行っています。
re:Readの紹介
簡単にいうと「読書管理+再読管理」をするWebサービス になります。
もう少し詳しく説明しますと、何度も読み返したいと思っている本(エンジニアにとっての技術書など)に対して写真やメモを溜め込んでいきます。
気になりポイント(写真)一覧
このアプリでは写真やメモを「気になりポイント」と称して呼んでいます。
気になりポイントとして溜め込むのは
本を読んでいて単純に気になったこと
難しくて意味がわからなかったこと
感動したこと
図解
などなど。写真やメモを見ることで、読み返したいなーと思えるものを溜め込んでいくのがおすすめです。
また、アプリ内では「次に読み返す日」を設定する入力フォームがあります。
この入力フォームには書籍名がデフォルトで入っており、任意でメモを残すことができます。日付を選択してクリックするとGoogleカレンダー に自動的に登録されることになっているので読み返したい日を忘れにくくなっています。
読み返し日の設定(Googleカレンダー に登録)
使い方
簡単にこのWebサービス の使い方を説明します。
ログインして書籍を登録
Google アカウントでログインします。
ログインしたらまずは読み返したい本を登録します。
読み返したい本リスト
読み返したい本を登録すると、その本に関する情報が表示されます。
具体的には「本のタイトル」「溜め込んだ気になりポイント(写真)の数」「最終更新日」「読み返す日の設定日」です。
気になったポイントを写真に撮り、投稿する
「読み返したい本リスト」からタイトルをクリックすると、溜め込んだ気になりポイント(写真)の一覧画面に遷移します。
初めは下の画面のように何も写真が登録されていないので「写真を投稿する」ボタンを押して写真を投稿してください。
気になりポイント
気になりポイント詳細&メモの編集
写真の一覧画面で写真をクリックすると、実際の大きさで表示されます。
また、メモを入力していた場合編集できるようになります。
気になりポイント詳細&メモの編集
写真一覧画面で「Googleカレンダー に読み返す日を設定する」というボタンをクリックするとGoogleカレンダー に登録するための入力フォームに遷移します。
「サマリー」「読み返す日」「メモ(任意)」があり、タイトルに関しては自動で設定されます(もちろん変更もできます)。
そして、設定ボタンを押すとお使いのGoogleカレンダー に予定が挿入されます。
Googleカレンダー
解決したい問題
解決したい問題は大きく2つあります。
読んだ書籍の内容を忘れてしまう → 読書管理アプリで解決
読み返すタイミングを忘れてしまう → リマインダーで解決
別々のもので解決することを1つのアプリケーションで解決したら便利ではないか?そんな思いがあります。
また、読み返すハードルを少しでも下げられるうに前回読んでいた内容を視覚的に伝えられるように写真を投稿するというスタイルを取ってます。
技術書や学習書籍を読んでいる中で難しくて読むのを諦めた本はありませんか?
感銘を受けた本で、何度も読みたいと思って忘れてしまっている本はありませんか?
読み返そうと思っても、どこまで読んだかわからずまた一から読み返す。それが面倒で書籍が進まないなんてことはありませんか?
僕は、あります。本棚に本をしまった段階で忘れ去られている本がたくさんあるので、そういった本を効率的に読み返したいという思いからこのアプリを作成することにしました。
なぜこのサービスを作ったのか?
もちろん、上記の問題を解決するためなのですが、ここでは少し個人的な話をします。
僕は数学が好きでよく学習書で勉強するのですが、如何せん書いてある内容が難しくて途中で挫折することも多々あります。「半年後にまた挑戦しようかな〜」なんて思って本棚にしまったが最後。すっかり本の存在を忘れてしまって、次読むのはかなり先の話。そういった事が多々ありました。
現状、今でも僕に読まれるのを待っている本がたくさんある状態です。また、どんな本がどんな状態で読みかけなのかは正直一切記録が残っておらず自分の記憶を探るほかありません。
リマインダー機能を使って忘れないようにしようとしたこともあるのですが、やっぱりどんな状態で読み終わっていないのかが不明瞭なことによって読み返すハードルが高く、難しかった記憶だけが蘇ることにより結局読まずじまいになっている本がたくさんあります。
また、ここ2年ほどプログラミング学習を始めてからも、何か新しい技術をキャッチアップするときは体系的に学べる書籍を利用するのですが、やはり同じ問題に直面しました。
そこで、「読み返すタイミングの通知」と「読んでいた状態を記録」できたら、読み返すハードルはぐんと下がるのではないか?そんな仮説をもとに作成することにしました。
こんな人に使ってほしい
書籍でなんらかの学習をしている人は少なからず何回も読み返したい本があると思うのでぜひ使ってもらいたいです。
僕は、趣味の数学書 やプログラミングの学習で利用しています。
技術スタック(2022年4月現在)
リリース後はVue.js+TypeScriptを導入予定です。
今後の予定
サービスはリリースしてからが始まりだと思っているので今後もどんどん開発を続けていこうと思っています。ファーストリリースの期限を自分の中で設定していたため実装できていない機能や技術があるので、キャッチアップしながら進めていきたいと思います。
機能面
画像トリミング機能
写真の削除機能
読み返しの履歴一覧ページの実装
サイト内で読み返し日の通知、しばらく読んでいない書籍の通知
技術面
フロントエンドをVue.js + TypeScriptに置き換えていく
RSpec のテストのガバレッジを上げていく
苦労したポイント
アイデア だし、エレベーターピッチ
エレベーターピッチとは、エレベーターで投資家と乗り合わせたときに、エレベーターの中にいる間に自分が作ろうとしているサービスを投資家に売り込んで興味を持ってもらうという説明のテンプレートのことで。30秒くらいで説明しないといけないのでどうしてもそのアプリの本質を考える必要があります。
また、週1回あるwebサービス 進捗報告会で自分の考えたアイデア (エレベーターピッチ)を説明するのですが、ここではいろいなツッコミが入ります。
それは本当に問題解決になるのか?既存のアプリもしくはアナログな手法で解決できるのではないか?と問答する中で自分の思考を整理していきます。
僕の場合は自分で納得できるサービスの形に落とし込むまでかなりの時間がかかりました。
フィヨルド の受講生にアドバイス するとしたら、次の3つです
早い段階から身の回りの困りごとがWebサービス で解決できないかアンテナを張っておく
矛盾しますが、アイデア だしの段階では1つのアイデア に固執 しない
愛着のあるアイデア でサービスを作る
僕は、自作サービスのプラク ティスの1つ前のプラク ティス(スクラム 開発)が終わったタイミングでアイデア 出しを始めたのですが、どうやらこれは遅すぎたみたいです。
コードを書かない時間ができてしまい、焦りから良いアイデア も出ないという悪循環になってしまいました。JSプラク ティスあたりで考え始めてもいいかも知れません。
3つ目に関してはモチベーションの問題です。2つ目と矛盾しているんですが、作ると決まったものに関しては愛着がないとしんどいです。2〜3ヶ月程度の長距離走 になるので疑問を持ったまま、納得していないまま自作サービスを作り始めると頓挫してしまう可能性が高いです。
3つ目は2つ目と矛盾しているんですが、アイデア 出しの段階では質より量で勝負した方がいいかも知れません。1つのアイデア に変に固執 してしまうとそのアイデア では問題解決できないとわかった時に、ひきづってしまったり切り替えられなくなって次のアイデア が出づらいです。また、強行的にそのアプリを作ることにした場合、問題解決できないアプリを作るだけのモチベーションの維持が難しいです。
ダメだったら次!くらいの気持ちで量を出して、メンターの方と問答する中でしっくりくるアイデア を深掘りするのがいいと思います。
画像アップロード Shrine
自作サービスで初めて技術選定を行いました。
そのgemを使うと問題解決されるのか
そのgemは定期的にメンテナンスされているのか
GitHub のスターが多いか
などの観点で選定しました。
Rails の場合画像アップロードはActive Storage
Carrierwave
PaperClip
など色々なgemがありますが、Shrine
というgemを使うことにしました。
shrinerb.com
理由は、上記の選定項目を満たしていたのとプラグイン 形式になっており、必要な機能をプラグイン として導入するという拡張性の高さが決め手でした。
エレベーターピッチの段階では必要最低限の機能について検討していましたが、リリース後の機能の追加にも柔軟に対応できると思ったからです。
苦労した点としては、日本語ドキュメントが少なくQiitaなどの記事も少し古くて信頼できるか自分では判断できず、基本的な使い方をマスターするまで時間がかかったことです。
そもそも画像アップロードの仕組みというか、概念みたいなものが理解できておらず英語の公式ドキュメントを読んでもなんのことを言っているのかわからない迷子状態が続きました。
ただ、デモアプリを作りながら少しずつ実験していく中で少しずつ腑に落ちる点が増えていき理解できるようになりました。
全く初見のライブラリを公式ドキュメントを読みながら理解するという実務でも役立ちそうなので良い経験になりました。
Shrineの基本的な使い方に関しては情報が少ないので後日ブログにしようと思っています。
今回はアプリ内にある入力フォームからGoogleカレンダー API を叩いてGoogleカレンダー に登録するということを実現するため、ログイン部分もGoogle アカウントを使ってログインする方式にしました。
読み返し日設定の入力フォーム
処理の流れとしては以下のようになります。
OmniAuthを使ってGoogle アカウントで認証する
ログイン時にユーザに権限の確認をしアクセストーク ンを取得
アクセストーク ンをもとにGoogleカレンダー API を叩いてGoogleカレンダー に次読み返す日の設定をする
この処理の流れ以前に、そもそも認証・認可とはなんなのか?
Googleカレンダー API をどうやって叩くのか?
といった概念的なところが全く理解できておらず、技術検証に時間がかかりました。
また、途中でOmniAuthとGoogle Authを至る所で混在させたり、アクセストーク ンも2回取得したりして、手戻りが発生したりしたのでかなり辛かったことを覚えています😅
API を叩くところに関してもドキュメントにはRuby CLI での実装方法しか載っておらず、Rails にどう反映させるのかに頭を悩ませました。
解決方法としては、小さなデモアプリをたくさん作り、「仮説→実験→ドキュメント」というのを繰り返していき、ドキュメントに書いてあるコードがどのように動くのか泥臭く実験していくことで理解しました。
また、実装したあとはメンターの方に方向性が間違っていないかペアプロ してもらうことで手戻りが最小限に抑えられたと思います。
こちらに関しても情報が少ないのでなんらかの形でアウトプットできたらと思います。
自作サービスを作っての感想
現時点では自分の実力通りのものができた
アイデア 出しの段階からリリースに至るまで大小含めて多くの「ああすればよかった、もっとこうすれば」みたいな小さな後悔があります。しかし、現時点で自分の力で調べ、実装し、Webサービス としてリリースできたことが何よりも嬉しいです。現時点では間違いなく実力通りのものができました。
今後はどんどん実力を上げて改善していきます。
人に頼ることの大切さに気づいた
フィヨルド ブートキャンプでは現場で戦力になるために自走力を求められます。
自走力というと自分で調べ解決する力だと思っていたのですが、どうやらそうではないことに気付かされました。
自分が感じた自走力は
自分で調べ、解決しようと仮説をたてやってみる。できなければ誰かに頼る
この、「誰かに頼る」部分も含めてきっちり問題解決していくのが自走力なんじゃないのかなと気付かされました。
自作サービスは正直1人では解決できない問題が多々ありました。しかし、その度にメンターの方にアドバイス をいただいたり、ペアプロ してもらったりして少しずつ解決していきました。
最後に
アイデア だしやペーパープロトタイプの段階からレビューをいただいた@ken_c_lo さんエレベータピッチの段階からアドバイス を下さった@machida さん、コードレビュー全般で適切なアドバイス を下さった@komagata さん、実装に関する疑問からペアプロ までわからないときは何度も頼らせていただいた@cafedomancer さん、Shrineを使った写真の登録でストロングパラメーターのバグで困っていた時にアドバイス いただいた@maedana さん、エレベーターピッチの相談に乗ってもらった輪読会メンバーに感謝します。ありがとうございました。🙏
お使いいただいた方でお気づきの点があれば、@haruguchi までフィードバックを頂けたら幸いです。とても喜びます。