「PHPカンファレンス2016」講演後スペシャルインタビュー
「テストを書けば、コードの質が高くなるわけじゃない」。和田卓人氏が語る「堅牢なコード」の本質

  • このエントリーをはてなブックマークに追加

メイン画像

2016年11月3日(祝)、大田区産業プラザPiOにて開催された国内最大のPHPイベント「PHPカンファレンス2016」。レバテックフリーランスでは、カンファレンスセッションの登壇者のひとり・和田卓人氏にインタビューを実施しました。

テスト駆動開発の先駆者として知られる和田氏ですが、今回の講演テーマは「PHP7で堅牢なコードを書く-例外処理、表明プログラミング、契約による設計」。あえてテスト以外のテーマを設定した理由をはじめ、PHPの優位性や今注目している言語、初心者エンジニアへのアドバイスなど、幅広くお話を伺ってきました。

<この記事の要約>
1. PHPの良い点は、ゆるふわな言語に見せかけて堅牢なコードも書けるところ。悪い点は、覚えることが多くて難しいところ。
2. テストを書いていればコードの品質が高いわけではない。また、テストが書けないくらい問題を抱えたコードでも、中から改善していくことは可能である。
3. 他の言語と比較したときのPHPの優位性は、圧倒的な技術者数の多さと裾野の広さである。
4. 和田氏が今注目している言語は、引き算のセンスが抜群のGo。
5. 初心者エンジニアは、身近に助言を求められる人がいるかどうかを基準に言語・フレームワークを選んだほうがよい。




和田 卓人(わだ たくと)氏
1977年生まれ。タワーズ・クエスト株式会社取締役社長。テスト駆動開発(TDD)の先駆者として知られ、講演活動やハンズオンイベントを精力的に行いながら、テストの重要性を説いている。監修した書籍に「SQLアンチパターン」、「プログラマが知るべき97のこと」がある。


 インタビュアー

福田 健一(ふくだ けんいち)
SEとしてITベンチャーを渡り歩いた後、2014年にレバレジーズ入社。レバテックでは複数メディアの新規立ち上げを行った後、レバテックキャリアのシステム責任者に就任。エンジニアリングだけでなくデザイン、マーケティングなど幅広い業務に携わっている。




<和田氏の「PHPカンファレンス2016」の講演スライドはこちら>

 

https://speakerdeck.com/twada/php-conference-2016

 

<当日の講演動画はこちら>

 


PHP7で堅牢なコードを書く-例外処理、表明プログラミング、契約による設計/和田卓人

 
PHPはゆるふわに見せかけて堅牢なコードも書ける、懐の深い言語

-本日は講演お疲れ様でした。このインタビューでは、今日の講演内容に関するお話をはじめ、PHPやその他の言語に関する和田さんの考えを伺いたいと思っています。まず、和田さんがPHPを使い始めたきっかけについて教えていただけますか。
 
和田氏:PHPを使い始めたきっかけは、僕自身が選んだというよりお客様が使われていたからですね。僕は主にコンサルタントという立場でお客様の現場やコードを改善する仕事をしてきて、担当したお客様がPHPでコードを書いていたので、必然的に僕もPHPを覚えて書くようになりました。
 
PHPを始めてみて、良かったところ・悪かったところというと、どういったことが挙げられますか。
 
和田氏:僕が仕事で最初に使った言語はJavaで、その後RubyやJavaScriptを使うようになり、PHPは4番目に使いはじめた言語だったんです。そういった背景をふまえた上でPHPの良いところを挙げると、PHPは意外と手堅い言語だというところですね。PHPはゆるふわな言語で誰でも簡単に書ける、というイメージが強いですが、意外と手堅く、かっちりとしたコードも書ける言語だということに気づきました。だから、JavaとRuby、どっちに似ているかと言われたら、Javaに似ているんですよ。
 
例えば、最近は開発環境でもPhpStormがとてもよくできていて、間違いの入りにくいプログラミングができ、言語の解析機能が強いという利点があります。PHPは、ふわっとニュアンスで書こうと思えば書けるし、手堅く書こうと思えば手堅く書ける、その懐の深さに興味を覚えました。
 
まさに今日の講演のテーマに通じていますね。
 
和田氏:そうなんです。堅牢なコードを書こうとしたときに、必要な考え方やテクニックがちゃんと適用できるようになっているのがPHPです。
 
