2歩戻ったら2.5歩進みたい

関東で働くweb developerのブログ

AIプロトタイピングで認識合わせを前倒す

tl;dr

  • 動く試作を開発初期に作ったことで、bizとの認識合わせと体験検証が前倒しされた
  • その結果、外部仕様のズレだけでなく、内部設計の改善にも早く到達できた
  • AIコーディングエージェントの価値は実装速度そのものよりも、検証と学習の順序を入れ替えられることにある

何をやったか

今回の開発テーマは、アプリケーション内のLP的なコンテンツページをハードコードからCMSに置き換えるというタスクだった。

対象は5ページ前後。もともと社内デザイナーがデザインを作り、bizがそれをエンジニアに渡して実装する流れだったが、既存ページはガッツリとハードコードされており、ページごとに細かい仕様やデザインの違いがあった。CMS化にあたっては、それらのルールを把握しながら置き換える必要があった。

そしてこのタスクでは、実質的なユーザーが社内のbizだった。biz自身がCMSに入稿して使う側なので、仕様書をレビューするよりも実際に触ってもらった方がズレが見えやすい。つまり、フィードバックまでの距離が近く、検証コストが低い状況だった。


従来ならどう進めていたか

うちのチームはスクラムで1スプリント1週間で回していて、1スプリントに1プロセスを進めるのがスタンダードだった。

つまり、仕様検討に1スプリント、設計に1スプリント、実装に1スプリント。最終的にbizが使えるようになるのは3週間後。しかも初週の仕様検討の段階では、誰もページ全体のルールを完全には把握していないので、まともなフィードバックは得られていなかったと思う。

この設計先行フローには合理性もあった。各スプリントで合意のタイミングが明確なので、チーム内の進め方が揃いやすく、不安が減る。何から着手すべきか迷いづらい。チームとしてそのやり方でうまく回っていた。

なので、今回の記事で従来のフローを否定したいわけではない


今回変えたこと

今回は、着手1日目でコーディングエージェントを使って手元で動く状態まで作り、2〜3日目にはチーム内レビューに回して実際に触ってもらった。

このやり方に切り替えられた背景はいくつかある。

  • 他チームでAI駆動で似た進め方をしている人に触発された
  • 「ユーザー目線のフィードバックを入れたイテレーションを3回くらい回すと、ユーザー要望にも応えやすく内部品質も良くなる」という話を見た
  • チーム内にも「そろそろAIネイティブな開発フローにしないと厳しい」という空気があった
  • ちょうどその時期から、従来のような設計チケット消化型ではなく、オーナーが比較的自由に進められるスタイルに変わった
  • そのため、既存の進め方を壊す心理的コストが低かった

bizにフィードバックをもらう場は、スクラムの朝会を使った。biz・devが全員いる場なので、動くものを見せれば自然とコメントがもらえる。「意見もらえたらラッキー」くらいの温度感だったが、実際にはかなり具体的なフィードバックが出てきた。


何が起きたか

想定していた仕様では漏れていたポイントに、早い段階で気づくことができた。

出てきたフィードバックは大きく2種類あった。

表示の柔軟性に関するもの:

  • 注釈などでフォントサイズを変えたいケースがある
  • ページ下部に補記(「〇〇のページに遷移する」など)を入れたい
  • 重要事項説明書のようなファイルを複数で表示するパターンがある
  • 特定ページのデザイン再現が難しい → ある程度類型化した上で、自由にレイアウトができるフィールドを追加できると汎用性が高そう

データ構造に関するもの:

  • 朝会にエンジニアも同席していたので、CMSの画面を見ながら入稿スキーマについてもフィードバックがもらえた
    • エンジニアから「よく使うパーツはコンポーネント化していけると楽そう」という発言があった

これらは、仕様書ベースのレビューでは出てきづらい類のフィードバックだった。実際に入稿してみて初めて「ここが足りない」「ここはこうしたい」が具体化するタイプのもので、体験ベースの検証が前倒しされたからこそ得られたと言える。


内部設計への波及

ここで面白かったのは、外部仕様のフィードバックが内部設計の改善にもつながったこと。

きっかけはdevの「よく使うパーツをコンポーネント化できると楽」という発言だった。これを受けて、CMS側のオブジェクトタイプをセクション単位で分けて、フロントのコンポーネントと1:1に対応させる構造を思いついた。結果として、入稿時の操作とコードの構造が対応するのでメンテナンスしやすくなった。

また、1回目に作ったのはあくまでプロトタイプだったので、2週目にはフィードバックを踏まえて作り直すことができた。AIに書かせたコードは雑なポイントも多かったが、外部仕様の変更に合わせて改めて整理することで、より凝集性の高い構造にできた。

プロトタイプのコードは一回捨てて作り直している。試作をそのまま本番に出した話ではなく、試作で得た学びをもとに、2周目でより良い設計で書き直したという話だ。

(正直に言うと、内部品質がどの程度向上したかは定量的には言えない。ただ、フィードバックなしにいきなり設計していたら到達しなかったであろう構造には到達できたと思う。)


AIの役割

「AIで爆速開発できました」という話にはしたくない。今回のポイントはそこではない。

AIの役割は、試作の初速を出した触媒だった。

具体的に言うと、AIなしの場合はまず既存のページをひとつひとつ調べて、CMSのスキーマをどうするかじっくり考えるところから始めていたはず。各工程に1〜2日かかってもおかしくなかった。

AIを使ったことで、「一旦既存のページ全部さらってCMSのスキーマに整理して」で一気に土台が出てきて、それをCMSに入れるのもAI任せで早かった。画面の実装もAIにやらせた。結果として、手書きなら数日かかっていた工程が1時間程度に圧縮された

ただし、ここで重要なのは単に速くなったことではなく、速くなったことで「雑に作って壊して作り直せばいい」という発想自体が生まれたことだ。AIなしだったらスクラップビルドという選択肢はそもそも思いつかなかった気がする。

