がんばるぞ

がんばります

API 設計で意識していること3選

この記事はスターフェスティバル Advent Calendar 2025 23 日目の記事です。

qiita.com


カプセル化について思いを馳せるタイミングがちょこちょこあるので、今回は時間の許す限り API 設計をする際に個人的に意識していることを書いていこうと思います。

API

この記事でいう API は WebAPI というよりはクラスのパブリックメソッドであるとかそっちがメインです。

こういったインタフェースのメソッド群や

<?php
interface HogeInterface
{
    public function doSomething(string $hoge): bool;
}

クラスのパブリックプロパティ, メソッドなどを指して API と呼んでいます

<?php
class Fuga
{
    public int $value;

    public static function doSomething();
}

逆に private なものは API とは考えません

<?php
class Piyo
{
    private string $piyo;

    private function doSomething();
}

なぜ API 設計?

プログラミングにおいてAPIの設計はとても大切です。

API を設計する目的の1つは、ユーザー(そのAPIを扱う別の開発者)に対して何を公開し、何を隠蔽するのかという情報管理だと考えていますが、この情報管理は凝集度の向上や結合度の低下、複雑性の隠蔽などに効いてきます。

そのため、 API 設計が適切にされていないと関心を同一とする処理が複数の箇所に散らばったり、いわゆるドメイン貧血症みたいな状態になったりなど保守性が落ちていきます。

<?php
class Cart
{
    public array $items;
    // ...
}

class CartService
{
    public function order(/** ... **/)
    {
        // いろんな箇所でこんな感じの処理を書きがち
        $totalAmount = 0;
        foreach ($cart->items as $item) {
            $totalAmount += $item->price;
        }

        // ...
    }
}

なぜこれらが良くないのかという点についてはここでは説明しませんが、好ましい API を保つために意識していることをヒョイヒョイと書いていきます

意識していること

ユーザーにどう使わせたいか?

Tell, Don't Ask の原則を守り、凝集度や結合度を適切なレベルに維持することは重要です。そのために僕が意識しているのは「このクラスをユーザーにどう使わせると便利か?」という点です。

この意識を持たずに手続き的に実装を進めてしまった結果、以下のような API を作ってしまったことが過去にあります。

<?php
class Cart
{
    public function getItems(): array { /* ... */ }
    public function setItems(array $items): void { /* ... */ }
}

このような API になってしまうと Cart の中身を操作する方法をユーザーが理解し、そのための処理を書く必要が出てきます。

<?php
// 呼び出し側でカートの操作をする
$items = array_filter(
    $cart->getItems(),
    fn($item) => !$item->getProductId() === $productId
);

$cart->setItems($items);

単純にクラスの使い勝手が悪くなりますし、クラスの役割が小さくなり単なるデータの入れ物になってしまいがちです。

しかし「どんな使い方ができたら便利だろう」という意識で考えると僕の場合は以下のような API を思い付きます。

<?php
class Cart
{
    public function removeItem(string $productId): void
    {
        $this->items = array_filter(
            $this->items,
            fn($item) => !$item->getProductId() === $productId
        );
    }
}

これであれば呼び出し側は単に removeItem() を呼び出せば終わりますし、結果的に Tell, Don't Ask の原則にも適い、凝集度の向上・複雑性の隠蔽に繋がっています。

Getter を生やすことを過度に避けない

Tell, Don't Ask は良い原則ですが、極端に解釈をした結果 Getter は常に悪いアイデアであるという論をたまに見かけます。というか僕も一時期そう思っていました。

しかし、過度に Getter を避けてしまうとモジュール間の結合度が必要以上に上がってしまうリスクがあります。

僕の考えでは Getter が害を生むのは「そのクラスに実装すべき処理が、 Getter と共に呼び出し元で実装されている」場合です。また、そのリスクが上がってしまうためなるべく Getter を避けようという話だと理解しています。

これ自体は共感できますし、今でも安易に Getter を生やさないように気をつけています。しかし、ここから飛躍して「とにかく Getter を作ってはいけない」と考えてしまうと前述の結合度のリスクにつながります。

極端な例をあげると以下のようなコードになります。これは、 getEmail() という Getter を避けた上でメール送信がしたいといった状況です。

<?php
class User
{
    public function sendWelcomeEmail(Mailer $mailer): void
    {
        $mailer->send($this->email, 'Welcome!');
    }
}

こうなると User から Mailer への不要な依存が生まれてしまいますし、もしメールの内容に User 以外の情報が必要になったら引数が増え、結局その引数に Getter が必要になるかもしれません。

もう少し工夫をして新しい抽象概念の導入などを行えば Getter 自体をなくした上で過度な依存を避けることも可能ですが、であれば素直に getEmail() がある方がシンプルで自然に思います。

<?php
$mailer->send($user->getEmail(), 'Welcome!');

