なずなログ

ただのSIer系SEが思ったことや色々書く感じのアレです

「PHPカンファレンス2019」に行ってきました #phpcon #phpcon2019

どんなイベント?

今年で20回目となる、国内最大規模のPHPのテックカンファレンスです。
PHP Conference Japan 2019 - #phpcon
PHP Conference Japan - YouTube

セッション

PHP における並列処理と非同期処理入門(@m3m0r7)

PHP における並列処理と非同期処理入門 - Speaker Deck

  • 趣味はバイナリファイルを読むこと。
  • 並行処理 !== 並列処理
  • マルチスレッド !== マルチプロセス
  • PHPでの非同期処理 !== できない
  • 並行処理は小さいタスクに分割してそれぞれ処理するが割り込みが入るから順序保証はされない
  • 並列処理はコアにタスクを割り振っていき、並列処理の上に成り立っている。
  • スレッドはプロセスの一つであり、スレッドはプロセスではない。
  • 非同期処理はAの処理を実行中にBの処理を実行してもAの処理を止めない。実装は並列処理でも並行処理でも良い。
  • PHPで並列処理を実装するにはpcntlやpthreadsなどがある。
    • pcntlはプロセスフォーク
    • pthreadsはスレッドフォーク

Laravelにはジョブキューがあり、DBレコードを介して別プロセスで非同期処理を実現しているのでそれを使ったことはあるけれど、それ以外の非同期処理はやったことがなかったので参考になりました。
今のところ単一リクエスト内で非同期処理を行いたいケースが今のところないので、必要になったらまた詳しく調べたいと思います。

思想と理想の果てに -- クリーンアーキテクチャのWEBフレームワークを作ろう(@nrslib)

[PHP Conference 2019]思想と理想の果てに――クリーンアーキテクチャのWEBフレームワークを作ろう │ nrslib

  • 層は3つでも4つでもいい
  • Controllerはアプリケーションが求めるデータに入力を変換する。
    • ゲームのコントローラが電気信号で本体に入力データを送るのと同じ。
  • 処理(InputPort)や出力(OutputPort)にinterfaceを使うことで、差し替えることができるからモックを刺して主導権をビジネスロジック側に出来る。
  • 理想を追い求めると代償がある。
    • 現代のMVC2 WebフレームワークだとOutputPortを使わない。
    • 層の数に比例してclass/interfaceが多くなる。(めんどくさい)
  • 理想を守るためにフレームワークを作ろう(!?)
    • そのためにもスキャフォールディング機能を実現するライブラリを作る。
      • プログラムを作るためのプログラムを作るためのプログラム。
    • 思想が先。httpは後。
    • まず最初にMVCを捨てる。ControllerからViewをreturnしなくすることでClasicc MVCぽくする。
  • 情報はアウトプットする人のところに集まってくる。
    • my favorite 車輪
  • 10年前は早く開発できることが重要視していたけど、フレームワークは変わっていく。
  • 「誰にも思い描く夢がある、その思想・理想を是非とも実現してほしい」
  • 「思っていることがあるならやってみてほしい」
  • 「世界をひっくり返すのはだれでもできる」
  • 「次に世界をひっくりかえすのはみなさんです」

理想を追い求めるためのその熱量というものの凄さを垣間見ました。
一人で趣味でやっているのであれば理想を愚直に追い求めること自体は出来ますが、チーム開発だったりプロダクションだったりでは理想を追い求める代償が大きく、中途半端になって余計メンテしづらくなったり悲しい結果になるのだと思います。(今の現場でまれによく感じる)
それに対してプラグインだったり開発フレームワークだったりで「理想を追い求めた方が楽になる」という状況を作るのは有効なアプローチですよね。

5ヶ月でカバレッジを20%から90%にあげた話(@strtyuu)