つまり、AIの寄与は2つある。

  1. 試作を作る時間を圧縮した(各工程1-2日 → 約1時間)
  2. 「作り直し前提で進める」というプロセス変更の心理的ハードルを下げた

今回ワークした条件

ここまで書いてきた話は、いくつかの条件が噛み合ったからワークしたと思っている。正直に整理しておきたい。

フィードバックの距離が近かった

今回はbizが社内にいて、しかも実質ユーザーだった。朝会で動くものを見せればその場でフィードバックが返ってくる。toC向けのアプリケーションで外部ユーザーが相手なら、そもそも検証したい仮説の組み立てからもっとシビアにやるべきだし、誰からどうフィードバックをもらうかの座組も違ってくる。

題材がCMS化だったから効いた可能性がある

今回は「触ってみるとズレが出やすい」テーマだった。入稿してみて初めて「ここが足りない」が分かるタイプの仕事。ドメインルールが重い領域やバックエンド中心の変更では、そもそも「動くもの」の定義が違うし、触って検証できる範囲も限られる。同じやり方がどこでも効くとは限らない。

テスト基盤があった

これはめちゃくちゃ大きい。今回はStorybook + Chromaticでほぼ完全なVRTが実現できていたので、「最終確認はVRTで」と割り切れた。だから雑に壊しに行けた。テスト基盤がない現場で同じことをやると、作り直しのたびにデグレのリスクを抱えることになる。「雑に壊せる」ための安全網は、このやり方の前提条件だと思う。


言えることと、まだ言えないこと

今回の経験から言えるのは、少なくとも以下の条件が揃ったとき、試作先行のプロセスは有効だったということ。

  • ユーザーが近くにいて、すぐにフィードバックが得られる
  • 触ってみることでズレが出やすいテーマである
  • テスト基盤があり、壊して作り直すことの安全性が担保されている

そして、AIの価値は「速く書けること」そのものよりも、速く書けることによって検証と学習の順序を入れ替えられることにあった。従来なら設計→実装→検証だった流れが、試作→検証→設計→実装に変わった。認識合わせのタイミングが3週間後から数日後に前倒しされた。

これがより広い条件で成立するかは、まだわからない。ドメインルールが複雑な領域、バックエンド中心の変更、外部ユーザーが対象のプロダクトなどで同じように効くかは、今後試してみないと言えない。

今回は「たまたま条件が揃っていた」部分も大きいと思う。ただ、試作を先に作ることで設計の材料が先に増える、という構造自体は条件を選ばない気がしている。

「顧客の要望を鵜呑みにするな」って言うけどさ

SmartHR Advent Calendar 2024 シリーズ2の18日の記事です。前の記事はyanagidaさんのドラクエの僧侶に学ぶチーフの振る舞い #マネジメント - Qiitaでした。

「顧客の要望を鵜呑みにするな」

プロダクト開発において誰もが聞いたことがある言葉ではないでしょうか。正論である一方で、実際に顧客の要望を鵜呑みにしてはいけない場面において適切に実行できるかというとこれもなかなか難しいなと感じていました。

私は普段プロダクトエンジニアとして働いていますが、この半年間ほどはプロダクトマネージャー(以下PM)の帽子を被ってユーザーヒアリングに行ったり要求整理をしたりするなど、いわゆるディスカバリーの工程をリードしました。今までPMが主導するヒアリングに同席したり、その後工程としてプロダクトの仕様の整理を行ってきましたが、顧客の業務フローから課題の仮説を自分で立てたり、その検証を行うのは初めての機会でした。その中で「顧客の要望を鵜呑みにしない」とはどういうことか腹落ちしたので説明したいと思います。

顧客の表面的な要望

よくある話:「申請書を電子化したいんです」

ここでは例として以下のようなストーリーで考えてみます。

  • 改善対象のストーリー:社員の家賃補助手当申請
  • 顧客の要望:申請書の提出を電子化したい
  • 現在のフロー
    • 従業員は申請書のExcelを印刷して記入して印鑑を押し、総務に提出する
      • 家賃の金額を証明する書類を添付する
    • 総務は書類をチェックしてOKなら承認、NGなら差し戻す

ここまでヒアリングで聞き出せたとして、次にどうするべきでしょうか?顧客は「申請を電子化したい」と言っているし、なんとなく紙を無くして電子化すればこのフローがいい感じになりそうな雰囲気があるので、具体的な仕様の検討を開発チームと一緒に進めていくのが良いでしょうか。

ここで「じゃあ仕様検討しましょう」という舵の切り方をしている場合、「顧客の要望を鵜呑みにしている」可能性が高いかもしれません。どういうことでしょう?

何に困ってる?

なんとなく不便そう、では解像度が低い

まず考えたいのは「今のフローにおいて何に困っているのか」が見えていないことです。現在の情報では「なんとなく紙で不便そう」ぐらいの解像度しかありません。そこで、以下のように課題を整理してみます。

  • 紙の印刷や押印など、やりとりに手間・時間がかかる
    • 家賃の証明書類の用意も面倒
  • 提出された申請書を保管するのが面倒

これで終わりでしょうか?

誰が困ってる?:課題に「主語」を!

これでは誰が困ってるのかわかりません。課題に主語を付け足してみます。

  • 従業員が申請書を印刷・書き込み・押印するのが手間
    • 従業員が家賃証明の書類を用意するのが面倒
  • 提出された申請書を総務が保管するのが面倒

主語を付けることで、課題の具体性が増し、「誰が」困っているのかが明確になります。ただこれだけでは課題の解像度が上がってませんね。もう少し色んな角度で考えたいところです。次は業務フローを俯瞰して考えてみましょう。

業務フローで考える