そのため、 Tell, Don't Ask を意識して凝集度を高く維持するというのを前提にした上で API として自然な範囲で Getter を使用するというのが良いと考えています。

余談ですが、以下のように計算結果を返す Getter はよく、プロパティをそのまま返す Getter は良くないといった話もたまに聞きますが、どちらも変わらないと考えています。

<?php
class User
{
    public function getFullName(): string
    {
        return $this->familyName . $this->firstName;
    }
}

メソッドの中で計算しているかどうかは API のユーザーからしたら関係がありません。

特定のユースケースを前提としない

A Philosophy of Software Design という書籍では深いモジュールという概念が紹介されており、「小さなAPIで多くの仕事をこなせる」ことを1つの特徴としてもっています。これは良い API の特徴の1つです。

もし API が特定のユースケースを前提としてしまうと、個々のシグネチャは小さくなったとしても、できる仕事も一緒に小さくなってしまいます。

メール送信を行うクラスにメールの種類ごとのメソッドが生えている状態だと例としてわかりやすいでしょうか

<?php
interface Mailer
{
    public function sendUserRegistered(string $to);
    public function sendDelivered(string $to);
    // ...
}

この場合、ユースケースが増えるたびにメソッドを増やす必要があり、一つのメソッドにつき1つのユースケースにしか対応できません。これが直ちに悪いことであるとは言えませんが、メソッドの数が増えるということ自体は学習コストや認知負荷の向上に繋がります。 テスト時の Mock も少しごちゃつくかもしれません。

こういった場合、僕は特定のユースケースを前提とせず、ユースケースに対してオープンな API を検討することが多いです(Mailerだと自分で実装することあまりないな...w)

<?php
interface Mailer
{
    public function send(string $to, MailContent $content);
}

こうすることで、1つのメソッドでさまざまなユースケースに対応できるようになり、小さなAPIで多くの仕事をこなせる状態に近づきます。

おわりに

ということで時間を過ぎたのでここらへんで切り上げたいと思います。 個人的には「ユーザーにどう使わせたいか?」が一番大切な気がしてます。みんなも良い API を作るために意識してることがあれば教えてください!

家買った

32歳。家を買いました。 この記事では家を買う時に僕が考えていたことを書きます。

あとこの記事はスターフェスティバル Advent Calendar 2025 9日目の記事です

qiita.com

マンション vs 一戸建て

まず最初に浮かぶのが、マンションにするのか一戸建てにするのかというところですが、これに関しては最初から決まっていて、一戸建てでした。

僕の娘は死ぬほど元気なのですが、現在のマンション住まいだとやはり音の問題が厳しく、自由に飛び跳ねながら暮らす事が難しいからです。 娘に窮屈な思いをさせず、のびのびと暮らすためには一戸建てしかないと思っていました。

中古 vs 新築

次に考えるのが中古にするか新築にするかなんですが、中古にしました。 最初は特に何も考えずに SUUMO を眺めていたのですが、死ぬまで住む家を探すと考えると家選びがあまりにも難しく感じたため、どこかのタイミングで売る前提で家を探すことにしました。 そうなると、売る際にオーバーローンになるリスクを極力下げたくなります。

不動産の建物部分は、木造建築の住居だと会計上(?)22年で減価償却が完了し、価値が0円になるそうです*1。まぁ実際には22年以上の家も0円以上の計算で売りに出てると思いますが、まぁとにかく年数に応じて値段が下がるということです。

つまり中古だと4000万の物件の内訳が建物500, 土地3500 だったりするわけなので、あまりにも不人気エリアになって土地が激下がりしなければまぁオーバーローンにもなりにくいだろうという見積もりです。 そして築10~20年程度の中古物件であれば古くなりすぎないくらいでちょうどいいだろうと思い、そこらへんを狙っていました。

エリア

エリアは以下の条件でざっくり絞りました

  • 妻と僕の実家の両方への車のアクセスがよいこと
  • 治安が悪くないこと
  • 坂が激しくないこと
  • 自然が豊かなエリアか大きい公園があること
  • ある程度都内に出やすいこと

これに合いそうなところということで

あたりを見てました。

あとは実際に現地にいってひたすら歩き回ることで、どんな場所かを体で感じるということをちょいちょいやってました。 しばらく高速とガソリン代の出費がえぐかった。(神奈川在住なので、千葉・茨城は少し遠いw)

あと道路族マップなるものがあると聞いたので治安の参考と思って見てみましたが、まぁそんな参考にするほどでもないかなという気持ちになりました dqn.today

教育環境

こちらもある程度重視するか...?と思ってたのですが、結果いまいち調べることができずw 公立の小中学校であれば、治安が悪くないエリアだったらそんな変わらんか...?という感じに。

人口に対する塾の比率とか見たり、なんか色々指標を考えてみましたが、あまりしっくりくるものが浮かばす。

最終的には、

  • 無理なく通える範囲にさまざまなレベルの高校があるか
  • 私立の中学があるか(いくかわからんけど)
  • 小学校のクラス数が少なすぎないか

