NEWREEL
Feature

いまの自分に疲れている人のための あおぞら技術用語
「リファクタリングの巻」

清水幹太 清水幹太 Apr 3 2019

清水幹太さんによるあおぞら技術用語連載、記念すべき第10回は「リファクタリングの巻」です。“キレイなプログラムはシトラスの香り……”とは?

FacebookTwitterLinePocket

花粉症を克服した

花粉症っていうのは、人によっては大変に深刻な問題だ。そういう季節になると、あからさまに調子が悪くなる人はたくさんいるし、手術をしたりする人もいると聞く。言わずもがなではあるが、スギとかブタクサとかいろんな植物の花粉を身体が異物と認識するとかで、鼻水が止まらなくなったり、目が痒くなったりする。

かく言う私も、小学生の最初の頃に、アレルギーっぽい症状が出て、涙が止まらなくなって病院に行ったところ、花粉症と診断された。

それからしばらくは、花粉の季節になるとなかなかに辛く、面倒くさいので年がら年中鼻血のときみたいに鼻にティッシュを突っ込んでいた。

ところが、いつからか、みんなが花粉症に苦しんでいる中、平然としている自分に気づいた。つまり、花粉症が治ってしまったのだ。

中学くらいになって自分の部屋を持って、親が入ってこない領域ができた。それを良いことに、当時の私は一切掃除というものをしなかった。次第に、自分の部屋の床はゴミや、ゴミなのかよくわからないもので埋め尽くされて、やがて床が見えなくなり、立錐の余地が無くなった。

掃除をしない部屋の汚さにはウェットなやつとドライなやつがある。

ウェットなやつは、食べ物をはじめとした有機物中心だ。カップラーメンの残骸とかそういうのが散乱して、黒色化したバナナの皮が転がっている感じだ。これは必然的に、しっとりとした汚さになっていく。

ドライなやつは、紙ゴミとか、着ていた服とかが中心で、有機的な感じではない代わりに、ホコリがたくさん出る。乾いているので、それが部屋中に立ち込める。

私の部屋の汚さは、ドライなやつだった。自慢ではないが、有機物はちゃんと捨てる。ウェットな汚さはちょっと無理である。

そのまま一切掃除というものをせずに、高校くらいになると、時折ホコリがひどすぎて、呼吸困難になったりするようになった。

その頃にはもう、花粉症とかはどうでも良くなっていた。超汚い部屋でホコリまみれになって暮らしているうちに、耐性のようなものがついてしまったらしい。実際のところはよくわからないのだが、おおむねそんな感じで、私はみんなが苦しんでいる花粉症を自然(?)に克服することができたのだ。

汚い、というのは原則的にはネガティブな概念だし、ほとんどの人が、汚いより綺麗な方が良いに決まっている。

ただ、こんなような感じで、汚いことが功を奏することも、ちょこちょこあるのだ。

たとえば、私が働いている会社は、クリエイティブっぽいアイデアを考えたり、それをもとにウェブサイトとかの画面ベースのものから、チームラボが腐ったような感じのフィジカル体験に至るまで、いろいろつくっている。

なんかすごいかっこいいおしゃれクリエイターっぽい会社だったら、代官山とかの洗練されたホコリ一つ落ちていないオフィスの方が、仕事環境の質が上がって良さそうだ。暖かい陽が差し込む、気持ちの良いテラスで、豆からちゃんと挽いたコーヒーなどを飲みつつ、丁寧な暮らしの中でこまっしゃくれたアイデアもどんどん出てくるだろう。

汚いは正義だ

ところが、私が働いている場所のような、アイデアは考えるけれども、「とりあえずつくって形にしよう」というのが主たる業務になっていると、そのへんに必要な機材とか部品とかパソコンとかが転がっている、「修羅場っぽいフォーメーション」の方が全然効率が良い場合があって、実際問題そういう場合でも本当はいろいろ整理して管理されていたほうがよいのだが、なんとなく、その「作業に最適化された汚さ」が正義になってしまう現場というのはある。

ちなみに私の場合、その後社会人になっても掃除できない傾向は続いてしまい、バイトとかも含め、出入りしたすべての会社という会社で、机とその周辺の汚さを注意され、警告され、問題化されてきた。

中間管理職になって自分のチームに人が入るようになったら今度は、その入ってきた人(村上さん)が、私の机の周辺に散乱している空のペットボトルの数を毎日数えてグラフ化するようなウェブサイトをつくって社内に公開するようになった。その数は、一時は30本とかにのぼった。今やっている会社はその村上さんとつくった会社なので、そんなどうしようもない上長でも見捨てずに一緒にやってくれる彼はとてもありがたい存在だ。

その汚さは、フィジカルだけではなく、デジタルな場所においても引き継がれている。まず1つはPCのデスクトップだ。私は、必要のないゴミみたいなファイルも、とりあえずどんどんデスクトップに置いておく傾向がある。