今回ターゲットとする業務をフローで捉えるとどうなるでしょうか?今回の例では「従業員が紙の申請書を提出する」から始まっていますが、その前後にも様々な作業や工程があるはずです。メジャーなケースを想像してみると例えばこんな感じでしょうか。

  • 総務:入社時の説明で家賃補助のルールについて説明する
  • 従業員:共有フォルダや従業員ポータルから申請書のExcelファイルを探してダウンロードする
  • 従業員:ダウンロードしたファイルを会社の複合機にアップロードして印刷する
  • 従業員:印刷した申請書に氏名・社員番号・住所・住み始めた年月・入社年月・家賃を書き込んで押印する
  • 従業員:賃貸借契約書を会社の複合機でコピーする
  • 従業員:申請書と賃貸借契約書を提出場所に置いてあるクリアファイルに挟んで提出する
  • 総務:提出場所を定期的にチェックして回収する
  • 総務:申請書を確認する。
  • 総務:(確認1)申請書と賃貸借契約書の内容が合致しているか確認する
  • 総務:(確認2)通勤時間をGoogleMapで確認する
  • 総務:家賃補助額を計算して給与システムに登録する
  • 総務:申請書をファイリングして保管する
  • 従業員:実際に家賃補助が振り込まれたことを給与明細で確認する

実際に書類がやり取りされる様子が分かってきました。業務の解像度が上がったので、もう1度課題について考えてみましょう。

課題に立ち返る

先程の各工程において、さまざまな課題が考えられます。 どのタイミングでどういう課題を感じているのか、仮説を立てて考えてみます(黄色部分が課題)。

  • 従業員:共有フォルダや従業員ポータルから申請書のExcelファイルを探してダウンロードする
    • 従業員:ファイルの場所が分からない
    • 従業員:いつどこに出すのか、いつまでに出すのかなどルールが分からない
  • 従業員:ダウンロードしたファイルを会社の複合機にアップロードして印刷する
    • 従業員:複合機の使い方がわからない
    • 従業員:印刷して書き込むのが面倒
    • 従業員:書類を出すために出社する必要があるのが面倒
  • 従業員:印刷した申請書に氏名・社員番号・住所・住み始めた年月・入社年月・家賃を書き込んで押印する
    • 従業員:ハンコを持ってくるのを忘れて提出が遅れる
  • 従業員:賃貸借契約書を会社の複合機でコピーする
    • 従業員:申請書を見るまで賃貸借契約書が必要なことを知らなくて提出が遅れる
  • 従業員:申請書と賃貸借契約書を提出場所に置いてあるクリアファイルに挟んで提出する
    • 従業員:家賃を書いてる書類を他の人に見られるリスクのある場所に置きたくない
  • 総務:提出場所を定期的にチェックして回収する
  • 総務:申請書を確認する。
    • 総務:毎月の入社人数が多いので確認に時間がかかる
  • 総務:(確認1)申請書自体の誤りがないか、また申請書と賃貸借契約書の内容が合致しているか確認する
    • 総務:紙の書類と社員DBなど複数のデータを照らし合わせるのが面倒
  • 総務:(確認2)通勤時間をGoogleMapで確認する
    • 総務:ルール上認められない通勤時間だった場合、従業員とのコミュニケーションに発展するとコストがかかる
  • 総務:家賃補助額を計算して給与システムに登録する
    • 総務:計算ミスが起こらないように2人以上で登録しており、ダブルチェックが面倒
  • 総務:申請書をファイリングして保管する
    • 総務:他にも書類があるので管理コストが高い
  • 従業員:実際に家賃補助が振り込まれたことを給与明細で確認する

最初は「申請書の提出を電子化したい」というフワッとした要望でしたが、提出の前後も合わせると他の課題が見えてきました。 業務フロー全体を見ながら課題を考えることで、課題に対して誤ったアプローチを行う確率を下げることができます。例えば「いつどこに出すのか、いつまでに出すのかなどルールが分からない」課題に対しては電子化しても直接的な解決策にはならないですね。

ここまで、課題の解像度を上げながら視野を広げることができました。次はどの課題を解くべきか考えるために、課題の優先度付けをしましょう。

tips: 課題をもっと深掘るために

イレギュラー運用・予防策

ちょっと長くなりすぎる気がしたので端折っていますが、実務では「課題が起こったときのイレギュラー運用」と「これらの課題が起こらないようにするための予防策」とがついて回る事が多く、この辺りに真の課題が潜んでいることが多いように感じます。 例えば、会員が申請書を提出するまでの過程で「〇〇が原因で提出が遅れる」という課題がありますが、実際に遅れてしまった場合の運用はどうなるでしょうか? 期限までに申請書が出なかった場合、総務側で催促の連絡をしたり、本来支払われるべきだった金額を次月の給与に加える作業が発生する、などが考えられます。こうなった場合、給与システムには一時的に倍額の家賃補助を登録しておいて、その次の月に通常金額に戻し、またその戻し作業を忘れないためにタスクを管理するExcelシートが実は存在して、しかしそのシートのフィルタ関数が壊れていて金額の戻し忘れが発生した...なんて事があるかもしれません。ここまで来てしまうと総務の方単体では片付かないので、上長を巻き込んで会計処理を正しくするための処理が余分に発生してしまうでしょう。 後半はほとんど妄想ですが、実際に顧客にヒアリングを行うと「そんなこと起こって良いのか...」と思ってしまうような運用が現場で起こっていることは珍しくないです。 実務ではこれらのイレギュラー運用・予防策まで深堀りを行って初めて価値が出ることが多い気がします。やっていきましょう。

ユーザーフローの外

直接業務フローには登場しない人が課題を抱えている以下のようなパターンもあります。

  • 会社役員は「そもそも提出が面倒すぎて使えるのに使ってない人が多い」ことに課題を感じている
  • 全社的に電子化を進めたいので「紙をなくす」ということ自体が目的になっている

