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.1k
もっと気軽に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
460
Go言語低レイヤー入門 Hello world が 画面に表示されるまで / Introduction to low level programming in Go
dqneo
4
1.5k
入門Go言語仕様 / Go Specification Untyped Constants
dqneo
1
1.2k
入門Go言語仕様 Underlying Type / Go Language Underlying Type
dqneo
9
4.7k
How to write a self hosted Go compiler from scratch (Gophercon 2020)
dqneo
3
1.5k
Goコンパイラをゼロから作ってセルフホスト達成するまで / How I wrote a self hosted Go compiler from scratch
dqneo
15
14k
コンパイラをつくってみよう / How to make a compiler
dqneo
9
11k
コンパイラ作りの魅力を語る / Making compilers is fun
dqneo
10
8.3k
Goのmapとheapを自作してみた / How to create your own map and heap in Go
dqneo
0
3k
Other Decks in Programming
See All in Programming
create_tableをしただけなのに〜囚われのuuid編〜
daisukeshinoku
0
240
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
270
fs2-io を試してたらバグを見つけて直した話
chencmd
0
220
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
130
バグを見つけた?それAppleに直してもらおう!
uetyo
0
170
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
640
Full stack testing :: basic to basic
up1
1
930
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
330
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
180
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
Go の GC の不得意な部分を克服したい
taiyow
2
760
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
180
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
94
Automating Front-end Workflow
addyosmani
1366
200k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
Done Done
chrislema
181
16k
Statistics for Hackers
jakevdp
796
220k
Writing Fast Ruby
sferik
628
61k
Side Projects
sachag
452
42k
Designing for Performance
lara
604
68k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
160
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で登壇すると 夢が叶う!
つぎはあなたの番です!!