引っ越しました

クリスマスも近くなり、日に日に慌ただしくなってきました。

そんな中、10月末にフィリピンオフィスの引っ越しを致しました。
11月でフィリピンオフィスを立ち上げて2年。現在約20人超のスタッフ。
ここまでとても順風満帆とは言い難いですが、何とか拡大することは
出来ています。
来年の中旬には30人体制

を目指し、日本人も含めた採用活動をしていきます。
今後ともよろしくお願いいたします。

まずは無事にクリスマス(および13か月目の給料支払い)を乗り切れるよう
引き続き頑張ります。
(しばらくはスペースに余裕があるので、フィリピンっぽくクリスマスツリーを置きました。)

広告

第5回マニラIT飲み会

だいぶ投稿が空いてしまった上に、この記事も少し遅くなりました。
去る10月13日に、第5回マニラIT飲み会を行いました。
今回は21人の方にお集まりいただきました。

場所が直前まで決まらなかったにも関わらず、お集まりいただいた方々、
ありがとうございました。

今後の開催は不定期となりますが、それでも年数回は開催される見込みです。
海外開催で定期で開催すると、スピーカーの調整がいつも難航します。

また、今回はいつも来ていただいているICANさんが来られなかったため、
代わりに募金箱を作成して設置させて頂きました。

この募金箱、当日に適当な箱を見繕って、フィリピン人スタッフに
「募金箱を作って」を依頼したのですが、出てきたもののクオリティが
高くびっくりしました。

しかし、よく見たら、入れられた募金を回収するには箱を壊すしかない
という素敵な仕様。。
こんなところからも、フィリピン人の特徴が分かりますね。

後日ICANさんに弊社までご足労頂き、その場で箱を壊して確認したところ
約5700ペソありました。
(IT飲み会の会費が1000ペソ黒字だったため、それもそのまま寄付させて頂きました。)

この場を借りて、ご寄付頂いた方にはお礼申し上げます。

第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

オフショア開発における国際化機能の活用による開発効率および品質向上対策について

いわゆるフルスタックと呼ばれるWebアプリケーションフレームワークには国際化(i18n)や地域化(L10N)という機能が付いていて、一般的にはグローバル展開するようなWebサービス等でユーザの言語設定に合わせて表示する言語を切り替えるというような使われ方をします。

今回はこの機能(以下国際化という表現を使います)を使ってオフショア開発で品質や開発効率を上げるための方法についてお話ししようと思います。

フィリピンでのオフショア開発を通じて、いわゆる言葉の壁というものを感じているというのがそもそもの動機としてありました。弊社では日本のクライアント様が大半のため、クライアント様とのコミュニケーションには日本語を用います。当然開発するWebサイトやアプリも日本語オンリーというものが多いです。

一方で社内では基本的に英語を用います。そのため開発時には日本語を英語に翻訳や通訳をするという必要性が出てきます。開発者からの問い合わせも例えば、「このHTMLや画像に書いてある文言の意味を教えてください」とか「エラーメッセージにはどのような文言を表示すればよいか」といったものが多かったりします。

ブリッジSEという役割はそのためにあるのですが、とは言うもののある程度の規模の開発になると開発者の数も増え、同じような質問を受けることもままあったりします。開発者はよくWebブラウザ上の画面をGoogle翻訳して理解に努めたりしているのですが、語彙があまりにも特殊な場合は翻訳が正確でなかったり、翻訳に一手間かかるという事情もあったりしますのであまりいい方法ではないように感じています。また、これはシステムの規模や要件の複雑さにもよるかもしれませんが、システム内で用いられる語彙は用途が限定されていることが望ましいと思っていまして、それをGoogle翻訳に一任してしまうともしかしたら誤解を生み出すことになるかもしれません。

そこで国際化の機能を使って、クライアント様やブリッジSEの画面には日本語を表示し、開発者の画面には英語表示するようにすれば、開発者は文言やエラーメッセージの内容を正しく理解できるようになり、本来やるべき機能の開発に集中することができるようになります。

先日とあるプロジェクトでこの国際化の機能を導入したところ、開発者からは思いのほか好評でしたので、まずはそのスクリーンショットをお見せしようと思います。

こちらがブラウザの言語を英語にした場合で

eng

こちらが日本語の場合です。

jpn

画面上の文言だけでなく、アラートやエラーメッセージなども言語設定に合わせて可変にしています。

弊社ではCakePHPというWebフレームワークを主に使用していますので、これをベースにご説明しようと思いますが、これは他のフレームワークにも応用が利くかと思います。

まず全てのHTML上の文言、アラートのメッセージ、バリデーションエラーメッセージをpoファイルに記述していきます。

