iOSエンジニア向けOSS Forwardワークショップを開催しました

はじめまして!iOSの技術顧問をしている@giginetです。Money Forwardでは、2021年3月よりiOS分野の技術顧問を務めており、2〜3ヶ月に1度のペースで社内勉強会を実施しています。

あんざいゆき、三木康暉の両氏が、AndroidおよびiOSの技術顧問に就任|株式会社マネーフォワード
https://corp.moneyforward.com/news/release/corp/20210305-mf-press2/

技術顧問giginetさんインタビュー コミュニティ活動やOSS活動の秘訣を聞いてみました | Money Forward Money Forward Engineers’ Blog
https://moneyforward.com/engineers_blog/2021/09/15/giginet-san-interview/

普段は、WWDCの振り返りやSwift Concurrencyについてなど、iOS界隈の最新知見についてのキャッチアップが主な内容でしたが、先日、三田オフィスにて、iOSエンジニア向けにOSS Forward体験ワークショップを開催しました。

このワークショップは、日常の業務上の課題から、OSS貢献のためのネタ探しをして、実際にPull Requestを送ることを通して、今後OSS貢献のハードルを下げていくことを目的としています。

また、コロナ禍以来、集まる機会の少なかった、社内iOSメンバーの交流の意図もあります。
都内のオフィスはもちろん、普段は福岡オフィスで業務しているメンバーも一同に会して、チームビルディングを行いました。

講義パート

はじめに、今回のワークショップの趣旨や、PRを送るための手順やコツについて、講義を行いました。

講義では、このワークショップの意義についてお話ししたあと、実際に私が過去に送ったPRを見せながら、パッチの送り方や、Descriptionの書き方、動作確認やテスト手法について説明しました。

OSSに貢献するために、一番難しいのは、何を改善するかというネタ探しです。日常の業務で利用しているソフトウェアについて、機能要望があったり、不具合を見つけて改善するというのが一番モチベーションを持ちやすいですが、普段から課題発見をすることはなかなか難しいです。

今回は、OSS貢献までのフローをコンパクトに体験してもらうことを目的としているため、講師が予め有名OSSについて、取り組みやすいissueをいくつかピックアップしてきました。
また、講義では、貢献しやすいissueとは何か。マージされやすいPRはどのように作るのか、という、貢献の手助けになるような話題についてもお話ししました。

実装パート

講義はほどほどに、その後、各々課題を選び、改善に取り組みました。

各参加者は、事前に用意された有名OSSの取り組みやすいissueの他、各々が普段利用しているOSSを調べ、取り組みやすい課題を探していました。

私は、講師として、会場内をうろうろしながら、各々が選択した課題解決のアプローチについて提案したり、環境構築や、実装、テストについてペアプロを行いました。

メンバーの習熟度はさまざまで、過去にオープンソースにコミットしたことがあるメンバーの他、初めての人、ユニットテストの記述やデバッグ手法に不慣れなメンバーもいましたが、各々が、自分が取り組める範囲で課題に取り組んでくれました。
(Money Forwardのエンジニアの皆さんはとても優秀でした 😄)

成果報告パート

最後は成果報告会です。各参加者は、自分の取り組んだissueや、アプローチなどについて発表しました。

このワークショップの結果、実際に数名がPull Requestを送ることができました 🎉
いくつかご紹介します。

swift-argument-parserのエラーメッセージ改善

List valid options in error messages for enum array argument by konomae · Pull Request #445 · apple/swift-argument-parser
https://github.com/apple/swift-argument-parser/pull/445

プロダクト開発部の河島さん(@konomae)は、Appleが提供する、CLIからの引数を簡便に扱う方法を提供するライブラリ、swift-argument-parserの改善に取り組んでいました。

このissueは、String 型のenumを受け取るオプションにおいて、定義外の値が渡されたときのエラーメッセージを改善するものです。

$ mycommand –format hello
Error: The value 'hello' is invalid for '<format>'. Please provide one of 'json', yaml' or 'csv'.
Help:  <format>
Usage: mycommand <format>
  See 'mycommand --help' for more information.

このPR以前では、formatの値として、定義外の文字列(hello)が渡された際に、ヒントが表示されませんでしたが、この改善により、想定されるフォーマット(json, yaml, csv)のヒントが表示されるようになりました!