そして、お客さんに自分の画面でプレゼン等をする際になると、さすがにまずいと思って、「ゴミ」というディレクトリをつくって、デスクトップにあるファイルを全部突っ込んでおく。そのうちに、その「ゴミ」の階層にどんどん別のゴミが保存され、いつしかプレゼンの日になると、また「ゴミ2」みたいなディレクトリをつくって、さきほどの「ゴミ」ごと突っ込む。

最終的に、散らかったデスクトップの「ゴミ」というディレクトリの中に、さらに「ゴミ」があり、その中に大量のゴミファイルとともに、「ゴミ」ディレクトリがあり、その中にまた「ゴミ」がある、みたいな、地獄曼荼羅っぽい状況がつくられてしまう。

もう1つは、プログラムだ。自慢ではないが、私はプログラムを書くのがめちゃくちゃ速い。自分で言うのもアレではあるが、人にお願いしておいたプログラミング作業が、全然うまく動かなくって、締切1日前とかに自分で最初からつくりなおしてどうにかした、みたいのは結構経験がある。

もはやそういう「動けばいい」ような場合は、あんまり考えて書かない。うおおおおおおりゃああみたいな感じの本宮ひろ志スタイルで、青龍偃月刀を振り回すかのごとく、ばっさばっさと必要な機能を書きなぐる。書きながらどんどんテストをして、バグが出たらその場でどんどんつぶす。

unkoまみれのプログラム

プログラムには、「変数」というものがある。この変数っていうのが、そもそもプログラムに触れたことがない人には困ってしまう概念なのだが、要するに、変数っていうのは何か入れておくための箱だ。とりあえず、何でも入る箱だと思ってくれればいい。数字でも言葉でも何でもいい。わかりやすく書いてしまうと、これだと厳密にはプログラムとしては動かないが、下記のようなことだ。要するに小学校の国語の問題だ。

彼女は私に「◯◯◯」と叫んだ

というときに、この◯◯◯には、何を入れてもいい。◯◯◯に「こんにちわ!」という言葉を入れれば、

【彼女は私に「こんにちわ!」と叫んだ】

ということになる。この何でも入る◯◯◯が「変数」だ。◯◯◯=「このハゲヒゲメガネ豚野郎が!」にすると、

【彼女は私に「このハゲヒゲメガネ豚野郎が!」と叫んだ】

になるのだ。プログラミングの世界だと、この◯◯◯を◯◯◯じゃなくって、何かわかりやすい名前で表現する。文字が入るなら「text」とかにするといい。そうすると、「あ、ここはなんか文字が入るんだなー」っていうのがわかりやすくて良い。下記のようになる。

彼女は私に「text」と叫んだ

こんな感じで、変数っていうのは箱で、自由に名前をつけられる。名前は中身がわかりやすいものが良い。

たとえば、Facebookか何かのコメントをプログラムで引っ張ってきて変数に入れるならば、変数名は、「facebookComment」とかにすればいい。わかりやすい。Facebookのコメントが入っていることが一目瞭然だ。

映像を扱うプログラムなんかで、「映像の再生時間」みたいなものを箱に入れておきたい場合、変数名は「movieLength」だろう。あるいは「movieDuration」とか。

ところが、締切一日前に作り直しでとりあえず動けばいいような場合、もう、そんなお洒落な英語の変数名なんて考えている時間なんかない。こんな長い文字数書いてる時間もない。その1秒2秒が惜しい。その場合、もはや、「unko」とかで済ませることすらある。「unko」にFacebookのコメントとか、映像の再生時間を入れてしまう。どうせ動けばいい。時間がない。そのときの自分がその変数が何なのかわかっていればそれでいい。だからもう「unko」でいい。

さすがにそこまで雑なことをすることは少ないが、そうじゃなくても私はプログラムを書くのが速いほうだ。そして、少なからず上記のようなとんでもない戦場でプログラムを書く羽目にもなるので、速度の代わりに、「プログラムの綺麗さ」というのを犠牲にすることになる。

綺麗なプログラムとは何か。それは本稿の本題に関わることなので、詳しくは後述するとして、簡単に言うと、綺麗なプログラムとは「他のプログラマーが見ても理解できて、処理が最適化された」プログラムということになるだろう。

そんなわけで私が雑にがーっと書いたプログラムは汚い。構造がぐちゃぐちゃだったり、変数が「unko」だったり、同じような処理を2回書いていたり。汚い、つまり人が読んでも理解しにくいプログラムだ(もちろん、ケースによっては、ちゃんと綺麗なプログラムを書くことはできますので、許してください)。汚いコードを読むことは、さながらぬかるんだ低木の針葉樹林帯で嵐の中、道なき道を進んでいくようなものだ。

そんな感じで汚プログラマーとして活動しているうちに、そのおかげで私は別の特技を手に入れることになった。それは単純な話で、私は汚いプログラムを書いてきたからこそ、汚いプログラムを読むのがうまいのだ。

構造がぐちゃぐちゃだったり、変数が「unko」だったり、同じような処理を2回書いていたりしていても、そういった「雑なプログラム」を書くときの思考回路をなぞれるので、「ふむふむ。この『unko』っていうのはつまり、Facebookのコメントのことなんだな」みたいに、普通の人が理解できないものを比較的簡単に理解できたりする。

