Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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.8k
入門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
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
130
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
2
450
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
0
120
Deno Tunnel を使ってみた話
kamekyame
0
210
JETLS.jl ─ A New Language Server for Julia
abap34
2
440
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
160
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
270
Jetpack XR SDKから紐解くAndroid XR開発と技術選定のヒント / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
180
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
130
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
450
チームをチームにするEM
hitode909
0
360
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
3.3k
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.4k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
The agentic SEO stack - context over prompts
schlessera
0
550
Abbi's Birthday
coloredviolet
0
3.6k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
31
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
What's in a price? How to price your products and services
michaelherold
246
13k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
310
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
85
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
29
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で登壇すると 夢が叶う!
つぎはあなたの番です!!