Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RFC駆動のPHP学習術 Fukuoka.php edition
Search
Takayuki Fujisawa
October 14, 2020
Programming
1
380
RFC駆動のPHP学習術 Fukuoka.php edition
Takayuki Fujisawa
October 14, 2020
Tweet
Share
More Decks by Takayuki Fujisawa
See All by Takayuki Fujisawa
RFC駆動のPHP学習術.pdf
takayukifujisawa
3
400
PHPのEnum事情
takayukifujisawa
1
600
レガシーなアプリケーションにこそTypeScriptを採用するべきではないかと思ったのでちょっとまとめてみたよっていう話をするスライドです / Legacy code needs TypeScript
takayukifujisawa
1
330
History of JavaScript
takayukifujisawa
1
160
usb_boot_ubuntu
takayukifujisawa
0
230
なぜPHPにはEnumがないのか
takayukifujisawa
0
4.7k
Other Decks in Programming
See All in Programming
PagerDuty を軸にした On-Call 構築と運用課題の解決 / PagerDuty Japan Community Meetup 4
horimislime
1
110
外部システム連携先が10を超えるシステムでのアーキテクチャ設計・実装事例
kiwasaki
1
230
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
560
Android 15 でアクションバー表示時にステータスバーが白くなってしまう問題
tonionagauzzi
0
140
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
430
C#/.NETのこれまでのふりかえり
tomokusaba
1
160
NSOutlineView何もわからん:( 前編 / I Don't Understand About NSOutlineView :( Pt. 1
usagimaru
0
160
macOS でできる リアルタイム動画像処理
biacco42
7
2k
破壊せよ!データ破壊駆動で考えるドメインモデリング / data-destroy-driven
minodriven
16
4.1k
リリース8年目のサービスの1800個のERBファイルをViewComponentに移行した方法とその結果
katty0324
5
3.6k
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
0
160
Sidekiqで実現する 長時間非同期処理の中断と再開 / Pausing and Resuming Long-Running Asynchronous Jobs with Sidekiq
hypermkt
6
2.7k
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
66
10k
A Tale of Four Properties
chriscoyier
156
23k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
228
52k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Designing for Performance
lara
604
68k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Designing Experiences People Love
moore
138
23k
Side Projects
sachag
452
42k
The Art of Programming - Codeland 2020
erikaheidi
51
13k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Transcript
#fukuokaphp RFC駆動のPHP学習術 - Fukuoka.php Vol.32 Edition - 2020/10/14 Takayuki Fujisawa
#fukuokaphp Takayuki Fujisawa 所属:株式会社ラクス Twitter: @miracle_fjsw 表のおしごと:品質管理やセキュリティ・技術仕様の標準化 裏のおしごと:社内エンジニアの学びの場の創出(勉強会イベントの主催)
#fukuokaphp みなさん PHPの学習って どうやっていますか?
#fukuokaphp - 書籍(はじめてのPHP、パーフェクトPHP、実践 〇〇、オライリー本…) - 技術系のWeb記事
#fukuokaphp こういうことありますよね? • 知識が陳腐化・古くなる • 学習した内容が自分自身に定着しない・曖昧な理解
#fukuokaphp そんなみなさんに紹介したい学習法が
#fukuokaphp 「RFC駆動学習」
#fukuokaphp RFCとは • 「Request For Comments」 • https://wiki.php.net/rfc • PHPの次期バージョンに取り込まれる新機能や改善の提案
• PHPコア開発者のコミュニティの中でメーリングリストなどで 議論・投票が行われ、採択される
#fukuokaphp 例えばこんなやつ https://wiki.php.net/rfc/match_expression_v2 PHP8:match式の提案
#fukuokaphp RFC駆動学習とは
#fukuokaphp RFC駆動学習とは • RFCに記載されている提案内容を理解し、
#fukuokaphp RFC駆動学習とは • RFCに記載されている提案内容を理解し、 記載されている課題感・背景などから
#fukuokaphp RFC駆動学習とは • RFCに記載されている提案内容を理解し、 記載されている課題感・背景などから 言語仕様・PHP界隈の動向への理解を深める、 というオレオレ手法
#fukuokaphp RFCの基本構成 • 提案内容 • 現状のPHPが抱える課題 • 提案の実装例
#fukuokaphp RFCの基本構成 • 提案内容 • 現状のPHPが抱える課題 • 提案の実装例 • ただ読むだけだと
「こんな新機能が増えるのか、なるほど」で終了しちゃう
#fukuokaphp RFCの基本構成 • 提案内容 • 現状のPHPが抱える課題 • 提案の実装例 • ただ読むだけだと
「こんな新機能が増えるのか、なるほど」で終了 RFC駆動学習は、 提案の背景・課題・周辺事項を じっくり理解し、 気付き・発見・学びを獲得 することが目的
#fukuokaphp なぜ RFC?
#fukuokaphp なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの
#fukuokaphp なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの
#fukuokaphp なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの • = 活用される可能性が高い知識領域
#fukuokaphp なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの • = 活用される可能性が高い知識領域 •
= 優先して学ぶべき・理解しておくべき領域
#fukuokaphp なぜ RFC? • 採用されるRFCは、コミュニティの中で同意を得られたもの • = 多くの人が課題を感じているもの、ニーズがあるもの • = 活用される可能性が高い知識領域 •
= 優先して学ぶべき・理解しておくべき領域 • ∴ あてもなく学習するよりも、 生きた知識になる確率が高く、効率が良い
#fukuokaphp なぜ RFC? • 提案内容が一つのTopicsとして、過去と未来がまとまっている
#fukuokaphp なぜ RFC? • 提案内容が一つのTopicsとして、過去と未来がまとまっている • 現状把握(過去)しつつ、知識のアップデート(未来)ができる
#fukuokaphp そんなRFC駆動学習について 自身の実例を ダイジェストで紹介します
#fukuokaphp 例1:match式
#fukuokaphp 例1:match式 • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • 条件により代入処理を分岐させる際にシンプルに記述できる
#fukuokaphp 例1:match式
#fukuokaphp 例1:match式 switch文は緩い比較を行います。 これは非常に驚くべき結果をもたらす 可能性があります。
#fukuokaphp そうだったのか!
#fukuokaphp 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • 条件により代入処理を分岐させる際にシンプルに記述できる
#fukuokaphp 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • 条件により代入処理を分岐させる際にシンプルに記述できる • switch文の条件判定は「緩い比較」が行われているという課題を、理解
していなかった
#fukuokaphp 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • 条件により代入処理を分岐させる際にシンプルに記述できる • switch文の条件判定は「緩い比較」が行われているという課題を、理解
していなかった • 不十分な理解に対する「そうだったのか!」という「発見」
#fukuokaphp 例1:match式(再掲) • swtich文によく似た新しい別の記法 ◦ https://wiki.php.net/rfc/match_expression_v2 • 条件により代入処理を分岐させる際にシンプルに記述できる • switch文の条件判定は「緩い比較」が行われているという課題を、理解
していなかった • 不十分な理解に対する「そうだったのか!」という「発見」 ◦ 自分自身の抜け漏れを認識 ◦ 「発見」の感覚が鮮明に記憶に残る
#fukuokaphp 例2:JIT
#fukuokaphp 例2:JIT • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit
#fukuokaphp 例2:JIT • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit
• 高速化できることは書かれているが、なぜ・何が高速化されるのかは明 記されていない
#fukuokaphp 疑問は調べるチャンス
#fukuokaphp 例2:JIT(調べた結果) • 通常の処理 ◦ ソースコード → OPcode(中間言語)に変換 → ZendVMがネイティブコードに変換(解釈)して実行
#fukuokaphp 例2:JIT(調べた結果) • 通常の処理 ◦ ソースコード → OPcode(中間言語)に変換 → ZendVMがネイティブコードに変換(解釈)して実行
• JIT ◦ ソースコード → OPCodeに変換 → ネイティブコードに変換してキャッシュ ◦ 次にリクエストが来た時、キャッシュされたネイティブコードを実行
#fukuokaphp 例2:JIT(調べた結果) • 通常の処理 ◦ ソースコード → OPcode(中間言語)に変換 → ZendVMがネイティブコードに変換(解釈)して実行
• JIT ◦ ソースコード → OPCodeに変換 → ネイティブコードに変換してキャッシュ ◦ 次にリクエストが来た時、キャッシュされたネイティブコードを実行 ▪ OPcodeを解釈する時間が短縮されるため速い
#fukuokaphp 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識
#fukuokaphp 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ
#fukuokaphp 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ ◦ OPcache … OPCodeをキャッシュして使いまわす仕組み。
JITはOPcacheの拡張版
#fukuokaphp 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ ◦ OPcache … OPCodeをキャッシュして使いまわす仕組み。
JITはOPcacheの拡張版 ◦ Preload … PHP7.4で入ったOPCacheを起動時に作る仕組み
#fukuokaphp 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ ◦ OPcache … OPCodeをキャッシュして使いまわす仕組み。
JITはOPcacheの拡張版 ◦ Preload … PHP7.4で入ったOPCacheを起動時に作る仕組み ◦ JIT使ってもWebアプリケーションは劇的に速くはならないという事 実 ▪ I/Oのボトルネックの方が大きい
#fukuokaphp 例2:JIT(調べた結果) • JITで速くなる理由を理解する過程で再整理された他の知識 ◦ PHPのソースコードが実行されるまでのコンパイルの流れ ◦ OPcache … OPCodeをキャッシュして使いまわす仕組み。
JITはOPcacheの拡張版 ◦ Preload … PHP7.4で入ったOPCacheを起動時に作る仕組み ◦ JIT使ってもWebアプリケーションは劇的に速くはならないという事 実 ▪ I/Oのボトルネックの方が大きい 注:OPCache から JITの話。 素のPHPからOPcacheの導入は、一定効 果あると思います。
#fukuokaphp 例2:JIT(再掲) • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit
• 高速化できることは書かれているが、なぜ・何が高速化されるのかは明 記されていない
#fukuokaphp 例2:JIT(再掲) • Just-In-Time Compiler ◦ ネイティブコードにコンパイルした結果をキャッシュすることで処理 を高速化できる新機能 ◦ https://wiki.php.net/rfc/jit
• 高速化できることは書かれているが、なぜ・何が高速化されるのかは明 記されていない • 理解する行為を通したPHP高速化周辺の一連の知識の 「学び」のトリガー
#fukuokaphp 例3: Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON
#fukuokaphp 例3:Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON • 構文エラーに出力されるトークンが混乱を招くのでやめたい ◦ https://wiki.php.net/rfc/rename-double-colon-token
#fukuokaphp PAAMAYIM NEKUDOTAYIM
#fukuokaphp םייתדוקנ םיימעפ
#fukuokaphp םייתדוקנ םיימעפ (ヘブライ語でダブルコロンの意)
#fukuokaphp 例3:Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON • 構文エラーに出力されるトークンが混乱を招くのでやめたい ◦ https://wiki.php.net/rfc/rename-double-colon-token
#fukuokaphp 例3:Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON • 構文エラーに出力されるトークンが混乱を招くのでやめたい ◦ https://wiki.php.net/rfc/rename-double-colon-token •
PHPコア内部で使用されているこのトークンは初見殺し 「T_DOUBLE_COLON」に変更すべき、という提案
#fukuokaphp 例3:Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON • 構文エラーに出力されるトークンが混乱を招くのでやめたい ◦ https://wiki.php.net/rfc/rename-double-colon-token •
PHPコア内部で使用されているこのトークンは初見殺し 「T_DOUBLE_COLON」に変更すべき、という提案 • この提案そのものは否決された
#fukuokaphp #externals https://externals.io/
#fukuokaphp T_PAAMAYIM_NEKUDOTAYIMについての議論 https://externals.io/message/110728
#fukuokaphp T_PAAMAYIM_NEKUDOTAYIMについての議論 https://externals.io/message/110728 「T_PAAMAYIM_NEKUDOTAYIM」 を 「T_DOUBLE_COLON」 に変えろって言ってるけど
#fukuokaphp T_PAAMAYIM_NEKUDOTAYIMについての議論 https://externals.io/message/110728 そもそもエラーメッセージに 「T_PAAMAYIM_NEKUDOTAYIM」 って表示しなければ良いのでは? ※開発者に必要ない情報だし
#fukuokaphp v7.4 Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM) ↓
v8.0 Parse error: syntax error, unexpected token "::"
#fukuokaphp 例3:Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON • 構文エラーに出力されるトークンが混乱を招くのでやめたい ◦ https://wiki.php.net/rfc/rename-double-colon-token •
PHPコア内部で使用されているこのトークンは初見殺し 「T_DOUBLE_COLON」に変更すべき、という提案 • この提案そのものは否決された
#fukuokaphp 例3:Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON • 構文エラーに出力されるトークンが混乱を招くのでやめたい ◦ https://wiki.php.net/rfc/rename-double-colon-token •
PHPコア内部で使用されているこのトークンは初見殺し 「T_DOUBLE_COLON」に変更すべき、という提案 • この提案そのものは否決された • 「問題の本質」にフォーカスすることの重要性を再認識する というPHPの枠を超えた「気付き」
#fukuokaphp その他にも色々な事例があります (飛ばします)
#fukuokaphp 例4:Saner string to number comparisons (簡潔な文字列と数値の比較)
#fukuokaphp 例4:Saner string to number comparisons • 文字列と数値を緩い比較(==)した時の不思議な振る舞いの是正 ◦ https://wiki.php.net/rfc/string_to_number_comparison
#fukuokaphp 例4:Saner string to number comparisons • 文字列と数値を緩い比較(==)した時の不思議な振る舞いの是正 ◦ https://wiki.php.net/rfc/string_to_number_comparison
#fukuokaphp • RFCに記載されている課題 例4:Saner string to number comparisons ・PHPの世界では緩い比較は常に避けるべき ・けど、in_array()とswitch文ではこの問題に遭遇しちゃう
#fukuokaphp 例4:Saner string to number comparisons(再掲) • 文字列と数値を緩い比較(==)した時の不思議な振る舞いの是正 ◦ https://wiki.php.net/rfc/string_to_number_comparison
#fukuokaphp 例4:Saner string to number comparisons(再掲) • 文字列と数値を緩い比較(==)した時の不思議な振る舞いの是正 ◦ https://wiki.php.net/rfc/string_to_number_comparison
• こちらのRFCはswitch文だけでなくin_array()の課題にも気付かせてく れる一粒で二度おいしい良コスパRFC
#fukuokaphp 例4:Saner string to number comparisons(再掲) • 文字列と数値を緩い比較(==)した時の不思議な振る舞いの是正 ◦ https://wiki.php.net/rfc/string_to_number_comparison
• こちらのRFCはswitch文だけでなくin_array()の課題にも気付かせてく れる一粒で二度おいしい良コスパRFC • ちなみにin_array()は第三引数をtrueにしましょう
#fukuokaphp 例5:Attributes
#fukuokaphp 例5:Attributes • これまでPHPDocに記述していた @before などのアノテーションを、 正式にPHPの言語仕様として記述できるようにするもの ◦ https://wiki.php.net/rfc/attributes_v2 •
自身の幅を広げてくれるナイスなRFC /** * @before ←これが */ public function setupSomeFixtures(){ } ↓ #[before] ←こうなる public function setupSomeFixtures(){ }
#fukuokaphp 例5:Attributes • RFCに記載されている課題 doc-commentsはただの文字列でしかない。 (ライブラリ開発者がアノテーションを実装するには) 追加で文 字列を解析する処理を書かなければならない。
#fukuokaphp PHPUnitのコードを見てみた
#fukuokaphp 例3:Attributes • RFCに記載されている課題 https://github.com/sebastianbergmann/phpunit/blob/master/src/Util/Annotation/DocBlock.php
#fukuokaphp 例3:Attributes • RFCに記載されている課題 _人人人人人人人人人_ > 正 規 表 現 <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄ https://github.com/sebastianbergmann/phpunit/blob/master/src/Util/Annotation/DocBlock.php
#fukuokaphp 例5:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ…
#fukuokaphp 例5:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ… • と同時に「意外と泥臭い仕組みで実現してるんだな」という親近感
#fukuokaphp 例5:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ… • と同時に「意外と泥臭い仕組みで実現してるんだな」という親近感 • からの「あれ、これオレでも実装できるんじゃね?」という希望
#fukuokaphp 例5:Attributes • おー…確かにゴリゴリ文字列解析してるなぁ… • と同時に「意外と泥臭い仕組みで実現してるんだな」という親近感 • からの「あれ、これオレでも実装できるんじゃね?」という希望 • アノテーションを使って振る舞いを変えるというのは、一部のライブラリ開発者
だけが扱える特殊技能、という先入観がなくなり、自分が開発する際のパター ンの一つに加わった。
#fukuokaphp 例5:Attributes(再掲) • これまでPHPDocに記述していた @before などのアノテーションを、 正式にPHPの言語仕様として記述できるようにするもの ◦ https://wiki.php.net/rfc/attributes_v2 •
自身の幅を広げてくれるナイスなRFC
#fukuokaphp 例5:Attributes(再掲) • これまでPHPDocに記述していた @before などのアノテーションを、 正式にPHPの言語仕様として記述できるようにするもの ◦ https://wiki.php.net/rfc/attributes_v2 •
自身の幅を広げてくれるナイスなRFC • 学習の過程で、自分自身の引き出しが増えるという「気付き」
#fukuokaphp 例6:Weak Reference(v7.4)
#fukuokaphp 例6:Weak Reference(v7.4) • PHPで「弱参照」が使えるようになる ◦ https://wiki.php.net/rfc/weakrefs • 元々PECL拡張としては存在していたものがコアの機能として再提案
#fukuokaphp 「弱参照ってなに?」
#fukuokaphp 例6:Weak Reference(調べた) https://qiita.com/miracle-FJSW/items/f35c3e90a5d14eb6eba3
#fukuokaphp 例6:Weak Reference(v7.4) • PHPで「弱参照」が使えるようになる ◦ https://wiki.php.net/rfc/weakrefs • 元々PECL拡張としては存在していたものがコアの機能として再提案 •
PHPのメモリ管理・GCまわりに詳しくなった • (ちなみに)PHPのGCサイクルは、どれだけメモリ使用しているかに依らず、オ ブジェクトが10,000個作られた時 • JIT同様、RFCをトリガに一連の学びの機会を与えてくれた
#fukuokaphp そんなこんなで RFCには学びや気づきの ポイントがたくさんあります
#fukuokaphp そんなこんなで RFCには学びや気づきの ポイントがたくさんあります 人によって学び・気付きの ポイントは異なると思います
#fukuokaphp RFC駆動学習により • 知識のアップデートが行われる • その過程で、自分自身の知識の抜け漏れが補完される • RFCはPHPerにとって共通課題であることが多く、学び効率が良い • 副次的な効果として、早期にPHPの変更点をキャッチアップできるので、PHP
バージョンアップする際、慌てないで済む
#fukuokaphp RFC駆動学習により • 知識のアップデートが行われる • その過程で、自分自身の知識の抜け漏れが補完される • RFCはPHPerにとって共通課題であることが多く、学び効率が良い • 副次的な効果として、早期にPHPの変更点をキャッチアップできるので、PHP
バージョンアップする際、慌てないで済む • 新機能なのでやってて楽しい、継続できる ◦ べんり!使ってみたい!というポジティブな感情が大事 ◦ 継続できれば学習のトリガは何でも良く、その一つがRFC駆動
#fukuokaphp どうやって始めたらいいでしょう? • PHP RFC Bot(@PHPRFCBot)をフォローする • いいねがそこそこついてるものを重点的にチェック(感覚で30くらい) • Google翻訳を駆使して読んだり、Qiita等の先人の記事を読んだり…
• #externals(https://externals.io/)を覗いてみるのもヨシ • RFCの読み方については、へーしゃの別のエンジニアが語った 資料があるので下記参照 ◦ RFCの歩き方:https://speakerdeck.com/ykanoh/how-to-read-php-rfc
#fukuokaphp RFCは学びの宝庫
#fukuokaphp RFC駆動学習を通じて 自身の抜け漏れを補完しつつ 知識のアップデートをしてみては?
#fukuokaphp ところで
#fukuokaphp 一人でやるのは大変ですよね!(断言)
#fukuokaphp 毎月勉強会をやっていますのでよろしければ… https://rakus.connpass.com/event/192297/
#fukuokaphp 毎月勉強会をやっていますのでよろしければ… https://rakus.connpass.com/event/192297/ おわり!