熱量あるうちに仕組みを作っておくと楽

2024/09/21

個人開発の最大の壁はモチベーションだ。個人開発は本業とは別でやる趣味の開発のことだが、平日の朝や夜、土日の時間を使ってやっている。自分の100%好きなものを作るので最初は楽しいが、数週間経つと徐々にその楽しさにも慣れてくる。そして仕事やプライベートが忙しい日々が続くとなかなか時間が取れなくなってきて手が止まり、一度止まるとモチベーションを再燃させるのは難しい。会社の仕事と違い、別にやらなくても良いことだから。モチベーションの曲線をプロットすると最初に山があり、そこから右肩下がりになるのが通常だ。

このモチベーション問題を解決するために自分が考えたのが爆速でリリースすることで、とにかく飽きが来る前に作りきって世に出してしまう。世に出せば使ってくれるユーザーがいたり反応の声があったりするので、また違ったモチベーションを得られる。何を作るかを考えたときにあまりに時間がかかるものは除外し、今の自分が数週間で作れるものに絞って考えていたところがある。これまで過去に20個くらいアプリやWebサービスを作ってきたが、振り返ってみると徐々に難易度の高いものとなっている。最初は公開されているAPIを利用し内容を表示するだけのアプリ、次は自分でデータベースを持つアプリ、次にUIを作り込んだアプリ、次にWebSocketを使ったアプリ。サービス開発では似たようなUIや機構は使いまわせるので、一度作ったものがあれば次回同じような手順は時短できる。これを続けるといろんなものが数週間ほどで作れるようになってくる。

段階的に難易度をあげるのは自分に合ったやり方だったと思うが、もちろん一択の正解ではない。ある友人は元々エンジニアではなかったが、個人的に欲しいアプリがあり、それを作るためにプログラミングを勉強して長い時間をかけてアプリを作った。データベース、認証など、自分なら最初は避けるようなものも時間をかけて作り込み、わからないところは知り合いに聞いて少しずつ前進。そのアプリはリリース後ヒット作となり、多くのユーザーに愛されている。このやり方と比べると自分のは勉強寄りで、幅広い技術や知識をゆっくり積み上げていく方式。友人のやり方は目的にまっすぐで、作りたいものから逆算して必要な技術をピンポイントで学んでいる。どちらが良いということはないが、後者の方が自分のやりたい課題解決に近そうかも?ただ、モチベーションを維持して長く取り組むことが、自分にはやはり難しく感じる。

最近新しく気づいたのが、モチベーションが高い間にリリースだけではなく、仕組みまで整えておくと楽だということ。この仕組みというのはテストコードを書いてサービスが壊れにくくしたり、散らかったコードベースを整理したり、リリース手順をドキュメント化したりとかのこと。リリースまでは一気に作り切ったとしても、実は重要なのはそこからの改善の旅だったりする。日常が忙しくて1ヵ月くらい空くと、過去の自分が書いてたソースコードがよくわからなくなる。そこを読んで思い出すところからのスタートになってしまう。また、いろいろな機能を追加するほどシステムは複雑化するので、バグを生みやすい。ひとつ修正するたびに他の箇所にも影響はないか確認して回るのはエネルギーを消耗し、結果開発効率が落ちてしまう。

最近作ったcastmakeというサービスでは、リリース後の熱量が高い期間で、機能ではなく仕組みを整えることに時間をつかった。それはテストを書いて壊れにくいシステムにしたり、難しいことを考えずボタン一発でリリースできるようにしたり。つまり、もし誰かが開発を手伝ってくれるとして、説明不要でその人に渡せるような状況にした。1人でやってるので渡す先は別にない。ここでいう「その人」とは未来の自分。1ヵ月後の自分がシステムを見た時に迷わず作業に入れるか、それを考えて整えていった。

さて、そこから数ヶ月経ったいま、久しぶりに機能を追加したが作っておいた仕組みの恩恵をかなり受けたと感じる。ソースコードを読み直したり構成を再理解する時間は不要で、何か修正を加えたらテストが自動的に回って壊れていないことを保証してくれる。これまでとは安心感が違う。これまではバグにならないかとビクビクしながら作って確認の工程に多くの時間を割いていたが、今回は作りたい機能について考える時間が増えた。今まで新規で作るのが好きでアップデートを億劫に感じる場面があったが、その正体が分かった気がする。変更して他の箇所が壊れることが怖くて、それを無意識に避けようとしていたんだ。それがわかり、長年のモヤモヤがひとつ解消された気がした。

