OSTRACISM CO.

基本情報技術者試験の過去問をやってみた

 勤務先で情報処理技術者試験を受けろという。私は今まで情報処理技術者試験を受けたことがないので基本情報技術者試験を受けることになる。で、まずは前知識なしで最も新しい過去問題(2013年春期)をやってみた。

 以下は

http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2013h25.html

http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2013h25_1/2013h25h_fe_am_qs.pdf

http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2013h25_1/2013h25h_fe_pm_qs.pdf

http://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver3_0.pdf

を参照しながらお読みください。


午前

問11

 MPUって言葉はまぁ当然知っているが、何故CPUって表現しない。CPUと表現すると何か問題があるのか? 二〇世紀で時間が止まってるのか? 教科書(オーム社2013年版基本情報技術者標準教科書)の索引にMPUは掲載されていない。シラバスsyllabus_fe_ver3_0.pdfにもない。


問15

 平均故障間隔と平均修復時間と表現しないのはMTBFとMTTRが何の略か知ってるかの試験なのか? そのくせ直列に接続とか無駄に問題を複雑にしているし、何をどうしたいのやら。


問19

 「マルチプログラミングでのプログラムの多重度」とは何か。なんで素直に「マルチタスクでのタスク数」とか「マルチプロセスでのプロセス数」って表現しないのだろう。プログラムの多重度って何だろうって真剣に悩んだ。現場では「マルチプログラミングでのプログラムの多重度」なんて絶対に言わないし、通じない。素直に表現したら解答が解りやすいからですか? 仮想記憶とスラッシングの関係が問いなのだから普通に現場で使ってる言葉を使えっての。「プログラムの多重度」をGoogleに伺うと概ね情報処理技術者試験関連で出てくる。ほぼ情報処理技術者試験用語。

 古語辞書(岩波情報科学辞典 1990年)を引くと「多重プログラミング(マルチプログラミング)」には項目があり、(同時に動く)プログラム数を多重度と呼ぶとあった。アカデミックにはこんな風に言った時代もあったんだろうねぇ。歴史ある用語なのだけど古語というか死語だろ。プログラムの実行をプログラミングと表現するのは違和感がある。「マルチプログラミング」と聞いたら「何? マルチプラットフォームプログラミングのことか?」と返す。「多言語プログラミング」でも可。


問26

 プロジェクト参画が社員1に対して複数対応してるのはわかるが、その複数に重複を許す許さないに関して記述がないから許すってのは仕様なのか? 引っ掛け問題だろう。入試じゃあるまいし。


問32

 計算式は以下。

100000 * 100 / (1M * 60 * 60)/((2000+400/2) * 8)

 これを電卓なしで計算しなくてはいけない。「試験問題の作成に当たり、電卓の持込み禁止に対して十分配慮しています」だそうです。もっと配慮してください。

 あんまり計算しなくても

0.1M * 100 / (1M * 9)/44

さらに

1M * 4.4 * 100 / 1M * 9

で、

4.4 * 100 / 9

位にはなる。これで大体半分近辺とはわかる。選択肢を見ると半分近辺が3つもある。「試験問題の作成に当たり、電卓の持込み禁止に対して十分配慮しています」じゃなかったのかよ。もっと配慮しろよ。筆算で割り算なんて何年ぶりだ。受験者の計算機能力でなく計算能力が問われる。って時点で間違ってんだろオイ。


