Edited at
YYPHPDay 2

PHP中級者を目指すを書くための情報収集とYYPHPの活用

技術書典5で「PHP中級者を目指す 〜言語を使いこなすための本〜」を書いた「このすみ」と申します。執筆こそ1人で黙々と書いたものの、途中でYYPHPも活用しつつ本書は完成までこぎ着けました。

本の内容は、書名の通りです。PHP言語そのものの知識で、初心者向けの入門書にはあまり載ってなさそうな内容を中心に書きました。技術書典5は終わってしまいましたが、電子書籍版がKindleにあります。

今回は、本を書き終えるまでの情報収集の過程を中心に、知見を共有します。


まずは入門書を読み漁る

中級者向けの本を書くことが目標でしたが、最初に読んだのはPHPの入門書です。書店にいって、PHPの棚で平積みや面陳されている本を中心に読みました。

中級者向けというレベル感は、判断基準が難しいです。そこで、「入門書に載っていない = 中級者向け」という定義付けにする事にしました。

そのため、「入門書に載りやすい内容とは何か?」を知る必要がありました。


中級者向け書籍の活用(参考文献として)

日本語情報をメインに探しましたが、最終的には洋書まで足を伸ばすことになりました。本書を執筆するにあたり、役に立ったオススメの3冊をご紹介します。


Modern PHP

「Modern PHP」は、幅広いPHP情報が掲載されています。内容は、大きく分け3つのカテゴリに分類されます。


  • Language Features(言語機能)


    • 名前空間

    • ジェネレーター

    • ビルトインウェブサーバー

    • ...etc



  • Good Practices


    • PSRコーディング規約

    • コンポーザー

    • フレームワーク

    • ...etc



  • Deployment, Testing, and Tuning


    • どこでPHPを動かすのか?(VPSなど)

    • プロビジョニング、デプロイ等

    • PHP-FPM, HHVM and Hack

    • ...etc



取り上げている内容の幅広さが特徴です。レベルとしては、中級者向けに相当する本だと思います。「PHP中級者を目指す」では、主に言語機能とグッドプラクティス(コーディング規約など)を参考にしました。


Upgrading to PHP 7

O'Reillyの「Upgrading to PHP 7」は、PHP7向けの情報収集で役立ちました。なんと無料です。

英語で書かれていますが、コードを読めば何となくわかるレベルの本です。本書を読んだことによって、「宇宙船演算子(<=>)」などのレアな演算子の存在を知りました。

PHP5で書いているエンジニアが、PHP7向けの情報をキャッチアップしたいときにもオススメです。「PHP中級者を目指す」では、主にPHP7向けの章で参考にしています。


WEB+DB PRESS総集編

「WEB+DB PRESS総集編」は、WEB系エンジニアであれば一家に一台レベルでオススメの本です。「PHP中級者を目指す」でも、主要参考文献として影響を受けています。

「PHP⼤規模開発⼊⾨」は、かなり参考になります。これを読むだけでも、お釣りが来るくらいの価値があると言っても過言ではありません。


  • Vol.80 「モダンな開発環境を構築!」パッケージ管理、ビルトインサーバ、デバッグ、テスト

  • Vol.81 「テストコードのないアプリケーションの改修」

  • Vol.82 「安全なコードの書き⽅」エラーと例外処理の活⽤、PhpStormによる効率化、健全なチーム作り

  • Vol.83 「PHP 5.5/5.6 ⼊⾨」新機能の紹介とアップグレードの注意点

  • Vol.84 「⾼速な開発サイクルのためのデプロイ」巨⼤Git リポジトリ運⽤、Composer でのライブラリ管理、ゼロダウンタイムリリース

  • Vol.85 「本番環境での不具合の発⾒と修正」例外やエラーの収集・可視化・通知、phpdbg によるデバッグ

  • Vol.86 「PHP による画像処理」Imagick の使い⽅、最適化、⾮同期処理、動的サムネイル⽣成

  • Vol.87 「PHPDoc でコードの品質を保つ」チームでの仕様共有、IDE による⼊⼒補完

  • Vol.88 「HHVM でPHP 実⾏速度を⾼速化しよう」インストール、設定、速度⽐較、運⽤監視

  • Vol.89 「Thrift とPHP で堅牢なAPI を構築しよう」⾔語間通信APIの作成、ドキュメント⾃動⽣成、活⽤事例

  • Vol.90 「新登場PHP 7」新機能と移⾏時の注意点

  • Vol.91 「名前空間とオートローディング」必要なクラスを無駄なくわかりやすく読み込む

  • Vol.92 「PHP からのHTTP リクエスト」ファイル操作関数、curl 関数、Guzzle ライブラリ

  • Vol.93 「PHP でコマンドラインプログラムを書く」バッチ処理、ジョブキュー、ログのストリーミング処理

  • Vol.94 「PHP 初⼼者がハマりがちな落とし⽳」型のキャスト、変数のリファレンス、引数による挙動の違い

  • Vol.95 「PHP の静的解析ツール」ドキュメントの⽣成、品質の計測、問題箇所の発⾒

  • Vol.96 「レガシーなプロダクトの改善」フレームワークを利⽤できない環境でのライブラリ活⽤

  • Vol.97 「PhpStorm 徹底活⽤」⼈気IDE で⾼精度な⼊⼒補完、リファクタリングを実現

