第3回社内勉強会

本日第3回目の社内勉強会を開催しました。

今回は弊社の若手2人にプレゼンをしてもらいました。

以下が今回のアジェンダです。

  • SQL performance tuning (Oba 15mins)
  • Software testing (Denmark 30mins)
  • Break time (5mins)
  • Functional programming (Hideshi 20mins)
  • How to create test data (Hideshi 20mins)
  • Quiz (Hideshi 10mins)
  • Next topics (5mins)

 

一人目は弊社最年少のオバです。彼は初めは研修生という形で3ヶ月ほど弊社でWeb開発に必要な技術を学び、その後社員として働くことになりました。理解力や質問力など技術者としての基礎的な能力が高く、素直な性格も相まって入社して間もないにもかかわらず多数のプロジェクトで活躍してくれています。

彼は以前にMySQLのパフォーマンスチューニングのプロジェクトに関わった経験があるため、SQLのチューニングをテーマにプレゼンをしてくれました。

study_meeting_oba

内容としては無駄にデータを取得しないようページングをうまく使いましょうというものと、N+1問題についてでした。

N+1問題の原因としてはSQLのJOINの理解不足になりますので、今回は実際にPHPのコードを書いて違いを見せてくれました。最後にはN+1問題があるかどうかでどの程度パフォーマンスに違いが出るのかをデモで実演してくれました。以下がその資料です。

開発の初期段階からこのような形でパフォーマンスにも注意を払いつつ実装することで、運用中にだんだん遅くなるといったトラブルを事前に回避できるようになるかと思います。また弊社では日常的にコードレビューを行っており、そういった問題の早期の発見ができるような仕組みづくりも行っています。

 

次にプレゼンしてくれたのはデンマークです。彼は現役の大学院生で先のオバと同じ時期に研修生から社員として入社しました。彼の担当は主にQA(Quality Assurance: 品質保証)で弊社で開発したシステムを日々テストしてくれています。仕様を正しく理解し、それに基づいてしっかりとテストをしようという姿勢は我々を安心させてくれます。

今回は単体テストと結合テストのセオリーについてプレゼンをしてくれました。

study_meeting_denmark

以下がそのプレゼン資料になりますが、まずは単体テストと結合テストの違いをVモデルを絡めて説明し、その後各テスト工程の方法論について説明してくれました。

 

単体テストでは画面上のフォームに入力する入力値のパターンを同値分割と境界値分析を用いて、効率的に洗い出す方法を紹介してくれました。

用語について簡単に説明しますと、同値分割は入力値の下限と上限を境界として、入力値の集合を3つのグループに分割します。各グループからそれぞれ代表値を一つ選び出し、それを入力値として用いるものです。

境界値分析については、入力値の下限と上限の境界周辺の値を入力値として選び出す手法で、例えば1から10の値を受け付ける場合の境界値は0, 1, 10, 11になります。

実際にはこれらが複合的に用いられ、場合によっては複数の入力フィールドを組み合わせでテストするようなケースもあったりします。今回の例では時間と分という組み合わせに対して、時間を縦軸とし分を横軸とするような図から同値グループを洗い出し、その中からどのグループの値を用いてテストすると効率が良いかといった応用的な内容も披露してくれました。

結合テストについては状態遷移図を用いて画面とサーバサイドの処理の関連を視覚化し、そこからどのように画面遷移のパターンを洗い出して漏れなくテストするかという話をしてくれました。この状態遷移図を使うと正常系だけでなく異常系も見える化できるため、開発者はもとよりQA担当にとっても有用と感じました。

単体テストは開発者も行うことになっていますので、今回のプレゼンをきっかけに全体的な品質がより一層向上することを期待したいと思います。

 

次は私の番で、関数型プログラミングに関して手ほどきをしました。というのも最近の流れとして、テスト駆動開発が品質を担保するための一つの重要な要素になってきていることと、継続的インテグレーションにより自動化テストをデプロイの度に実行し、修正によるデグレードを抑えることで安定的な品質を担保することがより重要になってきていることが挙げられます。

テスト駆動開発を行うためには副作用を局所化し、処理をなるべく小さい単位で実装し、テストプログラムを実装しやすくする必要があり、そのためには関数型プログラミングから得られるものが多いと考えたからです。実際のところ弊社ではJenkinsを導入しほぼ全てのプロジェクトで自動デプロイを行っていますが、幾つかの制約によりテスト駆動開発については社内で検討をしている状況となります。今後のためにも、少しづつこういった形の付加価値をご提供できるような体制作りをしていけたらと思っています。

