┗┐<(՞ਊ՞)>┌┛

プログラミングとミニクーパーS(F56)とバイク(セロー)と酒のブログ

iOS「ミュージック」で再生中の楽曲情報をシェアするアプリ「The Playing」をリリースしました

iOS の「ミュージック」アプリで再生中の楽曲情報を「タイトル、アーティスト名、アルバム名、アートワーク」という構成でシェアできるアプリをリリースしました。いわゆる「ナウプレ」アプリです。

The Playing

The Playing

  • Ryo Kitamura
  • ミュージック
  • 無料
apps.apple.com
f:id:funnelbit:20200527110325p:plain

iOS 13.5 以上で動作します。

開発のモチベーションとしては、すでにたくさんの便利な「ナウプレ」アプリが世の中にあるのですが、Twitter にシェアするには認証情報を渡さないといけないのがネックに感じていました。また再生ボタンなどいろんな機能がついていて、シェアだけをしたいという用途にはいささかオーバスペックかなあと思っていて、とにかくシンプルなアプリがほしいと感じていました。

そこで、iOS にもともと備わっている「Share extension」を利用し、好きなアプリに楽曲情報を渡す設計にすることで(例えば Twitter にシェアしたければ Twitter アプリを利用する)認証云々を抜きにしたシェアを可能にしました。これによって、メモ帳に聴いている曲を「タイトル、アーティスト名、アルバム名、アートワーク」という構成で記録していくとか、メールや Slack に共有するとかも可能になっています。

アイコンはイラレでさっと作りました。このアプリはそんな大それたものではなく文房具みたいなものだと思っていて、シャープペンシルとか、鉛筆とか、そういった地味な存在ということにしたかったので、あまり主張しない地味な色味にしています。

コードは SwiftUI で作られています。

これから必ず伸びる日本酒(というか既に割と伸びてる)光栄菊の紹介

光栄菊は杜氏「山本克明」さんによって作られている日本酒である。

かつて愛知で「菊鷹」という日本酒を作っていた。いわゆるプレミアム酒ほどの知名度は無いが味は素晴らしく、ファンが大勢居た文句なしの銘酒である。4号瓶がなく一升瓶しか無いためになかなか家庭では買うことが出来ず(でかすぎて冷蔵庫に入らない、入っても大きすぎて家族に怒られるなど)、店でのみ楽しんでいた酒飲みも多いことだろう。メニューにあれば必ず頼みたい一本であった。

ところがある日、日本酒界に衝撃が訪れる。それは「菊鷹は終わる。山本杜氏が菊鷹を作るのをやめる。蔵をやめるらしい」というもの。

多くのファンが悲嘆に暮れた。「菊鷹」の味は「菊鷹」でしか飲めない。正直他の酒とソコソコ似た味の別の酒というのはあったりする。しかし「菊鷹」はこれまでの飲酒人生から代替品を導き出すことが出来ない。確固たる地位なのである。多くの人間がそう思っていたであろう。

最後の菊鷹ロットも発表され、もはやこれまで、現存する菊鷹を大事に飲もう、誰もがそう諦めかけていたその時、再び日本酒界、激震。

「山本杜氏が佐賀の蔵で酒造りを始めるらしい」

え?ほんとか!!でもなんで佐賀??という疑問は誰もが持ったことだろう。しかし再び作ってくれるとなれば我々からとしてはどこでも良い。願ったり叶ったりである。菊鷹ファン歓喜、各飲み屋、酒屋も仕入れに向けアップを始めていたに違いない。ちなみになぜ佐賀なのかというと、佐賀で休止していた蔵を復活させた、とのことである。

headlines.yahoo.co.jp

そして去年の暮れ、ついに山本杜氏の新作にありつくことが出来た。それが光栄菊であった。

優しいオリの風味、そこそこどっしりとした酒のボディ、爽やかな程よく熟れたグレープフルーツのような香りと酸味。それらが上手くまとまり、一度に押し寄せる。余韻も心地よく、ソコソコ重いはずの味わいが徐々に引いていくことで「もう1杯、もう1杯...」と杯が進んでしまう。

