2024年振り返り(仕事編)

転職した

スタートアップ文化への適応

大企業2社を経て初めてのスタートアップへの転職。これまでと大きく異なっていたのは、ロールベースではなくアクションベースで仕事が進んでいくこと。ロールの名のもとに誰にどの業務領域を担当してもらうのか明確にし、そこに責任を載せることで駆動していくのがロールベース。一方で現環境は、ロールなんて気にせずアクションを起こした人が正義。目まぐるしく変わる状況の中で、最適なアクションを起こし、価値のインクリメントを最大最速にしていく。そうしたスタートアップ文化に慣れるのに最初は苦労した。まだ手探りでもある。

フロントエンド開発にがっつり入れた

これはキャリア形成において大きな出来事だった。インフラ、バックエンドと経験してきたが、フロントエンドは門外漢だった(RailsAPI モードばっかり触ってた)。それが業務やコミュニケーションのネックになることがあったし、技術領域を横断的に俯瞰した意思決定をするにはどうしてもフロントエンドをカバーしておきたかった。やってみて分かったが想像以上に概念が複雑で覚えることも多い。Figma を見ながら、その通りに実装が進んでいく過程は楽しい。

新しい技術領域に踏み込めた

分散トランザクションやイベントソーシングなど、これまで経験したことがなかったアーキテクチャを設計/実装できた。テックブログでアウトプットも出せた:

ゼロイチフェーズのプロダクトに関われた

前職でもゼロイチはあったが Embedded SRE ロールだったので少し違う。「誰に」「何を」「どうやって」「いつまでに」とチームで向かい合うことができた。事業領域とエンジニア領域の境界線がなく、事業上の意思決定を深く理解しているので、実装において齟齬が発生することはまずないし、スピード感も半端ない。コンテキストが多く、脳みそがパンクしそうにもなったが、事業がスケールしてもこのスピード感を維持したい。

打席数と速さが大事と知る

タスクをひたむきにやるだけじゃ足りない。プロダクトを成功させるために、アクションの量をとにかく増やす。正確さより打席数と速さが大事。失敗を恐れて尻込みするのではなく、何でもやってみてダメだったらあとから謝る。

悲観 vs 楽観のバランスをより意識した

過去の現場では目を背けたくなる技術負債がいつも隣にあった。負債に慎重であり、それを生み出さないことが至上命題になっていった。生み出す価値より、整合性が取れる、運用しやすいが判断の指針に。とはいえ、ゼロイチのプロダクトにおける不確実性の高い状況では手段としての楽観も必要だと学んだ。チームが楽観なら自分は悲観で、チームが悲観なら自分は楽観で考えることでバランスを取っている。

何でもやりながら成長していけるというマインドになった

プロダクトを成功させるために必要なことは何でもやっていこう、というマインドになった。例えば、ピープルマネジメントを習得する余裕がないからやらないというマインドから、プロダクトの成長のためにピープルマネジメントで貢献できるならやりたいというマインドに。「経験がないから」「余裕がないから」という言い訳に逃げないようにしたい。経験の部分は ChatGPT と壁打ちできる時代になったのである程度カバーできる。

エンジニアリングというものに向き合えた

「分からないこと」に向き合う力が確実に付いた。毎日が「分からないこと = 不確実性が高いこと」だらけなので、不確実性を小さくする How to もたくさん身についた:

- 目的不確実性(何があったら便利か、売れるか)
  - MVP、N1 インタビュー、バリュープロポジション、インセプションデッキ
- 方法不確実性(どうやったら作れるか)
  - とにかく早く動くものを実装する
  - スクラムイベントの部分活用
    - ストーリーポイント見積もりを手段とし、不確実性を明らかにする
    - 抽象的なスプリントゴール設定によりチームの爆速自走状態が作れる
  - プロダクト全領域を俯瞰してプラスになる意思決定
    - ex. マーケティングに活用しやすい技術選定

むしろ「分からないこと」に積極的に突っ込みたいし、その方が自分にとってのリターンも大きい。

月1くらいで社外のエンジニアと交流できた

イベントやカンファレンス参加に参加し、社外のエンジニアと交流する機会を多く作れた。その後の継続的な交友にも繋がっているので本当にありがたい。新しい発見や学びを交換できるのもそうだし、互いを応援し合える関係を築けたことは大きな財産になっている。

