なのログ

だから見てて下さい・・・俺の・・・変身

DroidKaigi公式アプリにコントリビュートしました

良い経験しすぎて泣きました。すみません泣いてません。
初めての行為がいくつあったのかわかりません。本当に良い経験をしました。


f:id:nanoyatsu:20200118174620p:plain

こんにちは。こんばんは。わたしです。
激アツの大流行コンテンツについて喋りにきました。ご存知ですか。

github.com

DroidKaigi/conference-app-2020っていうんですけど。

どうやら「今年も」な様子なんですが、 要するには
「2月開催のDroidKaigi(カンファレンス)の会場案内とかのアプリ作ってるからみんなで改善していこうぜ」の図です。

恥ずかしながら昨年のこの時期の自分にはAndroidのアンテナがそれほど立っていなかったので、
今回始めて存在を知りました。この数日間お祭り感がすごいです。Issue(修正候補項目)の取り合いです。

OSSコントリビュート初心者各位向けの祭りやで!」という舵取りも為されていて、
参加手引きのテキストも用意されている他、
Issueの一覧にeasy welcome contribute等のタグ付けがされていて優しさの塊のようなプロジェクトになっています。

で、どうにか自分もそれに参加をしてきましたという話をします。

もくじ↓

前提 conference-app-2020に参加前のわし

  • Androidは1年くらいぼちぼちやってるつもり
  • Kotlinも半年くらいぼちぼちやってるつもり
  • Gitも1年くらいぼちぼちやってるつもり
  • OSS活動したことない
  • (仕事を含めて一切)プルリク出したことない
  • ていうかまともなコードレビューを人生で一度も受けたことがない
  • それと英語で仕事したことない

こんなんです。孤独か?

やったこと

github.com
このIssueに対して github.com
このプルリクを投げました。

それだけっつったらそれだけなんですけども。

まあ細かく書いていきます。

コードを読む

DroidKaigi/conference-app-2020をcloneしてガン見していました。
プルリクするつもりなのにForkしていないところが不慣れ感を醸し出しています。(たぶん) (cloneしてから別のところのリモートに紐付けてそっからプルリク、でもいけるかもしれない)

同じようにするに当たっては、まずREADMEから読むのがよかろうかと思います。アプリの構成とかが書いてあります。

プルリクをしないとしても今の日本のAndroid開発に関する叡智が詰め込まれているものだと思うので、
興味がある人は是非見てみるとよいと思います。自分は向こう一年コースで舐め回す気がしています。

担当・解決できそうなIssueをさがす

自分が参加しようとしたのが1月17日で、Twitterで話題を見かけてから既に3日目くらいでした。
残っているIssueも、残っているだけあって超初心者向けみたいなものは少ない状況です。

github.com

ひとつ「イケるか・・・?」と思って選んだものがコレ↑でしたが、
「えっなにこの部品・・・BottomAppBar・・・へえ・・・すご・・・」となっただけで終わりました。
バージョン別対応であるところとかプロジェクト側で制御していないNavigationBarとの描画に関わることだとかで、「僕には何もできなかったよ・・・。」になりました。
さすがにある程度解決方法の目処を立ててから宣言しようと考えていたので、このIssueに関しては結果的に何もアクションせずに済んでいます。他の人に影響が出ることになるとやたら慎重になる僕です。

で、もう諦めるかと思って家事とかをしつつ、未練タラタラにIssue一覧を眺めていたら、新しいものが発行されています。
そいつがさっきのコレでした。

内容を日本語で書くと「検索結果から戻った時に、検索画面の検索文字列がクリアされてる(ので、維持したい)」というかんじ。
文面を見た段階で「だいたい実装方法はこうだろう」と思えたことと、使いそうなクラスへのリンクが用意されていたことから、今度はコードの確認をせずに飛びつきました。
(情けないながらに「使いそうなクラスの指示」の存在は大きくて、いざ実現可能な実装ができても「ココに書いていいのか・・・?そもそも全く別の機能を編集してないか・・・?」という不安が絶えない問題をいくらか解消してくれます・・・)

Issueへの挙手

すごいこまかいことを書くんですけど、「飛びつきました」といったところから、
たぶん30分くらいしてからIssueへのコメント表明をしています。

というのも、まあ自分が重度なチキンなだけなんですが、

  • READMEにあるとおり、英語推奨(強制ではない)
  • 「🙋」だけでいいよって言われてるけど、ちょっとそれは難しい(自己都合)
  • いやもうマジで自信ないので「初めてなんです」って言いたい
  • あとなんか迷惑かけたら本当申し訳ないのでそれも言いたい
  • っていうのを英語で書いたとしてちゃんと伝わるのか謎
  • 文意はもちろんとして、ビビリ度合いとかはもう伝わるのか更に謎

その結果がコレだよ

I want to try repair this issue.🙋
I'll code now.
(I contribute OSS for the first time. If I cause trouble, sorry...)

Because I can not english well, I write Japanese that want to tell in below...↓
英語まともに書けているかわからないので、言いたい日本語も添えておきます...↓

このIssueの修正に取り組みたいです。🙋
これから作業をします。
(初めてOSSコントリビュートをします。もし迷惑をかけたらすみません...)

めんどくせえ客だな。

(やさしいコメントとともにアサインして頂いたroana0229さん、ほんとありがとうございました...)

作業