バランスが良い、とはまた違う。各部分が個性的なのになぜかまとまっているという印象を受ける。バランスの良い酒といえばやはり 新政No.6 があるが、新政がどんな人にも好かれる優しい優等生との心地よいおしゃべりタイムだとすると、光栄菊は尖ったバンドメンバーがそれぞれ好きなことをしてるが息のあっているオルタナティヴを聞いている、そんな酒であると感じる。

流行りに敏感な日本酒好き飲み屋には置いてるっぽいので、見かけたら飲んでみてほしい。

2019年京都サイゼ飲み最前線

格安で飲める「サイゼ飲み」は数年前から話題となり、静かなブームとなった。その後サイゼリヤに続く形で「びくドン(びっくりドンキー)飲み」「バーミヤン飲み」など、ファミレスでの飲酒事例が続いている。昨今では一時期ほどのブームはないが、ファミレス飲酒行為は一定の市民権を得ていると言って良い。

ところで僕は京都に住んでいるのだが、京都の人間がサイゼ飲みをするならどこが良いだろうか?それは「京都四条烏丸」一択であると断言して良い。なぜかというとこの店舗は京都唯一の「ワインが豊富」サービス実施店舗だからである。このサービスを行っている店舗は通常のサイゼリヤとは異なり特別なワインリストが用意されていることを表している。そもそもサイゼ飲みが流行した背景にはこのワインリストの存在があり、それを体験できるのは京都だとここだけなのである。

ワインサービスがあるかどうかはサイゼリヤ公式ホームページで検索できる。店舗リストの各行の最後に「ワインが豊富」というマークが有る店舗が該当する。

www.saizeriya.co.jp

今回チョイスした店舗は京都市営地下鉄四条駅にアクセスする途中にある。飲んだあとにもすぐに電車に乗れるという異常なまでの好立地である。

噂のワインリストの今

さて、なにはともあれワインである。ワインサービス提供店ではワインリストが存在しており、店員に「ワインリストください」というと奥からリストが出てくることから裏ワインリストとも呼ばれていた。だが現在(もしくはこの店舗のみの事情かもしれないが)では普通にワインリストが席に備えられている。

ポップなデザインでレギュラーメニューの顔をしているためもはや裏な感じはない。念の為店員に聞いてみたがこれだけとのことであった。ラインナップも昔ほどないようである。少し残念だが致し方ない。とりあえずこの中で一番高い赤ワインを頼んでみる。

レアレとかいうやつがきた。ここはファミレスなので頼んだワインについて教えてくれる人間がいない。メニューとラベルがすべての情報である。詳細が不明。 飲みまくって破滅したい場合は「マグナム」を注文するとよいだろう。1.5リッターで1100円という破格である。狂っていると言って良い。

安ラインナップに紛れる高級フード

食べ物については、まず「エスカルゴのオーブン焼き」。399円。それとフォッカチオ。199円。

エスカルゴのオーブン焼きはアヒージョみたいなやつでパンを付けて食べるのをすすめる。フォッカチオが意外に美味しい。目隠しして食べたら誰も199円だと思わないであろう。

さて、現在(2019/12/21)サイゼリヤではとある目玉メニューが話題である。一つは「あったか具だくさんポトフ」でもう一つが「アロスティチーニ」である。どちらも食べたかったのだがポトフは売り切れてしまったため、「アロスティチーニ」のみ注文。 「アロスティチーニ」は399円する。焼き鳥屋ではそれでも安い気がするがここはサイゼリヤなので量を考えると富豪の食べ物である。サイゼリヤには「ハンバーグステーキ」があるがそれと同じ値段ということを考えると強気の価格ということがわかるだろう。学生の頃は間違いなく選ばなかった一品だが、いまや社会人となった僕にとってはもはや恐れるに足りない。一緒についているスパイスはクミンのような味がする。つけて食べるとなかなかうまい。ちょっくらジャンキーな味だがそれが逆に良かったりするのだ。

