一歩も進まない状況を避けていったら良さそう

 今月の仕事はなかなかやる気が出ず、だるかった。メタプログラミングされた機能に手を加える必要があって、コードを読み解くのにものすごく時間がかかった。しかもまだ終わっていない。メタなので、プログラムが動きながら、プログラムの要素を定義している。いつのまにかクラスやメソッドが追加されたりしていて、一筋縄ではいかない感じ。動かして、変数の中を眺めたり、途中で止めてみたりして、どこからどこまで進んでいるのかようやく把握できる。つらい。ふだんプログラミングをかいているときの万能感とか支配感とかまったくない。どうにか直した箇所も、たかだか10行にも満たないので、何かこう、仕事をしている感じがしない。もし厳しく監督されてたら、一日の進捗が具体的に説明できなくて苦しいと思う。そんなふうなのでモチベーションも上がらない。まだ終わってないけど、こういう時に、何を支えにして仕事をしていくのかというのは、少し面白い話題のように思える。最初につまらないと感じてしまった仕事をどうやって変化させていくか、というところ。

 そういえば、ダークソウルもやたら難しくて、さっぱり進めない時があった。ダークソウル2の時よりも、1の時のほうがひどかった。当然モチベーションは上がらない。こういう時って、典型的な一つの方法として、土台を固めるというのがあると思う。ゲームで言うなら「レベル上げ」というところ。とにかく行き詰まったら、単調作業によって少し状況が良くなるよ、というタイプのもの。状況が良くなって、行き詰っていたポイントが打開されると、楽しくなってモチベーションが上がる。ゲームではよくあることだ。一方で、現実ではレベル上げなんて悠長なことをしていられない場合が多い。それに、レベル上げのつもりが、なんにも成長してないとか、全然どうでもいいパラメータを高めていたりとかそういうことがある。逆にモチベーション下がる。

 また別の方法として、真っ白なノートを開いて、すべての前提を放り投げて最初から問題を眺めるというやり方がある。余計な前提が取り払われるので、なんか新しいことが見つかるかもしれない。手がかりができるとやる気が出てくる。ダークソウルだと武器を変えてみるとか、魔法使ってみるとか、一つ前のダンジョン行ってみるとか。これもまたひとつの典型的な方法だと思う。何だかよくわからないのでリセットして最初からやろう、というやり方。ピクロスとかマインスイーパーとかやってて、どうにもつじつまが合わなくなった時は、最初からやったほうがまだましだったりする。クリア出来ていたとしても2周めのほうが新しい発見があったりする。

 白紙にして再スタートする手法から初めて、どんどん遡って行くと、そもそも問題自体の価値を疑い始める。「これ解く必要があるの?」「そもそも人間とコンピュータに解くことができるの?」とまあそういう風に。これは、あまりゲームではやらないかもしれない。

 さてそんなふうに考えて行ける時はまだいい。問題は進まない時だ。視野を広げてもただの夢想か甘えかにしかならない時。そんな時の仕事はとてもじゃないがやる気がしない。逆に考えると、こういう時こそがつまらないのであって、これを避ければいいのかもしれない。そのためには、一歩でも進んでいるということ、それが確かめられる状態を作ること良いような気がする。結局、土台を固めるとか、白紙にするとか言う手法は、進めない時に進めかたをさがす手法にすぎない。それらが功を奏するのは、止まっていたものが進むようになった時だけだ。仕事でもそうだと思う。実際、バーンダウンチャートというやつを書いていた時も、そう思った。たしかに一歩進む安心感。それだ。ただ、今日進んだことが、いつもグラフには現れてくるわけではない。そういうものを見なくても自分に対して、何が進んだのかと問いかけて答えを得ることが、やる気を保つ良い方法なのかもしれない。

Clean Coder の感想

 プロのプログラマ、あるいはプロのソフトウェア開発者とは何だろう。漠然と思い浮かぶのは、よく仕事ができるとか、綺麗なコードを素早く書くとか、そんな人だ。だけど、Clean Coder では、もっと現実的な人の姿が描かれていた。

Clean Coder プロフェッショナルプログラマへの道