特にBtoBの形態であれば当事者以外の圧力によって課題や目的が発生することが多いでしょう。ここにも意識を払っておけると良いですね。

どれを解決する?課題の優先度をつける

ここまで、業務フローを整理して課題を見つけることができました。次にどこから手を付けるのか考えるために課題の優先度を付けましょう。 ベースは「最も心理的な負荷がかかること」「最も物理的に時間がかかること」の定性・定量の2軸で優先度をつけていきます。ここの作業はできれば課題を付箋に書いてユーザーと一緒に認識合わせできるとよいですね。 ゴールとしては解くべき課題とその優先度が決まっていれば良いでしょう。以下のようなイメージです。

(例)優先度の高い課題

1位:紙の申請書の提出が面倒で、期限までに申請書を出せない従業員が多い
2位:従業員が提出時のルールを把握しづらく、不備のある申請が提出された際の差し戻し工程が総務の時間を大量に奪っている
3位:給与システムへの登録時のダブルチェックが面倒

優先順位が決まれば、次はそれぞれの課題に対してどう解決するかを考える事ができます。「申請書を電子化する」という提案が最適解なのか、他にもっと良い解決策があるのかを考えることができますね。

まとめ

いかがだったでしょうか。記事冒頭、顧客の「申請書を電子化したい」というフワッとした要望から比べると、かなり解像度が上がって「具体的に何を解くべきなのか」までは来れたと思います。 私はここに書いたような道のりをここ半年で初めて経験しましたが、顧客の要望を深堀りするというその1点だけでも非常に奥深く、かつ面白いと感じました。

この記事では伝わりやすいようにシンプルな例に収めていますが、実際の運用をヒアリングすると、現場の担当者の方のスーパープレーによってなんとか成り立っている業務や、古くから続く運用の歴史によって生まれた歪みを目にすることがよくあります。そういった複雑な現状に対しても向き合って課題を解決するプロダクトを作っていくことが、プロダクト開発の楽しさの一つだと感じています。その「向き合う」という行為の一つが、今回の記事のように顧客の業務を解像度高く捉えながら課題を深堀りしていくことだと思います。

この記事を読んでくれている方が「顧客の要望を鵜呑みにするな」という言葉を鵜呑みにすることなく、表面的な要望の裏にある本当の課題を発見するための手助けになれば嬉しいです。

明日はoniki_ds - Qiitaさんの記事です。それでは!

ジェームズ・クリアー式 複利で伸びる1つの習慣 を読んだ

感想

ここ1年で読んだ本の中で1番良かったかも。最近新しいことを始めようとしては続かなくて、いつのまにかやめてしまうことが多かったので悩みに突き刺さったのもあるけど。

習慣が続かないことに気づいた時、「あぁ、俺こんなことも続けられないってダメだなぁ...」みたいに考えてしまうんだけど、この本は「習慣の失敗はあなたの意志力の弱さじゃなくて環境が整ってないからだよ!」って1冊通してずっと言っている。 この本では習慣が定着する時のサイクルをきっかけ、欲求、反応、報酬の4ステップに分けている。それぞれのステップをどういう風に改善すれば習慣を定着させられるかがめちゃくちゃ具体的に書いてるので、読みながら過去の経験と照らし合わせて「あの時机に向かい続けられたのはこういう要因があったからなのか〜」と納得したり、これからやりたいと思っていることをどういう風に計画すれば上手く習慣化できるかワクワクしながら読んでしまった。啓発書よりもマニュアルと読んだ方が正しいぐらいのレベルなので習慣化に失敗した経験のある人類は全員これを読んで欲しい。それぐらいオススメ。

本筋からやや離れはするんだけど、なんか新しいことを始めようとしてはやめてきたマンとしては、付録にあった「新しいことを始めるチョイスがいつもキラキラしているのは予測するための土台となる経験がないから」という内容の文章が忘れられない。今まで毎回行き詰まると新しいことを始めようとする(そしてすぐやめてしまう)のかが分からなくて自分にモヤモヤしてたんだけどその理由が完璧に説明されていて舌を巻いてしまった。他にもたくさん「なるほどっすなぁ〜〜〜〜〜〜〜〜!」って言いたくなるような、自分が今までやってきた習慣、あるいはやれなかった習慣について説明が書いてあるのでぜひ読んでみてほしい。良書でした。

以下要約をどうぞ。


1章

  • 達成したい目的をベースに週間を作るのは間違っている
    • なぜなら目的の達成が境界線になって成功と失敗という安易な二元論で行動の結論を出してしまうから
      • 達成以外はモチベーションにならないし、長期的な習慣として根付くのを阻害している
  • 成果はあくまで行動を積み重ねた結果振り返って観測できる事象なので、成果ベースの評価は習慣化を妨げる
  • ほしい結果が得られるまでには時間がかかる(プラトー)ことは驚くほど認識されていない。

    学習や作業の進歩が一時的に停滞する状態。練習曲線の横ばいとして現れる。心的飽和や疲労などが原因で起こる。

    • 習慣化に失敗する人の多くがこの潜伏期間を耐えきれずに投げ出してしまう
  • 習慣化は成果・行動・アイデンティティという3要素で説明できる
    • アイデンティティとは、「自分は〇〇な人間である」という認識。
    • アイデンティティが確立できていると行動を起こすまでに必要なエネルギーが少なくなるので、習慣化のためにはここをまず押さえるのが大事
      • e.g. 「今禁煙してるんですよ〜」って言ってる人はアイデンティティが喫煙者なので禁煙することに対して凄くエネルギーを使っている。
        • 極論「タバコ吸わないんですよ」って言ってる人は断るのが当たり前になってる
    • アイデンティティの形成のためには行動を積み重ねることが大事
      • 行動によって自分のアイデンティティが強化される
        • 投票みたいなもので、なりたい姿に近づくために行動を積み重ねることが大事
    • ではどうやったら行動を起こしてアイデンティティの形成を素早く行うことが出来るだろうか?
  • 習慣化のサイクルには4つのステップが存在し、フィードバックのループとして常に回り続けている。
    1. きっかけ
    2. 欲求
    3. 行動(反応)
    4. 報酬
  • これらをハックして習慣化を成功させるにはそれぞれ以下のようなアプローチが有効
    1. はっきりさせる
    2. 魅力的にする
    3. 簡単にする
    4. 満足できるものにする