「フリウリ風フリコ」。299円。フとリが多い。ポテトグラタンのような料理である。ワインとチーズは確実に合うのであると嬉しい一品。

「ハンバーグステーキ」399円。スパム(英語: SPAM)のような味がする。手放しにうまいと言える品ではないが、399円で肉の塊、ポテト、目玉焼きが食べることができるのは大きい。

会計は?

今回の会計である。意外と高いと思ったかもしれないがボトル一本頼んでいることを思い出していただきたい。またこの価格は二人分であるために2で割れば2100円程度である。ボトル一本頼んでこの価格は驚異的と言える。

また安さは勿論だが、以下の点もメリットとして上げることができよう。

  • 席が広い
  • 大体冷凍なのでやたらと早くフードが来る
  • 子どもも入店可能

勿論所詮はファミレスなのでフードは手放しに美味い!!とは言えないが、ファミレスで飲むというエンタテインメント性には惹かれる方は多いのではなかろうか。また社会人になってから行くと富豪プレイができて愉快である。気軽に行けるので、興味のある方はぜひ体感してほしい。あと他にも面白いファミレス飲みがあればぜひ聞かせてもらいたいところである。

2019/12/24 追記

サイゼリヤがサイゼリバーミヤンがバーミンになってので修正しました。申し訳ない。許してほしい。

ブラウザで開きっぱなしのお店、観光情報ページを保存する iOS アプリ「トコロバコ」をリリースしました

タイトルの通り、開きっぱなしのお店、観光情報を保存する iOS アプリ「トコロバコ」をリリースしました。

f:id:funnelbit:20181202140848p:plainf:id:funnelbit:20181202140841p:plain

立ち飲み屋やら旅行やらが好きなので、よくウェブで情報を検索するのですが、その後にページを開きっぱなしにしていました。行くかもよくわからない場所をブックマークに入れるには大層な気もするし、メモするにしても書くのもその後探すのも面倒くさくて、それだったら開きっぱなしでいいや、と思ってたんですよね。

ところがそんなことをしてるとどんどん開きっぱなしのページが増えていって、閉じたいのですが、一応また見るかもしれないから置いとくか、となってしまい、結局そのままになるという状態でした。

「じゃあ簡単にメモできるアプリを作るか〜」と思って作ったのがこのアプリになります。ページを保存できるだけではなく、もしも住所がページ内にあれば、住所の候補として表示。保存時に選択できます。アカウントも必要なく、アプリを開いたらすぐに利用できます。

まだ作りが甘いところもあるのでこのタイミングで出すのか悩みましたが、そんなことをしているといつまで経ってもリリースできませんので、まずはリリースを優先しました。今後は少しずつ改良を加えていく予定です。

よろしくおねがいします。

https://itunes.apple.com/us/app/%E3%83%88%E3%82%B3%E3%83%AD%E3%83%90%E3%82%B3/id1443138701

クーパーで富山の立山にいった

ずっと行こうと思っていた富山に(ついに)行ってきました。目指すは立山のみくりが池。あと地元のうまそうな酒とアテ、更に現地に住んでる友人です。

僕は京都から出発ですので、高速を使うのであれば最も早いのは高速の 名神 -> 北陸 のコースです。若干遅くてもいいから高速代を浮かしたいのであれば、湖西道路を使っても良さそうですね。道のりの交通状況としては、名神はちょっと混んでる、北陸に入ったらガラガラという感じでした。


休憩は2回ほど。これはそのうちの一つ。どこかは忘れました...

立山

とりあえず一直線に立山駅に向かいました。この先、車は進入禁止なので、ここで電車に乗り換えます。

やたらきれいな川が駅の近くにあります。

透明度が凄まじいです。

立山駅からみくりが池に行くまでには

1. 立山駅からケーブルカーに乗って美女平駅まで行く(一駅)
2. 美女平駅からバスに乗り換えて室堂駅まで行く(幾つか駅がありますが、室堂駅までの直通バスが用意されています)
3. テクテク歩いてみくりが池まで行く(10分ぐらい)