反対にPHPのここは良くないな、と感じるところはありますか。

 
和田氏:うーん、覚えることが多くて難しいところですね。PHPならではのルールを正しく覚えていないと、実際にシステムを動かしたとき、自分の想像とは違う動き方をするような仕様になっていることがあるんです。そういった部分では、他の言語を経験してきた身としては面食らいましたね。

カンファレンスの講演は、大展示ホールを満席にする盛況ぶりだった和田氏。


いいところの裏返しでもありますよね。ふわっと書くこともできるし、かっちり書くこともできるから選択肢が多いんですよね。
 
和田氏:そうなんです。だから、いざかっちりとしたコードを書こうと思ったときに、足元をすくわれることがあります。比較演算子やキャストといった「色々な動きができるけれど、これだけは特別です」というPHP独自のルールをたくさん覚えないといけなくて、それはPHPの難しいところだと思います。

テストが書けないくらい問題を抱えたコードでも、中から改善していくことはできる

和田さんといえば、テスト駆動開発を啓蒙するエンジニアというイメージが強いと思うのですが、今回のPHPカンファレンスの講演テーマに「テスト」ではなく「堅牢なコーディング」を選ばれた理由はあるのでしょうか。
 
和田氏:理由はいくつかあって、ひとつは「テストを書いていれば品質が高い」という誤解を解きたいと思ったからです。「テストを書いているから質が高い」、「テストを書くことのみが仕事をきちんとやっていることの証明」といった空気を最近は感じるようになっていて、それだけではダメだということを伝えたかったんです。
 
というよりも、テストは”質の高いコードを書くための一部”でしかないんです。テストは外部から見た質の高さや使いやすさを調べているのであって、内部の品質を高めたり、中から調査したりするのとは別物です。今日の講演は、内部の品質も含めてプログラミング全体の質を高くするためにはどうすべきか、ということを考えるきっかけにしたかった。だから、あえて今回はテストの話は一切しませんでした。
 
なるほど。だから講演で「動くプログラムを書くことと、正しいプログラムを書くことは違う」というお話をされていたんですね。
 
和田氏:少し難しい言葉で言うと、自動テストコードは動的検証というジャンルなんです。つまり、対象を動かして、対象が思ったとおりに動いているかどうかを確かめるという検証手法なんですね。ということは、テストでは動きが期待通りかどうかを調べているだけであって、それが正しいコードであるかの確証を得ることとは別なんです。だから、テスト以外にも正しいコードや使いやすいコード、間違いにくいコードや前提のないコードなど、考える事はたくさんあるぞ、ということを示したかった。
 
チームで作るシステムや長く運営されるシステムは、後から人が触るものだと思ってコードを書けと言われますが、まさにそれを実現するのに必要なお話ですね。
 
和田氏:そうですね。また、講演では言わなかったのですが、今日の講演の裏テーマとして「テストが書けないくらい問題を抱えたコードであっても、中から改善していくことは可能である」ということを掲げていました。
 
例えば、既存コードが雑すぎるとか設計が古すぎるといった理由で、テストを書くことを諦めてしまっている人がいます。でも、今日の講演でお話ししたアサーションや例外の話は、テストが書けないと諦めている人達に、突破口を見つけるヒントにしてもらえれば良いと思っています。
 

「テストを書くだけに留まらず、コード全体の質を向上させる方法を考えてほしい」と熱く語ってくれた。


和田さんはどのような経験を通して、テストやコーディングの堅牢さを重要視するようになったのですか?色んな失敗や試行錯誤があって、今のスタイルにたどり着いたのかなと想像しているのですが。
 
和田氏:きっかけのひとつは、テストが書きにくいプロジェクトをたくさん見てきたことですね。僕に仕事の依頼があるのは、組織やプロジェクトが何らかの改善を必要としているときなんですよ。コードの質を上げるためにテストを書く文化を根付かせてほしい、という依頼があったとしても、そもそもテストが書ける状態じゃない場合もあるんです。そうなると、テストを書く以外の方法で立て直しを図らなければならない。
 
コードの質を上げるのはテストだけではないので、テスト以外の手法を身に付けて自分の引き出しの中身を増やしておこうと思ったんです。だから、個人的に何か失敗をして、というきっかけはあまりなくて、目の前にある課題を解決する方法を探しているうちにたどり着いたという方が強いですね。

 
圧倒的な技術者数の多さと裾野の広さが、PHPの信頼を支えている