といった点をクリアしていれば OK かなとなりました。娘が勉強をがんばりたいとなった場合も、そうでない場合も選択肢がある場所であればって感じです。

みんながどこを見て判断してるのかはいまだに気になってます

予算

大事です。 爆裂に高い家を買うと人生が終わる可能性があります。

  • 直近半年の家計簿から見る支払い余力
  • 固定資産税 (年10万程度に仮定)
  • 修繕積立金 (だいたい10年ごとに200万と仮定)
  • 火災/地震保険
  • 住宅購入にかかる諸費用(だいたい物件価格の10%)
  • 公立と塾でがんばる・めっちゃ私立に行っちゃうの2パターンの娘の教育費
  • 住宅費の支払いがカツカツ・まぁいける・余裕 の3パターンで娘の教育費が落ち着いた段階でそれぞれどの程度の貯蓄になるか

あたりを計算し、だいたいの予算を決め、 そこから金利変動でどの程度月々の支払額に影響があるかを確認し、最終の予算上限を決めました。

ちなみに、予算上限を決めても予算を超える家が欲しくなってくるのでヤバいです。良い家の魅力がすごい。 これからめちゃくちゃ稼げばいいかとか、ワンチャン宝くじ当たる可能性はあるしなとか思ってました。

物件の条件

当初は

  • 人目が気にならない庭がある
  • 土地 150m2 以上
  • 建物 90m2 以上
  • 駐車場が並列2台止めれる
  • 4LDK
  • 一階に独立した部屋がある
  • 駅徒歩15分以内
  • 小学校が1kmくらい
  • 小学校までの道が危なくない
  • 汚すぎない
  • リビングに窮屈さを感じない
  • 遠くない距離に大きい病院がある
  • コンビニかドラッグストアが徒歩10分圏内にある
  • スーパー, 郵便局が15分圏内にある
  • 大きめの公園が徒歩10分程度の距離にある
  • 周辺の散歩が楽しそう
  • 駐車したときに自転車の出し入れが大変じゃない

といった点で見ていましたが、茨城の県南エリアであればまぁまぁあるのですが柏の葉キャンパスだと希望する物件があまりなく、あっても予算を超えるものばかりになってしまうので、柏の葉キャンパスエリアに限っては

  • 庭はなくても可
  • 土地は車が1台停められれば可
  • 一階に独立した部屋がなくても可
  • 駅徒歩25分以内

まで緩めましたw

予算を周辺環境と物件それぞれにどう配分するかって感じですかね〜

震災

首都直下型地震とか内水被害とかは怖いので、市の情報とか↓のサイトとかは見てました

jam.jibanmap.jp

www.bouhan-nippon.jp

www.jiban.co.jp

disaportal.gsi.go.jp

ときめき

まぁなんか色々書きましたが、なんだかんだときめきが一番重要だと思います。

実際に周辺を散歩したり、家を見たりしてときめかないと買えません。足を動かそう。

住宅ローン

最後に、住宅ローンに関しては、色々調べた結果50年ローンでいくか〜ってなりました 雑にシミュレーションした感じでは、月々の浮いた支払い額を投資信託とかに回した方が資産形成的に有利そうでした。 月1万ほど貯蓄を増やしたら、娘が大学卒業する時点の資産額がざっくり300万くらい変わるw ちなみに浮いた分を消費に回したら人生が積む可能性があるので、これから先は理性との戦いになります。

また、団信の保障に関してはあまり調べられてないのですが、60歳をすぎたあたりからがんのリスクが結構増えるため、50年ローンとかにするならがん保障つけといた方がいいかなーと思いました。が、その前に売る予定だしなーということで金利があまり変わらないがん50%保障だけつけるという中途半端なことをしました。

住宅ローンの比較にはモゲチェックってやつが便利そうだったので使ってみました。

mogecheck.jp

色々と候補として出てきたものと、不動産の提携銀行を合わせて、最終以下の銀行に審査を出しました

金利的には auじぶん銀行が一番有利だったんですが悲しいことに満額承認が出ず、最終的にはPayPay銀行になりました。

auじぶん銀行、今なら50年ローンでも金利上がらないのでおすすめですよ。10年固定めっちゃ安いし。

あ、そうそう。変動か固定かでいうと変動金利にしました。

金利はまぁ上がるだろうけど、上がっても3%くらいまでは耐えられそうだし〜〜〜ということで目先の支払額の安さに負けました。

auじぶん銀行なら10年固定にしてたかもしれん。

最終的にどんな家を買ったのか

ということで、家を買う時に考えていたことを色々紹介したわけですが、最終的に柏の葉キャンパスエリアで築10年超えの中古戸建を書いました。 来月に引っ越しを控え、ソワソワしております。

途中、あまりにも良すぎて予算を超えた家に手を出しかけましたが、正気に戻って予算内の物件に落ち着きました。