Apple標準のライブラリは、多くの開発者に利用されるため、非常に大きな成果となりました。
実装面では、候補が一定数より多い場合の表示方法の変更といった、境界条件を意識したユニットテストを実装でき、マージされやすいPRとなっていました。

河島さんのコメント

課題を選んでみたものの、一度も触れたことがないコードだったので、最初は何がどこで動いているか全くわからず、デバッガで動きを確認しながらどの辺りを修正すれば良いかを探りました。
調べていくうちに少しずつではありますが、コードへの理解が深まっていき修正箇所を特定できたので、期待される出力のテストを書き、本体コードを修正することができました。
普段なかなかOSSへのコントリビューションに取り組めていなかったので、貴重な体験になりました!

GUIライブラリ、Instructionsの表示位置設定の拡充

Add next label position by ong-yue-huei · Pull Request #273 · ephread/Instructions
https://github.com/ephread/Instructions/pull/273

プロダクト開発部のオンさん(@ong-yue-huei)は、iOSアプリにインストラクション用のUIを提供するライブラリ、Instructionの設定項目を拡張し、ボタンの表示位置を変更できるオプションを追加しました。

GUIライブラリは、テストケースの記述が難しいですが、Descriptionにスクリーンショットを添付するなど、マージされやすいPRを書くことを工夫していました。
また、課題発見も、普段業務で利用しているライブラリに着目し、業務課題を解決するissueに取り組めた理想的な例となりました。

オンさんのコメント

OSSのコントリビューションに挑戦するのは初めてなので、何から手をつければいいのか悩んでいました。最近使っているOSSを振り返ってみると、ある人が投稿した問題があり、それを解決できれば役に立ちそうな気がしました。 普段使っているOSSなので、全体的な解決イメージが湧きやすく、試行錯誤しながら、少しずつ解決への道筋が見えてきました!OSSコントリビューションに触れる良いきっかけになりましたし、良い経験でした!

他にも、XcodeGenやswift-algorithms, SwiftLintなど、各々がissueから新たな課題発見・貢献を行いました。

XcodeGenのSwiftPM対応におけるシンタックスの拡張
XcodeGenが生成するプロジェクトのファイルツリーソート順の改善
swift-algorithmsに新しいメソッドの追加
SwiftLintの特定ルールの誤判定を修正
URLスキーム用のルーティングライブラリ、CrossroadのmacOS対応
Material Components for iOSの不具合改善

3時間の作業時間では、惜しくもPRを送るところまでたどり着けなかったメンバーもおりましたが、各々が興味のあるプロダクトの実装を読んで、理解を深めたり、今後の貢献のための手応えを掴むことができました!

終わりに

今回のワークショップでは、いくつかのPRを通して、Money Forwardの皆さんがSwift、iOSコミュニティに貢献することができました 🥳
皆さまには、慣れないプロダクトの課題発見や実装にも前向きに取り組んでくださいまして、感謝しています。参加者の反応も上々だったと感じています😄

なにかとプロプライエタリな印象が強いiOS界隈ですが、近年のSwiftコミュニティは、Swift言語自体がオープンソースで開発されているほか、パッケージマネージャーやドキュメンテーションの仕組みが標準化するなど、急速にオープン化が進んでいます。
そんな中、iOS、Swift関連のOSSに貢献する方法を学ぶ機会はまだまだ少ないと感じていました。

貢献の経験がないと、とてもハードルが高いものに見えてしまいますが、実際は意外と簡単で、普段やっていることの延長で簡単に貢献することができる、と体感してもらうことができたと思っています。
私自身、いくつかのOSSのコミッターをしていますが、このような実践を通して、多くのエンジニアに「実は誰でもすぐにコミッターになれる!」という成功体験を得てもらいたいです。

このワークショップを通じて、iOSコミュニティに貢献する人が増えたり、Money ForwardのOSS Forwardがさらに盛り上がっていくことを願っています!


マネーフォワードでは、エンジニアを募集しています。
ご応募お待ちしています。

【会社情報】
Wantedly
株式会社マネーフォワード
福岡開発拠点
関西開発拠点(大阪/京都)

【SNS】
マネーフォワード公式note
Twitter – 【公式】マネーフォワード
Twitter – Money Forward Developers
connpass – マネーフォワード
YouTube – Money Forward Developers

Pocket