開発者はプロジェクトの最終成果物を完成させるために自分なりのプロセスを編み出しています。そのプロセスには、試行錯誤の末にたどり着いたツールが含まれます。「プロセス」と「使うツール」が決まると、ワークフローが完成します。ワークフローは、開発者が直面するプロジェクト管理上の問題を減らせるので、開発者は自分のワークフローにこだわります。
ワークフローの構築は経験と試行錯誤(苦悩の時間です)が必要なので、エキスパートは新米開発者に、優れた開発者のワークフローを学び、真似することを薦めます。新米開発者も時間をかけて使えるものを取り入れつつ使えなかったものを捨て、プロジェクト開発に使う自分のツール集を編み出すのです。
PHPの世界で著名な開発者やデザイナーが使うツールやワークフローを紹介します。包括的とは言えませんが試す価値があるでしょう。
Taylor Otwell : Laravelの作者
- 現在はPHPアプリのプロファイラーBlackfire.ioがお気に入り。分かりやすいインターフェイスを持ち、短時間でアプリの問題を特定できる
- 継続的デプロイのために、自身で製作した2つのサービスForgeとEnvoyerを使用
Taylorはさらに、自身のワークフローについてHashnodeの質疑応答で詳しく語っているので具体的に知りたい人はチェックしてください。
Phil Sturgeon : WeWorkで働くソフトウェアエンジニア
- 依存オブジェクトが多くて複雑なときは仮想化ツールVagrantとDockerを使い、プロジェクトを外から切り離して扱っている
- 最近は主にAPIに携わっているため、Gitリポジトリからのプル(ダウンロード)、composerinstall(プロジェクトのセットアップ)、php -Sコマンドもしくはテストツール起動をひたすら繰り返している
Stefan Priebsch:PHP.ccのITコンサルタント
- 通常はPHPStorm、PHPUnit、phpab、PHP_Depend、PHP CodeSnifferを使用
- 最近は、おもしろくて新しいツールdephpendを使い始めた。アーキテクチャとの整合性違反を検出する、有望な依存オブジェクト分析ツール
- バージョン管理はGitで、継続的インテグレーションにはJenkinsを使用。ただし、プロジェクトでCIサーバーを立ち上げることは少ない
Nicolas Grekas:Blackfire.ioの最高技術責任者(CTO)
- ハードウェアは、富士通製ラップトップに2つのモニターをつないでいる(スクリーンは3つになるが、主に2つを使用する)
- ソフトウェアは、Ubuntu、Git、vim、ターミナル、ブラウザーを使用
- そのほかqgitを使用したり、Sublime Textエディターでコードを書くこともある。Windows VMでイシューのデバッグ(BlackfireはWindowsでも動作可)をしたり、PowerPointを使用することもある
- 異論があるかもしれないが、開発でもっとも時間がかかるのは自分の脳を使って考える作業だと思うので、豪華なIDEの必要性は感じない
- ローカルにBlackfireスタックを立ち上げるのには、Docker Composeを使う。最近はインフラ構築と単純なポートチャネリングには、近日一般にも公開されるSensioCloudを使う
- プロジェクト管理・品質管理では、Github、Splitsh、Jenkins、Appveyor、Zendesk、Jira、Slackなどのツールを使用
Adam Wathan:ソフトウェア起業家・作家
以下が私のお気に入りです。
- 27インチ5KスクリーンのiMacで99%の作業をする
- 外出先での仕事は13インチのMacBookProレティナを使用
- 開発に使うエディターはSublime Text 3
- MySQLデータベースの作業はSequel Pro
- EメールはAirmail 3
- 作業の進捗管理はTodoist
- ターミナルはiTerm 3とZSH
- リポジトリとホスティングはすべてGithub
- プロビジョニング(必要なときに必要なリソースを割り当てる)はLaravel Forge
- ダウンタイムゼロのデプロイはEnvoyer
Manuel Lemos:Icontemとphpclasses.orgの創立者
2006年から、ユースケース図を使ってPHPプロジェクトの開発作業を標準化しています。
- 手掛けているプロジェクトはブログ、フォーラム、大規模メール、ソーシャルネットワーク、ゲーミフィケーション(仕事のゲーム化)などいくつかのサブシステムに分割できる
- 各サブシステムは、コントローラーとしての役割をもつユースケース・クラスで構成されている。HTTPリクエストや入力を扱い、データベースや遠隔システムへの接続サービスを実行する役割がある
- データベースへのアクセスには、2002年から開発を続けているORM(オブジェクト関係マッピング)ツールMetastorageを用いている。MetastorageはXMLファイルで書かれたオブジェクトの関係定義を受け取って、PHPのクラスが各オブジェクトのデータを読み書きするためのコードを生成する
- 上記ツールは生成後に修正の必要がない最終コードと、データベーススキーマ定義ファイルを生成できる。そのためスキーマの更新に必要なSQL文のことを考える必要もなく、データベーススキーマを定義・更新できる
最近のPHPのプロジェクトは半分以上のコードをMetastorageで生成することも珍しくなく、生産的になり、少ない労力でより多くのことが可能になりました。Metastorageが生み出すコードは型チェックもできているので信頼性も上がります。
Josh Lockhart:Slim FrameworkとPHP The Right Wayの創立者
- 各プロジェクトごとのUbuntu仮想機械(Virtual Machine、VM)の管理にVagrantを使用
- 各仮想機械と本番用サーバーを完全に同じ環境にするため、両者に同じAnsibleのroleを用意する
- コーディングにはPHPStormを使う
- プロジェクトの99.999%、Composerを使用
- テストの作成と実行にはPHPUnitを使用
- バージョン管理はGitLabを使用、継続的なテストにCodeShipやTravis CIを使用
- デプロイはCapistranoで管理している。これは数年がかりで発見し磨いてきた鉄壁の方法で、非常に満足している
- Dockerには興味をそそられるが、まだ本番で簡単に使用・管理できるほどには成熟していないと考えている
Eryn O’Neil:講演者・コンサルタント
同時にたくさんのプロジェクトに取り組んでいます。ただし、大半はほかの人が始めたプロジェクトです。プロジェクトごとにワークフローは大きく異なりますが、一貫しているのは以下の点です。
- PCはDell XPS13のデベロッパー・エディションを使用(最初からOSにUbuntuを入れて販売され、Dellがドライバーのサポートを保証している)。Roostの持ち運べるノートPCスタンドと、外付けキーボード&マウスも愛用
- ソフトウェアに関して、開発環境はUbuntuでvimを使用。.vimrcをはじめ、便利なプラグインも使用
- ローカルの開発環境を分離するためにVagrantを使用。Scotch Boxを使えば楽していきなりVagrantが使えるので、開発環境や既存VMがない状態から新規プロジェクトを始める際に便利
- プロジェクト管理はGithubイシューと、その新機能であるProjects(GitHubリポジトリにTrelloスタイルのボードを統合したもの)を使用。さらに上位のプロジェクトではInsightlyで順調に進めるために管理している
Cal Evans:Nomad PHP、elePHPantの運営者
新規プロジェクトに対するワークフローは以下の流れです。
- Sublime Textを開いて20~40行のPHPの処理手続きを書き、考えがうまくいきそうか確かめる
- 必要ならデータベースを設計する。すべてのプロジェクトで必要なわけではないがコンフィグのような情報が求められる場合の多くは簡潔なコンフィグファイルだけで事足りる。データベース設計は、長年愛用しているMySQL Workbenchにこだわっている
- ひととおりの手順を踏む。データベース設計の仕事なら上記で手順はほぼ完了だが、そうでなければ手順に沿って進める。図にすることもあれば、必要なオブジェクトのリストを作ることもある。私は過剰設計する傾向が強く、実際はリスト化したオブジェクトの半分しか使わない。APIであれば、必要なエンドポイントをリストにする。Webサイトなら、ページのリストを作る。多くの場合はCLIを使うプロジェクトなので、必要なコマンドを考える。私は常にsymfony/command(コマンドラインシステム)を使うので、この作業から始めるのが良い
- コマンドの作成
- 動作するコマンドを作成する
- 進める中で必要になったオブジェクトを、単独のオブジェクトとして準備する
- コマンドの単体テストを書く
- リポジトリへコミットする
- 単体テストは、自分以外使わないプロジェクトなら、通常テストは書かず、自分以外の人が1人でも関係するならば書く。通常コードカバレッジは70%から80%を目指す
- リポジトリは、ほぼすべてのプロジェクトでソースコード管理をしている。ここでも、自分だけのプロジェクトか他人が関わっているいるかでワークフローは異なる。自分だけならば新規プロジェクトはマスターブランチ、既存プロジェクトで作業するなら新規ブランチで作業する。他人と共同作業するなら通常はフィーチャーブランチ(トピックブランチ)を使う
- 動くまで繰り返す。「完成まで」繰り返せとは言わない。これまで築いたプロジェクトはすべて未完成だ。新機能、オプション、リファクタリングなど手を加えたいことはある。芸術家の友人に「どうなれば完成か」と尋ねたら「永遠に完成はない」という答えが返ってきた。私のコードは芸術の域には達していないが、これには同意する
以上が私の方法です。手放せないツールも紹介します。
- Composer
- PHPUnit
- Git
- Sublime Text 3
- MySQL Workbench
- Docker
- APIは、Slim framework
- Webサイトは、WordPress
- そのほかは、Symfony/console
Kat Zien:Brightpearlの上級ソフトウェア開発者
私の開発ワークフローは比較的一般的です。
- 作業計画にはTrelloやGitHub/GitLab issueを使用。多くのエディターを使っているが、作るものにより使い分けている。作業対象がbashやちょっとしたコードだけならVimを使う
- PHPなら、PHPStorm。Goなら、Gogland。JetBrainsのツールを愛用している
- 最近は、GoやbashのスクリプトにMicrosoft社のVSCodeも使う。これまでのところ本当に高く評価している
- テクニックは、TDD(テスト駆動開発)に挑戦しているが、常用ではない。実験的な試みではテストを飛ばして一気に進めて、リファクタリングとテストはあとで考える
- とはいえコードは極力テストしたいと考えており、大型プロジェクトではテストの実行とコードカバレッジの管理にJenkinsもしくはTravis CIを使用
- Goを書くときは、パフォーマンス面の計測のためにベンチマークテストを書く。データ操作の競合検出(race detector)やランタイムプロファイラーなど、Goには優れたツールがたくさんあるので、プロジェクトに使用している
個人的なプロジェクトでも仕事でも、Gitのプルリクエストを通じてコードの肉付けをするのが好きなので、自分のワークフローもそれに基づきます。リクエストを作成し、コードのレビュー、マージ、テストラン、そして継続的デリバリーにつなげます。1回きりの単純なプロジェクト以外は、できるかぎり自動化することがカギです。
Laura Elizabeth:Client PortalとDesign Academyの創立者
私はデザイナーで、パートナーは開発者(共同オーナー)です。協同作業ワークフローです。
- 作業計画の際には紙とclubhouseを使い、やるべき作業を管理する
- 私のパートナーはコンテンツ部分を含む基礎部分からコードを書き始め、私はPhotoshopを開いて外観パーツのモックを作る
- コンポーネントの定義にはFractalを使用し、ボタンやそのほかの再利用が見込まれるモジュールの肉付けを開始
- コードエディターにはAtom、開発にはBitBucketを使う
- 私たちのアプリ(http://rightmessage.io)ではLaravelを使用。ほかのアプリはシンプルなWordPressサイトやプラグインを使用
最後に
以上のことから、ワークフローに関して以下のことが挙げられます。
- 開発環境はLinuxが好まれている。開発者はWindowsやほかのOSも使うが、テストのときや互換性の検証のときに限られる
- 開発者たちはプロジェクトの管理にはDockerとVagrantを好む
- GitHubとGitLabへの継続的デプロイの管理ツールにはJenkinsとTravis CIがおすすめ
- バージョン管理には全員一致でGitを選び、ほとんどの開発者がテストが必要だと考えている。しかいし、自分だけのプロジェクトでテストは書かない
- IDE(統合開発環境)とエディターは個人差があり、簡潔なテキストエディター、モダンなエディター、そして完全装備のIDEまで好みが分かれる。IDEについて言えば、無料のNetbeansなどよりも有料版のPHPstormが好まれている模様
あなたのワークフローはどうですか。紹介した開発者たちの中で自分と同じワークフローの人はいましたか。
(原文:What Are the Workflows of Prominent PHP Community Members?)
[翻訳:西尾 健史/編集:Livit]