2章 はっきりさせる Make it obvious

  • 行動変化のプロセスは自覚から始まる
    • 一日の中で自分の行動を記録することで自覚できる
      • 目が覚める、携帯を開く、布団から出る、携帯を見ながらトイレに入る...
      • 大事なのは記録する時点では善悪の判断をせずにただ観察すること
  • 「私はいつどこで〇〇をする」という宣言をさせると実行できる確率が上がる(実行意図)
    • 「本をもっと読む」「運動習慣を作る」というざっくりした計画は役に立たない
    • 「寝る前の10分間、ベッドで本を読む」「夕食後、公園の周りをランニングする」という具体性が行動の確率を上げる
  • 「次に何をするかはやり終えたことに基づいていることが多い」

    ディドロ効果とは 意味/解説 - シマウマ用語集

    • これを利用して、既存の習慣に紐付けて新しい習慣を作ることが出来る
    • コーヒーを飲んだら(既存の習慣)瞑想する(新しい習慣)
    • きっかけははっきりしていればしているほど良い。
    • 昼休みの終わりに...よりも昼ごはんの皿を洗い終わったら...のほうがはっきりしている
  • 引き金を引くきっかけが無い環境は挫折を生みやすい
    • 自分で行動していると思いこんでいるけれど実は環境によって行動が引き起こされているだけなのをハックする
  • 習慣を引き起こすきっかけは背景ではなく背景との関係性によって変わる
    • e.g. ベッドでテレビを見ていると「ベッドはテレビを見る場所」というコンテキストが出来上がり、すぐに眠れなくなる
    • 新しい場所だと新しい習慣を作りやすいのはこの理屈(既存のコンテキストに引っ張られない)
  • 自制心が習慣を作るのではなく、環境が習慣を作る

3章 魅力的にする

  • 動物の欲求はドーパミンの量である程度定量的に測定できる
    • ドーパミンが大きく放出されるタイミングは、報酬が得られた時と報酬が得られると予測した時
    • 最初の報酬が与えられた時点でドーパミンが放出され、次回以降はきっかけが与えられて欲求が発生する直前で大きくドーパミンが放出される。
      • また、きっかけによって欲求が発生し、行動したのにも関わらず報酬が得られないときにはドーパミンの量が大幅に低下する。
      • しかし、報酬が期待したタイミングで得られない状態の後に報酬が与えられた場合はそれまで以上に大量のドーパミンが分泌される。
    • 行動を起こすのは報酬の予測。まとめると習慣自体を魅力的にするかがいかに大事かという話。
  • 行動を引き起こす確率を上げる、魅力的にするための方法の一つとして魅力的な報酬と抱き合わせるという手法がある
    • 要は宿題をやったらゲームをやっていい的な動機付け
  • 人間は近くの人と同じ様になりたい生き物なので、身につけたい習慣を当たり前に持っているグループに属すると身につきやすい。
    • かつ既に他の面で共通の要素を持っていると連帯感が生まれるのでよい
      • 運動をするオタクのグループに混ざる、みたいな
      • 同じオタクだから盛り上がれる上に彼らは運動してるので俺も頑張る!ってなりやすい
  • 悪い習慣はその先にある欲求に着目することで行動する確率を減らせる。
    • 承認されたいとか体に悪いけど美味しいものを食べたいとか
    • 行動した先に何があるか想像できるとブレーキになる

4章 易しくする(Make it easy)

  • どれだけ低コストで行動できるようになるかが習慣化の鍵
    • 習慣化のために必要なのは時間ではなく回数
    • 筋トレ1時間を週1回やるよりも10分を6回やるほうが習慣が付きやすい
      • 週1回の筋トレはすごくやる気が必要だけど10分を6回こなすとある程度脳死で出来る
        • 脳死で出来るようになったらこっちのもの
  • 低コストで行動するためには環境が大事。やる気ではない。
    • スマホを触ってしまうのならしばらく遠くに置いてみる。
      • 実際置いてみたらはかどってワロタ
    • できるだけ始めるのが簡単になるようにしよう。
      • 必要なものが出来るだけすぐ手に取れるように配置しよう。
  • 2分間ルール:習慣の行動は2分間で絶対終わるような長さで始める
    • 習慣は質を上げる前に定着させるのが大事
    • 始めたては2分経ったら確実にやめる。
      • 上手くいったからといって長時間続けると、次回行動する時の期待値が上がりすぎるので
  • テクノロジーで習慣を自動化させたり仕組み化出来るのでどんどん使うとよい

5章 満足いくものにする

  • 行動が習慣として定着しやすいのは行動によって与えられる報酬がより満足出来るものだった時
    • この章ではどうやったら再び行動を起こす確率を上げられるかを考える。
  • ただし難しいのは好ましいとされる習慣によって得られる報酬の多くが遅延報酬だということ
    • 実行した直後に報酬が得られにくいので習慣になりにくい
    • ので、即時報酬を行動の直後に供給するハックが有効
  • やったことや実績が明確に分かる仕組みが即時報酬になる
    • 例えば:
      • 〇〇やったつもり貯金(我慢したことが金額として分かる)
      • 行動した日はカレンダーにバツを付ける
      • 行動した回数だけ瓶にクリップを入れる
    • こういった仕組みは習慣トラッカーと呼ぶ
      • レコーディングダイエットもこの一種
        • トラッカーによって記録することでバイアスを排除できる。
        • 自分の行動に対しては得てして甘く見てしまいがちなので...
      • ただしトラッカーを付けるのが面倒になって習慣の定着を阻んでしまったら本末転倒なので「毎日付ける必要はないこと」「なるべく自動化すること」を意識する
      • また、トラッカーが示す数字はあくまでKPIの一つでしかないのでそれ自体にとらわれないように注意する必要がある。
        • もともと達成したいことを見失わないように。
  • 習慣が途切れそうになったら
    • 1日サボるのは許容する。2日連続のサボりは習慣の消滅を定着させてしまうので気合でやろう。
  • 誰かが自分を見ている、という認識は習慣の定着に大きく貢献する