というステップを踏む必要があります。また切符についてですが、ケーブルカーとバスを別に買わなくとも、立山駅で全て一緒くたになった切符が販売されています。更には折り返しの分も含めることが出来るので、切符一枚で済みます。

↑ 購入する切符の行き先は「室堂駅」になります。

ケーブルカー乗り場はこんな感じ。平日なのですが結構人がいました。


美女平駅 ~ 室堂駅

ここからはバスに乗り換え。うまいこと乗り換えられるようにダイアが設定されています。バス内では飲食はできないので注意してください。

車内では観光案内ビデオが流されており、要所毎に簡単な解説がなされるようになっています。また見どころスポットではバスが徐行したり、一時的に止まったりしてじっくり見れるようになっています。

はじめはただの山の中だなって感じなのですが、段々と景色が変わりはじめて...


高原らしい景色になり...


普段ではまずお目にかかれない山々が現れます。

室堂駅 ~ みくりが池

駅を出てすぐの場所で、既に素晴らしい景色が広がっています。写真では雲が多くかかっていて少し見づらいですね。

ここからテコテコ歩いていきます。

古代遺跡の道みたいなのが用意されているので、スニーカーでも簡単に歩けるのがありがたいですね。ちなみに9月の終わりですが既にかなりの寒さです。半袖で行ったら凍えること間違いなしです。

まだまだ雲が多い。果たしてきれいなみくりが池は見れるのか....

みくりが池

うおー!!美しい!!

この池は結構広く、正面から撮ろうとすると iPhone では収まらないほどです。

雪もちょっと残ってますね。

文句なしに美しい風景です。池に山々が映っているのがなんとも言えないですね。

ちなみに火山活動も活発なようで

こんな感じで煙がモクモク上がっている箇所があります。

見ごたえがある風景ですが、近づくと硫黄の匂いが凄いです。

他にも池が。

良いですね〜。

よく見ると人も写っているので、雄大さが伝わりますかね。

いつまでも見ていたくなる風景がそこらかしこにあります。



っと喜んでいると雲行きが怪しくなり始め...


↑わかりにくいですが恐らく雲の中にいます。

雨具もってないと危険そうな雰囲気になってきたのでそそくさと退散しました。

富山市

さて、富山に来たとなれば、地酒と海の幸を堪能せずにはいられません!ということで飲み屋に向かいます。ちょっと時間があるので市内を散歩してみました。


観光用の船でしょうか?京都では伏見にも同じようなものが有りますね。


圧倒的な数のカラスです。


路面電車!!観光用ではなく、れっきとした生活用路面電車のようです。


ここ、環水公園は地元の友人に案内してもらったのですが、カップルが良く訪れるデートスポットらしいです。奥に見えるレーザー?みたいなのは赤い糸を表したものなのだとか。


この噴水は綺麗ですね!


近づいて撮ると大雨にしか見えない写真になってしまいます。



そうこうしてると良い時間になったので飲み屋に移動。


分厚い....京都市内だとここまで分厚い刺し身は全然見ないですね。流石海が近い街といったところでしょうか。鮮度も良く、歯ごたえもしっかり。

また清酒については風の盆、吉乃友、林、千代鶴、勝駒など、関西ではなかなかお目にかかれないであろう銘柄をおもう存分堪能できました。どれも素晴らしかったですね...全体的に辛口テイストなのですが、いたずらに辛口というのではなく、ちゃんと清酒ならではの米の旨味や香りを引き出し、キレる辛口。僕が勝手に「モダン辛口」と呼んでいるものです。この街ではこういうテイストが普通っぽいので、現地の方からすればモダンでもなんでもないですねw

他にも色々アテを頼みましたが何でもかんでも美味かったです。何よりも友人と飲めたのが嬉しかったですね。気の合う友人と飲むお酒は、どんな美酒にも勝る価値があるものです。



京都の中心から富山までは大体車で4~5時間で到着できるので、もっと気軽に行っても良いかもな、と思いました。電車だと3時間ぐらいでいけますし。次は黒部ダムの方に行ったり、酒蔵を周ったりしてみたいですね。

おまけ