これは個人的な興味でもあるのですが、数年前まではwebを作るのに使われていた言語はPHP一択だったと思うんです。でも、最近だとスタートアップの多くがRubyやGo言語、Node.jsを選んでいて、PHPがなかなか選ばれない環境になってきているのかなと感じていまして。そういった変化が訪れる中で、和田さんの考えるPHPの優位性はどこにあるのでしょうか。
 
和田氏:PHPの優位性は非常にシンプルで、圧倒的な技術者数の多さと裾野の広さです。数は力なので、言語の世界に限らず使っている人が多いものは、それだけでも選ぶメリットはあります。圧倒的多数の人に使われ、鍛えられているということは、OSSモデルにとっては信頼の基盤です。たとえPHPにバグがあったとしても、誰かが気づいてくれるだろうと期待できるわけですから。
 
スタートアップにとって人材の獲得というのは緊急の課題なので、言語を扱える人が圧倒的に多いのは、言語選択を行う上で大きなメリットになります。書ける人がいないというのは企業にとって致命傷で、立ち上げを行ったエンジニアが別の企業に行ってしまって残された人で詰んでしまう、というのはよくある話です。
  
ただ、技術レベルの幅でいうと、他の言語と比較するとPHPは上から下までかなりバラつきがありますよね。
 
和田氏:そうですね。本当に色んなレベルの人がいます。それでも、書ける人がいなくなることはないという安心感は大きいと思いますね。
 
技術レベルの差が大きい中で、和田さんの考える優れたPHPプログラマの条件は何ですか?
 
和田氏:今日の僕の講演内容に近づけて言うと、“ただ動くコードではなく、後々のことまで考えたコードが書ける人”ですね。後々のこと、というのは将来の自分のことかもしれないし、今後そのコードを触るチームメイトのことかもしれないけれど、書き捨てのコードではなく、後で誰が触っても困らない、バランスのとれたコードが書ける人が優れたプログラマだと思います。

今、注目している言語は引き算のセンスが抜群なGo

 
PHPの話題とは少しずれるのですが、和田さんが今後伸びていきそうだと注目している言語はありますか。
 
和田氏:2014年頃に受けた取材で、今後トレンドになる技術としてGo言語を挙げたのですが、Goはこれからも伸びていくと思います。
 
Goに注目する理由は何なのでしょうか。
 
和田氏:Goが引き算の言語であるところですね。ある意味、Goはベテラン言語設計者の壮大な実験場だと思うんです。PHPを含めたこれまでの言語は、良いと思われる仕様やパラダイムをどんどん取り込み、規模を大きくしてきました。それに対して新しい言語であるGoは、これまでの言語の歴史を振り返り、“昔はよかったけど、今の時代にはそぐわないもの”はバッサリ削ぎ落とした仕様になっています。つまり、Goは全部入りじゃなくて、NOが多い言語なんです。
 
例えば、Goには例外がないんですよ。昔は良い機能だったかもしれないけれど、マルチコアの時代に例外はそぐわないから、僕が今日の講演で散々コテンパンにした戻り値を例外の代わりに使う、という選択をしています。それにはちゃんと理由があって、例外というのはシングルスレッドの言語の世界の話であって、マルチスレッドやゴルーチンの中で例外が出たらどうするのか、という問題が出てきます。それならば、使わない方が迷わなくて済む、という判断をGoは下しているんです。
 
Goの言語仕様には「みんなが当たり前のように大事だと思っていたものは、実はなくてもいいのではないか」という挑戦的なメッセージで満ちています。こういった引き算の仕方にセンスがあるので、Goはすごく面白いんですよ。

和田氏いわく「過激にも思えるGoの言語仕様は、よくよく考えると納得できることが多い」という。


さらに、Goにはgofmtというツールがあり、言語自身が公式のコーディングスタイルを決めてしまっているところも斬新ですね。例えば、よくエンジニア間で起きるくだらないケンカのひとつに、インデントにタブを使う派かスペースを使う派かといったものがありますが、gofmtを使うと全てタブインデントになります。だから、Goを書いていると徐々にみんなが書くコードが似てくるんですよ。みんなで同じ目的を達成するのであれば、自分と他人のコードが似ていた方がコードの境目がなくなっていって再利用しやすくなる、という考えに基づいた判断です。Goはこういった割り切り方や決め打ちの仕方が過激で、そこがまた面白いんですよね。
 
