現新比較の方法

情報処理技術者試験では出題されないのですが、IT技術者として当然知っておくべきテスト手法として「現新比較」というものがあります。
これは、システムを改修した際に思わぬ箇所に影響が出ていないことを確認する(無影響確認)ための手法であり、改修前の出力と改修後の出力を比較し、改修の影響を受けるべき箇所以外は差異がないことを確認する、というものです。

この手法は単体テストからリリース後の確認まで工程を問わず使用される手法です。
例えば、プログラムを製造する場面で、「販売情報管理システムの取引ファイル出力プログラムについて、ポイント払いのレコード(ポイント払いされた場合)にポイントの有効期限を更新するように改修する。それ以外の箇所は変更しない。」という改修を行った場合、単体テストでは「ポイント払いのレコードはポイントの有効期限以外は現新で差異が無いこと」「ポイント払い以外のレコードは現新で差異が無いこと」を検証するべきです。

直すべきところだけ直したつもりなのに、知らず知らずの内に他の箇所にも影響していたというのは意外とよくあります。
現新比較を行わないと、本来見つかるはずのバグが見つからず、後でバグが見つかることになってしまいます。
システム開発に慣れ始めた頃が危ないです。「この改修で他に影響するわけないだろう」と思わず、現新比較はしっかり行うようにして下さい。

現新比較の具体的な方法としては、以下のようなものがあります。

1.ファイル・テーブル・電文のレコード等、出力が文字列の場合

・WindowsのfcコマンドやLinuxのdiffコマンド

完全一致する場合等、ごく簡単な場合に。

・WinMerge等の差異比較用のソフトウェア

1レコードの内の一部が異なっている場合がある等、少し複雑な場合に。

・Excelやjava等で作成した独自ツール

複雑なデータ加工が必要な場合に。
改行コード付与や一部項目除外等で済むなら、Linuxのfoldコマンドやcutコマンド等を組み合わせるだけでも十分です。

2.Windowsで生成した帳票・ハガキ等、出力がPDFファイルの場合

・2つのPDFファイルを開き、画面を切り替えて目視

アナログですが、簡単な比較なら結局これが一番早いです。

・AdobeAcrobatやDiffPDF等のPDF比較用のソフトウェア

大量のPDFファイルを機械的に比較する必要があるなら必要です。

3.Web画面のキャプチャ等、出力が画像の場合

・2つの画像を異なるファイルの同じ個所に張り付け、画面を切り替えて目視

アナログですが、簡単な比較なら結局これが一番早いです。

・ImageMagick等の画像比較用のソフトウェア

ソフトウェアを導入することで、流行りの自動化も可能になります。

4.プリンターで出力した帳票やハガキ等、出力が紙媒体の場合

・出力された紙を重ねて透かして目視

アナログですが、これしか手段がない気がします。


いかがでしたでしょうか。

現新比較について研修という形で座学で教わることは少ないと思いますが、実務では重要になります。
まだ実務で現新比較をあまり行ったことがないのであれば、こういったことを実務では行っているということを知っておいた方がスムーズに仕事に取り掛かれると思います。

次回からも役に立つ情報を提供していきたいと思います!

基本情報処理技術者試験のpythonのサンプル問題を解いてみた

2019年10月28日にIPAから基本情報処理技術者試験のpythonのサンプル問題が公表されたので、解いてみました。
既に基本情報技術者試験.comから解説も出ています。

【2019年10月28日公開】基本情報技術者試験 Pythonサンプル問題|基本情報技術者試験.com

解いてみた感想を一言で言うと、
「pythonに詳しくなくても、頑張ってトレースすれば解ける」
と思いました。
シラバスの内容を照らし合わせて考えてみても、pythonの細かい文法知識を問われているというよりは、pythonを使って各種ライブラリを使いこなせるかどうかを問われていると思って良いでしょう。

サンプル問題を全問正解するには、以下に示す前提知識が必要になります。
高校の文系数学の知識はないと厳しいですが、pythonの知識はそこまで深く問われているわけではありません。
疑似言語を解けるだけの技量があれば、pythonの知識不足で点を落とす可能性があるのは9問中1問(設問2のc)だけだと思います。
言語選択の問題で、自分が得意な言語の問題がたまたま苦手な問題であった場合、試しにpythonの問題を見てみても良いのでは、と思いました。

