PHP-MySQL案件のお手伝いで気づいたことメモ

1週間ほど自分の管轄外の案件支援に入っていて気づいたことがあったのでメモ。

■やったこと
  • PHPのコード解析
  • SQLのチューニング(クエリ発行回数を減らすための工夫や、実行計画を改善するためのインデックスやクエリの組み換え)
  • MySQLの設定についての確認

■気づいたこと
  • コードだけを見る限り、PHPJavaも生産性はあまり変わらないかな
     PHPPerlの影響もあって特に文字列処理など痒い所に手が届くAPIが言語レベルで組み込まれているけど、それはJavaもライブラリが一般的に広まっているので大差ない。スクラッチでWebアプリを作るうえでの仕組みはJavaよりPHPのほうがシンプルに構成されていると思うけど、これは双方フレームワークを導入すると殆ど差がなくなるというイメージ。※まぁフレームワークも目的と種類にもよりますが。
     一方で、大きな規模であったり、追加の開発人員が増える事を想定するなら、静的型付けでコンパイル型のJavaの方が統制が取りやすく品質もあがり、受け入れる側も入る側もコストが少ないなーという印象でした。
     ただし、コーディング-デプロイ(Javaの場合コンパイルも)-確認(テスト)のサイクルを体験したわけではなく、このサイクルのリズムや手間でPHPにアドバンテージがあるのかなと想像してるので、次はこの辺を体験してみたい。※Javaホットデプロイが普及しつつありますが、まだまだ再起動が求められるシーンが多い。

  • ユニットテストの自動化ができていないと大胆な手が打てない
     結構大きな改修を要する案があっても、リリースが近いとデグレが怖くてなかなか手が出せないケースが多くなる。特にSQLの大幅な改善は処理のアウトプットを大きく変えるのでどうしても入念なテストが必要だけど、そのコストがなかなか割けない。この点、多少コストをかけてでもxUnitのテストを用意しておくと絶大な効果を発揮するなと感じた。
     自分は普段自社プロダクトを継続エンハンスしてるのでユニットテストを作るのは当たり前だが、受託案件だとこの変はコスト対効果でなかなか難しいなと。ユニットテストも熟練してくるとそこまでコストが目立つ事もなくなってくると思うんだけど、それまでの教育コストは結構大きいので手を出しづらい。

  • MySQLはまだまだOracleよりは機能面で劣る
     サブクエリが相対的に遅かったり、1つのクエリに対しインデックスが1テーブル1つまであったり、実行計画が言う事聞いてくれなかったり、断片化を可視化する仕組みがなかったり。管理ツール周りは特に厳しそうですね。まぁ自分は運用はやらないんですが。
     最近続々と機能追加されて追い上げてる気がするけど、ちょっと前のバージョンだと、その機能使えませんよ!みたいなのも結構ある。やっぱりいざという時に痒い所に手が届くのはまだOracleの方だなという印象。もう2~3年もすれば追いつくかな。


■感想
  • パフォーマンスチューニングは継続して実施していないと勘が鈍る
     いや、実は久しぶりに自分の手を動かしてガチでチューニングしました。まぁ鈍り具合が半端なくて、勘を戻すのに時間がかかりました。この辺のスペシャリストになろうと思うと、常にSQLの改善を行ってるくらいじゃないとダメですね。

  • PHP初体験は楽しかった
     JavaScript以外のスクリプト言語の実践は実はほぼ初めての体験で、とても新鮮でした。そういう意味ではこの業務はとても身のあるものだった。フレームワークはもう言語が変わっても殆ど一緒ですね。言語間の生産性の差は縮まっていてエンジニアの腕にかかってますね。

  • DBに関してはまだまだ未熟であまり役に立てなかったかも。。。
     MySQLのガチチューニングは初めてでした。そのためエンジンがかかるのが遅く、期待されてたほど役には立ててないかも。後、もっとミドルウェアの設定に詳しくないとダメ。MySQL特有の設定を逆にいろいろ勉強せてもらった。。。もっと精進します。