「熱量あるうちに作り切る」というのは自分の個人開発のテーマだが、そこに「熱量あるうちに仕組みも整えておく」が加わった。こういう仕組みはサービスが小さいうちは導入しやすく、サービスが複雑化していくると入れづらくなる。早めに導入して、その上で伸び伸びと改善していくようにしていきたい。


Webサービスの設計の勘所

2024/09/20

個人開発で色々作っていて、Webサービスは最初の設計が大事だなと感じる。ここでいう設計とは仕様とかデザインとか技術選定とか色々なものを含んでいて、何か新しいサービス・新しい機能を作るときに考えること、みたいな広い意味。良い設計は変化に強くて柔軟性がある。

Webサービスはリリースして終わりではなく継続的に改善していく。改善の方向は自分の好みだけでなくユーザーからのフィードバック、AIなどの世の中の技術トレンドによっても影響を受け、リリース時点では思いもよらぬ方向に伸びていくこともある。そうなると重要なのが、変化に柔軟に作ること。例えばメモアプリを作るとして、最初は書いたテキストを保存できるだけのものを想定していたとする。しかし、将来的にはテキストだけでなく画像や動画もメモとして書きたくなるかもしれない。太字や斜体などの装飾をつけたくなるかもしれない。パソコンで書いたのをiPhone/Androidアプリで同期したくなるかもしれないし、書いたメモをURLにして知人にシェアしたくなるかもしれない。出発点はシンプルでも、改善を重ねるごとにどんどん複雑度があがっていく。

書いたテキストの文字数をカウントして表示するような、アドオン的な機能は後からでも作りやすい。iPhone/Androidアプリにも同期するような、システムの根幹に影響するようなものは後から作ると時間がかかる。最初から考慮して設計できていれば比較的容易に作れる。最初にどれだけ拡張性高く作れているか?が後の機能追加のスピードに影響する。

ただ、常に最大限柔軟に作れば良いのかというとそうでもない。柔軟に、汎用的に作ると変化には対応しやすくなるが、何でもできすぎると逆に理解や管理のコストが高くなる。ソースコードを見たりデータベースの構造を見たりするときに、なんでこういう作りなんだっけ?と毎回自問することになる。汎用化すると基本的にはコードベースは膨らむので、少しの機能追加にも時間がかかるようになる。作っているサービスに将来どういう機能がつく可能性があるかを考えて、抽象度を適切にコントロールする必要がある。

用途をある程度絞った方がよいのはユーザー的にもそうで、「これで何でもできます」というサービスは基本的に使われない。インターネットは広く様々なサービスに溢れているので、ユーザーと接する短いタイミングで「あなたがやりたいコレを叶えるサービスですよ」と伝える必要があり、そうなるには特定の分野に絞って提供するのが理にかなっている(Notionは例外で何でもできて売れているので本当にすごい)。例えばメモアプリにはApple TVにミラーリングする機能はいらないだろう。プライベートな内面を書く日記アプリでは書いた内容を全世界に公開する機能はいらないだろう。こうやって必要・不要を精査しながら仕様と設計を落とし込んでいく。

設計が上手くなるには設計を経験していくしかない。いろいろなものを作ったり他サービスを研究したりする。他の成熟したメモアプリにはどういう機能があるかを見ておくとイメージを膨らませられる。最近流行ってるサービスは複数人で共同編集できるものが多いな、とか知っているとその機能が必要かどうか早い段階で検討することができる。いろいろ作っては設計を後悔して、次やるときはもう少し上手くなる。そんな感じで日々設計力を磨いている。


Twitterを使いづらくする

2024/09/19

(正式にはXですが心の中でTwitterと読んでいるのでそう表記します)

何の中毒かといわれたらTwitterの中毒で、気がついたら見てしまう。スマホを握ると無意識に見てしまうし、パソコンだとブラウザの新規タブを開く→ "t"と打ってTwitterを開く → チラッと見てすぐタブを閉じる を1日何度もやってしまう。5分に1回とかで見てしまう。そんなにフォローしてるわけでもないので新着ツイートは当然ない。それでも開いてしまう。習慣は恐ろしい。