問45

 「ソフトウェア方式設計」という言葉が唐突に出てきた。こんな言葉は初めて見た。Googleに伺うと概ね情報処理技術者試験関連で出てくる。内容を調べるとだいたい「基本設計」に近い用語のようだ。

 古典的ウォーターフォールは各社多少言葉は違うが「要求仕様」→「外部仕様」→「基本設計(内部設計)」→「詳細設計」→「実装」→「単体試験」→「結合試験」となる。今の私の仕事とはおよそ無縁だが昔からの伝統的な開発プロセス。私が知ってるのはおそらく富士通の言葉。現場で使われる(使われてた)のはコレであって「ソフトウェア方式設計」とかいうナニソレではない。

 古語辞書(岩波情報科学辞典 1990年)にも「ソフトウェア方式設計」の項目はない。がしかし、教科書(オーム社2013年版基本情報技術者標準教科書)には一応載っており「ソフトウェア要件をどのように実現させるかを決める(ソフトウェアの構造とコンポーネントの設計)」と説明されている。教科書には何故こんな用語が書いてあるのだろう。教科書の元ネタ本が何かあるんだろうか。どこかのメーカーのローカルな用語なのだろうか。

 元ネタ本はJIS X 0160だった。ソフトウェア・ライフサイクル・プロセスの規格。1996年に規格化された。ISO/IEC 12207の翻訳なので1996年に新しく作られた造語である可能性が高い。そりゃ知るはずないしなんらかの理由や価値がないかぎりメーカーが採用するとも思えない。

 「ソフトウェア方式設計」の定義を正確に調べるには上記規格書を入手するしかない。情報処理技術者試験の教科書ではほんの短い説明しかないからだ。現場では誰も使ってない用語のために4725円ですか(JSAで販売してるPDFの値段)。おっと、おそらくアングラなサイトを見つけてしまった(http://kikakurui.com/x0/X0160-2012-01.html)。

『この規格の目的は,ソフトウェア製品のライフサイクルにおける,取得者,供給者及び他の利害関係者の間で円滑にコミュニケーションを行う場合に必要な定義されたプロセスの集合を提供することである』そうですが、誰も採用しないおかげで実績の伴わない用語セットが一つ増えただけって状況なんですかねぇ。こんな誰も使ってない用語を知ってる義理はない。試験で使うなら広くメーカーが採用して以降に願いたい。


午後 

問2

設問3

 コメントにて「物理ページの個数を増やしても、ページ置き換えアルゴリズムによっては、ページフォールトの回数が増えることがある」なんてドヤ顔で語られても、単純FIFOが実際のモダンなOSでどれだけ使われてるんですかねぇ。ウィキペディアによるとVAX/VMSで修正された形で使われたそうだが「そのままの形で使われることはない」そうな。まぁ基本原理の問題だからいいのか。でも「さぁ、皆さん、MMUの気持ちになって一緒に」全部の優先順位を書き上げていくという解き方しかできないのはウンザリだ。


問4

設問5

 開発室に閉じ込めて出られなくなるってのは、いくらなんでも横暴過ぎないか。問題となる行動を起こさせないためのシステム側の工夫ってのはアリだろうし必要だろう。この方向で許されるのは次回締め出すことであって今回閉じ込めることではない。かなり典型的なやっちゃいけないロジック変更。

 耐タンパ性は教科書(オーム社2013年版基本情報技術者標準教科書)の索引には掲載されていない(本文にもなさげ)。載ってそうなもんなのになぁ。『耐タンパ性に関する受験者の知識が不十分であることの結果と思われる』だそうで。教科書に記載はないがシラバスsyllabus_fe_ver3_0.pdfにはある。シラバスに書いてあるJISEC、JCMVP、PCI DSS、ペネトレーションテスト、耐タンパ性のうち教科書に記載があるのはペネトレーションテストのみ。しかもマイナー項目扱い。そりゃまぁ、知らんだろ。


問6

設問1

 必要な計算は以下。

40 * 3 * 1.0
40 * 3 * 1.2
25 * 3 * 1.0
25 * 3 * 1.2
20 * 3 * 1.0
20 * 3 * 1.2
15 * 3 * 1.0
15 * 3 * 1.2
40 * 4 * 0.9
40 * 4 * 1.1
25 * 4 * 0.9
25 * 4 * 1.1
20 * 4 * 0.9
20 * 4 * 1.1
15 * 4 * 0.9
15 * 4 * 1.1

 「試験問題の作成に当たり、電卓の持込み禁止に対して十分配慮しています」ってどこがだよ。


問6

設問2

 必要な計算は以下。

2.5 * 6 * 0.4
2.5 * 6 * 0.6
3.5 * 6 * 0.4
3.5 * 6 * 0.6
2.0 * 6 * 0.4
2.0 * 6 * 0.6
1.0 * 6 * 0.4
1.0 * 6 * 0.6
9.0 * 6 * 0.4
9.0 * 6 * 0.6
(切り上げ(2.0 * 6 * 1.1) - 8) + (切り上げ(1.0 * 6 * 0.9) - 2)

 「試験問題の作成に当たり、電卓の持込み禁止に対して十分配慮しています」とかもう主張するなよ。試験当日計算用紙は潤沢に用意されてるんだろうな、オイ。


問7

設問3

 必要な計算は以下。

16 * 6.5 + 35 * 27.1 - 872
16 * 7.0 + 35 * 27.0 - 872
16 * 7.2 + 35 * 26.8 - 872
(16 * 6.5 + 35 * 27.1 - 872) * 10
(16 * 7.0 + 35 * 27.0 - 872) * 12
(16 * 7.2 + 35 * 26.8 - 872) * 13

 うんざり。電卓とか表計算とか使うだろ普通。


問8

 購入リストに対する挿入と削除は特売コードを加える以前から必ずあるはずなのだが、なぜサブルーチンになっておらず、特売コード部分で購入リストを直接操作するのか? 擬似言語には手続の記載はあるのでサブルーチンは記述できる。出来の悪いプログラムをあまり触らずにメンテするのは現場ではきわめてありふれた仕事であるのは確かだが、試験でまでそれを要求されるのはなんだろう。ある意味(後ろ向きな)実践的な問題ってことか?

 購入レコードにレコードを商品コード順にたどるためのptrという変数があるが、こういうやり方は一般的なのだろうか。レジマシンはコンピュータとしては貧弱でライブラリにソートがないか、ソートの負荷を分散させるといった程度にしか理由が思いつかない。このptrがあるってだけでもリストの処理を独立にすべき理由になる。

 『プログラムの末尾に追加する処理の内容と表1とを見比べれば、後半のgを含む処理がレコード削除処理であることが分かる』とか言われても、普通はコメントで削除処理って書くか削除処理と分かる名前の付いたサブルーチンにするよ。


問9

 どうも有料放送の料金体系が意味不明なので、Pythonで走らせてみた。プラン1の有料分のみに省略。


channel_block = [1, 3, 6, 10]
channel_charge = [1500, 1000, 700, 500]

def yuuryou(channel_num):
	fee = 0
	for i in range(3, -1, -1):
		cnum = channel_num - channel_block[i] + 1
		if cnum < 0:
			cnum = 0
		channel_num -= cnum
		fee += (cnum * channel_charge[i])
		print('%d * %d ' % (cnum, channel_charge[i])),
	print('= %d' % (fee))

for i in range(16):
	yuuryou(i)

0 * 500  0 * 700  0 * 1000  0 * 1500  = 0
0 * 500  0 * 700  0 * 1000  1 * 1500  = 1500
0 * 500  0 * 700  0 * 1000  2 * 1500  = 3000
0 * 500  0 * 700  1 * 1000  2 * 1500  = 4000
0 * 500  0 * 700  2 * 1000  2 * 1500  = 5000
0 * 500  0 * 700  3 * 1000  2 * 1500  = 6000
0 * 500  1 * 700  3 * 1000  2 * 1500  = 6700
0 * 500  2 * 700  3 * 1000  2 * 1500  = 7400
0 * 500  3 * 700  3 * 1000  2 * 1500  = 8100
0 * 500  4 * 700  3 * 1000  2 * 1500  = 8800
1 * 500  4 * 700  3 * 1000  2 * 1500  = 9300
2 * 500  4 * 700  3 * 1000  2 * 1500  = 9800
3 * 500  4 * 700  3 * 1000  2 * 1500  = 10300
4 * 500  4 * 700  3 * 1000  2 * 1500  = 10800
5 * 500  4 * 700  3 * 1000  2 * 1500  = 11300
6 * 500  4 * 700  3 * 1000  2 * 1500  = 11800

 2本までは各1500円、追加3本までは追加分各1000円、さらなる追加4本までは追加分各700円、それ以上は追加分各500円、ということのようだ。

 素直に実装すると以下のようになる。


channel_charge2 = [1500, 1500, 1000, 1000, 1000, 700, 700, 700, 700]
channel_charge_rest = 500

def yuuryou2(channel_num):
	fee = 0
	i = 0
	while channel_num > 0 and i < len(channel_charge2):
		channel_num -= 1
		fee += channel_charge2[i]
		i += 1
	fee += channel_charge_rest * channel_num
	print('%d' % (fee))

for i in range(16):
	yuuryou2(i)

0
1500
3000
4000
5000
6000
6700
7400
8100
8800
9300
9800
10300
10800
11300
11800

 プログラムコードはメンテナンスすることを考えて、多少野暮ったくとも意味が通りやすく記述することが求められる。料金体系が5段階になるとか、プラン1と2で段階の本数に違いが出るとか、要求仕様なんてのはどう実装されているかなんて事にお構いなしに変更される。

 インターネット接続サービス料金も同様。要求仕様通りに素直に記述する方がメンテナンスしやすくなる。Pythonで書くとこんな感じ。


inet_charge = [[0, 3000, 6000], [0, 2500, 6000], [0, 2500, 5000]]

def inet(basic_plan, inet_plan):
	fee = inet_charge[basic_plan][inet_plan]
	print('%d %d %d' % (basic_plan, inet_plan, fee))

for bp in range(3):
	for ip in range(3):
		inet(bp, ip)

0 0 0
0 1 3000
0 2 6000
1 0 0
1 1 2500
1 2 6000
2 0 0
2 1 2500
2 2 5000

 これもプラン1と2で低速回線の料金が同じにならない要求仕様の変更が考えられる。使われてるプログラムの要求仕様変更は必ず発生する。

 出来の微妙なプログラムをメンテナンスしてる気分。後ろ向きには実践的だが。


2013.08.18


「ホーム」へ戻る
OSTRACISM CO.
OSTRA / Takeshi Yoneki