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.5k
もっと気軽に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
580
Go言語低レイヤー入門 Hello world が 画面に表示されるまで / Introduction to low level programming in Go
dqneo
6
1.8k
入門Go言語仕様 / Go Specification Untyped Constants
dqneo
1
1.3k
入門Go言語仕様 Underlying Type / Go Language Underlying Type
dqneo
9
5.3k
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
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
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.1k
株式会社 Sun terras カンパニーデック
sunterras
0
2k
2026/02/04 AIキャラクター人格の実装論 口 調の模倣から、コンテキスト制御による 『思想』と『行動』の創発へ
sr2mg4
0
680
AI時代のソフトウェア開発でも「人が仕様を書く」から始めよう-医療IT現場での実践とこれから
koukimiura
0
130
CopilotKit + AG-UIを学ぶ
nearme_tech
PRO
1
120
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
150
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.6k
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
470
CSC307 Lecture 11
javiergs
PRO
0
580
朝日新聞のデジタル版を支えるGoバックエンド ー価値ある情報をいち早く確実にお届けするために
junkiishida
1
350
New in Go 1.26 Implementing go fix in product development
sunecosuri
0
310
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
380
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
970
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
GitHub's CSS Performance
jonrohan
1032
470k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
120
A Modern Web Designer's Workflow
chriscoyier
698
190k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
870
Why Our Code Smells
bkeepers
PRO
340
58k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
170
A better future with KSS
kneath
240
18k
Automating Front-end Workflow
addyosmani
1370
200k
How to Ace a Technical Interview
jacobian
281
24k
The Pragmatic Product Professional
lauravandoore
37
7.2k
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で登壇すると 夢が叶う!
つぎはあなたの番です!!