技術発信は少なかった

カンファレンスに CFP 出したが落選した。シンプルに球数が少なすぎたので来年以降はもっと増やしたい。

イベントソーシング + CQRS を理解する

ステートソーシング

従来からあるステートソーシングは一般的で分かりやすい。出荷状態を管理するモデルを例に取ると、status カラムが「準備中→出荷→到着→完了」のように遷移していく。

  • ポイント
    • データの「状態」を記録する
  • 流れ
    • データの状態を DB から読み出す
    • データの状態を変更する
    • 変更データを DB に書き込む
  • 特徴
    • モデルに対する CRUD で実現できる
    • レコードが常に状態と一致する

出荷を CRUD したければ単一のモデルに対してアクセスすれば実現できる。

flowchart LR
subgraph State[ざっくり概念図]
        direction LR
        Client((クライアント))
        Model[モデル]
        DB[(データベース)]

        Client -->|CRUD操作| Model
        Model -->|読み取り/書き込み| DB
        DB -->|現在の状態| Model
        Model -->|結果| Client

        style DB fill:#bbf,stroke:#333
end

イベントソーシング

レコードが常に最新の状態を持っているステートソーシングに対し、イベントソーシングは「状態が変わる出来事」に着目する。出荷状態が変わるできごと ー 例えば、梱包が完了した、トラックが出発した、受取が完了した ー を記録していく。

  • ポイント
    • データの「状態遷移」を記録する
  • 流れ
    • 状態を読み出すにはイベントから状態を再生する
    • 新しいイベントを追加する
  • 特徴
    • 基本的に SELECT と INSERT のみ
    • 参照と更新でアプローチが異なる
flowchart LR
subgraph State[ざっくり概念図]
    direction LR
    Client((クライアント))
    Model[モデル]
    Projection[プロジェクション]
    ES[(イベントストア)]

    Client -->|参照/更新| Model
    Model -->|書き込み| ES
    ES -->|読み出し| Projection
    Model -->|状態の再生| Projection
    Model -->|結果| Client

    style ES fill:#f9f,stroke:#333
end

コマンドクエリ責任分離 (CQRS)

データの読み取りと書き込みを分離する設計パターン。データの参照を担う Query とデータの書き込みを担う Command に分けられる。CQRS とイベントソーシングはセットで語られるが、相性がいいというだけで概念は別物である。そのためイベントソーシングするが CQRS を実装しないこともあり得る。(ただ、イベントソーシングする時点で書き込みと読み込みの処理は全く別物になるため自ずと分離を迫られる。)

イベントソーシングの概念図に CQRS を当てはめると次のようになる。

flowchart LR
subgraph State[ざっくり概念図]
    direction LR
    Client((クライアント))
    ReadModel[Query モデル]
    WriteModel[Command モデル]
    Projection[プロジェクション]
    ES[(イベントストア)]

    Client -->|更新| WriteModel
    Client -->|参照| ReadModel
    WriteModel -->|書き込み| ES
    ES -->|読み出し| Projection
    ReadModel-->|状態の再生| Projection
    ReadModel -->|結果| Client

    style ES fill:#f9f,stroke:#333
end

参考

2024年7~9月に読んだ本

高専時代に読んで挫折した一冊。リベンジできてよかった。

ブログ書いた: sasamuku.hatenablog.com


新しいチームでフロントエンドもやることになり急いで勉強。りあクト!は JS の基本から触れてくれるので勉強しやすかった。

oukayuka.booth.pm

oukayuka.booth.pm


新しいチームでマーケティングのことを考える機会があったので購入。恥ずかしながら PMF が何なのかすら知らなかったのでよい勉強になった。

ブログ書いた: sasamuku.hatenablog.com


新しいチームで OKR を考える契機があり冒頭だけ読んでみた。OKR のあり方やチームでの運用方法を知ることができた。


やはり時間を捻出するのに神業はないと分かった一冊。寝る前3時間以内に運動するとよくないことを知れたのでもっと早めにジムに行こうと思う。

「CPUの創り方」を読んでブレッドボードで組んでみた