「で、プルリクってどうやるんですかね」という状態からの参加だったので、手順は色々調べていました。

このあたり↓がわかりやすかったです。ていうか全部書いてある。
Github で Fork してから Pull Request をするまでの流れ | けーこ in サンフランシスコ

というわけで修正まではいつも通りの作業です。コミットのコメントの雰囲気とかは他のログの様子を見ました。

作業のこまかい話をすると、

  • ViewModelに持たせるか持ってるかして憶えといた値使ったらええでしょ
    →既に持ってた
  • TextViewにその値突っ込むようにしたらええでしょ
    →SearchViewっていう知らないクラス使ってた
    (setQuery(CharSequence, Boolean)ってメソッドを使う必要があった)
  • ViewModelに検索文字列そのまま持ってるっしょ
    →UI側への公開用に検索文字列と検索結果を詰めて1変数にして取り回してた

という学びポイントがたくさんありました。プチ修正だったのに。

プルリク

さっきのページを参考に、upstreamを登録したりmasterを更新したりとやりました。

コード書いてた時間よりコミットコメントどうしようってしてた時間のが長かった気もします。
もうお読みの皆さんお気付きかと思いますが、何もかも自信が無い。マジで面倒な野郎だよ!

プルリクも同じリポジトリの他のものを見つつ、

  • Issueの番号の前の"close"、意味わからんけどテンプレートについてるし他のにも書いてあるけどつけとこ・・・
  • 今回はスクショいらないやつかな・・・
  • Linkとか書かないところ"none"って添えとこ・・・

といった不安の中やっていきました。
とはいうものの、このあたりはブラウザのGithub上で出来ていて、
それまでよりは「あ~こういう形で(プルリク元、先のつながりとか)やってるんだなあ」と理解したような、察したような雰囲気になっていました。

引き続き面倒な野郎としてコメントに文意日本語を添えつつ、初のプルリクを発行しました

しかしまあ、この段階で1行しかコード書いてないとは思えませんね・・・

レビュー

プルリクをして早々に、takahiromさんからレビューコメントが届きました。カンファレンスの時にTwitterを見ると、いつもものすごいスピードで発表内容を吸収していそうな方です。
ここからもまた本当に学びに溢れていて、もうなんかビックリし倒しでした。
コードレビューって素晴らしいことだよ・・・(今更)(お前今まで何してたの?)

requireValue

「初期値もちゃんと入れてるしuiModel:LiveData<UiModel>の値はuiModel.value!!で取り出してエエやろ」と思って書いていた部分です。
そしたら「LiveData.requireValue()っていうの用意してるから使ってや」というコメントが届きました。ソッコーで従いました。

T.isEmpty()

SearchView.queryの値、nullんなってもエエっぽいしそのままSearchResult.query突っ込んどくか」と思って書いていた部分です。
しかしそこはやはり厳格なプログラミングをするべきということで、「データ側にisEmpty()用意して、そのあとsetQuery()しよか」というコメントが届きました。これまたソッコーで従・・・おうとしたんですが、ミスっていました。

なんとも有り難いことにレビュー結果としてサンプルコードを頂いていたんです。同時に大量のプルリクを見ているにも関わらず。
そのちょっとした書き間違い(UiModel側に実装しているが、使用側がSearchModel)と自分の見間違い(SearchModelに突っ込めばええんやな~たしかに~)が重なってしまい、

  • data class UiModel(val searchResult: SearchResult)
  • class SearchResult( ... )

このどちらにisEmpty()を実装するべきか不明確なまま、修正再コミットまで行ってしまいました。
本当にアホなことにコミット後にそれに気付き、改めてコメントをして「どちらが好ましかったですか?」と聞く始末です。
結果的には、幸いにもtakahiromさん的にもコミット済の内容が良さそうということだったのでそのままマージに至りました。

いやほんとなんとかなってよかったとしか言えません。安心しています。
というかメチャクチャ手間をかけていただきました。本当にありがとうございます。

英語

自分は本当にチキンだなということを含めて感じた内の一つの話ですが、
みんな無理矢理にでも頑張っていくところからやってるんだなと感じました。ええと、英語のことです。
どうやら、(あんまりちゃんとわかってないんですが)頑張って英語を使っていることによるコミュニケーションエラーもあったみたいなんです。少なくとも自分は間違いなく英語のほうが表現力落ちるし、そりゃあそうです。

ただ、それでも英語を使うんです。保険用の日本語なぞ添えんのです。

むすび

そして、今回は英語から上記の「無理矢理にでもやっていく」を感じたんですが、きっと開発の方もそうです。
まあよく言う話ですが、なんというか、もっとハードル低く考えてよいのかもしれません。
OSSコントリビュート、プルリクも、そうビビらずさっさと経験しろ、童貞を捨てろという話です。

自分に関しては本当にこれが苦手で、常々自責をしながらもなかなか変われない部分です。
今回は経験した内容もそうですが、内容を一切含まずに「経験したその事実」だけでも大きな一歩を踏ませてもらえました。

そしてその上で、ここまで語った通り、中身の経験も泣けてしまいそうなくらい良いものだったと感じています。
そういう意味では、プルリクもすんなり通らなくて良かったとさえ思います。

本当に良い経験をさせてもらえました。この先取り組めそう&余ってそうなIssueが残ってたりしたら、もうちょっと貢献できたらと思います。ありがとうございました。