こんにちは!R&D事業部のドンフンです。
R&Dのブロガーとしては初めて記事を執筆します。

今回のお話は、「開発環境についての課題とその対策」についてです。

開発環境01

R&Dの主な業務はWebアプリケーションの開発です。
開発するには、そのための環境が必要で、それを開発環境と呼んでいます。

まず最初に、R&Dではどのような開発環境で仕事をしていたのかをお伝えいたします。

これまでの開発環境

社員には1人1台のWindowsマシンが用意されます。今ですとOSはWindows10 Proですね。(※2018年9月現在の情報です)
このマシンを開発環境に仕立て上げます。

最初にバージョン管理に必要なgitやmercurialなどをインストールします。
次にWebサーバのApacheと、プログラミング言語のPHP、データベースのMySQLがパッケージになったXAMPPをインストール。
その他、ruby、python、nodejsなどのプログラミング言語や、GUIのデータベースツール、そしてプログラムを書くためのエディタなどをそろえて、最低限の開発環境を構築しています。

ちょっと余談ですが、他の会社では「統合開発環境」と呼ばれる、コンパイラやデバッガーなどの開発に必要なものがすべて入ったオールインワンのソフトウェアがインストールされているようですよ。

話を戻しまして、マシンにせっせと必要なものを入れることで開発する環境ができあがります。でもこれWindowsマシンなんです。私達の開発するソフトウェアは、Windowsマシンではなく、データセンターのLinuxマシンで稼働することを前提にしたソフトウェアです。このプラットフォームの違いで、開発環境と本番環境とで動作に違いが生じることがあるのです。

例えば、WindowsとLinuxではHDDのファイルシステムが違うので、ファイルを出力するようなプログラムで、使えるファイル名が違ったりフォルダのファイル数の上限が違ったりします。また、Web開発では決まった時間に定期実行するcronというものを利用することが多いですが、Windowsではそれが利用できません。

そして何より、本番環境に似せて開発環境を構築する難しさがあります。
大抵の場合、本番環境を構築するずっと前に開発環境を構築して、本番環境を構築するのは開発の終盤。いざ稼働させようとすると動かないということもあります。

このような開発環境でやってきたR&Dでしたが、たまに過去の開発プロジェクトを現在の開発環境で動かそうとすると、動かないことがよく起きます。使用しているミドルウェアのバージョンが新しすぎたりするからです。この「開発環境の切り替え」も大きな課題となっています。

Dockerを導入したら解決するかも

そこで注目したのが、開発環境の仮想マシン化です。
これまでも、VMWareやVirtualBox、Vagrantなどのキーワードはウォッチしていました。

Windows上に仮想的なマシンを作って、そこに本番環境と同じLinuxを入れ、本番環境と同じミドルウェアを入れることで、プラットフォームごとの動作の違いをなるべく無くせる。しかもプロジェクトごとに作った開発環境を他のメンバーに配布することができるというスグレモノ!

開発環境02

でもひとつ問題があって…この仮想マシン、重たいんです。
Windows上に複数のLinuxを起動しているのだから当然ですよね。このような仮想マシンをホスト型と呼ぶそうです。
結局、R&Dでは導入しませんでした。

対してコンテナ型と呼ばれる代表格のDockerは、ホストOSの上でゲストOSを起動させるという概念ではありません(ホストもゲストも同じOSの場合)。
Dockerの中で必要なミドルウェアのみが実行されます。しかも他のプロジェクトでも同じミドルウェアが利用されている場合は、効率よく実行されるようです。

開発環境03開発環境04

本来のDockerの使い方はミドルウェアごとのイメージをDockerHubからダウンロードして、それらを組み合わせながら開発環境を作るのが一番です。
しかし今回は、Linuxの一種であるCentOSをダウンロードして実行し、そこに必要なミドルウェアを次々とインストールして行くことに決めました。

とりあえず課題は解決

こうしてプロジェクトごとに作った開発環境は、Linuxやミドルウェアが丸々入っているので結構大きめです。1.8GBくらいですね。
結局ホスト型の仮想マシンと同じような使い方になってしまいましたが、目下の課題であった、プラットフォームの差違を極力減らし、過去のプロジェクトの開発環境を素早く構築する体制ができました。

そして現在新たな課題があります。
…やっぱり重たい。
本来のDockerの使い方だと効率的に起動するので、次回はそれを是非やってみようと思います。

それから複数の開発環境を起動したいとき、http://localhost:8001/と、環境ごとにポート番号を設定するのがスマートではないと思います。http://service-1.localhost/のように、ネームベースでアクセスできるようにしたいです。

開発環境05

尽きない探究と進化

今回は、長年使われてきたR&Dの開発環境を見直すことに挑戦をしました。結果、目標を達成しましたが、更に良くすることができることも見えました。

私が今回の挑戦を通して感じたのは、今まで普通に利用していたものに疑問を持つことが大事であるということです。
不便でもずっと使っていると、それが当たり前に感じてしまいます。そうならないために、常に改善を意識する必要があると思いました。

R&Dでは今回の開発環境だけではなく、様々な分野で改善を行い、仕事のパフォーマンスを上げる取り組みを常に行っています。
その様子を、これからもブログでお伝えしていきますので、お楽しみに。