高専在学中に読んで挫折した一冊。

取り組み方:

  • 本を通読して汎用 IC や CPU の内部構成を学ぶ
  • 秋葉原とネット通販で部品を揃える
  • ブレッドボードで実装

本書に登場する CPU の構成要素

  • ROM (Read-Only Memory)
    • 命令とデータを格納する
  • クロック生成器 (Clock Generator)
    • CPUの各動作のタイミングを制御する信号を生成する
  • プログラムカウンタ (Program Counter)
    • 次に実行する命令の番地(アドレス)を保持する
  • データセレクタ (Data Selector / Multiplexer)
    • ALUへの入力値を選択・切り替える
  • I/O ポート (Input/Output Ports)
    • CPUと外部との間でデータをやり取りするための接点
  • レジスタ (Registers)
    • データや命令のアドレス、計算結果などを一時的に保持する
  • ALU (Arithmetic Logic Unit)
    • 加算、減算、論理演算等の算術・論理処理を行う
  • キャリーフラグ (Carry Flag)
    • オーバーフロー(桁上がり)を示す
  • 命令デコーダ (Instruction Decoder)
    • 機械語命令(オペコード)を制御信号に変換する回路

読書メモ

第1章、2章は導入パートなので省略。

第3章

  • 汎用 IC
    • 基本的なゲートを複数含む IC(NAND, NOT など)
    • 未使用ピンは GND か Vcc に接続(開放は不可)
  • パスコンは電源安定化の役割

第4章

  • リセット
    • パワーオンリセット:電源 ON 時、コンデンサ未充電で 0V (L)、その後充電で電源電圧 (H)
  • クロック
    • 本書はコンデンサと提供による発振回路を使用
    • 通常は水晶発振子を利用

第5章

  • ROM の背景
    • BIOS 格納のため不揮発なメモリーが必要
    • 過去は不揮発メモリーは ROM しかなかった
    • Read Only は特長ではなく不揮発性の制約
  • ROM の役割: CPU からのデータ要求に応答
    • アドレスバス:番地指定
    • データバス:指定番地のデータ出力
  • 本書は DIP スイッチで ROM を表現

第6章

  • イミディエイトデータ
    • 即値:メモリ番地やレジスタ名でなく、数値そのもの
  • CPU 構成
    • レジスタ:内部記憶装置
    • プログラムカウンタ:実行中命令の番地を記憶
    • I/O:入出力ポート
    • ROM:プログラム格納場所

第7章

  • フリップフロップ
    • クロック立ち上がり時の入力値を保持・出力
    • 4個で 4bit レジスタ構成可能
  • CPU の本質
    • データ転送の繰り返し(演算も転送の一種)
  • データセレクタ/マルチプレクサ
    • 複数入力の切替スイッチ

第8章

  • ALU:演算処理を行う
  • キャリーフラグ
    • 条件分岐判断用データ
    • 加算時の繰り上がりを保持
  • プログラムカウンタ
    • 命令実行後にカウントアップ
    • リセット時は 0 番地にセット
  • I/O ポート
    • 出力ポート:レジスタ出力を LED に接続
    • 入力ポート:DIP スイッチを接続

第9章

部品メモ

基本的にTD4基板 Ver1.5(おまかせリスト)を参考に秋月電子通商で調達しました。秋月で調達できない IC は樫木総業株式会社で取り寄せました。こちらのブログを参考にさせていただきました。

その他、ブレッドボードやマルチメータ、ジャンパー線などは秋葉原で調達。

成果物

挙動が変なところがあったが原因を突き止めきれず。

感想

CPU がどのように動いているのか概観を掴むことができた。手を動かして失敗しながら学ぶのは意外と効率が悪くない。

PMF の教科書を読んだ

PMF とは

プロダクトが市場にフィットしている状態。顧客のニーズを満たすプロダクトがあり、潜在的顧客がいる正しい市場にいること。

フィットジャーニー

事業立案から PMFGrowth までの道のりを示したもの。

graph LR
    A[Customer Problem Fit<br>顧客は課題を<br>持っているか] --> B[Problem Solution Fit<br>課題への解決策が<br>あるか]
    B --> C[Solution Product Fit<br>解決策をプロダクトとして<br>実装できるか]
    C --> D[Product Market Fit<br>プロダクトは市場に<br>受け入れられるか]
    D --> E[Go to Market<br>スケール可能な<br>状態になっているか]
    E --> F[Growth<br>スケールしているか]