色々なエリアを散策したものの、柏の葉公園にすぐ行ける環境に一番ときめいたので、後半はほとんど柏の葉キャンパスに絞って探していました。みらい平とかも良かったんだけどね。

つくばも街並みがめちゃくちゃ良かったんですが、教育熱が激高いという噂からついていける自信がなかったのと僕の実家(神奈川)からはやっぱ時間かかるな〜というところでやめました。 子供が大人になったタイミングとかで移住してもいいのかもしれないですね。マジで街並みが良かった。

あと小金井公園もかなり捨て難かったんですが、周辺道路がすぐ混みそうなのがウーーームってなりました。子供をいろんなところに連れていきたいんですが、子連れだと電車より車の方が気楽なんですよね。

しばらくはここでのんびりと暮らしつつ、娘の学区などの縛りを気にしなくてよくなったタイミングで宝くじに当選して改めて駅近の豪邸を買う予定です。

次は「宝くじ当たった」っていう記事を書けるようにがんばります

PHP Conference 小田原 2025 で登壇した

こちらのイベントで登壇してきました。全体的にめちゃくちゃ楽しくて最高でした。天気も良かったのでより最高でした。 パンダさんと初めてお話しすることができたのもラッキーでした。 phpcon-odawara.jp

タイトルは「恣意性から考える変更に強いモデルの作り方」だったんですが、変更に強いモデルの作り方の話ができたのかはあまり自信がない...。

speakerdeck.com

この登壇は自分にとって意味の大きいものでした。 というのもここ数年「ドメインモデルにビジネスロジックを実装するというのはどこまで筋の良いアイデアなんだろうか」という疑問について継続して考えていたからであり、今回の PHP Conference 小田原 2025 と今年の一月に開催された吉祥寺pmでの登壇は、2つ合わせてこの疑問に対する僕なりの現時点での回答だったからです。

そもそもなぜこんな疑問を持つに至ったのかというと、日々ビジネスロジックと思われるものを修正している現実の中でふと「ビジネスロジックは安定しているという噂はどこまで本当なのか」と考えてしまったからでした。

一度そこに疑問を持つとあとは芋蔓式に

  • ビジネスロジックは安定しているという噂とビジネスは変化していくべきという噂はどう両立するのか
  • もし安定していないとしたら、なぜドメインモデルの変更コストが高い構造になるレイヤ系アーキテクチャを採用しているのか
  • ドメインエンジニアリングにおけるドメインロジックと Evans 本で言われているドメインロジックはそもそもズレてないか
  • ドメインエンジニアリングにおけるドメインロジックが業界全体で再利用可能なものであるとするならば、アプリケーションロジックこそがビジネスロジックに近いのではないか
  • DDD という考え方はライブラリ開発など技術的な領域の設計でも有効に感じるのになぜビジネスという単語を持ち出す必要があるのか

などさまざまな疑問が頭に浮かび、最終的には世間で言われていることと真逆の「ビジネスロジックドメインモデルから追い出した方が良いのではないか」という仮説を思い浮かべることとなりました。

結局はそこまで過激(?)な主張をする勇気は持てず「変更頻度の高いビジネスロジックを可変性として捉えドメインモデルに組み込むとよいのでは」といった多少穏やかな主張と、「変更頻度が高くなる(可能性が高い)箇所は恣意性の高い箇所なのではないか」という2つの主張をそれぞれ吉祥寺pmと小田原ですることで落ち着きました。とはいえ(特に後者は)相当に勇気が必要ではありましたが。

しかし内心では未だに「ドメインモデルからビジネスのコンテキストを取り除くことができれば汎用性が爆上がりして最強になるはず」と思っているので、もう少し経験を積んでレベルアップしたらそういった話ができればなとも思います。
あとはそもそもビジネスロジックって単語は使わない方がいいんじゃないかみたいな話とかも...。

また、これは完全に言い訳なのですが、恣意性の話に関しては様々な事情で資料を作る時間がほとんど取れず、完成度としてはかなり悔しい出来になってしまったので、またどこかでより深掘りした内容でお話しできればいいなあと思います。

そのほか、当日にご質問いただいた「恣意性というアイデアがどこから来たのか」という話を改めてこちらでも書こうと思いますが、 Clean Craftsmanship という本に以下の記述があり、そこからきています。

A discipline is a set of rules that are composed of two parts: the essential part and the arbitrary part. The essential part is what gives the discipline its power; it is the reason that the discipline exists. The arbitrary part is what gives the discipline its form and substance. The discipline cannot exist without the arbitrary part.
規律とは、本質的な部分と恣意的な部分の2つからなる一連の規則です。本質的な部分とは、規律に力を与えるものであり、規律が存在する理由である。恣意的な部分は、規律に形式と実質を与えるものである。恣意的な部分なしには、規律は存在し得ない