CakePHPではapp/Localeというディレクトリに各言語ファイルが格納されることになっており、英語と日本語のファイルは以下のファイルに記述します。

app/Locale/eng/LC_MESSAGES/default.po
app/Locale/jpn/LC_MESSAGES/default.po

以下のようにmsgidとmsgstrを対で書いていきます。msgidには一意かつ任意の文字列、msgstrには実際に出力される文字列を記入します。英語と日本語のmsgidが一致する必要があることにご注意ください。

msgid "title_is_required"
msgstr "Title is required"

msgid "title_is_required"
msgstr "タイトルは必須です。"

使い方としてはModelにあるバリデーションメッセージに以下のようにmessageの部分にmsgidを指定します。

model

HTMLテンプレートのctpファイル内では以下のように__(‘article_title’)のような形で使います。

ctp

また、国際化を行うにあたってもう一つ重要な点としてボタンなどのUI部品になるべく画像を使わないというが挙げられます。

これまでボタンなどのUI部品には画像を使うことが一般的だったかと思いますが、最近はフラットデザインの普及によりUI部品に過度な装飾が求められなくなってきていることと、CSS3を使うことで画像を使わなくても見た目の良いUI部品を作ることができるようになってきたということもあり、画像の利用頻度は以前と比べると減ってきているように感じます。

画像の代わりにCSSを使うことで、ボタン上に表示される文言をテキストとしてHTML上に配置することができるようになりますので、Webフレームワークの国際化機能をこれらのUI部品にも適用することができるようになります。

ボタンは画面遷移や処理を実行するための重要な部品の一つですので、このボタンの振る舞いを正しく理解することが品質を左右することになります。

今後オフショア開発をご検討される際はこれらの点をご留意されると、お互いにより良い形で開発が進められるようになるのではないかと思います。

参考:

Wikipedia 国際化と地域化:https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%A8%E5%9C%B0%E5%9F%9F%E5%8C%96

CakePHP 国際化と地域化:http://book.cakephp.org/2.0/ja/core-libraries/internationalization-and-localization.html

CONRAD MANILAに行ってきました

最近マニラ日本人界隈で話題(?)のコンラッド マニラに行ってきました。

場所はMall Of Asiaのすぐ南。Mall of Asiaアリーナの隣でした。

ホテルの下が新しいショッピングモールになっていて、便利そうです。

(ただ、また店舗が少ないです。)

 

今回は新しくオープンしたラーメン屋「うま馬」に行ってきました。