バリュープロポジション

顧客が必要としており、競合他社には提供できず、自社が提供できる価値のこと。

  • バリュープロポジションじゃないもの:
    • 独自性があり、自社で実装できるが、顧客が望んでいない価値
    • 顧客は望んでおり、自社で実装できるが、他社も提供できる価値
    • 独自性があり、顧客も望んでいるが、自社で実装できない価値

PMF を図る指標

遅行指標:

  • リテンションレート
    • 顧客が継続して商品を使い続けている割合
  • ユニットエコノミクス
    • 顧客生涯価値 ÷ 顧客獲得コスト
    • 3 以上が望ましい
  • レベニュー
    • 事業が稼いでいる定期的な収益

先行指標:

  • ショーン・エリステスト
    • 「プロダクトが使えなくなったときどう感じるか」アンケート
    • 「とても残念」が 40% を超えると PMF と判断できる
  • NPS
    • 顧客に知人にプロダクトを勧めたいかアンケート
    • 推奨者数 - 批判者数がスコアとなる
  • エンゲージメント
    • 新規ユーザのアクティブ具合を分析する手法
    • 利用停止、解約がないか

PMF 後における成長の方向性

  • 既存セグメントの拡張
  • 既存セグメントでのアップセル
    • 例: 機能追加や上位プランの設計により既存顧客からの収益を伸ばす
  • 新規セグメントに進出
    • 例: 飲食業界から物流、EC 業界にセグメントを拡張
  • クロスセル商品の開発
    • 例: 採用管理システムに採用代行サービスを販売

まとめ by Claude

Product Market Fit(PMF)は、スタートアップの成功における重要な指標である。顧客の課題発見から成長段階まで、各ステップを慎重に進むことが肝要だ。バリュープロポジションの確立、適切な指標による評価、そしてPMF達成後の戦略的成長が成功への鍵となる。常に顧客価値を中心に据え、市場の変化に柔軟に対応することで、持続可能な成長が実現できるのである。

2024年4~6月に読んだ本

正規化を初めて学んだときは(定義すること自体の)必要性をあまり感じなかったが、開発者が当たり前に考えていることを定式化することの意義を理解できた。正規化とパフォーマンスに付き纏うトレードオフや論理設計におけるバッドノウハウなど、テーブル設計をする上で頭に入れておいた方がよい知識がまとめられていた。

半透明ふせんの存在を知れたのが一番の収穫だった。本に付箋を貼ってメモを残すとき、文章が下に隠れないので助かる。肝心の読書術に関しては自分にとって目新しいことはそれほどなく、普段考えていることの答え合わせができた感覚だった。

オードリーのオールナイトニッポンを担当している放送作家さんの著書。芸人のラジオを聞いていて、何故こんなに面白く話せるのかずっと気になっていたので読んでみた。トークの素人が実践できることは以下になりそう。「これ話したい!」と思ったことを話すのがシンプルに大切。

  • 熱があるうちに話す
  • 心の動きを伝える
  • 無理に笑わせようとしない
  • 状況や情景など伝わるように話す

GraphQL の概観を学ぶためにざっと読み通した。業務で REST の辛み—具体的には「リクエスト回数削減のために最適化」「大は小を兼ねて膨れ上がった」エンドポイント—に課題を感じていたが GraphQL がそれらをどう解決するのか学ぶことができた。サーバとクライアントの実装サンプルにも触れられた。

久々に小説を読んだ。本でこんなにハラハラドキドキしたのは本当に久しぶりだった。2つの時間軸で物語が進行していくが、数奇な運命を1つずつ答え合わせしていく感覚が面白い。最近オデッセイやインターステラーを再び鑑賞したりもしていて、毎日欠かさずご飯を食べれることに感謝している。

別記事にまとめを書いた。

sasamuku.hatenablog.com

スタッフエンジニアを読んだ

感想