6章 改善するだけではなく、本物になるには

  • とは言っても改善を続けるだけではなくて抜きん出るには習慣だけでは難しい
    • 他の人よりも有利かつ好きな分野を探して頑張るのが一番早い
    • 平たく言ってしまうと、本当に抜きん出るには本人の特性(遺伝子など)によるところが大きいので...
    • クリフストレングステストのような診断系テストはこういった資質を測るのに適している
  • ではどういって自分に向いた領域を探すのがよいか?
    • 周りは苦に思うのに自分は楽しく出来ること
    • 周りの人より特異なこと
  • モチベーションを失わないためにはコンフォートゾーンをちょっとだけはみ出る事が大事
    • 同じルーチンの繰り返しで退屈になっても、難しすぎてパニックになってしまってもいけない
    • 出来るか出来ないかギリギリの領域で達成することを続けようとするのが大事
  • モチベーションが無い時、退屈な習慣にも耐えられるかがプロとアマの違い
  • 習慣が身についた後の落とし穴
    • 些細なミスに気を配らなくなる
      • 習慣 + 計画的な練習 = 熟練
    • 自分は「〇〇(肩書)である」というアイデンティティを確立した後それに固執する
      • 肩書に固執するあまり、肩書を失うような失敗を恐れることで成長が止まる
      • 肩書ではなくて「粘り強く情報を集めながら判断できる」という性質にウェイトを置くほうがよい

付録

  • 満足 = 結果 - 欲望
    • 何回も繰り返す行動がマンネリ化するのは、あり得る結果のパターンが予測出来てしまうから
    • 新しいことを始めるチョイスがいつもキラキラしているのは予測するための土台となる経験がないから

まとめ

  • 習慣が定着しない時、原因は意志の弱さではなく環境にある
  • 大きな変化を起こすのではなく、ほんの小さな1つの行動を続けることを重視する
  • 習慣とは改善の持続的なプロセスである。改善をやめないことにこそ習慣の価値がある。

新しいLinuxの教科書を読んだ

読みました。EC2とかDockerでなんとなくLinux触ってるのが気持ち悪かったので、何が分からないのかわかるようになるために読んでみた。この本が対象とするのはLinuxを触ったこともないような、あるいはこれから初めて触るような人に向けた内容だったので、前半は割と知ってる内容が多かった(ファイル操作とかviとか)。後半はパーミッションやプロセス、標準入出力やシェルスクリプトなど、自分が何となく知ってるけどあんまり意識して触ってこなかったような概念についての説明だった。

全体通して非常に文章が分かりやすかったので割とスラスラ読めた。ただまぁsedとかawkとかのテキスト処理やシェルスクリプトは正直苦手意識がある。多分サーバー構築の自動化なんかでシュッと書けると便利なんだろうなーぐらいの感覚なので今ここにコミットしなくてもいいかなーと言う感じ。

とりあえずこの本を読んで「Linuxが何か知っている」ぐらいのレベルにはなったのではないかなーと思う。これで例えばwebアプリケーションの運用がやれるかというとそんなことはないので流石にもうちょっと詳しい本を読むなどしたい。

雑に調べたらLinuxの認定試験のLinucのレベル1が割とちょうど良さそうなのでやってみてもいいかも?と思っている。

linuc.org

章ごとの感想

  • Chapter 01 Linuxを使ってみよう
  • Chapter 02 シェルって何だろう?
    • カーネルとシェルの関係について、など。理解がふわふわしてたので良かった。
  • Chapter 03 シェルの便利な機能
  • Chapter 04 ファイルとディレクト
  • Chapter 05 ファイル操作の基本
  • Chapter 06 探す、調べる
  • Chapter 07 テキストエディタ
  • Chapter 08 bashの設定
    • .bashrcと.bash_profileと/etc/profileの関係についてなど
  • Chapter 09 ファイルパーミッション、スーパーユーザ
  • Chapter 10 プロセスとジョブ
  • Chapter 11 標準入出力とパイプライン
    • ><2>&1
  • Chapter 12 テキスト処理
    • sort, uniq, wc, cutなど
  • Chapter 13 正規表現
  • Chapter 14 高度なテキスト処理
    • sedawk。ムズすぎワロタ
  • Chapter 15 シェルスクリプトを書こう
    • #!/bin/bashがおまじないでなくなった
  • Chapter 16 シェルスクリプトの基礎知識
  • Chapter 17 シェルスクリプトを活用しよう
    • この辺を読んで雑なテキスト処理とかターミナルから実行する運用系のコマンドはシェルスクリプトにして見たりすることが出来た
  • Chapter 18 アーカイブと圧縮
    • tarってアーカイブだけで圧縮じゃないんですね。知らなかった。
  • Chapter 19 バージョン管理システム
  • Chapter 20 ソフトウェアパッケージ

2021年 ふりかえり

月別ざっくり振り返り

やったこと
1月 個人開発アプリのリリースに向けて頑張る
2月 個人開発アプリをリリースする
3月 個人開発アプリの運用・改善する①
4月 個人開発アプリの運用・改善する②
5月 個人開発で燃え尽きる①
6月 ゲームしたり読書したり引越し準備したり(個人開発で燃え尽きる②)
7月 ゲームしたり読書したり引越し準備(個人開発で燃え尽きる③)
8月 引っ越し
9月 家を整える
10月 スマブラと読書
11月 転職活動
12月 転職活動

