サーバエンジニアが「開発力」を持つ意味

初出: Software Design 2009年4月号(2009年3月18日発売) 宮下 剛輔

サーバエンジニアの定義

本特集では、サーバエンジニアが開発力を持つことにより、どのような力を得ることができるのか、日々の業務にどのように役立てることができるのか、具体例とともに紹介します。

本題に入る前にまずはここでのサーバエンジニアの定義を明確にし、特集全体のコンセプトについて説明します。

クライアント/サーバ型のシステムを考える場合、サーバ側は大まかに以下のようなレイヤーに区分できます。

これらのレイヤーのうち、ミドルウェアレイヤーとOSレイヤーを主担当とするエンジニアを、本特集記事でのサーバエンジニアと定義し、対象読者と想定します。その中でも特に、オープンソースソフトウェア(OSS)をメインで扱うエンジニアを対象としています。

この定義で言うと、サーバエンジニアはシステムを構成する要素のちょうど中間地点に位置するため、直接の担当であるミドルウェア/OSレイヤーに専念するだけではなく、上層のアプリケーションレイヤーや下層のネットワークレイヤーを、ミドルウェア/OSレイヤーとつなぐ役割も負っていると言えます。

開発力とは

一口に開発力と言っても、様々な言葉で表現できると思いますが、ここでは「開発力がある」というのを、非常に大雑把ではありますが、以下のように定義したいと思います。

それぞれについて、もう少し具体的に見てみましょう。

プログラムコードが書ける

開発とは大雑把に言ってしまえば、コードを書くことである、と言えるかと思います。

ここで言う「コードが書ける」という状態は、大きなまとまったプログラムをいちから開発するだけではなく、簡単なシェルスクリプトやPerlのワンライナーを書いたり、既存プログラムを修正したり拡張することも含めます。つまり、何らかの目的を達成するためのコードが書ける能力を、開発力を構成する一要素と考えます。

本特集では主にこの部分にフォーカスを当てます。

プログラムコードが読める

コードが書けるだけではなく、読めることも開発力を構成する重要な要素だと考えられます。特に既存のプログラムを修正したり拡張する場合には、まずは既存のコードを読んで理解する必要があります。また、より良いコードを書くためには、他の人が書いた良いコードを読んで学ぶことも重要です。そこで、コードを読んで理解できる能力も、開発力を構成する要素に含めたいと思います。

後ほど、コードが読めることによって、サーバエンジニアにどのようなメリットがあるのかについて簡単に触れますが、いかにコードを読んで理解するか、といったコードリーディングの技術については、本特集の対象外とします。

より高い開発力を持つためには

「コードが書ける」「コードが読める」の2つを満たしていれば、開発力があると言ってよいとは思いますが、より高い開発力を持つためには、単にコードが読み書きできるのに加えて、様々な周辺知識が必要となってきます。いくつか例を挙げてみると、

といったものがあり、これら以外にもまだまだたくさんありますが、本特集で扱うにはテーマとして大きすぎますので、この章ではこれらのスキルがあると、サーバエンジニアにとってどのようなメリットがあるのか、簡単に触れるに留めておき、詳細は本特集の対象外とします。

サーバエンジニアが開発力を持つ意味

では、先ほど挙げたような開発力を構成する要素「コードが書ける」「コードが読める」「より高い開発力」をサーバエンジニアが持つことには、具体的にどのような意味があるのでしょうか?

プログラムコードが書ける意味

コードが書けることによるサーバエンジニアのメリットしてまず思い浮かぶのは、サーバ構築、設定変更、運用監視、インベントリ情報の収集、などといった日々のタスクの自動化が挙げられると思います。コードを書いてこれらのタスクを自動化することによって、以下のようなメリットが得られます。

特に対象となるサーバの台数が多ければ多いほど、コードを書くことによる自動化で受ける恩恵は大きなものとなります。

上記のようなタスクの自動化を行ってくれる既存のツールも存在しますが、既存のものだと機能が多すぎて複雑で使いにくかったり、その割にはかゆいところに手が届かなかったりすることもあるのではないしょうか。そんな場合でも、自分でコードが書ければ、必要な機能だけを実装できて、シンプルで使い勝手の良いものが作れますし、かゆいところにも手が届きます。