先日も、若者にお願いしていた電子回路向けのプログラムが突然動かなくなり、プログラムの内容を見てみたら、コードが汚くて「うわー全然わけわかんないことになってる」という感じで、他の人がさじを投げている状況だったのが、自分でしばらく読解した結果1行追加のプログラムを書いて一発で直したりとかしている。

そんなことができるのも、汚プログラマーとして活動してきたおかげだ。

こんな場合においても、汚いことが良いことをもたらすことがある。

汚い部屋に住んでいると、気分が落ち込んでくるという。鬱の患者さんも、掃除をすることで回復への一歩を踏み出したりすることがある。

ここまで、我田引水気味に「汚いは正義だ」的なことを言ってきたが、自分の場合でも、結婚したり子供ができたりして、嫁からの圧を受けたり、子供が散らかしたものを片付けたりしているうちに、いつしか、昔の自分からは信じられないほど綺麗な部屋で暮らすようになったし、「ホコリっぽくないと気持ちいいな」という感覚も覚えて、前よりは掃除をするようになった。

掃除をすると、普段の生活の中で、つまずくことが少なくなる。わかりやすい話、テレビのリモコンとか電話がすぐ見つかる。部屋が散らかっていると、1日に3回くらいは、「iPhoneを探す」機能でiPhoneのアラームを鳴らす羽目になる。文字通り、床に置いている固いものに小指をぶつけたりもしなくなる。子供が床に転がしておいた、戦隊もののロボットの頭部分(多くの場合、突起がたくさんある)を思いっきり踏んで号泣することもなくなる。

掃除は最高だ。

プログラムを掃除する

では、汚いプログラムを掃除することは可能なのか。それは、一体どういうことなのか。

それが、今回のお題であるところの「リファクタリング」だ。リファクタリングは、つまりプログラムの掃除だ。リファクタリングすると、汚くて見てられないプログラムが、綺麗に浄化されていく。

まずは「unko」からだ。あるプログラムの中で「unko」という箱が「facebookのコメント」を意味していた場合、それはちゃんと「facebookComment」に直す。さすがに変数「unko」みたいなことをやる人はそんなにいないが、このへんの基本的な作業も広義のリファクタリングだ。

「facebookのコメントを取得する」っていう処理があるとして、3箇所で「facebookのコメントを取得する」ようなことがある。

「facebookのコメントを取得する」っていう処理はそこそこ複雑なプログラムを書かないといけない。しかし3箇所でこれをやるので、3回同じような複雑なプログラムを書いちゃったりする。

もう少しわかりやすくすると、「歩く」って処理の中身は、「左足と右足を交互に前に出して前進する」ということだ。

「今日は歩いて会社まで行ってから、歩いてお昼ご飯を買いに行って、健康のために歩いたよ!」

なんていうことをわざわざ

「今日は左足と右足を交互に前に出して前進して会社まで行ってから、左足と右足を交互に前に出して前進してお昼ご飯を買いに行って、健康のために左足と右足を交互に前に出して前進したよ!」

という人はいない。ていうか読みにくい。しかし、3箇所で「facebookのコメントを取得する」処理を書くっていうのはこういうことだ。

その処理を「コメント取得!」という工程に分けておいて、その「コメント取得!」を呼び出せば済むようにすればいい。

そうすると、後でまたもう1回「facebookのコメントを取得する」をやりたくなったときに、同じ機能を呼び出すだけでよくなる。似たようなことを書く必要がないから、間違いもなくなる。

とか、そのへんの基本的なところだけではなくて、仕組みごとに独立して、なるべく依存せずに動くようにするとか(「ディペンデンシー・インジェクションの巻」参照)、長くなりすぎてしまったプログラムは分ける、とか。

これを丁寧にやっていくと、何が起こるかというと、他人がプログラムをいじりやすくなるだけではなく、プログラムをいじったときに、バグが起きにくくなる。「あれ? なんか動かなくなっちゃったぞー」みたいのが少なくなる。プログラムなんて所詮人間が書くものだから、ぐちゃぐちゃに書いていると間違えてしまう。

つまり、リファクタリング=プログラムの掃除をすれば、現実の掃除と同じで、つまずくことが少なくなるのだ。

綺麗なプログラム・コードは、シトラスやフローラルの香りがする。きちんとリファクタリングされたコードを触るのは、優しい日の光の中で、ポカポカと春の予感を感じながら、美しい遊歩道を歩くようなものだ。

リファクタリングとは、大人になるということだ。

私も今では、刹那的なウェブサイトや体験ものだけではなく、長く続いていくサービスやアプリのプログラムも書くし、大人になった。だから、今日もリファクタリングをした。家で、子供のおもちゃを片付けるように、自分の汚いプログラムを片付けていく。

リファクタリングするような大人になっちまった。それは、長すぎた青春の終わりでもあるのかもしれない。あの甘い腐臭がする、汚いプログラムの喪失なのかもしれない。

清水幹太

バーテンやトロンボーン吹き、デザイナーを経て、ニューヨークをベースにテクニカルディレクターをやっている。

BASSDRUM( http://bassdrum.org