【数学の知識】

・0度の場合はx軸を右側に進む

・一回転は360度である

・三角比の知識

【pythonの知識】

・文字列のスライシング

例えば、x[2:5]とすれば3文字目から5文字目を取得できる。
始点と終点は省略できる。
(人によっては、知らなくても選択肢から察しがつくかもしれない)

・stackの使い方

(ただし、設問中のロジックを見れば、知らなくても十分に察しがつく)


ちょっと今回は普段とは毛色の違う記事を書いてみました。

基本情報処理技術者試験は既に合格済みなのですが、合格した後も試験内容の変更には敏感であった方が良いのではないかと思っています。
いつの間にか新人でも知ってるようなことを知らない技術者になってしまったら悲しいですからね。

では、また次回!

unix/linux:決められた時刻に処理を実行する(ワンライナー編)

unix/linuxの便利コマンドの紹介です。


テストや補正作業を行う際、決められた時刻に決められたコマンドを実行したい場合があります。
unix/linuxでは、atコマンドを使用することで、決められた時刻に決められたコマンドを自動的に実行するように登録することができます。

しかし、atコマンドを通常の使い方をする場合、対話式にコマンドを入力したりコマンドを記載したファイルを別途用意したりする必要があり、オペレータに作業を依頼したりシェルスクリプトに組み込んだりする場合に都合が悪い場合があります。
そこで、下記のようにプロセス置換(コマンドをファイルに見立てる記法)を用いることで、対話式のコマンド入力やファイルの用意をする必要がなくなります。

・20:00に/home/hoge/test.txt(空ファイル)を作成するように登録する例

#> at 20:00 -f <(touch /home/hoge/test.txt)


OSのバージョンやatコマンドの設定によっては、atコマンドを使用できない場合もあります。
その場合は、下記のようにループ処理とバックグラウンドを併用することで、atコマンドと同じようなことを実現できます。

・20:00に/home/hoge/test.txt(空ファイル)を作成するように登録する例

#> (TIME=date "+%H%M"; while[${TIME} -lt 2000]; do sleep 60; TIME=date “+%H%M”; done; touch /home/hoge/test.txt) &


いかがでしたでしょうか。

unix/linuxのコマンドを使いこなせるようになると、できる作業の幅が広がります。
今回紹介したコマンドも、使う機会が少なくないのではと思います。

これからも、便利コマンドを紹介していきたいと思います!

java:イミュータブルなクラスを作る方法

「イミュータブル」とは「不変」という意味で、オブジェクト指向の世界では「状態(クラス変数)がオブジェクト生成時から変更されないこと」を指します。
有名所では、Stringがイミュータブルなクラスとして知られています。

イミュータブルなクラスを自作するためには、以下の条件を満たすようにクラスを作成する必要があります。

①クラス変数はprivateで定義する

クラス変数が外のクラスから直接書き換えられるのを防ぐため

②setterメソッドを定義しない

クラス変数を書き換えるメソッドは定義しない

③クラスをfinalで定義する

サブクラスでクラス変数を書き換えられるのを防ぐため

④ミュータブルなオブジェクトへの参照を含んでいない

ミュータブルなオブジェクトを変更する処理を記述しないようにするため

クラスをイミュータブルにするメリットとしては、内部の状態の変化を気にする必要が無くなるために処理を追いやすくなるというのがあります。
関数型プログラミングにも通じる考え方なのですが、オブジェクト生成より後で内部の状態が書き変わることがないため、クラスのメソッドが返す値が一定となり、内部の状態の変化を気にしながらトレースする必要がなくなります。
また、
hoge2 = hoge1;
のようなオブジェクトのアドレスのコピーが使いやすくなります。
イミュータブルではないクラスでこのコピー方法を用いると、hoge2の状態の変化がhoge1にも影響してしまい(hoge1とhoge2で同じアドレスを指しているため)、思わぬ影響が出ることがあります。
しかし、イミュータブルなクラスであれば、状態を変化させようと思えば新たにオブジェクトを作り直して新たなメモリ領域を確保しなければならないので、hoge2の状態を変化させても(オブジェクトを作り直しても)hoge1へ影響するのを防ぐことができます。
イミュータブルではないクラスでも、オブジェクトの中身全体をコピーすれば思わぬ影響を防ぐことはできるのですが、オブジェクトのアドレスをコピーする場合と比べてメモリ使用量が増え処理も遅くなります。