お土産をいただきまして

これが勝駒ってやつか!!

うお〜〜!!

良いですね〜〜。

ありがたく飲ませていただきます(多分今月中に)!!

七賢を醸す山梨銘醸の蔵開きに行った

山梨銘醸は毎年この時期になると蔵開きを開催します。僕は京都に住んでますので、中々行くことができなかったのですが、今回東京出張のタイミングと蔵開きのタイミングがたまたま重なり、さらに友人が車で連れて行ってくれると言うことで、念願の初参加が叶うこととなりました。

f:id:funnelbit:20170312174336j:image

うおおおこれが七賢!杉玉がめちゃくちゃ大きい!

 f:id:funnelbit:20170313164119j:image

駐車場から移動してすぐの所に受付があります。ここでは試飲の受付の他、蔵見学の受付も行なっています。僕は時間がなくて諦めました。蔵見学はすぐに埋まるので早い目に受付した方が良いです(別料金で500円だったかなと思います)。

 

f:id:funnelbit:20170312174845j:image

1000円で試飲コーナに置かれている全てのお酒と、高級酒の試飲ができる券、それを注ぐためのお猪口、あとはお土産用の日本酒が貰えます!

 

f:id:funnelbit:20170312174901j:image

お土産用の純米大吟醸酒

 

 f:id:funnelbit:20170313164130j:image

派手なアート壁の横に小さなドアがあり、ここが試飲会場の入り口です。

 

f:id:funnelbit:20170313164153j:image

中はこんな感じ。ナンバリングがされています。このナンバー、いくつあるのかと言うと17ぐらいあったと思います。つまりなんと17種類ほど飲めると言うことです。此処にない5つに加えて2つのお酒は高級酒でここにはなく、高級酒コーナにてチケットと引き換えになります。

 

f:id:funnelbit:20170313164806j:image

 注目は蔵開きでしか取り扱わない蔵出しシリーズ。通常版と一年熟成版があります。本醸造でたまに感じるネガがない、よくできた一品でした。

 

f:id:funnelbit:20170313172448j:image

一応「一人一杯」が存在しない(もちろん、闇雲に飲み続けるのはマナー違反かと思います!)ので、注意しないとあっという間に飲み過ぎてしまいます。少量ずつ、チビチビといただきました。

 

f:id:funnelbit:20170313170152j:image

おつまみコーナもあり、鴨ロースやハム、ソーセージといった品が無料で提供されます。

 

f:id:funnelbit:20170313170250j:image

貝のおつまみを提供してるブースも別にあり、こちりも無料で提供されます。気に入ったらパック詰めの商品を買うこともできます。あまりに美味く、1パック購入しました。

 

 f:id:funnelbit:20170313171053j:image

熱燗コーナも用意されています。

 

f:id:funnelbit:20170313171123j:image

どのようなお酒かわかるように、説明文も用意されています。

 

高級酒試飲コーナに行くと、なんと醸造責任者の北原さんも待機されていて、お酒を注いでくれるんです!これはすごい!せっかくなので少しお話をさせていただきました。

 

- 高級酒シリーズは山田錦で揃えているのは、やはり品評会向けの味わいになるからか?

「その通りで、ひとごこち、夢山水がうちが力を入れている酒米だが、やはり品評会では山田錦を使った方がねらった味わいになりやすい。ちなみに山田錦兵庫県産を使う」

 

-  七賢がスパークリングを作る理由を知りたい

「乾杯は泡でと言う文化がある。それはビールや、シャンパンといった類のお酒。日本酒ではない。日本酒には泡がないから。泡のないお酒で乾杯と言っても、日本もそうだが、特に世界では通用しない。やはり泡のあるお酒が必要。そしてうちは特にこだわりを持ち、ガスや味を後から注入することはせず、あくまでも酵母の力にこだわる」

 

- 精米歩合を37%など、あえてキリがよくない数字で止めているのはなぜか?

「一時期、コメは磨けば磨く程よいという時代があった。しかしそれでは面白くない。うちは七賢の7を精米歩合の中に盛り込む。だから37%や47%といった数字が生まれる」

 