Clean Coder プロフェッショナルプログラマへの道

 

 始まりは、チャレンジャー号の打ち上げ失敗のエピソード。チャレンジャー号の技術者は、ロケット打ち上げ時のリスクを発見し、データを揃えて上層部に訴える。しかし、上層部の判断で打ち上げは強行され、そして事故が起こる。彼らはそのことをどう考えているか。嘆いているのか、それとも、もっと改めるべきことがあると燃え上がったのか。いずれにしても、プロの話をしようじゃないか、という話題の前振りとしては、意味深なところがとても気に入った。

 ここでは、Clean Coder で描かれていたプロのやり方の中で、自分で取り入れたいと思う事柄について、書いていきたいと思う。

 第一に「危害を加えてはならない」という原則を採用したい。意味は、可能な限りバグを出さないようにすること。そして、構造を犠牲にした機能追加を行わないこと。人である以上、完璧にそれをするのは無理なのだけれど、目指すことはできる。手を抜こうとする自分を思い留めるには、こういった気高い言葉を片隅においておくのが良い。

 第二には「試しにやってみます」と言わないこと。もう少し詳しく言うと、十中八九できないとわかっている要求に対して、その場しのぎで「試しにやってみます」と答えないこと。この言葉には、責任感がない。「それじゃあ、試しに空中に浮かんでみます。試しに鉛を金に変えてみます。試しに大西洋を泳いでわたってみます。私にできると思いますか?」これは作中に出てくる言葉だが、実にもっともだ。やってできないことがわかっていることを、試すのは無意味だ。この言葉を使わないなら、できるかできないのか、自分の判断に対して責任をもつことになるだろう。特定の言葉だけにとらわれるのは良いことではないが、責任を考える、という意味では価値があるのではないかと思う。

 第三にはテスト駆動開発を試すこと。テスト駆動開発のやり方は実に簡単で「小さなテストを書く」「実装する」の2ステップの繰り返しをするだけだ。テスト駆動開発のメリットは、だいたい次のようなことが言われている。バグが含まれにくいこと、リファクタリングがしやすいこと、ドキュメントとして役立つこと。実のところ、このあたりのメリットは、テストを後で書いても変わらない。テスト駆動開発のもう一つのメリットは「テストしやすい設計を考えることを強制される」ということだ。こういうことを考えると、テスト駆動開発というやりかたは、やりづらいことを習慣づけるための方法ではないかと思う。たとえば、下のような文章を考えてみる。
「運動習慣がないことは、良くないことだと誰もが知っている。しかし、自分から進んで運動するというのは、なかなかうまくいかない人が多い。そこで○○ダイエット法を取り入れてみたら、運動習慣がついた」
文中の「運動習慣」を「テスト」に置き換えて、「○○ダイエット法」を「テスト駆動開発」に置き換えてみれば、まさにぴったりくるじゃないか。そんな思いつきに満足しつつ、ダイエットよろしくテスト駆動開発を試してみようかと思った。

 最後に受け入れテストを書くこと。言い換えると、Cucumber のようなシナリオベースの機械的なテストを書くこと。今まで普通のユニットテストはそれなりにやってきていたのだが、各機能の結合テストはすべて手作業でやっていた。だから、ひとつの変更が他へ悪い影響を与えていないかを検証するコストは、かなり高かった。そういうところを機械的に行えるのであれば、これを採用しない理由はない。一度も試していないので、悪いところも見えない。そういうわけで、次のプロジェクトでは、受け入れテストを書くことにしたい。

 さて。これで少しはプロのプログラマに近づけるだろうか。いや、そもそもプロになりたかったっけ? …考えてみると、また別の話になりそうだ。ともかく、こうして取り入れようと決めたことが、何かよい結果につながることを祈ろう。

