【20選】俺が唸ったOSS・GitHubリポジトリ!Web企業で働くエンジニア達に聞きました
さまざまな企業のエンジニア20人に、リポジトリの中から「これは素晴らしい」「他のエンジニアにもぜひ使ってほしい」と思うものを紹介してもらいました!
GitHub上に存在するリポジトリや、その他の場所に存在するものまで、オープンソースソフトウェア(以下、OSS)は世の中に星の数ほど存在します。利便性の高さから世界中の開発者が利用していますが、反面その種類の多さから、どれを使ったらいいのかわからないという方もいるでしょう。
そこで本企画では、企業のエンジニア20人に、さまざまなリポジトリの中から「これは素晴らしい」「他のエンジニアにもぜひ使ってほしい」と思うものを紹介してもらい、その理由を解説していただきました。 使って便利なだけでなく、コードを読んで技術研鑽に活用するもよし。ぜひご一読あれ。
※各カテゴリー内では所属企業名の50音順に掲載。回答者は敬称略とする。
プログラミング言語・ミドルウェア
The Go programming language(ウエディングパーク・東和樹)
Go言語のリポジトリ。標準ライブラリやそれぞれのテストコードがあります。シンプルで標準ライブラリが整っているGo言語は、ライブラリのテストコードも内包しているのでリポジトリを見ると勉強になります。特に標準ライブラリのソースは、暗号化や通信周りなどのそもそもの実装を学べますし、ライブラリもシンプルなコーディングなので、分かりやすいです。Go言語のリポジトリはおすすめです!
- 回答者:株式会社ウエディングパーク 東和樹(技術ボード)
- 主な運営サービス:Wedding Park、Photorait、Ringraph、DRESPIC
The Go programming language(はてな・大坪弘尚)
プログラミング言語Goのソースコードリポジトリ(のミラー)。コンパイラ、標準ライブラリ、ツールセットが含まれています。Goは表現力や言語機能を比較的抑えている言語で、その分だけイディオム的な書き方が基礎知識として求められるところがあります。Goのコアメンバーがコミットしているソースコードを読んでいくことで、正しい、とは言わないまでも好ましい書き方が学べ、Go的なスタイルが自然と身に着いていきます。読みにくいソースコードではないので、Goを普段書かない人にも楽しめるのではないかと思います。
Kotlin(コネヒト・富田健二)
プログラミング言語「Kotlin」のリポジトリ。Kotlinとは、IntelliJ IDEAで有名なJetBrainsが中心となって開発したJVM言語です。このリポジトリにはKotlinのコンパイラや標準ライブラリだけではなく、Kotlinに関連するIDEのコードフィックスやコード検査なども含まれています。
つまり、IntelliJ IDEAやAndroid Studioを使ってKotlinコードを書くとコードの改善すべき点を指摘してくれるため、Kotlinらしいコードが書きやすくなるということです。例えば、Pull Requestでコードレビューをする場合に「こっちのほうがきれいに書けます」と指摘を受けたり指摘をしたりする場合がありますが、IDE上でそのコミュニケーションを事前に防げるという点が素晴らしいと思っています。
これらの機能は、Kotlinリポジトリのinspection、intention、quickfixなどで実装されていますので、コードを読んでみると面白いかもしれません。また、Kotlinリポジトリの特徴として、KotlinのGitHubリポジトリ上にIssuesタブが存在しないことが挙げられます。
Kotlinを開発したJetBrainsの資源にYouTrackというIssue管理ツールがあるのですが、Issueを管理しやすくするため、あえて自社ツールを使っている点もKotlinならではと言えるのではないでしょうか。
- 回答者:コネヒト株式会社 富田健二(Androidエンジニア)
- 主な運営サービス:ママリ(iOS版)、ママリ(Android版)
Apache httpd(Supership・山崎大輔)
{$image_1}The Apache HTTP Server Project
ApacheプロジェクトのHTTPサーバー。最近のソフトウェアのソースコードの流れとして、小さなコア部分と機能別のモジュール群で構成されているということがあると思います。
Apache httpdはコア部分と各リクエストフェーズでフィルタのごとく実行されるモジュールの集合体として実装されており、(1)小さいものは美しい(Small is beautiful)、(2)各プログラムは1つのことをうまくやるように(Make each program do one thing well)、(3)すべてのプログラムはフィルタとして振る舞うように(Make every program a Filter)、などのUNIX哲学を意識して作られている点や、インターネットとともに歩んできたという歴史も含め、実にUNIXらしいソフトウェアということで一読をおすすめしたいソフトウェアです。
- 回答者:Supership株式会社 山崎大輔(取締役CTO)
- 主な運営サービス:ScaleOut DSP、Ad Generation(アドジェネ)、nanapi、Supership Search Solution(S4)
ライブラリ
FlexLayout(エウレカ・木村寛)
Facebook社が開発するクロスプラットフォームのレイアウトエンジンyogaを、Swiftから呼び出しやすくするためのライブラリ。yogaはiOS向けにObjective-CのAPIを公開しています。このままでも問題なく利用可能ですが、それをSwiftらしく記述できるようにyogaをラップしたライブラリがFlexLayoutです。
レイアウトの記述方法はCSSのFlexboxレイアウトと同様での使い勝手がいいです。また、C言語で実装されており高速なレイアウト処理が可能な点も魅力です。
iOSアプリ開発においてAutoLayoutの処理速度がボトルネックになっている場合、その解消法としてyogaの利用は有効です。PairsのiOSアプリ内でも部分的に利用することで高速化を実現しています。
Nuke(サイバーエージェント・伊藤恭平)
画像のロードとキャッシュを管理してくれるライブラリ。必要最小限の機能だけが備わっており、機能の拡張や置換も設計が綺麗なため行いやすいです。ソースコードを読むだけでも勉強になるのでおすすめです。
- 回答者:株式会社サイバーエージェント 伊藤恭平(SUPERCHOICE事業部 iOSエンジニア)
- 主な運営サービス:AbemaTV、AWA、アメブロ
lazy-static(Retty・Yuta Sakata)
Rustに遅延評価なstatic変数を定義できるマクロを追加するライブラリ。このライブラリをおすすめしたい理由は3点あります。
まず実用性がすごい点です。コーディングをするうえで、静的で不変な辞書やベクトルを定義したい場面はよくあります。しかし、Rustではstaticあるいはconstなラベルには、ランタイムでないと値が確定しないようなExpressionは代入できないため、辞書やベクトルのようにちょっと込み入ったデータ構造をstaticな変数に対して素直に代入できません。
このライブラリで追加されるマクロを利用すると、高い可読性を保ったまま、ランタイムに遅延評価されるstatic変数を定義できます。非常によくあるケースのため、それを簡単にしてくれるこのライブラリの実用性はとても高いです。
次に利用者への気配りが感じられる点です。このマクロでは、変数宣言の前にref修飾子を書かなければいけませんが、これを書くことで、使う側はその名前の変数には参照として扱える値が束縛されていることを意識できます。同等の機能を実装するのにref修飾子をつける必要がないことから、ref修飾子は作者からの気遣いであることが分かります。
最後に魅力的な実装がなされている点です。このライブラリはざっくり言うと、変数と同名のstaticに代入できるほど単純な構造体を宣言して、その構造体にDerefトレイトを実装することでdereference演算子をオーバーロードし、初めてdereferenceされたときにマクロに渡されたExpressionで内部を初期化し、それ以降はそのExpressionの評価値を返す、という実装がされています。
なかなかトリッキーな実装ですが、それが綺麗に隠蔽されており、利用者が実装の中身を意識することがほぼないのは素晴らしいことです。ロジック自体はとても短く読みやすいですが、読んでいるといろいろな発見がある、楽しい実装になっています。読んで楽しい、使ってうれしい、おすすめのオープンソースライブラリです。
開発効率向上
ansible_spec(スタディスト・北野勝久)
AnsibleのconfigをパースしてServerspecからも利用できるようにするgem。AnsibleとServerspecの設定ファイルの一部を共通化することで、ディレクトリ構成を美しくできます。また、READMEが読みやすく簡潔に記述されているため、導入が容易です。
- 回答者:株式会社スタディスト 北野勝久(SREチームリーダー)
- 主な運営サービス:Teachme Biz
big-list-of-naughty-strings(SmartHR・芹澤雅人)
入力されると不具合が生じる可能性のある文字列のリスト。ほとんどのアプリケーションはユーザからテキスト入力をしてもらう箇所があると思いますが、そこには常に脆弱性が付きまといます。人力でテストするのは結構シンドイので、ここにあるリストを使っていい感じに自動テストできるといいですね!また、リストを眺めるだけでも「こういうところでバグるのか~」という気付きが得られます。
- 回答者:株式会社SmartHR 芹澤雅人(VPoE)
- 主な運営サービス:クラウド人事労務ソフト「SmartHR」
通信処理
embulk(ジモティー・橋本吉治)
バッチ型の並列データ転送ツール。Fluentdのバッチ版と言ったほうがわかりやすいでしょうか。embulkは、JavaとRuby(JRuby)の2つの言語で開発されている、いわゆるpolyglotなプロダクトです。
polyglotでの開発が難しいのは、開発側が複数の言語を利用しなければならないので、それなりのスキルセットが要求されることです。一方で、利用する言語の長所を活用してプロダクトを作れるのはpolyglotな開発の良い点です。その意味で、embulkはJavaのカッチリしたところと性能面での長所を活かしながら、Ruby(JRuby)が持つ言語としての柔軟性やプログラミングの楽しさを活かしたプロダクトといえます。
開発元のTreasure Data社にはpolyglotな開発に耐えうるスキルフルなメンバーがそろっており、ソースコードもきちんと整理されています。そしてなにより、数多くの人に利用されるプロダクトでもあります。以上の点から、ソースコードの面でも、polyglot開発な面でも、オープンソース開発の進め方の面でも、良いお手本になるプロダクトではないでしょうか。
socket.io(SHOWROOM・佐々木康伸)
リアルタイムアプリケーションフレームワーク。WebSocketやpollingを利用したリアルタイム通信周りの処理を隠蔽化してくれて、処理を簡単に書けるようになります。サーバーだけでなくiOSなどのクライアントライブラリもあるので、さくっとリアルタイム通信の処理が必要なアプリを作りたいときに便利。redisのadapterもあるので、スケールする構成も作りやすいです。
- 回答者:SHOWROOM株式会社 佐々木康伸(CTO)
- 主な運営サービス:SHOWROOM
Netty(マネーフォワード・中出匠哉)
多くのOSSの内部で使用されているイベントドリブンな非同期通信フレームワーク。内部実装を読み解くことでスループットを向上させたりイベントドリブンな処理を実現するための仕組みを理解できる点がおすすめです。またJavaのコードなのでnodeなどよりは読みやすい印象があります。
- 回答者:株式会社マネーフォワード 中出匠哉(執行役員 CTO)
- 主な運営サービス:マネーフォワード、MFクラウドシリーズ
便利機能
Fastladder(ピクシブ・高山温)
Fastladderは2008年にLivedoorが公開したLivedoor Readerのオープンソース版です。2014年にLivedoor Reader終了騒動があったので思い出して見てみると、コミュニティメンバーの手によって活発に開発が続けられており、きちんとRailsのバージョンも上がっていたり、Herokuにワンクリックでデプロイできるようになったりしていました。長い間、Livedoor Reader/Fastladderにお世話になった人間として、とても感慨深かった印象があります。
- 回答者:ピクシブ株式会社 高山温(執行役員CTO)
- 主な運営サービス:pixiv、pixivコミック、BOOTH、pixivFACTORY、pixiv Sketch、Pawoo、ImageFlux
Apache Lucene/Solr(ビズリーチ・菅谷信介)
検索に関連する機能群を提供するリポジトリ。検索関連のさまざまな機能が含まれていますが、そのなかでもorg.apache.lucene.analysisパッケージのテキスト解析を紹介します。
検索システムを構築するときやテキストデータを機械学習で扱うときには、形態素解析などで文を適切な単位に分割する必要があります。Apache LuceneではAnalyzerという実装群が提供されており、実装を組み合わせることで柔軟なトークナイズを実現できます。また、独自の実装も追加できるので、たとえば「千円」を「1000円」に正規化して扱うフィルタもAnalyzerに差し込むことが可能です。
コードレベルの実装についても、AnalyzerはCharFilter、Tokenizer、TokenFilterの3つの実装で構成され、テキストを効率良く処理できるものになっています。一度マスターすると、自由自在にトークナイズができるようになるので、全文検索や機械学習に関わる機会がある方にはおすすめです。
- 回答者:株式会社ビズリーチ 菅谷信介(AI室チーフサイエンティスト、Apache PredictionIO、Apache Portals、Fessなどのコミッター、『Fess入門」などのWeb連載記事の著者)
- 主な運営サービス:ビズリーチ、キャリアトレック、HRMOS、スタンバイ、ビズリーチ・サクシード、ビズリーチ・キャンパス、ニクリーチ、BizHint
fuse-box(BASE・右京和馬)
マイブームのリポジトリで、WebPackやBrowserifyに代表される、いわゆるモジュールバンドラーです。他のものに比べて高速に動作する点が特徴。TypeScriptが好きな人におすすめで、コードもTypeScriptで書かれています。普段はツールとして利用しているコードの世界をのぞいてみませんか?
機械学習
scikit-learn(ウォンテッドリー・丹治信)
Python機械学習の有名なライブラリでいろいろなアルゴリズムが入っています。機械学習で行うことが一通りそろっていて、古典的な機械学習の手法であれば、何も考えないでデータを入れれば試せます。リポジトリを眺めていると、機械学習でどんな手法があるか概観できるのです。
- 回答者:ウォンテッドリー株式会社 丹治信 (Wantedly People エンジニア)
- 主な運営サービス:ビジネスSNS「Wantedly」、「Wantedly People」
chainer(VASILY・中村拓磨)
(1)抽象化してくれる ディープラーニングの学習スクリプトを書くうえで、イテレーションやロギングなど本質的でない部分をほとんどすべて肩代わりしてくれます。他のディープラーニングフレームワークと比較しても抽象化の機能は充実していると思います。
(2)コードが読みやすい オリジナルのネットワークを実装しようとすると、どうしてもfunctionの実装を確認する必要があります。chainerはコードが綺麗で機能がすぐに確認できる点が優れていると思います。自前の関数を実装する際も既存の実装が非常に参考になります。
- 回答者:株式会社VASILY 中村拓磨(開発部データサイエンスチーム テックリード)
- 主な運営サービス:IQON
リンク集
awesome-ruby(トレタ・酒井宏)
素晴らしいRubyのライブラリ(gem)やフレームワーク、Rubyで記述されたツール、ソフトウェアなどのリンク集。Rubyでのソフトウェア開発の“今”がここからたくさん辿れます。このリポジトリだけでも、ごはん3杯は簡単にいけます。
awesome-ruby(メドピア・福村彰展)
Rubyの素晴らしいライブラリやツールなどがまとめられているリポジトリ。数あるRubyの素晴らしいコードが技術ごとにカテゴライズされており、何を採用すればよいのか迷ったときや新しい技術を勉強する際に、どういうものがあるのかを、ある程度網羅的に知ることができます。
- 回答者:メドピア株式会社 福村彰展(執行役員CTO)
- 主な運営サービス:MedPeer、first call、ダイエットプラス
Deep Learning Papers Reading Roadmap(フューチャースタンダード・金田卓士)
深層学習の論文をまとめたリポジトリです。基本的な事柄を説明したレビュー論文から手法や応用の論文まで、わりと良くまとまっています。
深層学習の研究の進捗は早く、日進月歩で論文が発表されます。自分が業務で関わっている画像解析以外の分野をリサーチする場合は、何から手をつけたらよいかわからないことも多いのですが、そんなときに役立っています。
- 回答者:株式会社フューチャースタンダード 金田卓士(Chief Analytics Officer)
- 主な運営サービス:映像解析プラットフォーム SCORER
おわりに
優秀なプログラミング言語や便利な機能を持つもの、読むだけでも勉強になるものなど、さまざまなリポジトリが挙げられました。珠玉のツールの数々をぜひ日々の開発に活かしてみてください。
編集:中薗昴、八鍬悟志(サムライト)