YYPHP#3イベントレポート「PHP7.2、Hack案件、DALI API、DDD」

![YYPHP-ロゴ.png](https://qiita-image-store.s3.amazonaws.com/0/889/0051f99f-b555-6064-fcc9-3280e5543a1a.png)

これは2017年8月23日に開催したPHPerイベントYYPHPのイベントレポートです。

[YYPHP](https://yyphp.connpass.com/)は一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催は**毎週**水曜19:00に高田馬場にて。

今回は9名の方が参加してくれました！参加くださった皆さんありがとうございます。是非次回もお越し下さい〜！



それでは、YYPHPで話題になったことをおさらいしたいと思います。

## PHP 7.2がもうすぐ

8/17にPHP 7.2 Beta 3がリリースされたので、PHP 7.2ってどんな新機能が加わるんだろう？という話題からスタートしました。

参考にしたのはこちらの記事。[PHP7.2の新機能 - Qiita](http://qiita.com/rana_kualu/items/40ebed78742bfdbd1065)。これを見る限り、言語的な変更はあまりなさそう？という印象でしたが「記事が投稿されたのが去年の12月だから、最新版だともっと増えているんじゃない？」という指摘があり、次にみんなで見てみたのがこちらのスライド。[What's New in PHP 7.2 - AustinPHP Lightning Talk by Ian Littman](http://slides.com/ianlittman/aus72newalpha#/)。

これによると、null-coalesce equals operatorというのと、objectタイプヒントも追加されるらしいです。

### null-coalesce equals operator

サンプルコードが無かったので、推測ですがRubyの`||=`みたいな代入演算子でしょうか？

```php
$username = 'nobody';
$username ??= $_GET['user'];
```

### objectタイプヒントが追加される

objectタイプヒントについては逆に今までなかったの？という感想です。「使い所があまり浮かばないですね」「JSONデコードしたオブジェクトに何かするような関数ならユースケースとしてあるかも？」

## PHPはどうやって学んでいったらいいか？

「どうやってPHPを勉強したらいいですか？」という質問がありました。「誰かが作ったプログラムを直すところから始めては？」「自分の作りたいものを作ってみるのが一番だから、まずは作りたいものを見つけては」というアドバイスがありましたが、なかなか答が難しい質問ですね…。

## Hackで問題になったことはない

参加者の中で開発プロジェクトにHackを使っているという珍しい方がいました！Hackの良いところとしてはノンブロッキングIOができるので、HTTPレスポンスやDBへのクエリ結果が帰ってくるまで、他の処理をやれるのでそれがいいとのこと。

気になるのはプロダクションへの採用ですね。いくつか質問が飛び交いました。

「プロダクションでもうHackを使っているんですか！？」

「プロダクションではまだですね。ただHackの事例を作りたいというのがあって採用しました。」

「Hackで既存のライブラリも問題なく使えますか？」

「今のところ問題になったことはないです」

## 日本の「照明」を変えるPHPをどう学んだか

![YYPHP-2017-08-23-00012.jpg](https://qiita-image-store.s3.amazonaws.com/0/889/9f1d03a8-9acc-89ea-46c3-e4638eac847f.jpeg)

「ヨーロッパはDALI APIというメーカー共有の照明プロトコルがある。しかし、日本の照明はガラパゴスといったら、まだまし。メーカーごとに違う」と日本の照明制御APIのカオスさに苦言を呈すのは照明屋さんの@nakachonさん。「日本の照明を変えますよ」と豪語する。

nakachonさん曰く、プログラマーでも何でも無いが、照明屋としてIoTに関心があり照明を制御するウェブアプリを作るためにゼロからPHPを独学したとのこと。

ノンプログラマとしてプログラミング言語を学んだ過程として「CSSもPHPもわからなかった頃、いろんなイベントに参加した。僕いていいの？と思うようなイベントにも。いろいろ分かってくると前に出て発表する人は少ないことに気がついた。それで自分で発表したり、勉強会も主催するようにした。自分が発表するとなると、知らないといけないのでめっちゃ勉強するようになる。そうしているうちにプログラミングが分かるようになった。」らしいです。すごいですね…。

### DDD難しい

会場のどこかから「DDD難しいー！」という声が聞こえてきたので、PHPと直接関係ないですがドメイン駆動設計が話題になりました。(こういうPHP以外の話題もウェルカムなのがYYPHPですw)

僕がDDDに詳しいということになっているので、「DDDについて語ると3日くらいないと足りないですよw」と前置きをしながら、いくつか質問にお答えしました。

### 「DDDってなんですか？」

これはシンプルですが難しい質問です。教科書通りに説明すると、大抵ポカーンとされるので、王道の回答じゃないですが、僕はこう答えるようにしています。

「DDDは対象の業務をよく知った上で、複雑になりがちなソフトウェア開発の複雑さを自分でコントロールすることで、ソフトウェア開発をシンプルにして、高品質なソフトウェアを作れるようにするプロセスのことです」

要するに複雑さをコントロールすることがDDDの理念なのですが、それでも「何ゆってるんだ…こいつ…」となるので付け加えて言います。

「ソフトウェア開発を難しくするのは単純です。すべての処理をごちゃまぜに一箇所に書くことです。逆に言うと、ソフトウェア開発を簡単にする秘訣は、ソフトウェアを分割することです。小さいパーツに小分けにすれば、ひとつひとつは簡単に作れますよね。ただ、分割のやりかたを間違ってしまうと、一箇所に書くよりもひどくなることがあります。DDDは超複雑な業務システムを作る先達が自分たちの経験から導き出したベストプラクティスとしての分割方法を教えてくれるものです。」

### 「既存のプロジェクトからDDDにしたっていう事例ないんですか？」

CRUDからDDDに置き換えた事例ってないですかねー？と最近よく聞かれます。スクラッチで作ったプロジェクトのDDDサンプルコードはいくつかあるのですが、既に運用に入っているプロジェクトは大抵CRUDで作られているので、作り直しでDDDする方法より、どうやって既存プロジェクトをDDD化するかというところに関心が強いように思います。

「事例は有るんでしょうけど、あんまり公表はされてないんじゃないでしょうかね〜。僕の知る限りだとCRUDのRailsをDDD化した例として[Bring clarity to your monolith with Bounded Contexts](https://blog.carbonfive.com/2016/11/01/bring-clarity-to-your-monolith-with-bounded-contexts/)くらいしか知りませんー」

(あまり役に立つ回答ができなかったですね…。もしCRUDからDDDに持ってこれた事例があれば教えてください)

「逆に架空のだとシンプルになっちゃってDDDの良さが伝わらない」@reoringがそういうので、僕がめっちゃ時間あったらやりたいこととして言ったのが、リアルなプロジェクトでDDDをやってみて、そのソースコードをオープンソースにするというものです。

高知県の入札案件で[新図書館情報システム構築等委託業務に係る一般競争入札について](http://www.pref.kochi.lg.jp/soshiki/312201/system-nyuusatu.html)というものがあり、これがすごいんです。さまざまな業務分析資料が公にされていて、そのなかに業務フローや用語集もあります。YYPHPではその業務フローのエクセルをダウンロードしてプロジェクターに写して見せましたが、その複雑さとシートの多さに会場は白熱しました。

僕がめっちゃ時間があったらやりたいのは、まずこのシステムをCRUDで頑張って作る。敢えてすごいカオスなコードでバージョン1を作ります。そして、それをDDDで再実装する。そうすることで、CRUDをDDDにしたらこうなるというのがリアルに伝わるんじゃないかなと思います。ただ、業務がリアルすぎて、いつまでに作れるかどころか、いつ作り始められるかも正直分かりません。YYPHPの参加者のちから添え(コミット)があればできるかも…？

## YYPHPは毎週やってます

PHPについてワイワイ話したい方は、[YYPHPのイベント情報](https://yyphp.connpass.com/)をチェックしてみて下さい。