新卒入社2年目エンジニアがGitHubにAndroidのライブラリを公開してみて感じたこと | サイバーエージェント 公式エンジニアブログ


はじめましてー。 サイバーエージェント入社2年目のAndroidエンジニアな@magiepoohです!
業務ではもっぱらAndroidを書いています。(楽しい!)

@kakerukaeruさんに続き、アドベントカレンダー2日目を担当させていただきますーヽ(=´▽`=)ノ

現在、僕はAmebaFreshという動画サービスのAndroid版を開発中で、言語はJavaではなくKotlinを使っています。 Kotlinという言語について書き出すとアメブロの最大記事本文文字数(全角20,000文(半角40,000文字))を超えそうなので、Kotlinに関しては @satorufujiwaraさんや@AAkiraあたりがKotlinアドベントカレンダーに書くことを期待しつつ、全く別のお話を!!

今回はAndroidのライブラリを開発して感じたことや社内制度について、ざっくりと紹介できればなと思います!よろしくお願いしますー!

GitHubスターインセンティブ

サイバーエージェントにはGitHubスターインセンティブという制度があります。

GitHubスターインセンティブとは、エンジニアが自身のコードをGitHub(github.com)にオープンソースとして公開し、リポジトリのスター数に応じてインセンティブが得られる制度です。

インセンティブ内容としてはGitHubのスモールプランが会社負担になったりします。(さらに、スター数によってはもっといいことがあったり・・・!?)
個人的にインセンティブがあることによって、会社がGitHub活動を公に推奨してくれていることはとてもありがたい!と感じています。ヽ(=´▽`=)ノ

ライブラリを作ろうと思ったきっかけ

そもそもライブラリを作ろう(&公開しよう)と思うまでも、かなりのハードルがある気がします。僕の場合は今年の3月に会社の若手数人で行った14ピュアネイティブ強化合宿というものがきっかけです。

すごいスター数が付いているライブラリを公開している@wasabeefさんや@ogaclejapanさんを目指し若手でもなにか作ろうぜ!!というノリのものでした。

が・・・!!!
僕自身その時作ったものはとてもひどいもので本気で闇に葬りたいものができまして、、、完全な黒歴史というやつで惨敗でした、、、ほんとに(´;ω;`)

もちろん、参加者の中には2泊3日で素敵なライブラリを作った人もいましたので、一応チラッと紹介しておきますw
SAHistoryNavigationViewController
Transporter

ここで重要なのは、だいたい最初のアウトプットは闇ばっかりということですw
はじめから完璧なものを作りきろうとすると途中で投げ出したくなるかもしれないし、なかなか完成はしませんし、結局アウトプットができません。僕みたいに一度闇を味わってもいいじゃないですか!!w

とにかく、この合宿のおかげでライブラリを出すというハードルは個人的にはかなり下がりました。

自分が使いたいライブラリを思いつく

闇を生み出してから月日は流れ、とある実装をしていたときによりスタイリッシュに、より簡単に実装したいなという欲求が生まれました。
具体的には、RecyclerView(リストの行間)に線を引くときにデフォルトではできないし、指定した箇所だけさくっと線を引きたいというものでした。

そもそもライブラリってある問題に対してのアプローチ方法を提案するものだと思うんです。「〇〇が超絶めんどくさいから簡単にできるようにしてみたけど、どうかな?」くらいの。そういう点で自分の中でもっとこうしたいと思えるものを発見するだけで、ライブラリの種は見つけることができそうです。

公開してみた

で、さくっと作って公開してみました。

RecyclerItemDecoration

詳しくはREADMEに書いてあるのですが、各々のViewTypeに対して線を指定してやることができます。 個人的には問題点に対してコンパクトに解決できたライブラリだと感じています。

RecyclerView.ItemDecoration decoration = ItemDecorations.vertical(this)
                .first(R.drawable.shape_decoration_green_h_16)
                .type(DemoViewType.LANDSCAPE_TILE.ordinal(), R.drawable.shape_decoration_cornflower_lilac_h_8)
                .type(DemoViewType.LANDSCAPE_ITEM.ordinal(), R.drawable.shape_decoration_gray_h_12_padding)
                .type(DemoViewType.LANDSCAPE_DESCRIPTION.ordinal(), R.drawable.shape_decoration_red_h_8)
                .last(R.drawable.shape_decoration_flush_orange_h_16)
                .create();

demo

公開してみてよかったこと

ライブラリの公開方法

ライブラリの公開方法を学ぶことができます。ここでもbuild.gradleとの格闘が続きかなりハマりました・・・。
現在はかなり簡単になっているようなので、そこまでハマることはないかもしれません。

インタフェースを意識してコードを綺麗に書こうとする

一番大きいのはこれですね!!
ライブラリを使う人がどうやって使ってくれるかなということを想像して実装することによって、より綺麗なインタフェースを提供しなければいけないというプレッシャーが生まれます。 (普段の業務でももっと意識しろよといろいろな方に怒られそうですが・・w)

やる気が出る

僕が作ったライブラリにはIssueが1つしかついてませんが(笑)、そこでも感謝されるととてもありがたいものです。
作ってよかったなと感じることができます。

副次的によかったこと

先ほど、インタフェースを意識するとありますが、他のライブラリの実現方法がより気になりだしたりします。 たとえば、@kgmyshinさんのGoreinu(ライブラリ名とアイコンが素敵w)を見ていると

Goreinu.install(this);

と書くだけで動作します。

こういうライブラリを見るとどうなってるんだろ、自分だと思いつかないなーとかいろいろな感動を得ることができます。

そして、これ、超絶おすすめなんですけど、よくライブラリをウォッチしてスターしている人をフォローする!例えば、弊社のAndroidな人でいうと@wasabeefさんや@ogaclejapanさんをフォローしておくと自動的にキュレーションされるので、面白いライブラリを見つけやすくなりますw

まとめ:まだまだひよこなエンジニアだからこそ、どんどん公開していくべし!

コードの書き方を意識したり、情報に敏感になれるのでとりあえず小さいライブラリでも公開してみるのがまずはいいかなぁと! 最初から完全なものを作る必要もなさそうという感じでやってみると楽しいことに出会えます!


ってことで!つらつらと書いてきましたが、明日は@principia_caさん! (・・・・公式ブログってこと・・?ここのブログに誰かが書くってことかな??) あんまりよくわかってませんが!よろしくお願いします!!w

それでは、みなさん、よいエンジニアライフを~ @magiepoohでした~~ ヽ(=´▽`=)ノ