- 七賢の酒のネーミングはどうやって決めているのか?

竹林の七賢」からとっている。他にはこの辺りの地名などから取る。例えば甲斐駒ヶ岳から「甲斐駒」など。

 

f:id:funnelbit:20170313171749j:image

f:id:funnelbit:20170313171801j:image

他には天皇陛下が過ごしたとされる部屋を覗き見たりできます。ちゃんと受付すれば中にも入れるらしいです(確か200円)。

 

1000円でここまで楽しめる蔵開きは僕は見たことがありません。大満足です。七賢が好きな方はもちろん、日本酒好きなら確実に満足できるイベントかと思います。

 

おまけ

七賢の蔵の目の前には元祖「信玄餅」を販売しているお店があるとの事だったので、買ってみました。

f:id:funnelbit:20170313173039j:image

やたらと美味かった。他の信玄餅とは明らかに違います。なんかやたらと透明感のあるお餅だなあと感じたんですよね。七賢のお酒を飲んだ時もそんな印象を受けたのですが。興味のある方は是非。

大規模な Android アプリをリファクタリングする前にしたこと

メリークリスマス!!この記事は、はてなエンジニアアドベントカレンダー2016の25日目の記事です。昨日は id:tarao による 開発速度と品質のトレードオフの判断基準の合意 でした。

僕は id:funnelbit と言う者です。はてなでは Android アプリを担当しています。

突然ですが、ソフトウェアというものは腐ります。腐るというのは、メンテナンス性が失われたり、機能追加が困難になってくることを指します。原因は複雑なコードが絡み合ってしまったり、ライブラリのバージョンが古すぎたり、もはや世間では時代遅れのライブラリをつかっていたり等です。特に長期間問題を放置すれば腐りやすくなります。

こうなってくるとエンジニアとしてはリファクタリングを考えるようになります。リファクタリングには規模の大小があり、リネームやモデルの修正程度で済むものから、アプリ全体の設計を変更せざるを得ないケースまで様々です。後者の場合、しっかりと計画を立てなければ、適切なリファクタリングを行うことは困難になります。そして僕は今、まさにこの大きなリファクタリングに直面しているのです。

この記事では大規模なリファクタリングを始めるにあたり、どのような準備が必要だったかを紹介します。

1. なぜリファクタリングをするのかを明確にする

僕の関わっているプロダクトは、これまで長きにわたり設計を変えることなく、機能追加を行って来ました。しかしユーザへの機能追加を優先すると、コードのアーキテクチャを最適化するのは後回しになりがちです。アーキテクチャの最適化はどうしてもコストが掛かるもので、もし着手した場合、その間新機能の追加速度も落ちてしまいます。重きを置くのはユーザ体験や利便性の向上であったため、軽いリファクタリングは挟みつつ、機能追加をメインに開発を進めて来ました。皆様の支えもあり、おかげさまで5年以上経過した今も、多くの方々にご利用いただいております。本当にありがとうございます。

しかし5年以上経過すると、そろそろコードの状態を整理したくなります。実際、以下のような状況が目につくようになり、無視できないようになって来ました。

  • 非推奨のライブラリを使っており、将来のセキュリティにリスクがある。ライブラリを変更するためには、コードの大幅な変更が必要である。
  • 機能追加が非常に困難な箇所が見受けられ、計画的なリリースに支障をきたすレベルである。
  • 各所が時代ごとに別の書き方をされているため、どのような書き方をすればよいのか明確な基準がなく、どう書くか?でまず悩む時間が発生し、工数増加の原因となる。統一するにしても、まずはどう統一すればよいのかから考える必要があるし、その後書き換える必要もある。

このままただ単に機能を追加していけば、エンジニアリングが滞るだけではなく、ユーザ体験の低下にも繋がりかねません。この危機感はディレクターにももちろん共有しました。その結果、大規模なリファクタリングタスクが認められ、今回着手することになりました。

