yn2011's blog

技術メモ

TypeScript, Go, Docker Composeに入門するために約半年間かけてWebサービスを構築した話

この記事はチームスピリット アドベントカレンダー2019の22日目の記事です。

今年(2019年)の7月から12月にかけて約半年間、プライベートでコツコツ開発していたWebサービスが一応形になった。技術的な内容は別の記事で書く予定なので、今回は半年間を通じて感じられた個人開発という営み自体の難しさや継続のコツについて書いてみる。

作ったもの

これ何

  • ブログのような何か
    • 認証認可、記事一覧、投稿、削除ができる

構成

https://raw.githubusercontent.com/pokuwagata/portfolio-go-mysql-docker-webapp/master/docs/imgs/system-overview.png

モチベーション

  • 0からWebサービスを構築してみたい
  • (業務ではSalesforceを使っているので)たまにはSalesforceから離れたい
  • TypeScriptやGoで、それなりの量のコードを書きたい

なお、ブログサービスは題材として良さそうだっただけで、サービスとして何かやりたいことがあったわけではない...

所感

実際にやってみて感じたこと

時間確保の難しさ

  • 平日の日中は仕事があるので、平日の朝・夜か休日に開発
    • とにかく15分でもいいから毎日確実に作業することが凄く大事
      • 休日だけ開発をすると、始める際に「先週何をしていたか思い出す」負担が大きくて効率が悪い
    • 意外と良かったのが昼休みに開発することで、仕事モードのまま開発を始めると凄く集中力が高い状態で作業できる。昼休みはご飯も食べるので30分ぐらい開発できれば良いほうだが1,2コミットぐらいは確実にできたので十分良かった
  • 休日は自宅で開発するよりはカフェへ移動してしまった方が開発を始めやすい

モチベーション管理

  • 平日に仕事でもコードを書いて帰宅後もコードを書くのは気分的に辛い場合もあった(逆もあって、仕事で全然コードを書かない時期は個人開発が楽しかった)
  • Done is better than perfect. 大事
    • 個人開発は締め切りがない。いくらでも時間をかけられる
    • 自分は個人のモチベーションの絶対量には限界があると思っていて、細部に拘っている内に疲れて、最終的には開発自体に飽きてしまう(少なくとも自分はそう)
    • 特に自分の場合はCSS、Clean Architecture、Goらしい書き方、あたりに深入りしすぎる傾向があった
  • 日々の作業の区切りは、やり切る一歩手前ぐらいにする
    • 例えば、あとこの部分を修正したらコミットだなあと思ったら、そこを残しておいてその日は作業を切り上げる
    • 何をすればいいか明らかだと、別の日でも作業を始めやすい
    • たしか村上春樹職業としての小説家に書かれていたテクニックだった気がする
  • twitterで細かめに進捗を書くのもモチベーション高められたと思う(なお別に反応が貰えるわけではない)

開発の進め方

  • 機能定義→画面設計→テーブル設計→画面のコンポーネント設計→バックエンドのAPI定義→実際にコード書く
    • コードを書くまでの流れはよくある感じ
    • APIはswagger使ってきっちり定義しようともしたがswaggerの記法ルールとかバージョン互換がけっこう難しかったし、そもそもシンプルなAPIなので途中で諦めて開発しながら考えることにした(それであんまり問題なかった)
  • メモを取りまくる
    • 開発していて、「あれやらないとな」とか「これどういう意味なんだろう」とかすぐにやる必要がないタスクを思いついたら全てメモするように意識していた
    • 次にやらないといけないこと等もとにかく言語化してメモしていた
      • これは次に作業を始めるときにとても役立つし、全体の進捗を俯瞰して見れるので良い

実際には思うようにいかなかったこと

  • とにかくまずは空のページで良いので公開できることを目指した
    • が、現実にはDocker Composeをそのまま利用して外部にWebサービスを公開する手段はあまり確立されていない(というかメジャーじゃない)っぽくて調査や実験に相当な時間がかかって最終的には後回しにしてローカルだけで開発を続けた(辛すぎてモチベーションが枯れそうになったので)
    • そもそもDocker Composeは開発環境だけで使うものだよねって認識の人が多いということを初めて知ったりとか
  • 本当はDevOps周りきちんとしたかった
    • GithubにアップロードするとCycleCIでテストして自動的にデプロイしてくれるのを夢見ていた
    • CycleCIでテストとESLintで検査する部分までは、わりと開発初期に整備できていた
      • が、開発中盤まではGoのテストコードを書いていなかったしESLintの指摘も無視していたので常にBuildバッジは赤だった(残念)

ものを作ることの重要性

  • 技術書を読んだり、チュートリアルを写経したりするのも大事だが、何かを実際に作らないと分からないことが沢山ある
    • 例えばClean Architectureも実装してみて初めて気づくこと・理解できること・疑問に思うことも多い
    • あとWebサービスのようにフロントからインフラまで1人で開発していると、自分が疎い分野も明らかになるなと思った
      • 例えば自分はDBが弱くて、どういうSQLを書けばインデックスを効かせられるのか、インデックスが効いていることをどう調べて評価するのか、そもそもインデックスの仕組みとはみたいなところに興味を持つきっかけにもなった

今後

  • 今回は使用技術の学習も兼ねていたので開発期間が長くなってしまった。今後はWebサービスを素早く立ち上げるためのベストプラクティスを自分の中で整理して持っておきたいなと思った(多分Railsになりそう)