勉強会に参加しないと不幸になる?

 結論:ごめん、技術者が勉強会に出たほうがいいのはわかるけど、なんかすごいストレスだしメリットを感じないこともあるんだ。なので不幸になるとか言わんといて。

 以下駄文。「コミュニティに入るか入らないかでエンジニアとしての幸福度がかわる(http://d.hatena.ne.jp/nowokay/20140225)」という記事を見た。関連記事に「勉強会に参加しないと不幸になる話」とある。勉強会にはあまり出ない僕は、良い気はしない。自分では特に不幸だと思ってないが、他人の評価基準から見ると自分は不幸だというなら、不安だし気持ちが悪いことだ。そこで、幸せについて少し考えることにした。それでまず出てくるのが、この記事の前置き。

あと、ここでの幸せ・不幸せというのは、エンジニアとして、という話で、エンジニアリング能力があがるとか、エンジニアリングの活動がやりやすいとか、エンジニアリングの活動が評価されるとか、エンジニアリングの話題を共有できる仲間が増えるとか、そういう観点です。

エンジニアとしての幸せ以外にも、人生にはさまざまな観点の幸せがある、ということは最初に補足しておきます。

 なーんだ、そうか、と納得する。僕は「エンジニアとしての幸せ」以外の幸せまで含めて考えていたから、かみあわなかったのだろう。勉強会に出なくても色々な幸せはあるので、不幸とか決めつけられても困るな、という感情だ。だけど、話題を限定しているなら、そういうこともない。技術者の世界で活躍することを考えれば、確かにコミュニティに入っていたほうが有利だし、何かのコミュニティを見つけて入っていかなければ不幸になるというのもわからなくはない。

 ちなみに、自分の経験から言うと、行ってもメリットがなかったな、と思うような勉強会も存在する。どこかに書いてあるようなことを皆で実験して、何のつながりも生まれなくて解散するつまらない勉強会。疲労感から、講師の自己満足じゃないか、とぼやきたくなるような。自分で勉強したほうがマシだ、というような。そういう時に、少しでも何かを手に入れようと誰かに話しかけたり、積極的に質問を出したりするような精神が必要なのだろうけれど、残念ながら僕にはそういう勇気がなかった。勉強するのはわりと好きなんだけれども、沢山人が集まる所というのは、どうも苦手だ。まずはそういうところに、自分を慣らしていく努力が必要なのかもしれない。

ドミニオンの感想:作戦マニアには楽しい

 この前、ドミニオンというカードゲームで遊んだ。(http://hobbyjapan.co.jp/dominion/)あまり詳しくはないけど、ドイツのゲーム賞で大賞をとっているくらい有名なゲームらしい。ちょっとやってみた感じだと、工夫したり計算したりするところがあって、おもしろい。たとえばビレッジを引いてアクションの回数を増やしてから、スミシーでカードを大量に引いたり、セラーで山札の回転率を上げてから、リモデルでいらないカードを捨てていったりとか。僕はひねくれ者であり、手垢のついてない戦法を探すのが好きなので、ウッドカッターとか使えねーかなーと思って、それ専用の作戦を思い描いたりした。

 で、そういう妄想をするのは非常に楽しいんだけれども、そういう作戦は弱いから誰も採用しないわけであって、成功することは稀だ。なので何度かやっていると、冒険を避けて、定番ばっかりになるのがつまらなかったりする。たとえば、チャペルが出てきた時はそれ引かないと勝負にならなかった。いらないカードを山札から消し去ることができるので、欲しいカードをボンボン引けるようになってしまう。これはあかん。あとビレッジもローリスクで、1度引き始めたら1ターンが長くなるのでつまらん。ような気がする。だがそういう強いカードを避けていてはまず勝てない。まあ、どれくらい引かなくても勝てるのか、というラインを探すために、少しずつ作戦を修正していくのがいいのかも知らん。

 勝つためには記憶力と、確率の計算も重要だ。ドミニオンの最初の山札は全員同じようになっていて、金貨7、領地3の合計10枚と決まっている。このなかから最初に5枚を引くわけだけれども、その組み合わせは(金貨、領地)= (5,0) or (4,1) or (3,2) or (2,3) となる。5枚引いた後、残る山札は5枚だから、引いたカードを覚えていれば、次に引くカードを予測して行動を決めることもできる。計算してみたところ、2回のドローで金貨5枚が引ける確率は、1/6 だった。(この計算はけっこうおもしろいのでいつか書こうと思っている)

 そんな感じで、頭をつかう部分は多い。そのぶん、プレイヤーの技量と知識が問われる。達人が存在しうる、ということをちょっとでも想像できれば、そのゲームはたいてい面白くて奥深い。場が膠着してきたら場札の組み合わせを変更できるし、拡張パックとかも売ってるので、長く遊べるなかなか良いゲームだと思う。僕は一個しか知らなかったけど、推奨セットはたくさんある(http://suka.s5.xrea.com/dom/)らしい。ので、このセットごとに作戦を妄想するのは面白そうだ。

苦手とか嫌いとかいう中にある因縁と未熟さ

 もう、2013年も残すところあとわずか。次の年になる前に、今年最後の日記を書いておこう。この一年を振り返ってみると、それなりに色々あったけれど、一番覚えているのは新入社員の面倒を見ていたことだ。

 正直に言うと、彼のことが苦手である。単純に、自分が人と会話するのが下手だからかもしれないが、それを差し引いても、日常から「彼は苦手だ」という感情がもやもやと漂っているのだ。その原因について考えてみた。まずは、僕が彼について違和感を抱いた出来事を思い出してみよう。

 ある時僕は、彼から質問を受けて、解決策を2つ提案した。そして、どちらがいいですか、と疑問を投げかけた。「前者を選びたいと思います」と彼は言った。僕は、前者とか後者とかいう言葉に、いやな感情を抱く。自然な会話ではまず生じない言葉だからだ。

 たとえば、「りんごとみかん、どちらが良いですか?」と問われた時、りんごとみかんが頭のなかに浮かんでくるだろう。その時、あなたは順序を考えているだろうか。おそらく、考えていないはずだ。だとすると、前者とか後者とかいう言葉を使うには、発言した順序をさかのぼって、その実体が何であるかを考えなければいけない。これは不自然である。僕は、そういう不自然なことをする人に対して警戒心を抱く。「何をカッコつけてるんだ」と。

 その他に、こちらの依頼した仕事がうまくできなかったりとか、説明がわかりにくかったりとか、色々小さな問題はある。新入社員だから、どうしようもないことなのだとわかってはいるけれど、そういうものがどうしても、嫌な感情を引き起こす。彼は大学院にまで行って勉強しているはずなのだが、文章の書き方だとか、論理的な会話だとかそういうものにセンスを感じない。

 僕は同じく大学院まで行ったが、四六時中研究のことを考えて、性根のねじ曲がった教官にどやされ、悪夢を見続けたものだ。成果が出ず人格否定されて、本当にろくでもないことばかりだった。

 未熟さ。それが許される環境が羨ましいのだろう。聞けば答えが帰ってくる環境。間違っても許されるという環境。そういう甘い状況。それは本当は僕が欲しかったものだ。それを彼は持っている。皮肉なことに、僕自身が与えているふしさえあるのだ。本当に極めてひとりよがりな決めつけであるが、そういう風に勝手な想像をして羨み妬んでいる。

 だいたい、彼のことが苦手である原因はわかった気がする。なにやら面倒くさい感情である。こういう僕に対して、先輩は「君が与えているだけじゃなくて、彼から与えられるものもあるだろう」と言った。そんなことを考えていると、僕の教官が、恐ろしいことを言ったのを思い出す。「私達は相互に与え合うもののはずです。私は色々なものを与えたつもりですが、君からは何ももらっていない」

 さて。色々な感情はあるものだが、表に出てくるものはそう多くはない。僕がこうして考えたように、彼もまた何事かを様々に考えているだろう。苦手であっても火はつかない。原因が分かったなら、気をつければいいことだ。自分の未熟な面もまた気づけたことであるし、まあいいじゃないか。

面倒くさいけど、自分で決めたほうが良い

 もう十一月も終わり。今月は特に何もなかったな、と思いながら適当に人の日記を見て、気になったのがこれ。「お酒を飲むのを強要されたかった」という記事。

  http://anond.hatelabo.jp/20131128231038

 正直なところ、僕は「お酒を飲むのを強要されたかった」と思ったことなど生まれてこの方一度もないし、これから先も永遠にないだろう。だから、僕はこの記事を書いた人が、どうしてこんな記事を書いたのかが気になった。

 単なる想像だけれども、ルールを破る言い訳が欲しかった、ということが1つの理由ではないかと思う。自ら進んでルールを破るのは恐ろしいことだ。ルールを破ったものは当然、罰を受けるだろう。しかし、他人からルールを破るように指示されたのであれば、罪悪感は和らぐ。責任がすり替わるのだ。だからこそ「お酒を飲むのを強要されたかった」のだろう。

 記事を書いた人は『「未成年飲酒は悪」という固定観念に囚われてしまった』と書いている。『「あぁ、普通の人はやっぱり成人するまで酒飲まないんだな」とか高校生の頃は誤解してた』とも。そうまで書いておきながら、それでも結局飲んでない。本音と建前とか言って、割り切ってるわけでもない。この心の揺れが、いかにも若者らしい感じがする。

 子供の時は「大人がそう言ったから」 というのは究極の理由だった。少し年をとって「人がそう言ったから」に代わった。それからもう少し年をとって、いつまでもそれだけを支えにすると生きにくいようだ、ということがわかった。面倒なことだが、自分で判断して自分で責任を負ったほうが良い。なぜなら、人に判断を任せても、その責任は自分に降り掛かってくるからだ。

 「お酒を飲むのを強要されたかった」そんな風に、人に判断を委ねて、言われるままにするのは楽なように思える。けれどきちんと考えたら、何らかの答えがひとつ定まるはずだ。たとえば「法律違反の罪を負うのは自分だし、体を壊したとしても誰も代わってくれない。だから未成年飲酒はしない」というような。あるいは、「そんな大層なことになる可能性なんてたかが知れているから、多少のリスクは負ってでもお酒を飲んでみたい」という考えもあるだろう。どっちにしたって、自分で決めれば後腐れはない。失敗したって、そんなに後悔はしないはずだ。

 個人的なことを言うと、僕は酒の良さがわからない人間だ。だから、そういうことに悩んだことはない。ただ、お酒に関しては大失敗した時のリスクが大きいので、気をつけたほうがいいんじゃないかと思っている。

少し切実な僕の創作の動機

 「創作における間違った信仰」という日記を読んだ。創作のモチベーションは様々で、ちやほやされたい、という欲望があるのは自然だと思う。ただ、それが動機の大半だと考えるのは少々悲観的なように思えた。自分の場合、ちやほやされたい気持ちはあるけれど、実際に褒めてもらったことなんてほとんどない。作っては潰す。作りかけて投げる。そんなことがずっと続いているのに、未だにやめられない。

 僕は、自分がゲームや物語を作ろうとする理由について考えた。それには、僕の過去についてのいくらかの前置きが必要になる。

 小さい頃から、家にいて暇な時間を見つけると、なんとはなしにゲームをしてきた。それは今でもたいして変わっていない。それは周りと比べると少し異質だった。度々、何か別のことをするべきなんじゃないかと不安になることがあった。だけど、ゲームをしている時間が一番リラックスできて、楽に、スムーズに始めることができるから、止めなかった。少しばかりゲームを作ったこともあったが、ほんとうになんとなく作っただけだった。

 転機になったのは就職活動だ。そこでは、これまで何をしてきたのか、これからどうしたいのかが問われた。僕はただゲームを遊んできただけで、人と接するのは苦手だ。だから割と素直にそういう話をした。「そういう人が欲しい会社なんて、あると思うか?」そんなことを言われたと思う。ひどく絶望的に思えた。

 僕はそこで、素晴らしい言い訳に出会った。「創作者には、あらゆる想像力が必要だ。あらゆる経験が作品の糧になる」たいした見聞も持たない僕がなぜ、そんな言葉に光明を見出したのかというと、この言葉からは「どんな過去の経験であっても、無駄なものはない」という結論が導かれるからだ。「僕は創作のためにゲームをしてきた、そのために研鑽し見聞を広めたいと思っている」そのような前向きな自分を作り出すことができた。都合の良いことに、文章(論文)を書くための訓練をしてきたし、プログラミングの勉強もまたそうだったから、ものを作るためのタネと、手段を持ち合わせていたことになる。

 僕の創作のモチベーションとは、それだ。無為に過ごしてきたように思える時間が、無駄ではなかったことを証明するための手段。それが創作だといえる。

1.ゲームをすることは無駄ではない。
2.なぜならその間に自分の中に積み重なるものがある。
3.その証拠に、僕はこんな素晴らしい物を作ることができる!

 そういう論法だ。正直なところ、現実はより曖昧で複雑だ。こんな方程式を作り出す前から、ゲームを作りたいと思ったこともあるし、実際に作っていた。完成しないゲームであっても、物語であっても、そこに自分が見つけたものの姿を見ることができて、少しだけ楽しい。

 もう少し時間を置いてみれば、別の動機を見つけることもできるだろう。けれどさしあたり今の僕がゲームを作る理由は、ちやほやされたいという欲望よりも、もう少し切実な部分が大きいはずだと信じている。