RFC駆動のPHP学習術.pdf

 RFC駆動のPHP学習術.pdf

5a6d5ee0a806157d4b8d214194d9ee91?s=128

Takayuki Fujisawa

September 25, 2020
Tweet

Transcript

  1. #phpltjam ©2020 RAKUS Co., Ltd. RFC駆動のPHP学習術 Takayuki Fujisawa

  2. #phpltjam Takayuki Fujisawa 所属:株式会社ラクス Twitter: @miracle_fjsw 表のおしごと:品質管理やセキュリティ・技術仕様の標準化 裏のおしごと:社内のエンジニアカルチャー醸成(勉強会イベントの主催)

  3. #phpltjam みなさん PHPの学習って どうやっていますか?

  4. #phpltjam - 書籍(はじめてのPHP、パーフェクトPHP、実践 〇〇、オライリー本…) - 技術系のWeb記事

  5. #phpltjam こういうことありますよね? • 知識が陳腐化・古くなる • 学習した内容が自分自身に定着しない・曖昧な理解

  6. #phpltjam そんなみなさんに紹介したい学習法が

  7. #phpltjam 「RFC駆動学習」

  8. #phpltjam RFCとは • 「Request For Comments」 • https://wiki.php.net/rfc • PHPの次期バージョンに取り込まれる新機能や改善の提案

    • PHPコア開発者のコミュニティの中でメーリングリストなどで 議論・投票が行われ、採択される
  9. #phpltjam 例えばこんなやつ https://wiki.php.net/rfc/match_expression_v2 PHP8:match式の提案

  10. #phpltjam RFC駆動学習とは

  11. #phpltjam RFC駆動学習とは • RFCに記載されている提案内容を理解し、

  12. #phpltjam RFC駆動学習とは • RFCに記載されている提案内容を理解し、 記載されている課題感・背景などから

  13. #phpltjam RFC駆動学習とは • RFCに記載されている提案内容を理解し、 記載されている課題感・背景などから 言語仕様・PHP界隈の動向への理解を深める、 というオレオレ手法

  14. #phpltjam RFCの基本構成 • 提案内容 • 現状のPHPが抱える課題 • 提案の実装例

  15. #phpltjam RFCの基本構成 • 提案内容 • 現状のPHPが抱える課題 • 提案の実装例 • ただ読むだけだと

    「こんな新機能が増えるのか、なるほど」で終了しちゃう
  16. #phpltjam RFCの基本構成 • 提案内容 • 現状のPHPが抱える課題 • 提案の実装例 • ただ読むだけだと

    「こんな新機能が増えるのか、なるほど」で終了 RFC駆動学習は、  提案の背景・課題・周辺事項を  じっくり理解し、  気付き・発見・学びを獲得 することが目的
  17. #phpltjam なぜ RFC?

  18. #phpltjam なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの

  19. #phpltjam なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの

  20. #phpltjam なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの • = 活用される可能性が高い知識領域

  21. #phpltjam なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの • = 活用される可能性が高い知識領域 •

    = 優先して学ぶべき・理解しておくべき領域
  22. #phpltjam なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの • = 活用される可能性が高い知識領域 •

    = 優先して学ぶべき・理解しておくべき領域 • ∴ あてもなく学習するよりも、   生きた知識になる確率が高く、効率が良い
  23. #phpltjam なぜ RFC? • 提案内容が一つのTopicsとして、過去と未来がまとまっている

  24. #phpltjam なぜ RFC? • 提案内容が一つのTopicsとして、過去と未来がまとまっている • 現状把握(過去)しつつ、知識のアップデート(未来)ができる

  25. #phpltjam そんなRFC駆動学習について 自身の実例を ダイジェストで紹介します

  26. #phpltjam 例1:match式

  27. #phpltjam 例1:match式 • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • ズバリ過去と未来が書かれているボーナスRFC

  28. #phpltjam 例1:match式

  29. #phpltjam 例1:match式 switch文は緩い比較を行います。 これは非常に驚くべき結果をもたらす 可能性があります。

  30. #phpltjam そうだったのか!

  31. #phpltjam 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • ズバリ過去と未来が書かれているボーナスRFC

  32. #phpltjam 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • ズバリ過去と未来が書かれているボーナスRFC • switch文の条件判定は「緩い比較」が行われているという課題を、理解

    していなかった
  33. #phpltjam 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • ズバリ過去と未来が書かれているボーナスRFC • switch文の条件判定は「緩い比較」が行われているという課題を、理解

    していなかった • 不十分な理解に対する「そうだったのか!」という「発見」
  34. #phpltjam 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • ズバリ過去と未来が書かれているボーナスRFC • switch文の条件判定は「緩い比較」が行われているという課題を、理解

    していなかった • 不十分な理解に対する「そうだったのか!」という「発見」 ◦ 自分自身の抜け漏れを認識 ◦ 「発見」の感覚が鮮明に記憶に残る
  35. #phpltjam 例2:JIT

  36. #phpltjam 例2:JIT • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit

    • 能動的な学習を促す良RFC
  37. #phpltjam 例2:JIT • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit

    • 能動的な学習を促す良RFC • 高速化できることは書かれているが、なぜ・何が高速化されるのかは明 記されていない
  38. #phpltjam 疑問は調べるチャンス

  39. #phpltjam 例2:JIT(調べた結果) • 通常の処理 ◦ ソースコード → OPcode(中間言語)に変換 → ZendVMがネイティブコードに変換(解釈)して実行

  40. #phpltjam 例2:JIT(調べた結果) • 通常の処理 ◦ ソースコード → OPcode(中間言語)に変換 → ZendVMがネイティブコードに変換(解釈)して実行

    • JIT ◦ ソースコード → OPCodeに変換 → ネイティブコードに変換してキャッシュ ◦ 次にリクエストが来た時、キャッシュされたネイティブコードを実行
  41. #phpltjam 例2:JIT(調べた結果) • 通常の処理 ◦ ソースコード → OPcode(中間言語)に変換 → ZendVMがネイティブコードに変換(解釈)して実行

    • JIT ◦ ソースコード → OPCodeに変換 → ネイティブコードに変換してキャッシュ ◦ 次にリクエストが来た時、キャッシュされたネイティブコードを実行 ▪ OPcodeを解釈する時間が短縮されるため速い
  42. #phpltjam 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識

  43. #phpltjam 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ

  44. #phpltjam 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ ◦ OPcache … OPCodeをキャッシュして使いまわす仕組み。

         JITはOPcacheの拡張版
  45. #phpltjam 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ ◦ OPcache … OPCodeをキャッシュして使いまわす仕組み。

         JITはOPcacheの拡張版 ◦ Preload … PHP7.4で入ったOPCacheを起動時に作る仕組み
  46. #phpltjam 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ ◦ OPcache … OPCodeをキャッシュして使いまわす仕組み。

         JITはOPcacheの拡張版 ◦ Preload … PHP7.4で入ったOPCacheを起動時に作る仕組み ◦ JIT使ってもWebアプリケーションは劇的に速くはならないという事 実 ▪ I/Oのボトルネックの方が大きい
  47. #phpltjam 例2:JIT(再掲) • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit

    • 能動的な学習を促す良RFC • 高速化できることは書かれているが、なぜ・何が高速化されるのかは明 記されていない
  48. #phpltjam 例2:JIT(再掲) • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit

    • 能動的な学習を促す良RFC • 高速化できることは書かれているが、なぜ・何が高速化されるのかは明 記されていない • 理解する行為を通したPHP高速化周辺の一連の知識の「学び」
  49. #phpltjam 例3:Attributes

  50. #phpltjam 例3:Attributes • これまでPHPDocに記述していた @before などのアノテーションを、 正式にPHPの言語仕様として記述できるようにするもの ◦ https://wiki.php.net/rfc/attributes_v2 •

    自身の幅を広げてくれるナイスなRFC /** * @before ←これが */ public function setupSomeFixtures(){ } ↓ #[before]  ←こうなる public function setupSomeFixtures(){ }
  51. #phpltjam 例3:Attributes • RFCに記載されている課題 doc-commentsはただの文字列でしかない。 (ライブラリ開発者がアノテーションを実装するには) 追加で文 字列を解析する処理を書かなければならない。

  52. #phpltjam PHPUnitのコードを見てみた

  53. #phpltjam 例3:Attributes • RFCに記載されている課題 https://github.com/sebastianbergmann/phpunit/blob/master/src/Util/Annotation/DocBlock.php

  54. #phpltjam 例3:Attributes • RFCに記載されている課題 _人人人人人人人人人_ > 正 規 表 現 <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄ https://github.com/sebastianbergmann/phpunit/blob/master/src/Util/Annotation/DocBlock.php

  55. #phpltjam 例3:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ…

  56. #phpltjam 例3:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ… • と同時に「意外と泥臭い仕組みで実現してるんだな」という親近感

  57. #phpltjam 例3:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ… • と同時に「意外と泥臭い仕組みで実現してるんだな」という親近感 • からの「あれ、これオレでも実装できるんじゃね?」という希望

  58. #phpltjam 例3:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ… • と同時に「意外と泥臭い仕組みで実現してるんだな」という親近感 • からの「あれ、これオレでも実装できるんじゃね?」という希望 • アノテーションを使って振る舞いを変えるというのは、一部のライブラリ開発者

    だけが扱える特殊技能、という先入観がなくなり、自分が開発する際のパター ンの一つに加わった。
  59. #phpltjam 例3:Attributes(再掲) • これまでPHPDocに記述していた @before などのアノテーションを、 正式にPHPの言語仕様として記述できるようにするもの ◦ https://wiki.php.net/rfc/attributes_v2 •

    自身の幅を広げてくれるナイスなRFC
  60. #phpltjam 例3:Attributes(再掲) • これまでPHPDocに記述していた @before などのアノテーションを、 正式にPHPの言語仕様として記述できるようにするもの ◦ https://wiki.php.net/rfc/attributes_v2 •

    自身の幅を広げてくれるナイスなRFC • 学習の過程で、自分自身の引き出しが増えるという「気付き」
  61. #phpltjam 以上、3つの事例で 「発見」「学び」「気付き」 を紹介

  62. #phpltjam 以上、3つの事例で 「発見」「学び」「気付き」 を紹介 人によって学び・気付きの ポイントは異なると思います

  63. #phpltjam RFC駆動学習により • 知識のアップデートが行われる • その過程で、自分自身の知識の抜け漏れが補完される • RFCはPHPerにとって共通課題であることが多く、学び効率が良い • 副次的な効果として、早期にPHPの変更点をキャッチアップできるので、PHP

    バージョンアップする際、慌てないで済む
  64. #phpltjam RFC駆動学習により • 知識のアップデートが行われる • その過程で、自分自身の知識の抜け漏れが補完される • RFCはPHPerにとって共通課題であることが多く、学び効率が良い • 副次的な効果として、早期にPHPの変更点をキャッチアップできるので、PHP

    バージョンアップする際、慌てないで済む • 新機能なのでやってて楽しい、継続できる ◦ べんり!使ってみたい!というポジティブな感情が大事 ◦ 継続できれば学習のトリガは何でも良く、その一つがRFC駆動
  65. #phpltjam どうやって始めたらいいでしょう? • PHP RFC Bot(@PHPRFCBot)をフォローする • いいねがそこそこついてるものを重点的にチェック(感覚で30くらい) • Google翻訳を駆使して読んだり、Qiita等の先人の記事を読んだり…

    • RFCの読み方については、へーしゃの別のエンジニアが語った 資料があるので下記参照 ◦ RFCの歩き方:https://speakerdeck.com/ykanoh/how-to-read-php-rfc
  66. #phpltjam RFCは学びの宝庫

  67. #phpltjam RFC駆動学習を通じて 自身の抜け漏れを補完しつつ 知識のアップデートをしてみては?

  68. #phpltjam ところで

  69. #phpltjam 一人でやるのは大変ですよね!(断言)

  70. #phpltjam 毎月勉強会をやっておりますのでLet’s JOIN! https://rakus.connpass.com/event/189017/

  71. #phpltjam 毎月勉強会をやっておりますのでLet’s JOIN! https://rakus.connpass.com/event/189017/ おわり!