また、既存ツールでもプラグイン等で拡張できるものも多く存在しますが、コードが書ければやりたいことにマッチしたプラグインを書くこともでき、自分の手になじむようにカスタマイズすることができます。

プログラムコードが読める意味

OSSを日頃利用しているサーバエンジニアにとって、コードを読んで理解できることは大きな武器になります。

メリットのひとつとしては、普段利用しているOSSの内部動作に関する、深くて正確な理解を得ることができる、というものがあります。例えば、サーバの負荷状況を取得するためのツールであるtop、vmstat、iostatなどが示す数値が何を示すか、何となく理解していても、OSカーネルレベルでは具体的に何を示しているのか、ということは、ソースコードを読んで理解することによってはじめて正確な理解が得られます。システムの負荷対策を行うにあたっては、そもそも負荷とは何か、ということに関する正確な理解が必須であると筆者は考えます。

また、OSSを利用していて想定外の動作やバグに遭遇した場合に、コードが読めれば問題の箇所をつきとめることができ、更にコードを書くことができれば、自身で修正することもできます。

OSSなソフトウェアやライブラリには、とても便利なんだけどドキュメントが不足していて、使い方がよくわからない、想定どおりに動かないといったものも存在します。そういった場合でも、ソースコードを追うことができれば、利用方法を理解することができます。(もちろん、そこまでして利用する価値があるかどうか、という判断は必要になりますが、ドキュメント不足だからといってすぐ利用をあきらめるのはもったいないほど便利なソフトウェア、というものも世の中に存在します。)

他の人が書いた良いコードを読んで理解することも、開発力向上にとても役立ちます。

より高い開発力を持つ意味

単純にコードが読み書きできるだけではなく、更に高い開発力を持つことにより、どのようなメリットがあるのかを考えてみます。

読みやすくメンテナンスしやすいコードを書くための知識は非常に重要です。読みにくいコードは書いた本人すら理解できなくなることもあり、そのようなコードは具体的に何を目的として何を実行しているのかが不明瞭になるため、正常に動いている間はいいですが、何か問題が発生した場合や、修正が必要になった際に、容易にコードを変更することができなくなります。

メンテナンスしやすいコードを書くための知識としては、例えばオブジェクト指向があります。オブジェクト指向がもたらす変数や関数の局所化は、メンテナンスしやすいコードを書くのに大いに役立ちます。また、コードのテストに関する知識も、メンテナンスしやすいコードを書くためにはとても重要です。

各言語の標準/非標準モジュールや便利なライブラリを多く知っていると、目的を達成するためのコードを非常に簡単に書けるようになり、本来の目的の処理を書くことのみに注力できるとともに、コードも簡単になるため、メンテナンスしやすく、バグの出にくいコードを書くことができます。

Subversion等のバージョン管理ツールは開発者のためのツールと思われがちですが、サーバエンジニアが作成するコードの管理にもとても役立ちますし、コードの管理だけではなく、設定ファイル等の管理にも大いに役立ちます。

アーキテクチャパターンは先人達の知恵の集合ですので、多くのパターンを知ることにより、先人達が悩み乗り越えてきた道をショートカットできるようになります。例えば、MVCパターンは耳にしたことのある方も多いと思いますが、これは一般ユーザをターゲットとしたUIを持つアプリケーションだけではなく、アプリケーションレイヤーと接続するAPIを持ったシステム管理用プログラムの開発にも大いに役立ちます。

まとめ

この章では、本特集がターゲットとするサーバエンジニアについての定義を行い、サーバエンジニアが開発力を持つことにより、どのようなことができるようになるのかを、簡単にですが紹介しました。

次章以降では開発力のうちの「コードを書く」をテーマとして、更に具体的に、サーバエンジニアが開発力を持つとどのようなことができるようになるのか、紹介したいと思います。


これは、Software Design 2009年4月号に寄稿した特集記事『~サーバエンジニアがプログラムを知る意味~ システム運用/管理に役立つ「開発力」 ~楽天,mixi,paperboy&co.の事例紹介!~』において、自分が執筆を担当した第1章の内容を、技術評論社様の許可を得て、全文を転載しています。

現在では「サーバエンジニア」ではなく「インフラエンジニア」の方がおそらく一般的な呼び方でしょうね。(それも変わりつつあるようですが。)

なおこの記事は サーバ/インフラエンジニア養成読本 にも掲載されています。