Twitterとの距離感を適切にするべく、iPhoneからアプリを消し、見たいときはSafariでブラウザ版を見るようにしている。さらに「Control Panel for Twitter」というアプリを使ってブラウザ版の表示を改変し、おすすめのタイムラインやトレンドなど不要なものを非表示にしている。これはかなり効果があって、自分の時間を取り戻せた感覚がある。

ところで、最近はnoteを書いたりこの日記を書いたりして、Twitterに投稿する頻度があがっている。そうなると「いいね」などの通知欄が気になってしまう。スタンスとしては反応があるかではなく自分の思ってることを書き出せているかを重視したいと思っているが、それでも読んでもらえらやっぱりうれしいので、反応が気になってしまう(特にnote)。でもそれも本当はたまにチェックすれば良くて、1日何回も見る必要はない。Twitterをチェックする頻度があがってしまい、これではイカンということで対策を考えてみる。できるだけ見ないようにしよう、みたいな意思は習慣の前では無力なので仕組みで解決できないかを考えてみた。

最初はiPhoneのスクリーンタイムで制限を入れようとしたが、Safariで特定のサイトだけを制限を入れるのはできないっぽい。そこでちょっと調べ、「BlankPage」というアプリを見つけた。これはURLを登録するとSafariからそのサイトにアクセスできなくなるというもの。応用的な機能として曜日や時間を指定してブロックするスケジュール機能もあるが、これは自分には必要ない。単純にTwitterのURLを入力して登録し、スマホからアクセスできなくした。緊急の連絡をTwitterですることはないし、必要あればパソコンから見ればいい。どうしてもスマホからツイートしたいときは投稿専用アプリの「FasPos」を使えばよい。

1日これで回してみたが自分がどれだけ無意識にTwitterを開いていたか再確認できた。Twitterが見れないと手持ち無沙汰になり、代わりに日経アプリを開いたり気になる技術を調べたりするようになった。これで良い。再び自分の時間を取り戻せた感覚になる。しばらくこれで運用してみたい。


本を読むと何が良いのか

2024/09/18

趣味の一つに本があり、エッセイ、日記、ノンフィクション、小説、自己啓発、ビジネス本、技術本などジャンル問わず幅広く読んでいる。仕事の忙しさや気分によって波があるが、1ヵ月1万円分読むのをなんとなく目標にしている。この1万円というのは確か「レバレッジ・リーディング」に書かれていた金額で、社会人の始めの頃にそのアドバイスに触れて、よくわからないけどいったんこの基準でやってみよう、としたのが今でも続いている。特に社会人初期は本に1万円使うのはお財布的な影響が大きかったが、読書の習慣がついたことはそれを遥かに上回る良いことがあった。

SNSはレコメンドエンジンが発達し、自分の興味関心に沿った情報だけが流れてくる。日常的に自分の考えと近いものばかりに触れるようになり、さらにその考えが強化される。エコーチェンバーやフィルターバブルというキーワードで指摘される現象だが、これは世界の分断を生む。自分から見える景色が強化されすぎて他の人の意見や価値観に耳を傾けるのが難しくなる。読書はこれを解決してくれると思っていて、他人の考えや世界を知ることができる。例えば最近『「コーダ」のぼくが見る世界――聴こえない親のもとに生まれて』を読んだが、こういう本を読まなければその人の体験や心情を知る機会はなかなかない。いろいろな考えを知ることは明日からの仕事に使えるわけではないが、相手の立場に立って考える(共感/エンパシー)のに大事なこと。自分の価値観は限定的な世界で培われたもので、その価値観を人に押し付けてはいけないな、と最近はよく思う。

エンジニアの世界ではXが人気で、最新の技術動向はXで得られるといっても過言ではない。エンジニアは情報をオープンにする傾向があると思うが(OSS=オープンソースソフトウェアという文化がある)、Xはその性質と相性がよく、技術を試したり何かを作ったりするとそれをXでシェアすることが多い。界隈の人をフォローしておくと、いまこれが流行ってるんだなとか、みんなこういうのを最近勉強してるな、みたいなのをなんとなくキャッチできる。トレンドというのはふわっとしていてGoogleでは調べにくいものだが、Xのおかげでぼんやりと可視化されている。