個人開発

今年の前半は個人開発に注力していました。2020年の9月ぐらいから取り組んでいたので足掛け半年ぐらい開発をしていたことになります。

zenn.dev

リリースまでは朝早起きして1時間コードを書き、仕事を定時で終わらせたらご飯を食べて寝るまでコードを書くような生活を続けていました。この頃はモチベーションに満ち満ちており、個人開発でアプリを出して小銭を稼ぐぐらいまでは行ってやるぞ、と思っていました。

無事2月にリリースにこぎつけたのですが、残念なことにリリース後のトラフィックはほぼ全くの無風でした。もちろんTwitterで潜在ユーザーに直接宣伝してみたり、既存のユーザーにヒアリングしてみたり、改善はやったつもりでしたがそれ以上にモチベーションが保ちませんでした。

今振り返ってみるとニーズの捉え方が甘く、結局はユーザー(自分含め)が本当に欲しい物をわかっていなかったことが成功できなかった原因だったと思います。まぁそれはそれとして、自分が全力で出したアウトプットのクオリティの低さに耐えられなかったのもあり、燃え尽き症候群のようになってしまいました。結局そのままアプリは放置しています。どこかのタイミングでモチベーションが戻ってきたらまたやってもいいのですが、しばらくは別のことに時間を使おうかなと思っています。

本とかゲームとか

5~6月は余暇の時間を読書やゲームに向けました。

モンハン。PSP以来だったのでついていけるか不安だったけど、とりあえずソロで全部回れはした。アクションがめっちゃ進化してて楽しかったです。

FE風花雪月。リシテアちゃん可愛いよ。

発売当初にリトルマックでVIPに入って満足してたんだけど、友達が本格的にやり始めたので巻き込まれる形でまたやり始めた。オンライン対戦のレベルが上がりすぎてて怖い。来年はちゃんとVIPに入れるようになりたい...。

展示を見に行く度に歴史を知らないのは勿体ないような気がしていたので読みました。印象派以降の流れが分かったので色んな画家に対して親近感を持てるようになった。嬉しい。

あとこの辺。もうちょっと読んだ気もするけど...。

canisterism.hatenablog.com

canisterism.hatenablog.com

引っ越し

今年の後半に入ってからは引っ越しが大きなトピックでした。今の彼女と同棲することにしたので大田区から川崎に引っ越しました。23区に比べると家賃がバカみたいに安くなりました。

引っ越しを経験するのは人生で3回目ですが何回やっても大変ですね。特に今回は初めての同棲だったので、家具家電をほぼ全部新調するために2人で検討するのが大変でした。必要な家具家電を全部洗い出して暫定の予算を書き込んだ上で必要なタイミングを考えながらいつ買うのかを決めるためにスプレッドシートに作ったり、引っ越しのタスク整理のためにNotionで看板を作ったりしました。ほぼ仕事でしたが普段プログラマーとして働いているのでプライベートでPMっぽい仕草をするのは楽しくもあったので良かったです。

もう語り尽くされてますが、ドラム式洗濯機とロボット掃除機を入れたのは今でも正解だったと思ってます。この辺の話をどこかで書きたい。

f:id:canisterism:20211228153544j:plain
PanasonicのNA-VX700BL

この動画がすごく参考になりました。

【コスパ最強】洗濯乾燥機をスペックで選ぶのは危険!下位機種で良い理由!おすすめが1つだけありました - YouTube

実際に引っ越したのは8月でしたが、9月〜10月まで家具選びを頑張っていた記憶があります。ソファとか棚とかテレビとか。また、自室の環境も引っ越しに伴っていい感じにしたいと思っていたので思い切って電動昇降式机を導入しました。好きな時に立ったり座ったりできるのは最高。

お仕事

仕事に関して、今年はチームで上手くバリューが出せなくてずーっと悩んでいたような気がします。親しくしていたメンバーの方がチームから抜けたり、チームにおける自分の存在意義が上手く見いだせなかったりしてモチベーションがうまく継続できませんでした。

また、Flutterという技術を自分のキャリアにおいてどういう位置づけにするのか?という問いをずっと考えていました。

現職ではFlutterを使ってモバイルアプリエンジニアとして働いていますが、このままモバイルアプリエンジニアとしてキャリアを積んでいくのか?という疑問が今年の中盤からずっと頭の中で渦巻いていました。

Flutter自体は素晴らしいフレームワークですが、2年間触った感想としてネイティブのレイヤーに近くなれば近くなるほどFlutterによるデメリットが浮き彫りになっていくように思います。単純なJSONのやり取りだけであれば良いですが、Webviewやテキストフォーム、カメラなどの機能を使うことを考えるとつらみが多くなってくるのではないでしょうか。(Google謹製のアプリのうちいくつかはFlutterベースに書き換えられているのを見ると単純に僕のスキル不足によるものである可能性も否めないですが)

つまり(?)、今時点の自分のFlutterに対する認識はこんな感じです。

  • クロスプラットフォーム開発のためのフレームワークとしては素晴らしい
  • ただし、ネイティブのAPIに近いことをやろうとすると結局ネイティブのコードを書く必要がある
  • 自分はネイティブのコードが書けない(し、あんまり書くつもりがない)
  • ネイティブのコードが書けないFlutterエンジニアがマッチするのは「(複雑なことはせずに)とりあえず両プラットフォームでモバイルアプリが欲しいプロジェクト」である

