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
DQNEO
February 10, 2020
Programming
6
8.4k
もっと気軽にOSSに Pull Requestを出そう!/ Let's make a PR to OSS more easily
PHPerkaigi 2020 で発表した資料です。
DQNEO
February 10, 2020
Tweet
Share
More Decks by DQNEO
See All by DQNEO
英和辞書付きGo言語仕様書 / Word Wise Go Spec
dqneo
1
550
Go言語低レイヤー入門 Hello world が 画面に表示されるまで / Introduction to low level programming in Go
dqneo
6
1.7k
入門Go言語仕様 / Go Specification Untyped Constants
dqneo
1
1.3k
入門Go言語仕様 Underlying Type / Go Language Underlying Type
dqneo
9
5.2k
How to write a self hosted Go compiler from scratch (Gophercon 2020)
dqneo
3
1.7k
Goコンパイラをゼロから作ってセルフホスト達成するまで / How I wrote a self hosted Go compiler from scratch
dqneo
15
15k
コンパイラをつくってみよう / How to make a compiler
dqneo
9
11k
コンパイラ作りの魅力を語る / Making compilers is fun
dqneo
10
8.6k
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
業務でAIを使いたい話
hnw
0
260
複数チーム並行開発下でのコード移行アプローチ ~手動 Codemod から「生成AI 活用」への進化
andpad
0
130
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
4
540
Flutterアプリ運用の現場で役立った監視Tips 5選
ostk0069
1
340
例外処理を理解して、設計段階からエラーを見つけやすく、起こりにくく #phpconfuk
kajitack
12
5.8k
Swift Concurrency 年表クイズ
omochi
3
230
SidekiqでAIに商品説明を生成させてみた
akinko_0915
0
130
自動テストを活かすためのテスト分析・テスト設計の進め方/JaSST25 Shikoku
goyoki
2
570
チーム開発の “地ならし"
konifar
4
3.1k
OSS開発者の憂鬱
yusukebe
8
3.2k
AI時代に必須!状況言語化スキル / ai-context-verbalization
minodriven
3
380
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
lagenorhynque
0
120
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
320
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.3k
BBQ
matthewcrist
89
9.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Thoughts on Productivity
jonyablonski
73
4.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8k
Rails Girls Zürich Keynote
gr2m
95
14k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
660
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
24
1.5k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
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で登壇すると 夢が叶う!
つぎはあなたの番です!!