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
もっと気軽にOSSに Pull Requestを出そう!/ Let's make a PR t...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
DQNEO
February 10, 2020
Programming
8.5k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
もっと気軽にOSSに Pull Requestを出そう!/ Let's make a PR to OSS more easily
PHPerkaigi 2020 で発表した資料です。
DQNEO
February 10, 2020
More Decks by DQNEO
See All by DQNEO
英和辞書付きGo言語仕様書 / Word Wise Go Spec
dqneo
1
600
Go言語低レイヤー入門 Hello world が 画面に表示されるまで / Introduction to low level programming in Go
dqneo
8
1.9k
入門Go言語仕様 / Go Specification Untyped Constants
dqneo
1
1.4k
入門Go言語仕様 Underlying Type / Go Language Underlying Type
dqneo
9
5.4k
How to write a self hosted Go compiler from scratch (Gophercon 2020)
dqneo
3
1.8k
Goコンパイラをゼロから作ってセルフホスト達成するまで / How I wrote a self hosted Go compiler from scratch
dqneo
15
15k
コンパイラをつくってみよう / How to make a compiler
dqneo
9
12k
コンパイラ作りの魅力を語る / Making compilers is fun
dqneo
10
8.7k
Goのmapとheapを自作してみた / How to create your own map and heap in Go
dqneo
0
3.2k
Other Decks in Programming
See All in Programming
Performance Engineering for Everyone
elenatanasoiu
0
240
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
310
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
180
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
210
Vite+ Unified Toolchain for the Web
naokihaba
0
370
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.5k
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
7.1k
Webフレームワークの ベンチマークについて
yusukebe
0
180
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.8k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
200
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
210
Context Engineering - Making Every Token Count
addyosmani
9
990
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
260
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
440
Designing for Performance
lara
611
70k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
490
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
4 Signs Your Business is Dying
shpigford
187
22k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Transcript
もっと気軽にOSSに Pull Requestを出そう! @DQNEO (ドキュネオ) PHPerKaigi 2020/2/10
自己紹介 @DQNEO (ドキュネオ) • US版メルカリを開発しています • 趣味: ◦ コンパイラ自作 (去年)
◦ 英語 (いま) ◦ 突然アセンブリを書いてしまう
※注意 このトークは初心者むけです
質問 PHPの有名ライブラリにコントリビュートした ことのある方?
「コントリビューション」のイメージ ◦ まず、しっかり使いこなす (← すでにハードルが高い) ◦ 新機能追加して便利にしたよ (← 何も思いつかない) ◦
バグ見つけて直したよ (← バグとかある?) できたらカッコいいが、なかなかチャンスはない
私のコントリビューション実績 Symfony Guzzle AWS SDK for PHP DietCake DietCube Ethna
Fluent Logger PHPBench Monolog PHPJava AssertChain ほか多数
4つの着眼点 1. 作者の関心ゾーンの外側を見る 2. 使ってなくてもコントリビュート 3. 業務で得たノウハウを横展開 4. ダメ元でも送ってみる
テストコードの可読性 着眼点1: 作者の関心ゾーンの外側を見る メインコードの 設計、実装、可読性 • テストコードの可読性 • テストコードのコメント •
コメント、ドキュメント • CI設定 • 環境変化への追従 異常 ケース
メインコードの 設計、実装、可読性 コメント、ドキュメント
例: Guzzleの README $client = new \GuzzleHttp\Client(); $res = $client->request('GET',
'https://api.github.com/user', [ 'auth' => ['user', 'pass'] ]); echo $res->getStatusCode(); // 200 echo $res->getHeaderLine('content-type'); // 'application/json; charset=utf8' echo $res->getBody(); // {"type":"User"...'
そのまま実行するとエラー PHP Fatal error: Uncaught GuzzleHttp\Exception\ClientException: Client error: `GET https://api.github.com/user`
resulted in a `401 Unauthorized` response: { "message": "Bad credentials", "documentation_url": "https://developer.github.com/v3" }
Pull Request出してみた
PR説明欄を丁寧に書く
すぐマージされた https://github.com/guzzle/guzzle/pull/1658
いまGuzzleのトップページにある サンプルコードは 僕が書いたやつです https://github.com/guzzle/guzzle
https://github.com/symfony/symfony/pull/24618/files PHPDocの修正: symfony union書き忘れ
PHPDocの修正: Aura.Sql https://github.com/auraphp/Aura.Sql/pull/129/files エラーケースは忘れられがち
PHPDocの修正: guzzle/psr7 https://github.com/guzzle/psr7/pull/134/files nullになるケースはなかった
テストコードの可読性 メインコードの 設計、実装、可読性 テストコードの可読性 テストコードのコメント コメント、ドキュメント
テストコードの可読性: Symfony https://github.com/symfony/symfony/pull/11812/files パラメータの可読性向上
テストコードのコメント: Symfony 文章の間違いを修正 https://github.com/symfony/symfony/pull/11811/files
躊躇しないで シュッとPR出してみるの大事
PRを出す習慣が身につく 「次はもっと大きいコントリビュー ションを!」 マージされるとやる気が出る
テストコードの可読性 メインコードの 設計、実装、可読性 テストコードの可読性 テストコードのコメント コメント、ドキュメント 異常 ケース
異常ケース: guzzle handler オプションに不正な値を渡したとき
異常ケースの改善: guzzle コンストラクタで型をチェックする https://github.com/guzzle/guzzle/pull/1745/files
異常ケースの改善: guzzle エラー報告がわかりやすくなった
Guzzleのコンストラクタに コントリビュートした!
テストコードの可読性 メインコードの 設計、実装、可読性 テストコードの可読性 テストコードのコメント コメント、ドキュメント • CI設定 • 環境変化への追従
環境変化への追従、CI設定の充実 ライブラリというのは放っておくだけで古くなる • PHPの新バージョン • PHPUnitの新バージョン ◦ 後方互換がしばしば壊れる • 新しいPSRが策定される
(例 PSR12) • Coding Styleチェッカーや静的解析ツールの進化
travis.yml にPHPのバージョンを追加 これも立派な貢献 https://github.com/dietcake/dietcake/pull/35/files
PHPJava: .php_cs.dist を追加 https://github.com/php-java/php-java/pull/72/files
• エコシステム周りはチャンスの 宝庫 • ひとつの知識を横展開できる
着眼点2: 業務で得たノウハウを横展開 • 会社の巨大アプリケーションが PHPUnit ver4だった • PHPUnit ver4 →
ver7 にあげた • バージョンアップに異常に詳しくなった • OSS界隈を見渡すと、古いPHPUnitに依存してるライブラ リが無数にあった • チャンス!!
PHPUnitのバージョンアップ職人 • DietCake 4 → 5 → 6 → 7
• DietCube 5 → 6 → 7 • Monolog 5 → 6 • PHPBench 6 → 7 • AWS SDK for PHP 5 → 6 • AssertChain 4 → 5 → 6 • Chronous 6 → 7 etc
詳しくは PHP Conference 2018の資料で 大規模PHPプロジェクトでPHPUnitを3世代アップグレードするためにやったこと https://speakerdeck.com/dqneo/phpunit-upgrade-story?slide=94
着眼点3: 使ってなくてもコントリビュート • 「読むだけ」でも結構見つかる • PHPStormの警告で気づいたり
Symfony: 使われてない変数 https://github.com/symfony/symfony/pull/24617/files
Symfony: 子クラスでのreturnし忘れ https://github.com/symfony/symfony/pull/24626/files
Symfony: 無名関数の引数の型 https://github.com/symfony/symfony/pull/26821/files
Symfony: 無名関数の引数の型 https://github.com/symfony/symfony/pull/24622/files
無名関数の引数の型宣言は忘れられがち • array_map(function(ここ $x){....}) • ただし、型宣言を後から追加する場合は、 後方互換を壊さないように注意
着眼点4: ダメ元でも送ってみる • 失うものはない • 「やった方がいいのにたまたま誰もやってなかった」 ケー スもある • 超有名レポジトリにPRしてみた
React: 英語の難単語を置き換え • 公式ドキュメントで ”mandatory”(=必須)という難単 語があった • 別の単語 ( a
must ) への置き換えを提案 • 「”mandatory”くらい普通に使うだろ」という反応を 予想していた https://github.com/facebook/react/pull/8809 ↓
Goコンパイラ: 変数名をリファクタ • わかりにくい変数名を見つけた • 10年の歴史のあるコンパイラの変数名 • 何か深い歴史的事情があるのかも、 と思いながらも変数リネームのPRしてみた •
あっさりOKが出た https://github.com/golang/go/commit/f07059d949057f414dd0f8303 f93ca727d716c62
まずはPR出してみよう!
余談
余談: 1年前のPHPerkaigi
余談: 1年前のPHPerkaigi
両方達成した!
PHPerkaigiで登壇すると 夢が叶う!
つぎはあなたの番です!!