全体を通して、会社や組織とは不合理なものだという諦めの雰囲気を感じて逆に面白かった。だからこそ、「空気を読む」とか「反論しない」みたいな本に書くまでもなさそうなアドバイスも現実味があった。スタッフエンジニアになるためのガイドに加え、リーダー職の処世術がまとめられたような本だった。

第1章

スタッフエンジニアとは

スタッフエンジニアは、字面だけみると一般社員のようだがシニアエンジニアの1つ上のポジションと定義されている。マネージャーとスペシャリストの分岐点を技術寄りに曲がった先ということになる。

https://pr.forkwell.com/wp-content/uploads/2023/06/staff-engineer-graph.png 「スタッフエンジニアとは?役割・スキル・キャリアパスを徹底解説!」増井 雄一郎 | Forkwell Press | フォークウェルプレス

スタッフプラスの4つの典型

スタッフプラスエンジニア(>=スタッフエンジニア)の4つの典型に分類される。

典型 役割
テックリード チームの技術的なビジョンを決める中心人物。複雑な技術プロジェクトを完遂できる。チームを技術的成長を後押しする。
アーキテクト 企業内の特定の技術領域(API デザインやストレージ戦略)を成功に導く。会社の成功に必要でかつ複雑な分野に求められる。
ソルバー 会社幹部が重要と認めた問題に取り組む。組織内のすり合わせ、上層部の説得をすることはない。特定の課題にフォーカス。
右腕 上級リーダから権限を預かって行動する。直接的な経営責任は追わない。代わりにリーダの価値観に合わせる必要がある。

多くのスタッフエンジニアはテックリードに該当するらしい。それは体感としてもそうだと思った。

第2章

個人として発展し続けるために大事なことがまとめられている。

重要なことに力を注ぐ

  • 上級職になればなるほど、減り続ける時間の中でより多くを達成することが求められる
  • 異なる環境で活躍したいなら、評価される仕事と自己の成長のバランスを取ることが重要
  • 簡単な仕事、インパクトが弱い仕事、目立つだけで自己を成長させない仕事に気をつける
  • 育成にもっと投資する、雇用と同じくらいの影響力がある(毎週2, 3時間をチームの育成に費やす)
  • 関心が向いている先と本当に得意なことが交差する点の仕事をする

エンジニアリング戦略を立てる

  • デザイン文書(プロジェクトにおける意思決定やトレードオフを記述する)を5つ書き、優れたエンジニアリング戦略の下地とする
  • 5つのエンジニアリング戦略から1つのビジョンを導く

技術品質を管理する

  • 成功を収める企業では変化も多いためかつての技術決定で現在の品質基準を満たせることは少ない
  • 技術的ベクトルを組織内で合わせてより多くの成果を得られるようにする

権威と歩調を合わせる

  • マネージャーとの間に意図的にパートナーシップを育む(綿密な情報共有など)
  • 自身の価値観と会社の価値観との差異に対する意識を高め、どちらも追い出すことなく擁護する方法を探す

リードするには従うことも必要

  • 優れたリーダーはリードするよりもフォローすることに多くの時間を費やす
  • 効果的なリーダーはリーダーとフォロワーの役割を自在に使いこなす

絶対に間違えない方法を学ぶ

  • 自分は決して間違えないと思い込んでいる人は空気から酸素を奪っていく
  • 話を聞き、明らかにし、空気を読む
    • 疑問に耳を傾ける: 自分も質問していいのだという心の余裕と安心感を持ってもらう
    • 目的を明確にする: チームが何を達成しようとしているのか問いかける
    • 空気を読む: 無理に合意形成しようとせず、空気を察して柔軟に対応する

他人のスペース(余地)を設ける

  • 会社にとって不可欠な人物になってはならない
  • 周囲の人々に自由に活動させ成功に導くようサポートする
  • 優れた議論
    • 参加者全員がポジティブな印象を持つ合理的な結論で迅速に終了すること、だけが優れた議論ではない
    • より多くの人に議論に関与させ、個人的な働きかけがなくても適切な決断を引き出せるようにする

ネットワークを築く

  • コミュニティから見つけられやすい存在になる
    • コミュニティに意見を寄せる
    • カンファレンスで登壇する
  • 内部ネットワーク
    • 社内のネットワーク作りによって仕事が改善し、将来的に外へのネットワークも広がる