なので、Flutterをキャリアの中心に置き続けるには、ネイティブのコードが書けるようになるか、ネイティブのコードが書けなくても問題ないようなアプリを書き続けるかのどちらかになると考えました。自分はモバイルアプリを作り続けたいわけではなく、一人のwebエンジニアとしてプロダクトを出すための力をつけていきたいと思っています。こういった考えから、今のチームでFlutterを書き続けるのはやめて、別の会社でwebアプリケーションを作るエンジニアとして働く決断をしました(書いてみると決断が一足飛びな気もしますが、まぁ書きにくいことも色々あるのでお察しください)。

注:Flutterを書いてる/好きな方やFlutter自体を貶したい訳ではないです。個人のキャリアとしての観点なので悪しからず。

というわけでなし崩し的に転職エントリになってしまいましたが、来年の1月から別の会社でお世話になります。現職には3年とちょっと在籍したので、そろそろ別の会社を見てみたかったのもあります。

次の会社ではおそらくまずはRailsでバックエンド+インフラもやることになる(というかやりたい)と思っています。今までどちらかというとUI寄りの開発が多かったのですが、ゼロイチでサービスを作れるようになりたいので新しい挑戦をしたいと思います。

総括

なんだかまとまりのないエントリになってしまいましたが今年の振り返りはこんな感じです。全体的に集中力が下がってしまって、まとまったインプット/アウトプットが出なくて悔しい感じになってしまいました。いろんな失敗を経験したのでもうちょっとちゃんと振り返りをして次に繋げたい...。

キャリアに関して、正直今でも明確な回答が出てる訳ではないんですが、自分なりに考え抜いた結果出た答えなので、来年は修行だと思ってひたすらコードを書いていきたいと思います。来年の目標もサクッと書けるといいなー。それでは良いお年を!

f:id:canisterism:20211228174144j:plain
武蔵小山「てりや」の のどぐろ。なんとなくめでたそうなので。

DNSがよくわかる教科書 を読んだ

動機

最近の中長期目標が「webエンジニアとしての基礎を作る」なので今まで避けてきたアプリケーション以外の技術に触れてみる一環で読んだ。直前に読んだ本がマスタリングTCP/IPだったのでネットワークつながりで続けて読むことにしたのだけれど結果的に良い判断だったと思う。

canisterism.hatenablog.com

感想

実務でもDNSのレコードを直接操作したり、名前解決のプロセスを辿ってトラブルシュートしたりすることはなかなか機会に恵まれなくてどうにも苦手意識があったのだけれど、少なくとも概観を掴めたのでDNS何もわからん!という状態ではなくなった。

基礎編ではDNSの構成要素や名前解決の仕組み、委任などの説明を交えながら具体的な動作の説明に入っていく。教科書と銘打ってる通りゼロベースで説明してくれてるので自分のように理解があやふやな人にも優しくて助かった。

8章のdig他DNS周辺のCLIコマンドを実際に叩きながらフルリゾルバとして名前解決をしてみるセクションがすごく理解を助けてくれた。digコマンド自体は知ってるけどあんまり叩く機会がないので...(一方で実際に手を動かすパートはここぐらいしか無いので理解を深めるためには別の書籍をあたったほうが良さそう)

読んでてピンとこなかったことは検索しながら読み進めたのだけれど大体jprs.jpやnic.ad.jpのサイトに詳しい解説が載っている。

jprs.jp

www.nic.ad.jp

DNS周辺、いざって時に触れたり分かってたりすると役に立つタイプのものだと思うので、これを読んで苦手意識を消すレベルまで引き上げられて良かった。

マスタリングTCP/IP 入門編を読んだ

webエンジニアになりたての時に「エンジニアにおすすめ!」みたいな記事を読んで買ったんだけど当時何が書いてるのか全く分からなくて積んでしまっていた本。

3年ぐらい経った今、ぼんやりエンジニアとしての基礎が足りないと感じていたところにふと目についたので手にとって読んでみた。

感想

序盤の章ではインターネットの歴史からOSI参照モデルTCP/IPにおける簡単な通信の流れをさらって、以下の章では各層のプロトコルを順番に解説していた。

ネットワーク周りがずっと苦手で避けてきたので前提知識がほぼ無いような状態で挑んだ割に面白く読めたと思う。プロトコルを普段の生活に例えて説明してくれるところが読みやすかった。例えばTCPとIPにおいて目的のホストに辿り着くまでの経路解決が「駅員に目的地だけ伝えたら次はどこに行けばいいか分かる」という説明をされていて分かりやすかった。

自分のようなネットワーク何もわからんマンには序盤の章でざっくりした全体図を示してくれるのはすごく助かった。あと全然関係ないんだけどTCP/IPの標準化までのプロセスは実際に役に立つ仕様を作成するための仕組みという感じがして面白かった。

3章以降は各層のプロトコルに関してもう少し突っ込んだ説明がなされていて、こっちに関してはふんわりとわかった気がする...というのも、読んだ時は理解してるんだけど応用するための知識として引き出すには足りないのでもうちょっと実務で使うなり深めるための学習が要るような気がする。とはいえ一回分かってればあとは引き出すことは出来そうなのでそういう意味で読めてよかった。

本筋とは別の話で面白かったこととして、全体通してプロトコルが発展する時の思想としてひたすら「実践的かどうか」を問いながら進んでいるのが面白いなと思った。プロトコルを先に策定して広めるのではなくて、提案をベースにして実験と議論を行い、主要メンバーが承認すると実装され始め、その上で広く運用されると晴れてStandardになる...というプロセスを踏むので標準として策定されたときには十分に洗練された状態になっている。ただインターネットの偉人たちによってこれだけ標準化までのプロセスを洗練させても、長い時間が経つと想定外の事が起こってるのを見ると事前に起こる問題を予想し切るのは無理なんだなぁ...と思った。

話が逸れたけど、短期的に見ると効果が薄いけど長い目で見たら読んだほうが良いタイプの本をちゃんと読み切れたのはすごく良かった。このベースがあると今後の実務レベルの知識が入ってきやすくなると良いな〜〜〜〜〜。終わり。