ただXで得られるのは断片的な情報なので、そればかり追っていると上辺だけの知識で終わってしまう。エンジニアといっても実際の仕事内容は幅広いので、いろんなトレンドを当てもなく追っていると膨大すぎて疲れてしまう。最近はAIニュースに派手に驚く人も増え("プロ驚き屋"と揶揄される)、彼らはインプレッションを稼ぐために実態より誇張して評価する。Xだけを見ていては地に足をついた学習は難しい。ここでも読書が解決策になる。

技術本はそのトピックが体系的にまとまっているので、一通り読みながら手を動かすと全体感が掴める。実際にコードを書いたり、自分のプロダクトに当てはめて考えたり、そうすると確実に身になる。Xのように10分とかで読み終えることはできないが、時間をかけたリターンは確実にあると思う。何か新しい分野を学びたいとき、オススメなのはまずそのジャンルの本を3冊くらい読むことで、3冊読むとけっこう同じ内容が書かれている。そうするとそれは核の部分なんだなと思うし、逆に特定の本にしか書かれていないのならその著者の思いとか、限定的な状況で活きる方法だと理解できる。入門のときこそ本は重宝する。

何かに悩んだり苦しんだりするとき、本に救われたことが何度かあった。自分のモヤモヤが言語化される、新しい視点を授けてくれることもあったが、内容関係なく読書そのものの時間が救いになることもあった。『プロジェクト・ヘイル・メアリー』を読んでいたときは、毎晩寝る前にちょっとずつ読み進めていたので、ベッドに行くのが楽しみになった。どの場面も本当におもしろく、どんどんページが進むが意識的にそれを止めて眠る。翌日この続きを読めるというのがうれしい。読み終わってしまったときは明日からベッドで何をすればいいのかと悲しくなったほど。フィクションでもノンフィクションでも、本を読むのは面白い。


執着を手放すということ

2024/09/17

若いのを良しとすると、歳を重ねて老けていくのを残念に思う。お金持ちになりたいと思うと、自分より収入が高い人に会ったとき自分が小さく見える。どの分野でも上には上がしるし、なにかに執着するということはそれを基準に比較が生まれるということ。この考え方は幸せになりにくい。

幸せとはどういうことか?それは没頭できる時間が多いこと。何かに打ち込むとき、誰かといるとき、楽しい時間は一瞬で過ぎる。過去や未来に想いを馳せるのではなく、その瞬間を目一杯感じる。こういう時間をどう増やせるかを考えると、他人ではなく自分が基準になる。手を動かし、頭を使い、自分の興味に進む。それがたまたまお金になることもあるが、あくまで本質は没頭する時間の最大化。幸せとは特定のゴールではなく、日々の没頭の状態のこと。

将来の不安、過去の後悔。考えることは山のようにある。そんななかでイマを生きるのがマインドフルネス。雑念と距離を置き、いまこの瞬間にフォーカスする。マインドフルネスのワークでは呼吸に集中するが、何かの取り組みに没頭しているときも近い状態になる。ゾーンに入るというのも近い気がするし、脳汁が出ている状態といってる人もいる。

自分の中の話なので、外からの情報は基本的にノイズになる。適量なら着想のヒントや刺激、自分の引き出しになるが、情報を摂取することは没頭によってはマイナス要素。外部の状況を知り過ぎると取り組もうと思っていたことのブレーキになることがあるし、取り組みが外部から評価されると突然おもしろくなくなってしまう。他者から見て意味がなくても自分にとって価値があればそれでいいのだが、創作は儚いものでそこまで自信を持つのは難しく、自分の取り組みを客観視して手を止めてしまうことも少なくない。

人からの評価はアテにならない。自分の取り組みを100%理解してもらえることはまずないし、そもそも何かを評価するということ自体が難しい(死後評価され始める画家がいる)。何かを相談するといろんな人が自分の意見を言ってくれ、時には活動に対して評価されたりする。それでやる気を失うことも多い。基本的には黙って黙々とやる方が続きやすい。ただし誰にも相談しないと孤独が大きいしフィードバックがなくて少し不安になる。そんなときはトピックごとに相談できる相手が1人いると良い。会社ならこの人、プライベートならこの人、趣味ならこの人、みたいな。相手はそのトピックの経験者で、かつ人の話をよく聞いてくれる人だとうれしい。ありがたいことに今そういう人たちがいるが、彼らは自分の意見を押し付けずに話をよく聞いてくれる。自分への尊重を感じるし、モチベーションが枯れずに興味がさらに掻き立てられる。没頭の時間がさらに色濃いものになっていく。