5ヶ月でカバレッジを20%から90%にあげた話 - Speaker Deck

  • 注:カバレッジは必ずしも品質に比例するわけではない
  • 当時カバレッジ20%くらいのときに、存在しない未来の話で応募した。
  • 採択されて「やらなきゃ」と追い込まれ、3ヶ月で18%から90%にした。(すごい)
  • カバレッジを上げたかった理由
    • 気軽にコードを修正したい。
      • 依存が一方向だったら修正も楽だけど、循環すると難しい。
      • フレームワークレイヤを改善したいけど影響が大きいからテストをしっかりとしたい。
    • コードリーディングのコストを下げたい。
      • 10年も続いてれば歴史的経緯のあるコードがある。小さな後悔が大きな後悔になるには十分な時間。
      • 続けば続くほど関わる人が増えていくのでリーディングとかのコストに時間を払う人が多くなる。
      • そのコストを下げた方がエンジニアにとって幸せなのではないだろうか。
  • 進め方を決めてからやった。
    • エンドポイントに近い箇所からテストする。
      • エンドポイントに近いほど内部実装を気にせずに進められる。
      • カバレッジが稼ぎやすそうという動機も)
    • リファクタは最小限に。
      • 時間が足りないし、そもそもリファクタリングは継続して行うもの。
      • 完璧主義はダメ
    • にゃ~んクラスを妥協する。
      • にゃ~んクラス = いびつな形で妥協せざるを得なかったクラス。つらいときに「にゃ~ん」というところから命名した。
  • テスト環境を整備した。
    • 簡単にデータを作る仕組みを用意する。
      • 完全コンストラクタなクラスでもActiveRecordでもどちらでも対応できるようにしないとしんどい。
      • 状態に名前を付けてその状態を簡単に作れるようにしたい。
    • 簡単に結合テストできる仕組みを用意する。
    • テストの実行速度を早くする。
      • めちゃくちゃPRを出すので早くCIが回ってくれた方がうれしい。
      • pcovを採用。
    • グローバルヘルパをモック可能にする。
      • グローバルヘルパは挙動を変えることができない。
      • 「全部リファクタリングしてたら間に合うわけないじゃないですか」
      • PHP-VCRで乗っ取った。(非推奨)
  • 実際カバレッジを90%まであげてみて、それに見合った成果が出るかはわからない。
  • でもPHP7.4にあげてみたら手動テストでは見つからなそうなバグ/非互換を発見することができた。
  • カバレッジをあげることでリファクタリングをする土台が出来上がったので、ここからがスタート。

状態の抽象化ってテストするときには結構大事だと思っていて、状態の具体的なデータ状態に変更があった時にテストクラスへの影響が抑えられる仕掛けがあるとテストコードがちゃんとメンテされやすくなるのかなと思います。
カバレッジをあげるコストって後にならないと見合うかどうかはわからないので結構不安になるというか、他のことの方が優先度高いのでは…?って思うときはありますが、言語/パッケージのバージョンアップなど、欲しいときにカバレッジがちゃんとあるというのは心理的安全性的な意味合いでもコツコツ進めるべきなんでしょうね。
ちょっと自分がやろうとしているテスト環境の整備に対しての意欲を盛り上げていただきました。焼肉食べたいです。

「CPUとは何か」をPHPで考える(@tomzoh)

「CPUとは何か」をPHPで考える / What is a CPU? - Speaker Deck

  • 削った箇所の供養としてのマイクテストと映像テスト(前座)
  • CPUは「プログラム実行環境」「エミュレート対象」「電気回路」からの視点で見ることができる。
  • 「TD4」という4ビットCPUを題材にする。
  • 「プログラム実行環境」の視点で見ると、マシン語プログラムの実行環境であり、プログラムを実行してくれる存在。
    • 自分の使う機能のみの理解でOK
  • 「エミュレート対象」の視点で見ると、エミュレータのCPU部分であり、対象CPU用に書かれたすべてのプログラムを動作させる存在。
    • CPU仕様を完全に理解しなければならない。
  • 「電気回路」の視点で見ると、クロックに従って状態遷移する回路としてCPU命令を表現した存在。
    • 仕様と物理のパズルを読み解かなければならない。
    • プログラムカウンタは静的回路を処理装置化する存在。
  • CPU自作は面白いよ!

前座で論理回路の基礎理論を久々に思い出しました。懐かしい…。
CPUの基本原理は中々知る必要に迫られることはないけど、知ってみると面白いですね。
「プログラム実行環境」として見てみるとそんなに難しくないけれど、「電気回路」として見てみると途端に難しい存在になるんですよね、CPUって。
だけどCPU自作はちょっとハードル高い…。
久々にObnizとかArduino周りを触りたくなりました。

感想

会場についたら「ここまで人が多いものか」と予想よりも大きい規模にびっくりしました。
いろいろ聞きたいお話はありましたが、後日Youtubeで見させていただきます!(配信残ってるのありがたいです)

LT枠は上級者ぞろいでした…!
4分枠に変更となっていたにも関わらず、言いたいことを詰め込んで伝えきれるというのはすごいです。
言いたいことを最初の方に持ってくるというのは言い切れないことに対する保険として、自分がやるときは参考にさせていただきます 🙇

様々なスポンサー企業様の展示ブースではお菓子や飲み物だけではなくモバイルバッテリー、電子メモパッド、SIMケースまでいただいて「え…こんなにもらっていいの…?」と不安になるレベルで頂きましたが、ありがたく使わせていただきます!🙏

頂いたものリスト(順不同)

また、お声がけいただいた皆様、ありがとうございました!
テストだったり、DDDだったりと関心毎についてお話させていただけたので、参考になりました。
また来年のぺちこんでお会いしましょう!