こんにちは、EC事業部でエンジニアをしているやんまーです。去る2023/03/23〜25、練馬区立区民・産業プラザ Coconeriホールとニコニコ動画にて、PHPerKaigi 2023が開催されました。GMOペパボ株式会社からも、登壇を始めとした様々な形でイベントに参加したので、パートナーより当日の様子をお届けします。
登壇
Win Testing Trophy Easily / テスティングトロフィーを獲得する
k1LoWより、APIサーバの新規開発においてミディアムテストに重きを置いたテスト戦略の決定と、その決定を成功させるためにrunnを開発した事例を紹介しました。
Win Testing Trophy Easily / テスティングトロフィーを獲得する - fortee
クイズを作ってPHPに親しむ
やんまーより、クイズを作るという少し変わったアプローチで、PHPの仕様把握や、PHPが好きな開発者とのコミュニケーションを図る例を紹介しました。
スポンサーブース
GMOインターネットグループとして、スポンサーブースを出展しました。
ブースでは「成瀬の挑戦状」と題した、手を動かしてお宝を探す問題を配布していました。また、スポンサーセッションにてグループメンバーが解く様子を紹介した発表が行われました。セッションの様子は、以下の記事をご覧ください。
PHPerKaigi 2023 スポンサーセッション「成瀬の挑戦状」登壇レポート -Vol.01
当日の様子
こんにちは、keigoです。ここからは写真を交えて当日の様子を紹介します。 ブースフロア周辺は、たくさんの企業ブースで盛り上がっていました。
セッションフロアに入場する際、名札をかざすと「ペチパー!」と鳴る仕組みが非常に面白かったです!
LTタイムになるとお酒やお菓子と共にペンライトが配られ、会場一体となって盛り上げていました!!非常に楽しかったです。
セッションの紹介
PHPerKaigiに参加したメンバーから、リレー形式で印象に残ったセッションを紹介します。
PHPで学ぶ "Cacheの距離" の話
yulilyより、富所 亮さんの「PHPで学ぶ "Cacheの距離" の話」を紹介します。
Cacheとは何かから、どんな種類があり、どういった使い方をし、使うことによる落とし穴は何かまで解説されていました。
キャッシュの目的には二つパターンがあります。一つは、近い場所にデータを置き次回取得しに行くコストを減らすものです。もう一つは、処理コストが高いものは結果を保存し、次回からは処理済みのものを取得することで処理コストを減らすものです。今回は前者の距離に関する話でした。
距離はアプリケーションからデータを参照できるまでの長さと捉えています。Colin Scott氏のサイトでは、ハードウェアからネットワークまでのレイテンシの変化を、過去から現在まで見ることができます。
APCuの話では距離は近く早いが、保存や取得にまつわるコストが発生しデータの大きさによっては無意味になることがあるようです。APCuからメモリへの値コピーを除外したimmutable_cacheというpeclのライブラリがあり、取得回数が増えると顕著にコストによる差が見え驚きました。
落とし穴では、導入時に注意しないといけない点が多く述べられていました。導入して改善する数値はなにか (DBへのクエリ削減なのか、レスポンスタイムの向上なのかなど)、外部サーバーに保持する場合に接続先ダウン時に正しく動くのか、内部でも外部でもCacheをクリアした後の負荷に耐えられるのか、サーバーによってCacheが違う可能性は起きないかなど考慮しなければいけない点が多くありました。
導入時には運用フローも含めてしっかり設計しないとなと、とても考えさせられるセッションでした。
実例から学ぶ変化に強いテーブル設計 - 責務の分解とRDBMSの上手い使い方
yulilyより、曽根 壮大さんの「実例から学ぶ変化に強いテーブル設計 - 責務の分解とRDBMSの上手い使い方」を紹介します。
テーブル設計の考え方の話で、Unixの哲学の「一つのことをうまくやれ」という言葉がとても当てはまる内容でした。
カラムを増やしていくと、その分テーブルの責務が大きくなっていってしまうという話があったのですが、その責任の数をindexの数で例えるのはなるほどと思いました。責任の数が増えてきたら正規化を考えると述べられていました。
正規化のコツでは、事実だけを保存する・重複がない・不整合がない・nullがないを挙げられていました。MySQL 8.0.16以降で使えるチェック制約では不正な値が入ってしまうのを防げるため、正規化を減らすテクニックとして紹介されていました。
またドメインの知識が足りてない場合も、設計に現れてしまうので、プロダクトに関する知識はしっかり持つ事が前提として必要だなと改めて思いました。
イージーな実装とシンプルな実装についても述べられていました。イージーな実装は設計がやりやすく、シンプルな実装は小さな責務を果たすものです。本来は両立できるものですが、能力不足だと難しいこともあり、迷った時はシンプルな実装を選ぶとよいそうです。データベースはアプリケーションと違い変化に弱いため、複雑さをデータベースに持ち込むと負債になりやすいので、迷った時はシンプルな実装に目を向けようと思いました。
防衛的 PHP: 多様性を生き抜くための PHP 入門
yulilyより、しけちあさんの「防衛的 PHP: 多様性を生き抜くための PHP 入門」を紹介します。
静的解析ツールやPSRの紹介がありました。静的解析ツールはコード整形や型のチェックなどしてくれるツールです。PSRはPHPコーディング規約のことです。人によって書き方に差異はでてきます。そういった多様性からツールを介して品質を担保し、本質に集中できる環境を作れるのはとても良い事だと思いました。個人的にはRectorとPHPStanの組み合わせが気になりました。
PhpStormにも静的解析機能があり、デフォルトではオフだけどPSR-12のチェックなどがあるとのことで早速いれました…。またPhpStormはCIでも動くらしく、IDE上で行われている指摘事項をCI上で実行できるようです。無料で使えるようなので試してみたいと思いました。
パフォーマンスを改善せよ!大規模システム改修の仕事の進め方
こんにちは、keigoです。私からは、tacloseさんによる発表「パフォーマンスを改善せよ!大規模システム改修の仕事の進め方」を紹介します。 本セッションでは、Slow Queryの画面を決め打ちして計測してから改善をするのではなく、網羅的な計測をしてから原因を調査し、改善することが重要だというお話でした。 お話の冒頭では、8000文字超えの激重クエリを改善して速度改善を期待するという推測から始まりました。しかし、実行計画を確認し、改善できそうな箇所を特定しても、改善目標は達成できませんでした。そこで、推測をせずに「計測しろ」という考えに基づき、網羅的な計測を行いました。計測では、PHPのXdebugプロファイリングやQCacheGridを活用し、問題点を網羅的に見つけて改善につなげました。
本セッションを聴いて、自分自身も計測したつもりが実は推測が混じっていたことがあると感じました。解決したい課題を包括するような計測をし、原因を正確に特定することが重要であることを学びました。また、今回初めてQCacheGridを知りましたが、自分の業務でも活用できそうだと感じました。今後も、「推測するな、計測しろ」という考えを心がけ、パフォーマンス改善に取り組んでいきたいです。
問い合わせ調査に素早く回答するための「アキネイター」的アプローチの模索
shiorinです。私からは、横山雅季さんの「問い合わせ調査に素早く回答するための「アキネイター」的アプローチの模索 」について紹介します。
経験値によって、どうしても対応時間などで差が出てしまうお問合せ調査に対して、過去に対応したお問合せ調査の結果を、フローチャートとして分解し、YES/NOで判断できるような形にすることで、経験値を問わず、素早く判断できるな運用方法にたどり着いたというお話でした。
お問合せ調査の際、一番時間の要する解決への切り口の見つけ方をアキネーターに聞くように手軽に判断できるようにするというアプローチは、慣れている人に属人化しやすくなってしまったり、一方で慣れていない人にとっては時間がかかり、ストレスとなってしまう面を解消できるとてもいい手段だと思いました。
私も普段の業務で、お問合せ調査に携わることが多く、今回上げていた課題点は感じることが多いので共感したとともに、アプローチの方法はとても参考になる内容でした。
Rector ではじめる "運用を止めない" PHP アップグレード
やんまーより、工藤 剛さんの「Rector ではじめる "運用を止めない" PHP アップグレード」を紹介します。
静的解析を用いたリファクタリングツールのRectorと、これを用いたPHP 7.4からPHP 8.1へのマイグレーション手法を解説していた発表です。中でも、文字列と数値の曖昧比較の順序に関する非互換性への対処法が印象に残っています。この非互換性は、PHPの7系から8系への仕様変更の中でも影響範囲が大きいものです。
発表で紹介されていた手法は、まず、7系と互換性のある曖昧比較を行うC言語拡張を作成し、次に、既存コードの曖昧比較演算箇所を、Rectorを用いて作成した拡張へ置き換えるものでした。
Rectorと拡張を組み合わせた戦略は、とても興味深いアイデアでした。リファクタリングツールとしてのRectorの紹介に留まらず、PHPアップグレードに対する実践的な事例が示されていたことで、どのように活用していくかの想像が膨らみました。
不幸を呼び寄せる命名の数々 ~君はそもそも何をされてる方なの?~
やんまーより、山村 光平さんの「不幸を呼び寄せる命名の数々 〜君はそもそも何をされてる方なの?〜」を紹介します。
この発表はLTの一番はじめのもので、はじめてPHPerKaigiに参加した私が「PHPerKaigiのLTはこんなに熱いのか!」と盛り上がっていることを知れた発表でした。プログラマなら誰でも身近で悩むことのあるであろう命名について、実例へのツッコミ形式で切り込んでいく姿は、身に沁みて学びにもなり、なにより笑ってしまいました。会場の空気感が一気に暖まったとても魅力的な発表で、わたしもいつかあれくらい盛り上がる発表をしたい、と思いながら聞かせていただきました。
PHPの配列の内部実装について学びたくなった。
やんまーより、meiheiさんの「PHPの配列の内部実装について学びたくなった。」を紹介します。
PHPにおける配列の内部実装を、5系以前と7系以降の双方を比較しながら解説されていた発表です。一般的なデータ構造に関する知識の説明からはじまり、その後に大まかな内部実装の構造が説明されていて、聴講者が内容の把握しやすいように配慮されていました。
PHPにおける配列は、C言語などと同様の一般的なデータ構造としての配列(発表では真の配列と呼ばれていました)と異なり、キーを与えた連想配列としての側面も持ちます。連想配列でない配列として利用される場合でも、連想配列として利用される場合でも、どちらでも高速に動作するよう、PHPの内部実装が改善されていると学びました。普段コードを書いているときは意識しないランタイム内部での実装を通して、PHPに対する理解を深めることができました。
参加した感想
やんまー
私が業務で携わるWebアプリケーションにはPHPでできたものも多く、普段からPHPを読んだり書いたりしています。同じプログラミング言語を一つの軸として、PHPの話題や、それにとどまらない話題をたくさんの箇所から吸収することができました。スピーカーセッションや、ポスターセッション、冊子、廊下での会話、アンカンファレンスなど、様々な場所で学んだ話題を、自らの業務やキャリアに活かしていきたいと思います。
何より、他のイベントに行ってPHPerKaigiの名札を首から下げている方をみて憧れを抱いていた場に参加できて、とても楽しい時間を過ごすことができました。もちろん技術的な学びとして持ち帰るものもたくさんありましたが、それとあわせて、たくさんの人と直接話したり、食事をともにしたりしながら双方向のコミュニケーションができたことが、とても嬉しかったです。
yulily
久しぶりにイベントに参加しました。静的解析ツールの話やフレームワーク内部の話、パフォーマンス改善の話が盛りだくさんでとても勉強になりました。
またPHPやMySQLのバージョンも上げていきたいなと思うようなセッションも多くとても刺激になりました。
今回はオンライン参加だったため、次回はオフラインで参加したいなぁと思いました!
keigo
PHPのイベントに参加させていただいたのは今回が初めてでした。 PHPならではのイベントの色というものを感じることができて、とても楽しかったです。コミュニティの存在を肌で感じることは、技術を学ぶためのモチベーションにもなるな〜と感じました。 これからも参加していきたいです!!!
shiorin
今回、PHPerKaigiには初めて参加しました。 普段、業務で抱える問題に関して、自分の会社だけの問題ではなく他でも悩んでいることなんだということを実感できたことがとても大きかったです。 そこから、どういうアプローチを取り解決できるように進めていったのかについては、どれも参考になるものばかりで、業務で早速活かしていきたいと思いました。
またLT大会の時間では、時間が迫ってくると、登壇者に対してペンライトを振ったりなど、終始登壇者と聴講者が一体となる空間で、進んでいったのがとても楽しく、次回は私もチャレンジしてみたいと思えるような空間でした。
PHPerであることをとても実感することができ、ここで聞いたことをこれからたくさん活かしていきたいと思えるような時間を過ごすことができました!
これからも積極的にPHPに関わり、PHP愛を高めていきたいと思います!
おわりに
複数のパートナーがイベントに参加し、楽しんだり学びを得たりすることができたのは、イベント開催へ尽力されたオーガナイザーやスタッフの皆様、普段からPHPコミュニティやPHPerKaigiコミュニティを支えてくださっている方々のおかげです。この場を借りて御礼を申し上げます。
またどこかのイベントやカンファレンスでお会いしましょう!