このリファクタリングには一つの目標を定めました。「今後5年間は変更に耐えうるコード」です。誤解しないでいただきたいのは、5年後には腐敗してよいと言うことではありません。しかし5年後にはまた新しいパラダイムが登場していることでしょう。それはどうしようもありません。しかしそのような状況になっていたとしても、分解して再構築しやすいようなコードを目指したいと考えました。プロダクトの価値を次の5年につなげるためのリファクタリングと言うことです。

2. リファクタリングする期間を確保する

まず必要なのは当たり前ですが「リファクタリングする時間」を取ることです。この時間ではリファクタリング以外のことはしません。アプリのコードの規模にもよるかと思いますが、少なくとも大規模なリファクタリングの場合、連続的かつ長期間設けたほうが良いです。例えば「1日の数時間だけリファクタリングする」というのは余り良くないと思います。大規模リファクタリングはそんな単純なものではありません。

とはいえ、この段階で工数を弾き出すのは非常に困難です。まだ「リファクタリングをやる」ということしか決まってません。しかし大雑把な期間であればある程度は出せるはずです。

3. ドメイン知識を得る

ここからが本番です。まずは正しいドメイン知識が必要です。

全画面を把握する

まずはどんな画面がアプリに存在しているかどうかを把握します。コードをみたり、思いつく限りの操作を行って、とにかく色んな画面を起動し、1つずつスクリーンショットを取るなどして記録します。特別な導線の場合に特別な View が現れることも考えられるので、とにかく起動しまくります。わかったつもりになっている画面も全てです。また、それぞれの画面でどのような Model・View を使うべきかを議論し、記録していきます。そうすると、他の画面と何を共通化出来るのかが分かってきます。

条件によって分岐する View をすべて把握する

「ここはこの API を叩いたときには通常表示だが、とある API の場合のみ、別な表示になる」という箇所をすべて記録します。わかったつもりになっている箇所もすべて記録します。スクリーンショットを取り、まとめます。

正しい名前を付ける

画面、View それぞれに正しい名前を付けます。この作業は最低でもエンジニア・デザイナー全員で行います。特に View の名前を付けるためには、どのような意図でその View のデザインをしたのかというデザイナーの意見が不可欠です。正しい名前が決まったら即座に記録します。

4. 現状の問題点を見極める

ただ単に「クソコード」と揶揄するのではなく、冷静に問題点を分析していく必要があります。言うまでもなくこれはエンジニア全員でやります。 問題のあるコードには必ず不吉な匂いが漂います。そこから何故こうなっているのかを探し出し、解決方法を探ります。以下は僕が直面した数例です。

継承が多い

歴史の層が積み重なり、多重の継承をしている箇所があります。継承が必要なく、移譲で解決できる箇所が散見されます。これは過去にはそれでうまく行っていたが、時がたつに連れてうまく行かなくなっていくケースが多いかと思います。

抽象化が間違っている

正しい抽象化がなされているのかどうか精査してください。例えば、ただ処理をまとめるだけの抽象クラスは確実に破綻します。

名前と役割に違和感がある

名前と役割が一致してない、という方がわかりやすいですね。機能としては良いが、ネーミングが好ましくなかったり、ネーミングの割には機能が豊富すぎて、本来の役割を逸脱してそうだったり、様々なケースがあります。

アーキテクチャが統一されていない

これは歴史的経緯が大きいです。古い箇所は古いアーキテクチャで、新しい箇所はやたらモダンであったりします。古い箇所でモダンにすれば解決するかもしれませんが、古い箇所は複数のコードが絡み合っていることが多く、まずは処理を整理することが求められると思います。

クラス内に処理がまとまってはいるが、追うのが難しい

確かに一クラスに処理がまとまっているのですが、追うのがかなり難しくなっている箇所があります。過度な抽象化や共通化、複雑な Builder パターンなどが該当します。

パッと見で「やばい」と思ってしまうクラスがある

冗談抜きで開いた瞬間に「これは」と思ってしまうクラスに出会うことがあります。これは一言では表せないことが多いです。例えば定数が大量に存在したり、非同期処理が複雑に絡んでいたり、色んな箇所から呼ばれていたり。解決するには、それぞれがどこでどう使われているのかを把握し、正しい設計に落とし込む必要があります。