雑誌の連載記事であるため、短いページ数に情報が凝縮されています。さらに、実際のプロダクトコードで得た知見をベースに執筆されています。とにかく情報の質が高いです。Pixivさんには頭が上がりません。


カンファレンス動画:PHPカンファレンス、PHPer Kaigi

カンファレンス動画は、ピンポイントで良質な情報が知りたいときに役立ちます。

型宣言の章では「型を意識したPHPアプリケーション開発」や「PHP7で堅牢なコードを書く」のセッションが参考になりました。

また、徳丸さんのセキュリティセッションは、WEBシステムを書き始めのエンジニアには文句なくオススメです。

PHPカンファレンスは、全体的にセッションの質が高いです。情報の収集源としては、良質な部類に入ります。余談ですが、迷ったらTrack1のセッションを見ると良いです。Track1は一番広いので、多くの聴衆を想定したセッションが詰まっています。


ポッドキャスト:PHPの現場

ポッドキャストである「PHPの現場」は、主にアーキテクチャの章で参考にしました。

私はレイヤードアーキテクチャをベースに開発をしていますが、それもPHPの現場の新原さんに影響を受けています。また、「独立したコアレイヤパターン」の存在を知ったのは、PHPの現場がきっかけです。

アーキテクチャの話が面白いのは、何より設計思想や、そのアーキテクチャが生まれるに至った背景やモチベーションを知れることです。既存のアーキテクチャでは解決できない問題があるからこそ、新しいアーキテクチャが生まれます。

PHPの現場は、自分のブログに感想を書いていたりしますので、宜しければどうぞ。


YYPHPの活用

技術書典5の「PHP中級者を目指す 〜言語を使いこなすための本〜」は、執筆こそ1人で黙々と頑張りました。しかしながら、PHP言語のコミュニティであるYYPHPが、執筆のモチベーション維持に役立ちました。


  • PHP言語のコミュニティに参加することで、本の需要を事前に確認することができた

  • コミュニティ内の「買いたい!」「興味がある!」という声に支えられることで、頑張って書こうというモチベーションが維持できた

  • 実際にYYPHPコミュニティの方も、何名か技術書典5のブースに足を運んでくださいました

ちなみに、YYPHPで「PHP中級者を目指す」を書いてます宣言をするかどうかは、当初はとても迷いました。中級者向けと銘打つ本なので、それなりの知識が載ってないとならないからです。マサカリも不安でしたが、そのような心配は無用でした。


  • YYPHPは、雑談ベースのコミュニティだったため話に入りやすい

  • 初心者から上級者まで、幅広いレベル感を受け入れるコミュニティ

  • はじめて参加した回が記念すべき第50回だったため、お祝いムードでリラックスできました(笑)

YYPHPは質問ベースで会が進行するため、実は本の内容にも役立っています。PHP初心者が感じる質問や疑問点は、本をわかりやすくするための種にもなります。あと、本書を書くための情報収集は、質問への解答に意外と役立ちました。


さいごに

「PHP中級者を目指す 〜言語を使いこなすための本〜」は、自分の知識をベースにこそしているものの、さまざまな情報収集によって成り立っています。

今回の執筆によって、私は以前よりもPHPに詳しくなりました。そうすると、色々と試したいことが増えてきて、PHPを書くのが楽しくなってきます。

言語を知ることはオススメです。それには探究心が必要ですが、今は手軽に情報が集められる時代になりました。あなたが今お使いの言語も、ぜひ探求してみませんか?

「YYPHP Advent Calendar 2018」の3日目は、わかばちゃんでお馴染みの@llminatollさんです!