博多ラーメン。マニラでこんな博多なラーメンを食べたのは初めてかも(笑

他にもお好み焼き屋さんや、鍋屋さんなど、オープンを控えているものも含めてたくさんあるようなので、うちからのアクセスが良いここが発展してくれることを願うばかり。

第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時間有意義な時間を過ごすことができました。

フィリピン人スタッフによるプレゼン

image1数か月前から当社では毎月テーマを決めてフィリピン人スタッフによるプレゼンを行っています。5月のテーマは「How to Increase Productivity(without use money)」というもので、ようはお金を使わず生産性を上げるにはどうするか、ということです。

なんとなく多かったのは、

・仕事を好きになる

・モチベーションを上げる

・自己管理

的な気持ち的なものが多く、「それはいいけどどうやるの?」と思う事も少なくありませんでした。

もう少し具体的なものでいいなと思ったのは、

・言葉や文化の違いがあるので、ちょっとでも疑問な事はどんどん質問する

・朝ミーティングを行い仕事の優先順位を確認する。(今朝ミーティングは廃止されています。)

・何にどのくらい時間を使っているか記録する(丁度工数管理のシステムを準備中でした。)

など。

前者の気持ち的なものも、それが出来るなら良いと思うので、まずは各自そうなってもらえるよう促しつつ、経営としてサポートしていきたいと思います。

 

 

はじめてのOUTING

13178800_10204587738972583_9220982973877768176_n日本がGWの5/5~6にOUTING(所謂社員旅行)に行ってきました。
日本だと最近はあまり流行らない社員旅行かとは思いますが、ここ
フィリピンでは年1でのOUTINGが必須といってもいいと思います。
(ただし、泊まりでなく日帰りでも良いそうです。)

うちは日本のクライアントからのお仕事がほとんどのため、
日本が稼働日の時は休みにくいので、GWの間に行かさせて頂きました。

行き先は「Pico de Loro」。マニラの南、バタンガスです。
http://hamilocoast.com/membership-page/pico-de-loro-beach-country-club

途中マニラ近郊の避暑地と言われるタガイタイでランチを食べ、
しばらく自由行動がありました。

馬に乗ったりFish Spaを楽しむスタッフもいました。
はじめての異国でのOUTINGでいろいろ不備もありましたが、
少なくともローカルスタッフは普段食べるよりもいいものを
食べられたはずですし、ビーチとエアコンのある部屋でリフレッシュ
出来たのではないかと思います。

来年はもう少し企画を詰めて実のある内容にしたいと思いました。
(あまりやると日本の社員旅行みたいに嫌がられそうですが。)

写真はスタッフが撮っていたものをこっそり拝借。。

越境ECなどで注目される個人間決済・送金サービス

最近日本からフィリピンにいらっしゃる方の中には、日本→海外、海外→日本でものを販売する、いわゆる越境ECに取り組んでいたり、興味をお持ちの方が目立ち始めました。
Paypalで一気に身近になった個人間の決済サービスが充実してきたことがひとつの要素なのでしょう。

最近のニュースでは日本から海外への送金に関しては、以前よりも難しくなってきているようです。たとえば日本からフィリピンへの海外送金で有名なウエスタンユニオンは、とても
便利で、送金手続きして数分で現金が受け取れるため、フィリピン在住日本人は多くの方が使っていますが、日本からの送金時にはマイナンバーが必要で、フィリピンでの受け取り
には、パスポートとフィリピン政府発行のIDが必要となるようになりました。

このこと自体は特に問題ないのですが、フィリピンで生活する中で便利さを感じた個人間課金・送金
一つ目はGcash。

Gcashとはフィリピン最大の携帯電話キャリアGlobeが提供している個人間送金の通貨で、携帯で完結する手続きで発行される番号を送るだけで送金できるサービス。チャージも
セブンイレブンやショッピングモールなどで簡単にできます。Gcash Master Debit CardはGcashをマスターカード加盟店でどこでも支払いに利用できるデビットカードです。
最近ショッピングモールなどでブースを出して会員を募っており、即時カード発行してくれます。フィリピンの運転免許証を使ってほんの10分ほどで作成できました。
(パスポートのみで日本在住の方が作成できるかは未確認です。)

フィリピンではクレジットカードはおろか銀行口座を持たない人も多い国ですが、少しづつオンラインEC等でカードの需要が増えてきており、今後爆発的に流行する可能性もあり、
Gcashは現金がないとき対面での個人間のお金のやりとりの際にも利用されるようになることも可能性としては十分あり、居住者の方は簡単に作れるうちに作っておくといいかもしれません。

ちなみにこのGcash Master Debit CardにはBeepというマークが入っていますが、これはフィリピンの高架高速鉄道LRT1、LRT2、MRTの3本の鉄道で利用できる、日本で言う
パスモやスイカなどのIC機能で、駅にある端末でチャージすれば、いちいち切符売り場に並ばなくても改札が通れるようになります。
続いて、Payoneer。

こちらはフィリピンに来た当初から自分の空き部屋を提供するために利用していた民泊マッチングサービスAirbnbがホスト向けへの代金支払いに採用したことで知った送金サービスで、
USのアマゾンAmazon.comでの販売者も受け取りに利用できるサービスです。なおクレジットカード決済なら、だいたいどのような請求でも個人向けに請求ができるので、最近日本向け
にトライアルしている越境ECでもクレジットカード決済手段としてPayoneerを利用し、スムーズにいっています。即時請求でき、決済完了したら約2~3営業日で受け取りできています。
なお、PayoneerでもMasterデビットカードを発行しており、ATMなどで現金で受け取れますし、カード利用もできます。
最後に、Bitcoin。

暗号通貨Bitcoinは非常に簡単かつ驚くほど安い手数料で送金が可能なため知られるようになりました。ビットコインの価値変動が現状激しいため、投機対象として興味を持つ方が
多い現状ですが、国の境目がどんどん薄れてきている昨今、国に関係なく流通できる通貨というのは今後ニーズが高まることが容易に予想できます。ビットコインの詳細は専門家に
任せるとして、Bitcoin関連で面白いサービスは、やはりデビットカードで、e-coin.ioのビットコインデビットカードはUKのサービスですが、17ドルでいとも簡単に発行されます。
ちなみにCoin.phというフィリピンのビットコインウォレットならGcashでビットコインが購入できますので、Gcashをビットコインデビットカードに移動してしまえば、銀行なしでワールドワイドに
使える通貨プールを所有することができるといえます。
最近フィンテック(Finance + Technology)と呼ばれるビジネス分野に注目、投資が集まっており、
個人間の国をまたいだ決済・送金サービスについては、今後イノベーティブなモデルが出てきそうです。
(写真:Gcash Master Debit Cardが即時発行される街角のブース)unnamed