5. ライブラリを選定すると同時に、設計を決める

ここまで来たら、何が問題かはだいたい分かっているはずです。が、ここが最も難しい所です。 近年の Android 開発では有用なライブラリが多々ありますが、採用することで設計が左右されるものがあります。例えば Rxjava を採用するとリアクティブプログラミングを全面的に取り入れることになりますし、Realm を採用した場合は Realm の監視を中心とした設計になってくるはずです。

このようなライブラリを選ぶと、設計をある程度確定せねばなりません。しかしそのライブラリから発生する設計が本当に有用なのかは、しばらく考えてみないとわかりません。まるでパズルのように、このライブラリを採用したパターンA、パターンB、やっぱり採用せずに別パターン... などを繰り返し、議論し、納得できる設計に落とし込んでいきます。

6. 小さなプロジェクトで試す

経験上、いきなり新しい設計を既存のアプリに組み込むと必ず不備が出てきます。「やっぱりこうしとけばよかった」となると、組み込んだすべての箇所に変更を加えなければなりません。そこを放置して先に進むと新たなレガシーが爆誕です。

組み込む前に完璧な設計を行うのは非常に難しいですが、少しでも完璧に近づける事はできます。最もいい方法は小さいプロジェクトを作って、新しい設計を試すことです。プロジェクトは Github で管理し、うまく行かなかった設計についてはプルリクを投げ、レビューし、修正します。修正内容は Github に残るので、設計の経緯を追うことができます。

7. 設計をドキュメント化する

小さなプロジェクトでチーム全員が納得できる設計を作ったら、次に行うのがドキュメント化です。命名規則パラダイム、クラスごとの規約や制約を書き出します。ドキュメントには「なぜこのような規約が設けられているか?」が分かるように、経緯を織り交ぜて読み手が納得できるように書いていきます。ドキュメントも Github で管理し、変更する必要がある場合はプルリクを出し、変更の経緯が分かるようにします。

ドキュメントは、コードを作る時、コードレビューのときに利用します。記載しておくことで「分かった気になっていた」「勘違いしていた」を無くします。誰かがチームを抜けても、新しい人が入ってきても、ドキュメントは常に存在するので属人化を防ぐことができます。

8. 作業状況を可視化する準備

エンジニアは自分で作業してるので、今自分がどれぐらい進んでいるのかが分かります。しかしディレクターにはそれはわかりません。またエンジニアにとっても、取り掛かっているタスクの進捗はわかりますが、それが計画全体のどの位置にいるのかを把握するのは難しいものです。

そこでリファクタリングを進める前に、ある程度タスクをリスト化するなどして、今自分が全体でどの位置にあるタスクをこなしているのか、あとどれ位タスクをこなせば終わるのかを把握できるようにします。そうでなければ、エンジニアははて亡き荒野をひたすら進むことになり、ディレクターもうまく助けることができなくなってしまいます。僕の所属しているチームでは、それぞれのタスクに目安の時間を設定し、バーンアップチャートを作り、順調に進んでいるのかどうかを他人が把握できるようにしています。

9. ここからが本当のスタートです

ここまでで準備は終了です!しかし本当のリファクタリングはここからです。言うまでもなく大変な作業が待ち構えています。 ざっくりと紹介しましたが、細部については書ききれていません。実際にどんな設計にしたのか?どのようにドキュメント化したのか?どのようなクラスから着手したのか?リリースのタイミングは?

幸いにも、僕は運良く国内最大の Android カンファレンスである DroidKaigi 2017 でこれらについて話す機会が与えられました。タイトルは「大規模アプリのリノベーション」というものです。

droidkaigi.github.io

もしもご縁がありましたら、聴講していただけると幸いです。またぜひ会場では皆様と交流し、リファクタリングについての知見を交換できたらなと思っています。どうかよろしくお願いいたします。

はてなエンジニアアドベントカレンダー2016 はこれにて終了となります。それでは皆様、良いお年を。