以下で、イミュータブルなクラスを定義してそれを使用するサンプルコードを示します。

【サンプルコード】

・ImmutableCalc.java

・ImmutableTestMain.java

【実行結果】


いかがでしたでしょうか。

オブジェクトの内部の状態を意識する手法には多くの技術者が慣れ親しんでいると思いますし、オブジェクトのアドレスのコピーも便利ですが、それが思わぬ影響を及ぼすこともあります。
思わぬ影響を防ぐために、イミュータブルなクラスを作成する手法は覚えておいて損はないでしょう。

これからも役に立つ情報を発信していきたいと思います!

ウォーターフォールモデルとV字モデル

日本でシステム開発を行う場合、多くの場合は「ウォーターフォールモデル」と呼ばれるプロセスに従って開発を進めます。
ウォーターフォールモデルを知ることで、各々の工程を何のために行うのかを考えることができるようになります。
システム開発作業に参画する際は、ウォーターフォールモデルについて知っていることが望ましいです。

ウォーターフォールモデルでは、実際にプログラムを作るまでは「要件定義(基本計画)」→「外部設計(基本設計)」→「内部設計・プログラム設計(詳細設計)」→「プログラミング(製造)」といった工程を踏みます。
ユーザの要求からスタートし、段階的に詳細化しシステム化の方針を決めるといった形で、トップダウンで開発を行います。
プログラムを作り終えてからは、「単体テスト(UT)」→「結合テスト(IT)」→「システムテスト(総合テスト、ST)」→「運用テスト(UAT)」といった工程を踏みます。
バグ頻発でテスト進行が妨げられることを防ぐために、細かい箇所からテストを行い徐々に統合するという形で、ボトムアップで開発を行います。

開発工程とテスト工程は、以下のように連関しています。

プログラミングの内容は単体テスト、内部設計・プログラム設計の内容は結合テスト、外部設計の内容はシステムテスト、要件定義の内容は運用テストで検証します。
これをV字モデルと呼びます。

誤りを修正する場合、後の工程になるほど手戻り工数が増え、修正コストが増大します。
最悪なのは、リリース後に誤りが発見され、修正の必要が生じた場合です。
そのため、手戻りは原則として行わず、各々の工程を順番にこなしていくことが理想です。
(水が流れるように順番に工程をこなすことから、「ウォーター(水が)フォール(流れ落ちる)」と呼ばれるようになりました)

手戻りを防ぐためには、レビューを強化する等し、ある工程で埋め込んだ誤りはその工程の中でできる限り解消することが重要になります。
仮に後の工程で誤りが発見された場合は、その誤りについてなるべく早い段階で例外的に前工程に戻り、その誤りの修正に関わる要件・設計・実装を見直すことが重要になります。
大規模かつミッションクリティカルなシステム開発では特にこの原則を守ることが重要となります。
以下は東証のシステム更改の例で、前工程への手戻りを正式にプロセスに組み込むことで手戻り工数を削減する「フィードバック型V字モデル」が採用されました。
http://ac.nikkeibp.co.jp/cn/xdev10/pdf/10907-xdev-A-1.pdf

また、実現性が疑わしい箇所について開発開始前にプロトタイプを作成し、実現性をあらかじめ検証するという手法も使われます。
プロトタイプを作ることで、開発開始時に実現性の問題が出て手戻りが発生することを防ぐことができます。
(このような事前検証は「POC」と呼ばれることもあります)

ざっくりまとめると、先が見える場合は1つ1つの作業を確実にこなす、先が見えない場合は先回りして視界を良好にする、という姿勢がプロジェクトを円滑に進める上で重要になります。


いかがでしたでしょうか。

私も1~2年目だった頃は、手戻りのリスクを考えずに猪突猛進に作業を進めて、結局手戻りして先輩に迷惑をかけたことがあります。
若手なら先輩に迷惑をかける程度で済みますが、リーダーや管理者の立場で同じことをすればプロジェクト全体の進捗に影響してしまいます。

ウォーターフォールモデルはシステム開発のプロセスとしては基本的なものですが、基本だからこそないがしろにしてはいけないと思っています。
単純に各工程の名前と作業内容を覚えるだけでなく、その背景にある理念も含めて理解する必要があると思っています。

それではまた次回!