またJavaScript界隈ではリアクティブプログラミングが話題になっていますが、その便益を享受するための予備知識として必要になると感じています。最近はReact.jsの案件の引き合いなども来ていることから、そういった案件にも対応できるよう技術的な基礎体力の向上にも寄与できればと思っています。

study_meeting_hideshi2

以下がプレゼン資料になりますが、パラダイムシフトって何、関数って何というところから始まり、手続き型プログラミングと関数型プログラミングの違い、関数が第一級の値であるということ、イミュータビリティとミュータビリティ、参照透明と副作用、再帰、クロージャ、遅延評価と正格評価といった関数型プログラミングの主要な用語を簡単な例を交えつつ紹介してみました。

ちなみに関数型プログラミングをするには関数型プログラミング言語を使わなければいけないということはなく、PHPやRubyといった副作用を許すような言語でも関数型を意識して書くことは、ちょっとしたコツがいるかもしれませんが十分可能だと思っています。関数の役割を明確にし、副作用を局所化し、必ず値を返すようにする、これだけで十分メンテナンスしやすいものになるかと思います。そして皆が、どうしたら保守性の高いプログラムを書けるようになるかについて考えるきっかけになれば幸いに思います。

 

次も私のプレゼンで、テストデータをなるべく品質を損なわず効率的に作る方法を紹介しました。

テストデータの作成は仕様を満たしているかどうかを確認するための重要な作業で、これの出来次第でソフトウェアの品質が大きく変わってきます。仕様が複雑になればなるほどそれを検証するためのより多くのデータが必要になってくるのですが、かといってあまりやり過ぎてしまうと納期に間に合わなくなると言うジレンマがあります。そのため単体テストレベルではなるべく最小限の手間で仕様を満たすことができるよう効率的にデータを作る必要があるのですが、そのコツについて少しお話をしました。

テストデータのサンプル

前回とはまた違った趣でしたが、これはこれで面白い会になったのではないかと思います。

ゴッドフリーもご満悦の様子です。

godfrey

広告

第2回社内勉強会

先日弊社で2回目の社内向け勉強会を実施しました。弊社のエンジニア・コーダー全9名が参加しました。

今回の内容は以下のような感じです。前回と比べるとだいぶ増えましたね。

 

1) 社内のプロジェクトで使っている技術の紹介 Node.js

2) 新技術の紹介 PHP7 & CakePHP3

3) CakePHP2ソースコードリーディング

4) WebセキュリティTip

5) アルゴリズムクイズ

 

最初にプレゼンをしたのは弊社のトップエンジニアのアレックスです。彼はフロントエンド・バックエンドともに得意なオールラウンドプレイヤーで、新技術にも常にアンテナを張っている勉強家です。先日はスマホアプリの開発でも活躍してくれました。

弊社が関わっているとあるサービスにチャット機能があり、そこでNode.jsが使われています。彼はその設計と実装に一から関わったのですが、社内でも多くの技術者がNode.jsに関心を持っているようでしたので、今回発表してもらうことにしました。

study_meeting_2_01

彼はSocket.ioなどのNode.jsの主要な機能のメリットを分かりやすく説明してくれただけでなく、このプレゼンのためにデモまで用意してくれました。デモはシンプルなチャットアプリで、Node.jsの特徴を直感的に理解してもらえたのではと思います。

 

二つ目のプレゼンもふたたびアレックスです。今度はPHP7を紹介してもらいました。

PHP7は高速化と省メモリ化されただけでなく、便利なシンタックスが多数導入されました。

特に印象深いのは関数の引数と戻り値に型を定義できるというところです。ここ最近の流れとしては動的型付け言語は書きやすくていいんだけれども、型チェックでコードが散らかってしまうとか、型をチェックするためのテストばかりでめんどくさいねという風に型の重要性に気づいてきて、静的型付けに回帰してきているような気がします。これからはより型を意識した実装を心がけて型安全なプログラムを書いていきたいですね。

PHP7が正式リリースされてから半年ほど経ちましたが、実案件でも使われるケースが少しづつ増えてきているようですので、弊社としても新しい技術をできるだけ早くキャッチアップできるよう今回特別に調査し発表する機会を設けました。

 

三つ目のプレゼンは弊社トップクラスのエンジニアのゴッドフリーです。彼は学習能力、仕様理解力、実装力が高く、多数のプロジェクトに参画し数々の困難な要求を実現してきました。

今回はCakePHP3を紹介してもらいました。

study_meeting_2_03

CakePHP3は2と比べて大幅にアーキテクチャが変わりました。ModelからORMに変わりAPIがSQLライクの流れるインターフェースになりました。サブクエリも比較的簡単に実行できるようになっているようです。