PHPとは真逆の文化ですね。
 
和田氏:真逆です。Goは仕様の小さい言語ですが、PHPは大きい言語です。もし、PHPが今から仕様を小さくしようとすると、技術者人口が多いことも相まって、相当揉めると思いますね。だから、Goは最初から大きくしないという選択をしています。
 
言語関連のトレンドでいうと、2010年代は企業が言語を作る時代になりました。これまでの言語、例えばPHPやRuby、Pythonなんかは開発母体がOSSコミュニティでしたが、GoをGoogleが、SwiftをAppleが開発したように、企業が開発母体になることが増えました。それ自体は良いところも悩ましいところも両方あるのですが、総じて2010年代の言語は、僕が今日の講演で話したような手堅いコードが書きやすくなっています。つまり、間違ったコードを後から直すのではなく、最初から間違わないように書ける言語が増えてきているんです。
 
僕はSwiftを書いたことはほとんどありませんが、コードレビューやペアプロをする機会はあって、そういったときにコードを見てみると「あ、手堅いな」と感じるところがあります。そういった部分は、モダン言語の良いところだなと思っています。

駆け出しのエンジニアは、身近なところに師がいる言語・フレームワークを選ぼう

ありがとうございました。私が所属しているレバテックはエンジニア人材の転職や案件提案サービスを行っていまして、弊社に相談に来る方の中には、これからwebエンジニアとしてがんばっていきたいと考えている若手の方も多くいます。そういった駆け出しのエンジニアに向けて、最後にアドバイスをいただけないでしょうか。
 
和田氏:今、webプログラミングの世界に新たに飛び込んでいくことは、状況としては結構大変だと思うんです。昔、例えばPHP3や4の時代のwebプログラミングは牧歌的な世界で、セキュリティホールがあってもそんなに問題にならなかったし、覚えることもそこまで多くなくて、今よりもっと簡単でした。でも、今はXSS(クロスサイトスクリプティング)のようなセキュリティ対策もきちんとしなきゃいけないし、サーバー環境構築関連で覚えることもたくさんあるしで、難しいを通り越して圧倒されると思うんですよ。

だから、駆け出しのエンジニアにアドバイスを言うならば、初心者のうちはプログラミング言語やフレームワークを選ぶ基準を「その言語についてわからないことがあったとき、近くに聞ける人がいるかどうか」にする、ということです。
 
つまり、言語やフレームワークの良し悪しではなくて、困ったときに頼りにできる人が身近にいるかどうかを基準にすべきということです。そうやって身近なエンジニアから色んなことを学んだ後に、自分の考えで選んだ言語やフレームワークにチャレンジしていけばいいと思います。

身近に頼れる人がいないと、プログラミングを始めても途中でくじけてしまう可能性が高いという。

 
今はエンジニア向けの情報サイトがたくさんあり、SNS上では影響力の大きい技術者たちの意見も容易に得られますが、それは、それぞれの立場や状況によって述べられているものです。初心者にとっては、何が自分にとって最適な意見か判断しにくいことも多いでしょう。だから、まずは身近な人がPHPを使っているならPHPを、Rubyを使っているならRubyを使うことをおすすめします。どうしても特定の言語を学びたくて身近にアドバイスをもらえる人がいないのであれば、今日のようなカンファレンスや勉強会に参加して、信頼できる知り合いを作る必要があります。それくらい、身近に質問できる人がいるかどうかは重要です。
 
さらに、今のwebの世界はやるべきことも考えるべきことも多すぎるので、初めから全部を自分ひとりでやるのは無理なんですよ。だから、自分では対応しきれないという壁にぶつかったとき、そこで諦めるんじゃなくて、自分でできない部分は他の人やツールに委ねる判断をすることも必要です。PaaS(Platform as a Service)のようなものを使って、作るものの質を落とさずに手数を減らしていく。そのためにかかるお金は必要経費だと思いますね。
 

フリーランスに興味がある・案件を探したい、という方は下記からご登録ください



 

■求人・案件をお探しの方へ
PHPの求人・案件
業務委託の求人・案件

  • このエントリーをはてなブックマークに追加
いきなり相談するのは不安な方へ フリーランスになった時にどんな案件を提案されるのかメールでわかる! 詳しくはこちらから

プライバシーマーク

© 2014-2017 Leverages Co., Ltd.