【20選】俺が唸ったOSS・GitHubリポジトリ!Web企業で働くエンジニア達に聞きました

さまざまな企業のエンジニア20人に、リポジトリの中から「これは素晴らしい」「他のエンジニアにもぜひ使ってほしい」と思うものを紹介してもらいました!

【20選】俺が唸ったOSS・GitHubリポジトリ!Web企業で働くエンジニア達に聞きました

GitHub上に存在するリポジトリや、その他の場所に存在するものまで、オープンソースソフトウェア(以下、OSS)は世の中に星の数ほど存在します。利便性の高さから世界中の開発者が利用していますが、反面その種類の多さから、どれを使ったらいいのかわからないという方もいるでしょう。

そこで本企画では、企業のエンジニア20人に、さまざまなリポジトリの中から「これは素晴らしい」「他のエンジニアにもぜひ使ってほしい」と思うものを紹介してもらい、その理由を解説していただきました。 使って便利なだけでなく、コードを読んで技術研鑽に活用するもよし。ぜひご一読あれ。

※各カテゴリー内では所属企業名の50音順に掲載。回答者は敬称略とする。

プログラミング言語・ミドルウェア

The Go programming language(ウエディングパーク・東和樹)

Go言語のリポジトリ。標準ライブラリやそれぞれのテストコードがあります。シンプルで標準ライブラリが整っているGo言語は、ライブラリのテストコードも内包しているのでリポジトリを見ると勉強になります。特に標準ライブラリのソースは、暗号化や通信周りなどのそもそもの実装を学べますし、ライブラリもシンプルなコーディングなので、分かりやすいです。Go言語のリポジトリはおすすめです!

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ならではと言えるのではないでしょうか。

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らしいソフトウェアということで一読をおすすめしたいソフトウェアです。

ライブラリ

FlexLayout(エウレカ・木村寛)

Facebook社が開発するクロスプラットフォームのレイアウトエンジンyogaを、Swiftから呼び出しやすくするためのライブラリ。yogaはiOS向けにObjective-CのAPIを公開しています。このままでも問題なく利用可能ですが、それをSwiftらしく記述できるようにyogaをラップしたライブラリがFlexLayoutです。

レイアウトの記述方法はCSSのFlexboxレイアウトと同様での使い勝手がいいです。また、C言語で実装されており高速なレイアウト処理が可能な点も魅力です。

iOSアプリ開発においてAutoLayoutの処理速度がボトルネックになっている場合、その解消法としてyogaの利用は有効です。PairsのiOSアプリ内でも部分的に利用することで高速化を実現しています。

Nuke(サイバーエージェント・伊藤恭平)

画像のロードとキャッシュを管理してくれるライブラリ。必要最小限の機能だけが備わっており、機能の拡張や置換も設計が綺麗なため行いやすいです。ソースコードを読むだけでも勉強になるのでおすすめです。

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が読みやすく簡潔に記述されているため、導入が容易です。

big-list-of-naughty-strings(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もあるので、スケールする構成も作りやすいです。

Netty(マネーフォワード・中出匠哉)

多くのOSSの内部で使用されているイベントドリブンな非同期通信フレームワーク。内部実装を読み解くことでスループットを向上させたりイベントドリブンな処理を実現するための仕組みを理解できる点がおすすめです。またJavaのコードなのでnodeなどよりは読みやすい印象があります。

便利機能

Fastladder(ピクシブ・高山温)

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く