文脈は全然違うので単に僕が曲解してるだけではあるんですが、僕の大好きなマルチパラダイムデザインで紹介されている共通性と可変性がそれぞれ本質的な部分と恣意的な部分として解釈できそうな気がして、そこが始まりでした。

ドメインモデルとは、本質的な部分(共通性)と恣意的な部分(可変性)の2つからなる一連の規則です。」うん。それっぽい(w


とりとめもなく書き殴ってしまいましたが、改めて PHP Conference 小田原 2025 おつかれさまでした。 運営してくださったみなさん、僕のセッションを聞いてくださったみなさん、ありがとうございました!!!

スタフェスに入社してから4年経ちそうです

この記事はスターフェスティバル Advent Calendar 2024 19 日目の記事です。 アドベンドカレンダーのときしか書かないブログになってしまっている

qiita.com


はやいもので年が明けたらもう入社して4年になります。 今年の後半は組織的にかなり激動の一年だったので、今年の振り返りと来年以降のやっていきの気持ちを綴りたいと思います

今年なにしてたの

データ基盤を作ってた

年初くらいからデータ基盤チームに移籍し、データエンジニア見習いとしてデータ基盤の構築を推進していました。 ETL is 何?ってレベルからのスタートでしたが、チームメンバーに鈍器の輪読会に付き合ってもらったり、ディメンショナルモデリングについてキャッチアップしたりと、まだまだ知識が全く足りてませんがなんとかやってます。

弊社は様々なノーコードツールを活用しながら事業を回しているので、それらを DWH に連携させていくというところが地味に面倒でしばらくはそれをコツコツ進めていました。

途中から ETL を半自動で生成するツールを作るなどしてちょっと楽しつつ、チームとしては

  • 全社向けの KPI ダッシュボードの設計・構築
  • プロダクト向け KPI ダッシュボード作成
  • データを活用した振り返りの支援

などしていました。...いやほとんどチームメンバーに任せてて僕はそれに使うデータの用意とかばっかりしてた気がするなw ざきさんが優秀すぎてめちゃくちゃ甘えさせてもらってます。

データ基盤によって意思決定や現状把握に大きく貢献できるのはめちゃくちゃ価値が高いと思っているので、引き続きやっていきたいですね

また社内基盤に関わり始めた

去年のどこかのタイミングで社内基盤からは離れていたんですが、数ヶ月前から再度関わりはじめました。 前回と違うのは、カスタマーサポート出身のドメイン知識豊富なエンジニアがチームメンバーに加わっていることで、かなり最高感があります。

これまでも社内基盤は進めていたものの限られた部分にフォーカスしていたので、今回は全体像を想像しつつ進めるということを意識しています。

そのためまずは各部署に対する業務フローのヒアリングをチームメンバーにリードしてもらい、ざっくりと業務の境界を把握しつつ大枠の設計方針を決めるということをしました。あとは進めていくだけや!

しかし社内基盤というものは設計で意識しないといけないことが多すぎて楽しいですね。営業戦略やら他アプリケーションとのつながり方、チーム設計、etc...めちゃくちゃ難しいですがやっていきです。

CTO 室が誕生した

激動要素その①です。

詳しくはアドベントカレンダーの最終日にざきさんが書いてくれると思いますが、 CTO が退任した代わりに CTO 室が爆誕しました。

主には CTO が担っていた役割を部署として対応していくといった感じで、エンジニア組織の文化づくりや各チームのお困りごとを解消する仕組みづくり、技術領域の大きめな意思決定、あとは経営陣とのコミュニケーションなど主にやってるかなと思います。
この前書いた KABE-UCHI の記事なども CTO 室の取り組みの一環です。

これによって組織論的なやつだったり、会計周りのお勉強だったり色々とキャッチアップをがんばっています。

CTO 退任はインパクトの大きい話だったのでみんなへの影響はかなり心配していましたが、逆にポジティブな方向に行動が変わったメンバーが多数いて、やはりスタフェスのエンジニアはすごいという気持ちになりました。 Go All Out だね〜

EM になった

激動要素その②です。

なんやかんやあって自分から手を挙げて EM をやることになりました。 全く想定していなかったロールなので、ほんと何が起こるかわからないですね。

EM というかマネジメントの知識0状態で、僕のラインのメンバーに迷惑がかかると申し訳なさすぎるので、ここしばらくは EM 周りを一番集中してキャッチアップしてます。
2ヶ月で EM 系の本を10冊以上消化したのはほんと偉いなって自分でも思うので継続して学びを深めていきたい。

とりあえず 3ヶ月以上は経過したけど 1on1 とかはまだ全然慣れないですね。難しすぎる。 そんな感じでまだ未熟なんですが、みんながパフォーマンスを存分に発揮できる働きやすい環境づくりをがんばりたいのでとにかくがんばります。Go All Out や

来年の抱負

アウトプット

実はここ数年は子育てに集中するためにアウトプットなどは意識的に避けていたんですが、採用を加速させていかなければなのでアウトプットを再開するぞという気持ちです。

ということでいくつかプロポーザル出したりしてたんですが、早速1月、2月、4月と登壇の機会を頂けてありがたい限りです。

弊社は PHP だけでなく TypeScript とかもガッツリ使ってるので TSKaigi とか PHP 界隈以外にも顔を出していかないとな〜。
あとは EM 系の勉強会とかもね!がんばるぞ

しかしネタはもう尽きました。w
ポジション的に手を動かすことが減ってきているのでどうやってネタを作っていくかは課題ですね

EM の学びを深める

これは引き続きやっていきます。やりはじめてみると面白さもわかってきました。

体力お化けになる

この前ランニングしてみたら心身ともにすごい元気になったので、体力がつくってすごいって思いました。 毎日すごいって思ってすごくなりたいのですごい体力の人になりたいです。

可読性についてレビューするときに気をつけていること

この記事はスターフェスティバル Advent Calendar 2023 9 日目の記事です。

qiita.com


最近社内で可読性について会話をするタイミングがあり、可読性について思っていることを言語化してみるか〜と思ったので書いてみます。 可読性って難しいしよくわからないよね〜

この記事では、可読性という単語をコードの把握しやすさといった認知負荷的な意味だったり誤読しにくさみたいな意味で使っています。

メンタルモデルに起因するものなのか、そうではないのかを意識する

メンタルモデル?

メンタルモデルというものは「XXとはこういうもの」や「こうしたらこうなるはず」のような人それぞれが持つ思い込みみたいなものだと理解しています。

コードを読んで理解するときのメンタルモデルは、これまでのプログラミングに関する経験や知識、そのロジックが解こうとしている問題についての理解、自然言語自体の理解などの積み重ねで作られていくものかと思います。

たとえば、僕は getName というメソッドを見たときに

  • 状態の更新は起こらないだろうな
  • I/Oは発生しないだろうな
  • 計算コストは低いだろうな

みたいに思ったりしますが、僕とは違うメンタルモデルを構築している人であれば「小さなロジックとかもなく、インスタンスプロパティをそのまま返しているだけだろうな」といったことまで期待するかもしれません。

メンタルモデルに起因する指摘は難しい

読み手のメンタルモデルと実際にコードに乖離があると読み手は読みにくいなとか理解しにくいなとか思い始めますが、 残念ながらメンタルモデルは人によって異なり、ある人にとって可読性が上がる修正が別の人にとっては可読性を下げる修正になることがあります。

例えば関数指向になれている人は mapfilter を使って配列を処理することは簡潔で読みやすく感じると思いますが、そうではない人にとっては for 文を使ってループ処理している方が読みやすく感じたりします。

そのため、自分にとって可読性が低いから変えてほしいという視点だけだと自分しか得をしない指摘になってしまったり、 たいして実利を得ることができない議論のために時間を消費してしまったりするため、 この可読性の低下はメンタルモデルに起因するものなのか、ロジックの複雑性に起因するものなのかなどを自覚することは大事だと思っています。

とはいえ、綺麗に区切れるものでもないと思うので難しいんですが

普通の範囲に収まっていそうであれば許容する

多くのエンジニアのメンタルモデルに概ね合致するようなコードを書くことは重要なため、 getName というメソッドで状態の更新を行うようなコードを指摘するのは有益だと思いますが、 特別変なことをやっているわけではないコードに対してレビュアーとレビュイーが細かい点を主張しあうといった、お互いの普通あるいは常識をぶつけ合うだけで実利に結びつかないような議論は微妙だなと感じます。

(幸い自分の会社でそういった光景を見たことはないです

何を普通とするかは難しいためあくまで感覚的な話にはなってしまいますが、ある程度普通なコードに対しては nits くらいの温度感で意見を共有するに留めて、 プロダクトのコード規約のアップデートなどに時間を使った方が有意義かなと思っています。

コメントの不備による可読性の低下は指摘する

A Philosophy of Software Design という書籍の中では、コードだけでは必要な情報を全ては表現しきれないためコードコメントを残さないと情報の欠落が発生するというようなことが書かれています。たしか。

言葉足らずな文章が理解しにくいのと同じように、コードから読み取れない重要な情報はコメントとして残されていないとロジックの意図が捉えられず、ほとんどの人にとって可読性が低下してしまうため、こういったところは進んで指摘をするようにしています。

複雑度に起因する可読性の低下は指摘する

先日 fukabori.fm の認知負荷回を聞いてとにかく最高だったのですが、 fukabori.fm で語られていたように人の認知リソースは限られており、認知リソースを多く必要とするコードは全ての人にとって可読性がよくないため可能な限り複雑度が低くなるよう努力した方がいいです。

fukabori.fm

条件分岐を無理なく減らせたり、責務が分割されすぎているクラス群をある程度まとめるような修正は循環性複雑度などの数値の改善につながり、 大体の場合は認知リソースの節約になると思うので極力指摘をするようにしています。

とはいえこちらも、デザインパターンに慣れている人とそうでない人で複雑に感じる度合いが異なるなどメンタルモデルに左右される部分もあるので難しいのですが...

可読性という単語をあまり使わない

最後に、可読性という単語はあまり使わないようにしています。 というのも可読性という単語は便利なのですが抽象度が若干高いため、可読性という単語だけで説明した気になってしまうと意図が伝わらずにレビュイーを困惑させてしまったり手戻りが発生したりといったことに繋がるように思うからです。

可読性を低下させている原因は可読性という単語を使わずに説明可能なことが多いので、より具体的な単語を使って説明する方がコミュニケーションしやすいかなと思います。

おわりに

なんか書いてる間、テンションずっと変だった〜〜〜〜〜〜〜〜〜〜〜

可読性〜〜〜〜〜〜〜〜〜〜〜嫌!

PHPerKaigi 2023 に参加しました! #phperkaigi

phperkaigi.jp

数年ぶりにオフラインでカンファレンスに参加してきました。 去年も行きたかったんですが家庭の都合が合わず参加できなかったので、念願の!でした。

セッションの感想など

PHPの最高機能、配列を捨てよう!!

fortee.jp

朝1発目から uzulla さんの発表、目が覚めていいですね! 会場の盛り上げ方とかうますぎるし、何回も笑ったので最高でした。

技術的な内容に関しても、PHPの配列が生み出す辛みがめちゃくちゃ現場感あるもので課題感がとても伝わってきましたし、その解決策もとても簡潔にまとまっていたのですごく良いセッションだと思いました。

日頃の開発でも個人的に気をつけていた内容だったのですごく共感しつつ、僕にはここまでの言語化はできないので改めて uzulla さんすごいなぁと感じました。

面倒なのは嫌なのでコンテナのマネージドサービスに極振りしたいと思います。

fortee.jp

App Runner など使った経験がないしCaaSという単語すら知らないレベルだったので、情報のキャッチアップのために聞いてみましたがとても参考になりました。

n さんは Twitter で見ている限り技術的な守備範囲が異常に広いと感じているのですが、このセッションで守備範囲が広くなる背景を垣間見た気がしますw とにかくしっかり調査されているし、見習わなければと背筋がピンッとなりました。

Laravelへの異常な愛情 または私は如何にして心配するのを止めてEloquentを愛するようになったか

fortee.jp

武田さんの Laravel への異常な愛情を聞いてみたくて参加しました。 Laravel のドキュメントをもとに「Laravel はこういう構造をベストプラクティスとして想定しているのでは?」という仮説はすごく面白かったですし、なるほどなとなりました。

その仮説を踏まえると、Laravel は Eloquent 使ってこそだよねという結論もとても納得感があり面白かったです。

セッションを聞いていて、Laravel は開発するアプリケーションが Eloquent で耐えられる(= テーブルとドメインエンティティを 1:1 にマッピングする構造で問題ない)場合に採用するとうまくいく、と個人的に整理したのですが、じゃあ武田さんはこのアプリケーションは Eloquent でうまくいく/いかないをどういった指標で判断しているんだろう?というのが聴きたくなったので、そこらへんの話を続編として別のカンファレンスでしてくれることを勝手に期待していますw

そのほか感想

最終日しか参加できなかったのと、カンファレンスの廊下でたくさん雑談をしていたので、セッション自体はあまり参加できていないですが 後日オンラインで色々見ようかなと思ってます!

PHPをブラウザで動かす技術とか、めちゃくちゃ気になりますw

おわりに

久しぶりにオフラインで参加したPHPerKaigiはめちゃくちゃ楽しかったです! 最近は Twitter もだいぶ見なくなってコミュニティから消えかかっていたんですが、改めてもうちょっとコミュニティに参加したいなという気持ちになりました!

開催・運営してくださったスタッフの皆様、カンファレンスで僕と会話してくれた皆様、ありがとうございました〜〜〜〜!!!!!!!!!

スターフェスティバルに入社して2年が経ちそうです

この記事はスターフェスティバル Advent Calendar 2022 18 日目の記事です

https://qiita.com/advent-calendar/2022/stafes

昨日は @k1rnt自作プログラミング言語「リンちゃんなう!」 でした。
リンちゃん、だいぶ荒れ狂ってましたね。

はじめに

早いものでスターフェスティバルに入社して 2 年が経ちそうです。
スターフェスティバルに入社してからは一度もこういった振り返りをしていなかったので、久しぶりにしてみようかなと思います。
Advent カレンダーのネタがなかった

これまでから今まで何をやっていたのか

ごちクル期

入社してから 1 年と少しの間は ごちクル というアプリケーションの改善を主にやっていました。

入社した時点では CI が存在していなかったりテストが 8 割がた壊れたりしていたので、 まずは CI の導入とテストを全て直すところから始め、その後 PHPStan の導入をしてPHPStan のエラーを 2000 個弱解消したり、EC2 上で動いていたものをコンテナ化したり、一部の API を 40 倍以上高速化させたり、色々としていました。
CI 周りの改善やコンテナ化は今後の運用保守に良い効果を与えることが出来たんじゃないかなぁと思ってます

また、ごちクルと並行して ごちクル deli BOXという小さい新規サービスの開発をしたりもしました。
新規アプリケーションの開発を要件定義や仕様決めの段階からやるのは久しぶりだったので楽しかったです。追加の要求はやっぱり斜め上からくるなぁというのを改めて実感したので、各要素とその関係性を極力シンプルに保つような備え方を身につけないとなーってなりました。

リリース後、ごちクル deli BOX はご飯を食べながらの 1on1 やオンライン飲み会・イベントといったユースケースで利用いただいているようで、とても嬉しいです。
弊社主催のオンラインイベント でもこのサービスを使っていて、実際に食べるとやっぱりおいしいですね。

後半はCore Web Vitalsのスコア改善に取り組んでいましたが、こちらは残念ながらあまり結果を出すことが出来ませんでした。フロントエンドむずい。
数ヶ月後に弊社のフロントエンドエンジニアが片手間で対応してくれたんですが、(まだ途中ではありますが)グングンスコアが改善していくのを見てすげ〜ってなりました。やっぱり Webpack と向き合わなきゃいけないんや...

社内基盤期

今年の 4 月ごろにごちクルチームを抜け、社内管理基盤のリプレイスを進めるチームに移動しました。 弊社は様々な背景により社内基盤のリプレイスというものを数年単位で計画しているのですが、このチームではそれの要件定義から設計開発運用までを愚直にやっていきます。 また、単にリプレイスするだけだと改善しない点が多くあるので業務フローの再定義やデータモデリングのやり直しなども同時並行で行っています。マジですごく大変!

この社内基盤チームに移動してからは、社内基盤に商品を登録・変更するフローが様々な経緯でまぁえらい大変になっているのでそれの改善にずっと取り組んでいます。商品という事業的に重要なものについて色々考えなきゃいけないので、ずっと頭抱えて白目剥いてます。むずい!
(使ってる技術も未経験のものばかりだったので初期は白目が二回転してました。早く黒目に戻りたい)

僕は設計周りが好きなので要件定義とかも好きでやらせてもらってるんですが、このチームでは営業や社内オペレーションの担当、事業戦略を考える人など様々なロールの人たちが一体となって要件定義を進めているので、かなり面白いし勉強になることが多いです。

営業戦略とか事業戦略を踏まえて考えると設計にも新しい視点が入ってきて面白いですし、問題を解決するモデルとして担保しなきゃいけない部分と事業を回す上で担保しなきゃいけない部分って結構違うっぽいなぁというのが見えてきた気がしていて、これも面白いですね。
ドメインロジックとビジネスロジックの違いってこういうことなのかなぁと思いつつ、まぁここらへんは色々な考え方がありそうなのでアレですが。

振り返り

今までもそうですが、社内基盤チームに移動してからは特に自分の経験不足を強く感じるようになりました。
社内基盤では周辺のアプリケーションとの結合度を下げつつ協調していくためにイベント駆動をメインに開発を進めているんですが、まぁひたすらに難しく(僕が)失敗を重ねています。

幸い弊社はリファクタリングなどにかなり理解がある環境なので(本当にとてもとてもありがたい)失敗をしながらも軌道修正ができているのですが、あの時僕がちゃんと設計ができていればもっとスムーズに開発を進めることが出来たなということが本当にひたすらにめちゃくちゃあり反省しています。

  • イベント自体の設計
  • イベント駆動を元にした実装・テスト
  • データモデリング
  • テーブル設計
  • モジュール設計

あたりの知識をもっとつけるとここらへんはもうちょっと改善できるかなと思ってます。

一方で学びはかなり多く(結果に結びつけるにはもう少し時間が必要そうですが)、チームメンバーにもとても恵まれているのでワイワイ楽しく改善を続けられたらと思ってます。

ということで、スムーズな開発を実現するために来年以降も引き続き色々と学んでいきたい所存です。

がんばるぞ!

採用がんばってます!

エンジニアとしてスキルアップするチャンスに溢れている環境でワイワイ開発したい人にとてもオススメなスターフェスティバルなのですが、絶賛エンジニア募集中です! 社内基盤のリプレイスだけじゃなくて新規プロダクトの開発なども色々やっているので、食という領域に興味がある人は是非〜〜〜〜!楽しいよ!

stafes.notion.site

社内の雰囲気はざっくりこんな感じだったりするので、カジュアル面談とかしたい方は是非僕のTwitterにDMください! zenn.dev