twadaさんの基調講演(@XP祭り)
和田さんが講演をした理由
TDD誕生からの20年間を学んでほしい
- TDDの歴史
- お互いの得意分野を出し合ったペアプロ
- 最初はTest Firstという名前だった
- 加えた要素
- インクリメントなデザイン
- リファクタリング
- Test-Driven Development は日本のソフトウェア開発には必要な存在だろう
- 和訳して、日本のソフトウェア開発界に一役買いたかった
- 要件はお客さんに近い方から生まれるから、外側から実装していきたい
- ただ依存が多いドメインから実装しないと外側の機能のテストができない
- そこで、Mockなどを用いたテストが生まれる
- これが「依存方向逆転」の一種
- 和田さんのここまでの経緯
- テストを書かせたかった
- 簡単にテストを書けるtestingフレームワークを作ればいいってことで作成
TDDの本来の意味を再確認してほしい
- 正しくない解釈と意味の希薄化
- TDDの強要は、TDDを広げるための一番の妨げになる
- 「テスト書かずんば、人にあらず」は言い過ぎ
- testを書くだけでは、コードの品質は上がらない
- 無理やりテストを書くだけで、リファクタリングはしない
- テストを書きづらいことはリファクタリングと再設計のチャンス
- test firstだけがTDDではない
- testだけ書かれて、リファクタリングされない
- Mockが柔軟に使えるようになって、testを通すためだけの便利な道具に成り下がった
- Mock, Stub, Fake, Spyは違うよという話
- 違いを理解して、使い分けができる
- BDDの目的がテストを通すことになってしまった
- 本来はシステムの外から仕様を固めていくために使う
- BDDをやることが目的だけではない
- テストのメンテナンスしている日々を送ると幸せの約束の地には行けない
- メンテナンスコストがかかる
- リファクタリングはしていく必要があるよ
- TDDの本来の意味
- TDDの「T」はテストの一部でしかない
- Agile Testing
- testではなく,checkingでしかないんじゃないか?
- テストがあることで自信のある状態で勝利の道を歩き始められる
- テストは目的であり、大いなる自信を持ってコードを書くための手段でしかない。
講演を終えて僕たちがとるべき行動
テストを書いた後のコード自体の品質をあげよう
- テストは「品質」がわかるだけで、品質は上がらない
- リファクタリングによるインクリメンタルな再設計することで品質をあげよう
リファクタリングとインクリメンタルな再設計をしよう
- テストが書きづらいのは自分の技術力のせいだけではない
- 「testが書きづらい == 関係者が多すぎる == 設計が悪い」
TDDで自信を持って、コードを書こう
テストの本来の目的を体感するためにTDDの2章をやろう
- テストを書きながらテストを作る
- 脳外科手術のようなこと
オープン・クローズドの原則
参考:
SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則編(拡大版)〜 - Speaker Deck
オープン・クローズドの原則の定義
オープン・クローズドの原則とは
- 「Open」「Closed」を同時に満たすこと
- 「Open」とは、機能を拡張できること
- 「Closed」とは、修正を行わないこと
オープン・クローズドの原則を使用する理由
SOLIDの原則が目指している「良い設計」をもっとも反映しているから
- なぜ、そう言えるのかは割愛
バリエーションからコードを守ることに長けているから
オープン・クローズドの原則の使い方
問題の分析
- 問題を見つけるための着眼点
- バリエーションによって変更される部分を探す
- バリデーションを増やすことが容易かどうかを想定する
- 問題かどうかの指標
- 変更されるだろう部分がバリエーションの軸に沿ってまとめられているかを確認する
- バリデーションを増やした際に、OPCを破るなら改善する必要がある
改善方法
- バリエーションの軸を捉え直す
- 既存の軸で変更範囲が甚大ならば、他の軸を見つける
- 一番おおもとのバリエーションごとに分けられる軸に沿わせる
- それぞれでクラスを作る
- それがバリエーションで分けるということである
- 条件分岐を各バリエーション自身に任せる
- 使う側がどの処理をやるかを決めるのではなく、バリエーション自身に決めさせる
- バリエーションの判定をResolverクラスに任せる
- Resolverクラスには、それぞれの種類のコードは出てこない
- バリエーションがあるクラスに共通のメソッドを持たせる
- そのクラス自身に処理を決めさせる
具体的なコード例
問題点①: バリエーションが増えると増やすとバラバラにコードを書き足す必要がある
- 問題の分析
- コードの現状の軸とバリエーションの増加する可能性がある軸の整理
- 現状採用している軸
- 「行」のバリエーション
- 増加するバリエーションから考えられる軸
- 行の種類
- TODOの種類
- 出力フォーマットの種類
- どのバリエーションが増加したときに変更が大きくなるのか
- TODOのバリエーションが処理全体に大きな影響を与えそう
- フォーマット用の既存コードを修正する必要がある
- TODOのバリエーションが処理全体に大きな影響を与えそう
- バリエーションを軸にまとまっていると言えるかどうか
- 現状採用している軸
- コードの現状の軸とバリエーションの増加する可能性がある軸の整理
- 改善方法
- Todoのバリエーションを軸にした設計に変更
問題点②: Switch文による分岐部分で既存のコードに付け足しが必要
- Todoのバリエーションを軸にした設計に変更
- 問題の分析
- 分岐されるバリエーションが増えれば、elsifを増やす必要がある
- 改善方法
- Resolverの導入
- switch文の処理を代替するオブジェクト
- 入力に対応した処理オブジェクトを返す
- 入力値自らが自分の処理を決める
- 特定の集合に対して、特定のクラスを使うという対応付け(マッピング)の仕組み
- Resolverの導入
ないものがない世代
僕は現在22歳.
19歳までは,愛知県の比較的田舎で生まれ育った.
今は東京の大学に通う,普通の大学生.
決して裕福な家庭ではないが,特に不自由をしない一般的な家庭.
物心ついた時から,周りは物に溢れ,おもちゃが欲しいとねだったことはあるが,生活に困るものがなかったことはない.
高校に入学した頃には,IPhoneを使い始めた.2011年のことだ.
そんな世の中で生きていると,あれがないから不自由だと感じることは,ほとんどない.いや,全くないと言ってもいいくらいだ.
「ないものがない」のだ.
世の中に出回っているもので,十分すぎる.
一昔前は,現在と大きく違っていただろう.
当時の人は,自動車を作り,ビルを作り,あらゆる加工食品を作りと,まだまだ世の中の不十分な部分を補えば,その人の任務は全うされたことになる.
でも,「ないものがない」世代である僕たちは,一昔前と同じ道を歩むわけにはいかない.
厳密にいうと,歩めるけど,その道は轍があり誰でも通れる道になってしまっている.
では,僕たち世代の多くはどういう道を歩むべきなのか.
それは,自分が「好き」になれるものだろう.
偏愛を持てるものだろう.
偏愛から生まれるそのものの変化のきっかけが持てるものだろう.
ありきたりすぎて,少しださい気がするが,これは実感していることだ.
僕はプログラミングが好きで,数学が好きで,世の中を変えるものを作りたいと思っているから,今のインターンを見つけた.
業務は楽なものではないが,毎日ワクワク過ごしている.
でも,僕の周りでよく聞く話は,「自分が何が好きなのかがわからない」というものだ.
好きなものがわからないのに,よく就活をやれるな〜と思ってしまう.
好きなものを見つけるためにいいなと僕が思っている方法は,いろんな人の話を偏りなく聞くことだろう.
聞きに行くのがめんどくさいなら,スマホで情報を集めてしまえばいい.
今は,Instagram,Facebook,TwitterなどのSNSはもちろん,ニュースアプリでも様々な人が会話をしている.
みんなそれぞれが自分の「好き」なことに関して,投稿したり,話したりしている.
そこで興味を持った分野に詳しい人の話を聞きに行けばいい.
勉強会や公演なんて,毎日都内のどこかで毎日開催されている.
機会がないなんて言えない.
自分の将来を考えないようにしているのと,ほんの少しの勇気がないだけだ.
僕たちの世代の半分は100歳以上まで生きると言われている.あと80年もある.
生きがい,自分が一生かけて成し遂げたいこと,夢中になれることは,焦って作る必要はない.
でも,それを見つけてからの人生は今までにないほど,楽しめる人生だろう.
それが自分の人生を生きるということなんだろう.
和牛
和牛はとてもおいしい.
僕の大好物の一つだ.
でも,今回は,食べ物の和牛ではなく,お笑いコンビの「和牛」について,ほんの少しだけ話したいことがある.
先日,たまたまテレビをつけたらM-1グランプリがやっていた.
お笑い番組もあんまり見ないし,最近はテレビもろくに見ない生活をしていた.
僕が気になったのが「和牛」.
ボケの水田さんとツッコミの川西さんで構成されている.
一回目の漫才を終えると,他のより深々とお客さんに頭を下げ,「ありがとうございました」と川西さんが言った.
漫才終了後,今田耕司さんと上戸彩さんとトークの時間があるが,その受け答えはすごく感じのいい,真面目の印象を持つものだった.
予選を通過し,ファイナルステージへ.
決勝も非常に面白い漫才だった.
ファイナリスト全員が舞台に集められて,その場で優勝者が発表される.
和牛は惜しくも2位.
そして,テレビカメラは優勝コンビを映す.
そこに水田さんが見切れる.
そこに悔しさの表情も悲しさの表情もない.
なんとも言えない深い目をしていた.
今日のために,この舞台のために,たくさんの時間を費やし,たくさんのものを犠牲にしてきて,報われなかった人の目.
この人は,漫才に人生をかけているのだと,一瞬でわかる目をしていた.
僕も,和牛にとって「漫才」のような存在を夢中になって追う人生にしたい.
神に選ばれた者
神に選ばれた人で想像できるのは,現代では,お坊さん神父さんが思い浮かぶと思う.
昔だと,村の儀式で生贄に捧げられた人なんかも,神に選ばれたとされていたんじゃないかなと思う.
何を言いたいかというと,自分の利益や損失は考えずに,他の人のために尽くすことができる人が神に選ばれた人なんじゃないかな.
「神に選ばれた者」というのは,ラテン語で「ligere」と表される.
実は,「ligere」は,「エリート」の語源らしい.
「神に選ばれた者」.ちょっとかっこいい.
現在では,エリートとは,優秀な能力や影響を持つ人や集団に使われる言葉であることが多い.
しかし,語源まで遡れば,そういう意味ではない.
現代でよく使われるエリートの意味で考えると,僕は決してエリートではないと思う.
でも.「神に選ばれた者」,つまり,自分の利益や損失は考えずに,他人のために尽くすエリートに僕はなりたい.
好きな人が2人います.
先日,東京ディズニーシーに友達と行ってきた.
アフ6だったので,入場した時はすでに真っ暗.
お酒が好きな人が多かったから,ホットワインを飲みながら,ぼんやりメディテレーニアンハーバーを見つめる.
素敵な時間が流れる.
次に向かったのは,面白いカメさんと話せる,あのアトラクション.
カメさんに質問をしたければ,手を上げる.
もしかしたら,カメさんが選んでくれえるかもしれない.
ひょうきんな友達が手を上げた.
質問する.
好きな人が2人います.どうしたらいいですか.
カメさんが,心なし戸惑った表情に見えた.
(隣の知らない人から小声で「え,ありえない...」と言っていたのは,彼には内緒.)
確かに彼は,恋人がいるのに他の子と遊んだり,1ヶ月前話していた子と違う子が何人も出てくるほど,目移りが激しい人だ.
少し時間が空いて,カメさんが質問に応える前に,逆に質問を返してきた.
それで君は困っているのかい?
彼は応える.
幸せになれないです.
カメさんが返す.
でも,君は幸せそうな顔をしているよ.
(会場爆笑)
確かに彼はいつもニコニコしている.
誰がどう見ても,不幸には思えない.
人生楽しんでるって感じの雰囲気を醸し出している.
そして,カメさんが続ける.
多くの人のことを嫌いになるくらいなら,多くの人を好きになる方がずっといいと思うよ〜
(会場拍手喝采)
確かにそうだなと思った.
これまでに何度かこのアトラクショを楽しんだが,一番面白く,一番深かった回だった.
才能
きっと君の周りには,ある特定の分野に大きな力を発揮する, 才能 を持っている人がいるかもしれない.
その知人は,その才能とどのように向き合っているだろうか.
そして,自分が何かの才能を持っていたら,どう向き合うだろうか.また,自分の子どもが才能を持っていたら,どのようにその子を育てるだろうか.
決して自分に才能があるとは思っていない.
だけど,今の生活は,ある特定の分野に,かなり偏ったものになっている.
小学生の頃から,ずっと一つのスポーツをやっている.
勉強が大好きで,平日も休日も関係なく机に向かっている.
プログラミングが大好きで,パソコンにひっついて生活している.
飲み会に意味がないと思い,断って,本を読み続ける日々.
別にこれらが悪いとは決して思わない. (僕も一時期はこんな生活を繰り返していた.)
でも,人として,一番大切なことを忘れていた.
人を愛する心を育てることだ.
人がどういう心を持ち,どういう人が世の中にいるのか,自分以外の人が何を考えているのかを知る機会が少ないのはよくない.
その分野で力を伸ばすためにも,広く世の中を知り,多くの人を知ることは,決して無駄なことではないと気づかされた,
そして,1人の人間として,そうした方が人生が豊かになるのだと感じた,22歳の誕生日だった.