個人的には生のSQLを直接書くのが一番いいと思っているのですが、とはいうものの一対多の関連を持つデータの処理は面倒なので、その辺りを解消してくれるORMは高速な開発には欠かせないものです。そのため今回の変更はいい方向に向かっているなと思いました。また関数型言語の影響か、ORMで取得したデータに対してMapやReduceでループを使わずに処理ができるようになっているのもいいですね。

 

四つ目のプレゼンは私の番で、CakePHP2のソースコードリーディングを行いました。

study_meeting_2_04Webアプリケーションフレームワークを使用する大きな理由の一つとして横断的関心事の分離があるかと思いますが、そこから派生してCakePHPのコア機能であるイベントシステムの解説を行い、それをどのように活用したら保守性の高いプログラムが書けるかという話をしました。

横断的関心事というのは直感的に分かりづらい用語のため、図や実例を用いてなるべく分かりやすくなるよう心がけました。後半の質疑応答では色々な質問や意見が出て実りのあるものになったように思います。また図を描くことでフレームワークのソースコードを読み解きやすくなることが、少しでも理解してもらえたら幸いです。

 

五つ目のプレゼンも私で、WebセキュリティTipを実演を交えて解説しました。

study_meeting_2_05

今回のお題はSQLインジェクションでした。最近新たに入社した社員が数名いましたので、重要性を改めて知ってもらうためにこの内容にしました。
ソースコードを見せてクイズ形式で脆弱性を探してくださいという感じでやってみると、参加者にとっても考えるきっかけになるので、これはいい方法だなと思いました。

ということで、今回はみっちり2時間有意義な時間を過ごすことができました。

第1回社内勉強会

先日弊社で初めて社内向け勉強会を開催しました。

現状の弊社の教育体制について少しお話ししますと、基本的に入社後1〜2週間ほど研修期間を設けていまして、その間に弊社でメインで使われる技術(PHPフレームワーク)を勉強してもらい、その後はOJTで業務をしながら学んでもらうというやり方をとっています。

しかしながら最近は少し所帯が大きくなってきていることや、使う技術がプロジェクトによって異なるケースが増えてきていることもあり、各自の技術力の向上や引き継ぎを容易にするためにも社内で使っている技術を全体にシェアした方がいいと思うようになってきました。

また開発における問題解決能力や論理的思考能力を養い技術者の基礎体力を向上させることで、生産性をより一層向上させる必要性も感じていたため、勉強会を開催する運びとなりました。

1回の内容は以下の通りとなります。

  1. Monacaの紹介
  2. CakePHPのソースコードリーディング
  3. アルゴリズムのプログラミング課題(宿題)

ひとつめのMonacaですが、アシアル株式会社が開発しているハイブリッドなスマホアプリを開発できるツールとなります。弊社でも幾つかのプロジェクトで採用しています。

Monaca詳細につきましては以前に書いた記事をご覧ください。

こちらが勉強会で使用したスライドです。

今回はMonacaの紹介ということでさほど深いところまでは話していなかったのですが、参加者からは多くの質問が出てきて予想以上に盛り上がりました。

 

ふたつめは弊社で普段使用しているCakePHPというWebフレームワークのソースコードリーディングを行いました。CakePHPRuby on Railsの影響を受けて作られたフレームワークで、高機能で習得がしやすいのが特徴です。

PHPはオブジェクト指向も使えるプログラミング言語ですが、フレームワークを使って開発をしているとあまりオブジェクト指向を意識しないでも開発ができるので、ある意味メリットといえばメリットなのですが、技術の基礎体力という意味で言いますと実用的なケースを参考に理解をしておくほうがいいといいと感じています。他にもリフレクションを用いた依存性の注入や、ORマッパーでのSQLの生成過程を通じたDSLの作成方法などフレームワーク開発におけるスタンダードを比較的高品質なコードで学べるとともに、有用な関数や変数などをソースを読むことで知ることができたりと、ソースコードリーディングを通して得られるものは多いと感じています。

こちらがスライドです。実際にはこれに加えてシーケンス図やソースコードを見せながら解説をしました。

sequence_diagram_cakephp_routing

今回はCakePHPのルーティングに焦点を当ててリーディングを行いましたが、次回以降はコントローラやモデル、それ以外の機能についても見ていこうと思っています。

実際にやってみた感想としては、CakePHPを長く使っている人ほど得るものが多かったように感じました。今後何か新しいライブラリやフレームワークを学ぶときの一助となればと思います。

次回は5月に開催の予定となりますが、弊社のエンジニアにもなにかプレゼンをしてもらう予定です。結果については、後日この場を借りてご報告させてもらおうと思います。