プログラミングについて知ろう
はじめに
みなさん、こんにちは。今回は「プログラミング」をテーマに解説します。弊社では定期的に小学生向けのプログラミング教室を開催しているのですが、「キーボードを触るのが初めて」という子供でも、半日もすると簡単なシューティングゲームを完成させてしまいます。子供たちの上達の早さには毎回本当に驚かされますが、「やってみようという気持ち」と「ポイントを押さえた知識」があれば、「誰でもプログラミングができる」ということの裏返しでもあると思います。
もしかしたら皆さんは「プログラミング=アプリケーションエンジニアの仕事」と思っているかもしれませんが、実はインフラエンジニアでも簡単なプログラミングをする機会があります。本記事では構造的に理解しやすくするために概要から話をはじめますが、最終的にはインフラに関わるプログラミングに特化して事例を交えながら解説したいと思います。
プログラミングとは
1. プログラミングとは
日本の小学校では2020年からプログラミング教育が必修となり、需要を狙ったプログラミング教室も次々にオープンしています。皆さんもプログラミングという単語を耳にする機会が増えてきたのではないでしょうか。
それではプログラミングとは何なのでしょうか。Wikipediaには「コンピュータプログラムを作成することにより、人間の意図した処理を行うようにコンピュータに指示を与える行為」と紹介されていますが、ひと言で表現するならば「プログラム(コンピュータプログラム)を作ること」になります。
2. プログラム(コンピュータプログラム)とは
プログラムとは「コンピュータに実行させたい処理を記述したもの」です。例えばインフラ的なプログラムだと「Oracleの表領域をバックアップモードに変更、データファイルをバックアップ、バックアップモードを解除…」といった一連の処理が記述されています。
プログラムは人によって思い浮かべるものが異なる概念的な言葉です。そこで、イメージしやすいように少し分解すると、「実行プログラム」と「ソースプログラム」に分けることができます(図1)。
大前提として、コンピュータは”0”と”1”で表現される「機械語」と呼ばれるものしか理解することができません。最近のコンピュータはOSの機能により随分と人間に優しい雰囲気を醸し出していますが、最終的には”0”と”1”しか理解できないのです。この機械語で書かれたプログラムが実行プログラムです(図2)。
さて、プログラミングをするのは人間ですが、人間が機械語を理解するのは非常に困難です。従って、通常は人間が理解しやすい言語を使用してソースプログラムというものをまず作成します(図3)。そして、このソースプログラムを機械語へと変換することで、コンピュータが人間の命令を理解できるようにしています。
3. プログラミング言語とは
前項で説明した人間に理解しやすい言語を「プログラミング言語」と呼びますが、具体的に”C言語”や”Java言語”など実際の言語名を挙げたほうがイメージしやすいかもしれませんね。世の中には数多くのプログラミング言語が存在していますが、システムで使用されているものは数種類に絞られます。
プログラミング言語を駆使してプログラミングを行うためには、その言語の使い方を覚える必要があります。書店にはプログラミング言語に関する分厚い書籍がたくさん並んでおり圧倒されてしまいますが、実はインフラエンジニアのプログラミングに必要な知識はそれほど多くないのです。
4.コンパイル方式とインタプリタ方式
人間に優しいプログラミング言語を使用してソースプログラムを作成した後、コンピュータで実行するためには機械語へと変換する必要があると説明しましたが、この変換には「コンパイル方式」と「インタプリタ方式」の2つがあります。
コンパイル方式では、コンピュータの実行前にソースプログラムを機械語で書かれた実行プログラムへと変換します。事前に実行プログラムへと変換しておかなければプログラムを実行できません。メリットは実行速度が速いという点で、C言語やCOBOL言語はこの方式です(図4)。
一方、インタプリタ方式ではコンピュータの実行時にソースプログラムを機械語へと変換します。ソースプログラムを作ったら即実行してみるといった形で手軽に動作を確認し、問題があればすぐに修正できます。メリットはこのメンテナンス性ですが、速度面でデメリットがあります。Perl言語やPython言語がこの方式です(図5)。
システムとプログラミング
1. システムにおけるプログラミング
おさらいになりますが、第1回「ITインフラの全体像を理解しよう」ではシステムを図6のように分解しました。
今回のテーマはプログラミングなので分解する軸を変えてみたいと思いますが、システムにおいて使用されるプログラム(=ソフトウェア)を分解すると図7のようになります。
- プログラムとソフトウェア
「プログラム」と言うと「コンピュータに実行させる命令を記述したもの」という文脈で使用される機会が多いのですが、「ソフトウェア」はこのプログラムの集大成になります。Excelはプログラムではなくソフトウェアと表現した方がしっくりきます。
システムソフトウェアとは、MicrosoftやOracleといったソフトウェア会社が販売しているものを使用するため、当然ながらインフラエンジニアがプログラミングする必要はありません。アプリケーション(例えば、ECサイトで購入ボタンが押された場合に決済が行われるなどの様々な機能をシステムごとにカスタマイズして作成したもの)に関しても、基本的にアプリケーションエンジニアがプログラミングすることになります。
2. インフラにおけるプログラミング
残るは「ツール」ですが、これがシステム開発プロジェクトにおいてインフラエンジニアがプログラミングする対象になります。具体的にはシステムを運用する中で必要となる自動化ツール(1日に1回バックアップを取得するなど)を作ることになります。
なお、本記事では便宜上ツールと表現していますが、インフラエンジニアがよく使用するプログラミング言語はスクリプト言語(正確な定義はないが、簡易的なプログラミング言語全般を指す)であることから「スクリプト」と表現されることも多いです。お客様からも「使用言語はPowerShellとシェルスクリプトで、200ライン程度の運用スクリプトを100本」といった具合で依頼されます。
なお、ここ数年でよく使用されている言語は図8の通りですが、時代とともにプログラミング言語も栄枯盛衰があり、バッチスクリプトやPerlを使うプロジェクトはだいぶ少なくなってきた印象があります。
連載を通して、インフラエンジニアが関わる「システム運用」に注目し、さまざまな側面から解説していく本コラム。今回は「システム障害」について考えていきたいと思います。
システム開発が終了するとシステム運用が始まりますが、運用や保守に携わる人間にとって怖いのがシステム障害です。ハードウェア故障からソフトウェアのバグ、性能問題、セキュリティ問題など様々な原因がありますが、最終的には運用をしている人間が解決する必要があります。
社会的に影響のあるシステムは止まることが許されないので、運用も24時間365日休むことなく行われています。システムは監視ミドルウェアによって監視され、障害時には警告を出して人間に知らせてくれますが、通常はシステム担当の運用オペレータが1次処理を行います。ただ、運用マニュアルの中で対処できないものに関しては担当エンジニアにエスカレーションされることになり、ここから長い戦いが始まることになります。
このような障害対応を始めとする運用経験はシステム開発を行う際にも必ず生きてくるものです。はじめのうちは「構築・設計をやりたい!」と思うのも理解できるのですが、どこかで運用を経験しないと本当のシステム設計はできません。
(おわり)
様々な言語
1. Windowsバッチスクリプト
Windowsのコマンドプロンプトに実行させる処理を記述してツールを作ります。PowerShellの登場までは多くのシステムで採用されていた言語ですが、デメリットは実行できるコマンドが少ないことです。普段の操作の延長で扱えるため新たに覚える要素が少なく、ファイルバックアップといった簡単なツールでは今でも選択されています(図9)。
2. PowerShell
Windows Server 2003以降で使用されるようになった言語で、使い方はバッチスクリプトと同じです。バッチスクリプトでは主にファイル操作などの処理が中心でしたが、PowerShellでは扱えるコマンド数は飛躍的に増えておりWindowsの大半を操作できるようになりました。Windows環境で少し複雑なツールを作成する場合にPowerShellを選択することになります(図10)。
3. UNIXシェルスクリプト
UNIX系OSにおけるツールは基本的にUNIXシェルスクリプトで作成しています(図11)。注意点は実行するシェル環境ごとに微妙な方言(差分)が存在することですが、通常はUNIX全般に標準搭載されているBシェル環境に合わせてスクリプトを作成します。ただ、最近のLinuxの勢いを背景に「Bash」というLinuxのデフォルトシェル環境に合わせたツールも作成されており、どのシェル環境に合わせるかはシステム運用を鑑みて決定する必要があります。
4. Python、Ruby
その他にも、最近ではPythonやRubyといった言語を選択するシステムも増えてきました。これまでに紹介した言語で困ったことはあまりないのですが、さらに複雑な処理を行う場合や実行速度を気にする場合に選択されています。また、このような言語では「ライブラリ」と呼ばれる様々な便利ツールが公開されていることも大きなメリットです。特にPythonではAI関連のライブラリが豊富に揃っています。
プログラムの構造
前項で様々なプログラミング言語を紹介しましたが、実はどの言語を選択してもプログラムで使用する処理は3つしかありません。それが「順次」「分岐」「反復」です。
1. 順次処理
順次処理は、処理を順番に実行していく方法です(図12)。実行させたい処理を上から順番に書いていけばそれが順次処理となります
2. 分岐処理
分岐処理は、条件によって実行する内容を変える方法です(図13)。
例えば、ファイルのバックアッププログラムを作成する場合、実際にはファイルの状態を考慮する必要があります。書き込みが発生している状態のファイルをバックアップする場合、そのままバックアップ処理を流すとファイルの整合性がとれなくなる可能性があります。したがって、まず何らかの処理を行いファイルの静止点を確保する必要がありますが、このように前の処理が成功した場合にのみ次の処理を行うようにしたい場合には分岐処理が必要となります。
3. 反復処理
反復処理は、同じ処理を繰り返し実行する方法です(図14)。
例えば、対象リストに従ってファイルのバックアップを行うプログラムを作成する場合に、1つずつファイルをバックアップする処理を記述するよりも、反復処理を入れたほうが効率的なプログラムを作ることができます。
注意点としては反復を終了させる条件を設定しないと永遠に反復し続けてしまうという点で、反復処理には必ず終了条件が存在します。
実行形態
それでは、実際に作成されたプログラムはどのように実行されるのでしょうか。プログラミングをしている時は自分で手動実行して確認しますが、運用時に手動実行するわけにはいきません。通常は運用ミドルウェアの1つであるジョブ管理ソフトウェア(JobCenter、JP1/AJS、SystemWalkerなどの製品)が導入されており、スケジュール登録することで自動実行しています(図15)。
小さなシステムでジョブ管理ソフトウェアが導入されていない場合には、UNIX系であればCron、Windows系であればタスクスケジューラという自動実行を支援するツールが用意されているので、そちらに登録して自動実行することになります。
なお、ここで注意が必要な点は実行環境の違いです。プログラミングしている時には自分の想定した環境(rootユーザで環境変数が設定されているなど)で実行するためエラーが発生しなくても、自動実行される時には環境が変化している可能性があります。よくはまるポイントなので、覚えておいてください。
おわりに
今回はプログラミングをテーマに解説しました。現場のインフラエンジニアの中にはプログラミングができる人もいればできない人もいます。できない人に無理やりプログラミングさせることはないですが、やはりできた方がエンジニアとしての市場価値は上がります。最近では積極的に構築やテストの自動化も行われており、そこでもプログラミングの知識は必要となります。
さて、今回で本連載も最終回となります。およそ8か月に渡り最後までお付き合いいただいた方、本当にありがとうございました。毎回、記事の切り口が思い浮かばなくて悶々と過ごす日々は辛いものでしたが、「いいね」評価をしてくれた読者の方や編集部の方に支えられて、無事に全11回の連載を終えることができました。 最後に、本連載をベースにしたインフラエンジニアのための初心者向け書籍を作ることになりました(2018年2~3月頃刊行予定)。ぜひ、そちらも手に取っていただけたら幸いです。