[雑記] システムアーキテクト 受験

システムアーキテクトという試験を受験しました。昨年に続いて2度めの受験で、今回は無事合格することができました(昨年度の受験時の記録)。
試験対策および本番で気を付けた点をまとめます。

本番までの準備

基本的な知識は昨年に受験した際に学習したため、今回は「前回学習した内容の再確認」を基本にし、その上で「解答のコツを押さえる」ようにしました。4種類ある各科目の準備は次のように進めました。なお、使った問題集は、『情報処理教科書 [秋期]高度試験午前対策 2009年度版』と『情報処理教科書 システムアーキテクト 2009年度版』の2冊です。(2011年度版のリンク:『情報処理教科書 [秋期]高度試験午前I・II 2011年版 』(午前用)と『情報処理教科書 システムアーキテクト 2011年版 』)
  • 午前I (四択/共通問題): 今回は免除のため対策なし
  • 午前II (四択/分野個別問題):
    1. 問題集を2〜3回解く。
  • 午後I (記述問題):
    1. 問題集の基礎知識部分を一読し、知識を再確認する。(1h)
    2. 過去問題を数問解き、問題の形式に慣れる。(2-5h)
  • 午後II (論文):
    1. 問題集の「論文の書き方」を一読する。
    2. 過去問題を数問解き、問題の形式に慣れる。(3-9h)
    3. プロジェクト例を想定しておく。(2h)
続いて、午後I(記述問題)と午後II(論文問題)について、学習時に意識したことと本番で意識した内容をまとめます。

学習時に意識したこと

午後I (記述問題):
  • 得意分野と不得意分野を明確に把握しておく。不得意分野の過去問題を解くときは知識を付けるようにするが、得意分野の過去問題を解くときは、知識を付けるよりも「どうやって時間内に答えを見つけるか」に重点を置く。
    (私の場合、得意分野は、業務分析・業務設計・UML・開発管理、不得意な分野はシステム移行・パッケージ導入)
午後II (論文):
  • 決まり文句は覚えておく。
    • 例 えばアについては「私はシステムインテグレータB社に属するシステムアーキテクトである。先般私が携わったプロジェクト(以下PJ)は、○○業のA社より 依頼された、○○○○○である。本システムは、○○○○○である。総開発期間は○ヶ月、要員は○人、総工数は○人月である。私は本案件にシステム構築の リーダーとして携わった。」など。
  • 各フェーズ(以下)について、実際に要した時間を記録し、以下の目安からどれだけずれたかを計る。
    • 問題文解読+ストーリー構成:20分 (〜14:55)
    • システム概要記入:5分 (〜15:00)
    • ア (目安700字):20分 (〜15:20)
    • イ (目安1200字):40分 (〜16:00)
    • ウ (目安900字):30分 (〜16:30)
  • 時間をオーバーしてしまった場合は、その原因を必ず分析する。(自分の場合は以下のような原因があった)
    • ストーリー構成で想定した内容は書き終えたものの、字数が足りず、追加内容を考えた。
    • ストーリー構成の内容が多すぎて、削りながら作文したため、時間を要した。
    • 書いているうちに内容の矛盾に気づき、修正方法の検討と修正に時間を要した。
    • 書いているうちに、ストーリー構成で想定した方針からずれていることに気づき、書きなおしたため、時間を要した。
    • 事象を説明するために、予想以上に字数を要してしまい、時間(と字数)を要した。(例えば説明するためにアーキテクチャの詳細にまで触れてしまった場合など)

本番で気をつけたこと

午後I (論述問題):
  • 試験開始前: 解答用紙が配られたときに解答欄を眺めて、どの大問でどのような解答が求められているかを眺め、解きやすそうな大問を見つける。例えば、用語を答える問題 が多いか、40字程度の記述が多いか...など。(自分は、できるだけ用語を答える小問が多い大問を選ぶようにした)
  • 試験開始直後: その解きやすそうな大問を読み、問題の概要を把握する。
    まずはパラグラフのタイトル([]で書かれた部分) だけを読む(※1)。問題なさそうなら、その後、小問を読み始めて解いていく。
  • 小問回答時: 小問が次のどちらであるかを早めに見極める。(→それぞれで戦略が異なるため)
    • 問題文中に書いてある答えを求める問題
    • 問題文中の手がかりをヒントに、システムアーキテクトの常識から答える問題
  • 字数指定の設問は、
    まず、以下を手がかりに解答を組み立てる。
    • 10字:キーワード
    • 20字:短文
    • 30-40字:修飾語をつけた文章
    • 50字:2文
    次に、字数の過不足は、冗長な表現があれば削ったり言い換えたりする、修飾語を挿入/削除する、文末を調整する。
※1 例えば、[現行システムの概要]→[〇〇業務の概要]→[○○業務の問題点]→[○○業務の改善]→[新システムの○○機能] だけを読むと、「既存のシステムを動かしているのだけど、問題があるため、改善し、新機能を追加したのか」といった流れが分かります。

午後II (論文):
  • 具体性を持ったキーワードを意図的に盛り込む。
  • 書いてみた結果字数が足りていなかったら、主張を繰り返して字数を稼ぐ。
  • 数行書くごとに、問題の趣旨に逸脱していないか確認する。(上述の「書いているうちに、ストーリー構成で想定した方針からずれていることに気づき...」への対策)
  • ストーリー構成を行うときは、あまり盛り込み過ぎないようにする。
    「問題文中に現れるキーワードの2〜3点の具体化」+(あれば)「文中にないが類推されるキーワード1点の具体化」程度でよい。
    また、その他のストーリーを書いても意味がない。
  • 主張を明確にするため、原因・方式・対策などの項目を列挙する場合、必ず順位付けをする。これをしておくと、「トレードオフのある複数の項目からひとつを選ぶ」という場合にも説明しやすいと思う。
  • 使えるフレーズ
    • 「○○という状況であった。」
    • 「○○と判明した。」
    • 「本来ならば○○が理想であった。」
    • 「○○という制約があった。」
    • 「○○方式と○○方式が考えられたが、○○方式を採用した。理由は...。」
  • システムアーキテクトの本務ではない業務は書かない。(工数と予算はプロマネと相談する/データベースとネットワークの設計はそれぞれのスペシャリストと相談する/コーディングとテストはPJメンバにさせる)
  • 解答用紙を汚さないため、問題冊子を切り離し、使わない1枚を下敷き替わりにする。(見開きの2ページについて、解答がそれぞれの解答用紙に写ってしまい非常に読みにくくなるのを防ぐため)

参考 (今回受験した際の所感と解答)

所感:
  • 午後I:
    • 問3(設備棚卸システム機能追加)と問4(デジタルサイネージシステム設計)を選択。
    • 問3は、仕事で(人力で)設備の棚卸を行ったことがあるので、題意は理解しやすかったです。ディスプレイとPC本体で同じ資産番号なのに、別々の場所にあったり、別の事業所にあったり...といろいろと面倒だった記憶があります。
    • 問4は、一見解けそうと思い着手したものの、推測で書かせる解答が多く、自分の答えが合っているのかそうでないのか自信が持てず、終始不安でした。
  • 午後II:
    • 問3(組込みシステムでのハードウェアとソフトウェアの機能分担)を選択。
      問2か問3で迷いましたが、問2がだいぶ抽象的で書きにくそうに感じたため。
    • 字数は、ア:約800字、イ:約1000字、ウ:約800字。
    • イとウの内容分担が不明確のまま書いてしまい、少し内容が重複してしまったような気がします。 書いている途中でイとウの内容分担で悩んでしまったためか、時間はぎりぎりでした。
午後Iで書いた解答 (自分のメモより。下線部はおそらく×となったであろう答え)
(ちなみに、80点でした)
  • 問3
    • 設問1:(忘れました...)
    • 設問2(1):同一の資産シールを複数枚発行している資産についての現物数の不足
    • 設問2(2):
      照合内訳数/内訳テーブルの現物照合実施日が初期値の場合のみ、1を加算する。
      最新現物照合実施日/内訳テーブルの現物照合実施日の値と同一とする。
    • 設問3:(忘れました)
    • 設問4(1):遠隔地の資産を回収したとき、システム上照合されていた資産が見つからないこと
    • 設問4(2):(忘れました)
  • 問4
    • 設問1(1):対象のディスプレイ端末、データ保持の有無
    • 設問1(2):プレイリスト
    • 設問2(1):ネットワークの性能、ネットワークの切断
    • 設問2(2):NTPサーバと通信し、各端末の時刻を調整する機能
    • 設問2(3):ディスプレイ端末のバックライトの調節機能
    • 設問3(1):HDDの数およびプロセッサの数
    • 設問3(2):サーバ全体としてデータ伝送性能が向上すること
    • 設問4(1):タッチパネル
    • 設問4(2):転送量が少ないことによる転送時間の短縮
午後IIで書いた解答の骨子 (自分のメモ+一部補完)
  • システム:ロボット制御機器の分散システム制御部。障害検知・フェイルオーバー機能・自己状態最適化機能を備える。
  • イ:ハードウェアとソフトウェアのトレードオフの検討項目
    • 障害検知機能:自社保有技術 (自社保有技術を流用)
    • フェイルオーバ機能: 性能 (完了時間)
      ⇒ハードでもソフトでも可だったので、プロトタイプを作成し評価することにした。
    • 自己状態最適化機能:再利用性(アルゴリズムを置き換えやすくしたい)
    • 全体として: 開発スケジュール、開発・製造コスト
  • ウ:機能分担の内容と評価
    • ハード: 障害検知機能とフェイルオーバ機能
    • ソフト:自己状態最適化機能とした。
    • フェイルオーバ機能はプロトタイプを作成し評価した結果、ソフトウェアでは1msオーダーでの性能が出せなかった。スケジュールは伸び、製造コストはかさんだが、依頼元とPMと相談し合意を得た。
    • 評価:(忘れましたが、「開発コストが○○ほどかかったが、性能を出せた」などと書いたように思います)

※上記リンクは、2011年度版です。

[パズル] 99人の囚人

「99人の囚人」という論理パズルについて、問題と解答を書きます。

この問題は、職場の先輩のブログ: にゃんたこす!徒然草。99人の囚人 問題編(数学パズル)という記事に載っていたものです。面白い問題と思ったので、自分のブログにも転載させて頂きます。解答は私が書いたのですが、結構ややこしいものになってしまいました。エレガントな解答を思いついた方がいらっしゃいましたら、ぜひコメントにて指摘頂ければと思います。


ではまず問題から。(前述のブログから引用)

問題

99人の囚人がいます。彼らの頭に1~100までのナンバーカードが貼りつけられた帽子をランダムにかぶせます。
他人の帽子は見ることができても、自分の帽子は見ることができません。
帽子の数は全部で100なので、一つ使われずに余ります。
そのナンバーは囚人達にはわからないようにしておきます。
この状況で、囚人たちに一斉に自分のナンバーを宣言させて、全員が正解だったら釈放するという賭けをします。
囚人たちには帽子をかぶせられる前に相談タイムが設けられています。
どういう戦略を取れば、助かる確率を最も高くできるでしょうか?

以下では、ヒントと答えを書きます。


ヒント

各囚人は、自分以外の98人の囚人のナンバーカードを見ることができます。ナンバーカードは全部で100個あるため、自分のナンバーは2通りある (すなわち、1〜100の数のうち、他の囚人98人が被っている98個の数 以外の2つの数) ことが分かります。その2通りの数のうち、1つは自分のナンバー、もうひとつは、使われなかったナンバーということになります。下の表では、各囚人にとってどの番号を見ることができるかを示します (未使用の番号を61としています)。

囚人1
の番号
囚人2
の番号
...囚人i-1
の番号
囚人i囚人i+1
の番号
...囚人99
の番号
未使用
の番号
見えない
囚人1にとって38...205914...796と61
囚人2にとって96...205914...738と61
:::...:::...:::
囚人iにとって9638...2014...759と61
:::...:::...::
:
囚人99にとって9638...205914...7と61


ヒントの1つめ
「見えない2つの数を元に必ず自分の番号を当てる方法」は存在し得ません。なぜなら、ある囚人にとって、「他の囚人が被っている帽子の番号の情報(98個の整数)」のみでは、2つの可能性を1つに絞ることができないからです。(※1)。
そこで、答えは、「あらかじめ2つの可能性を1つに絞るためのルールを決めておく」、より正確には「相談タイムにて『各囚人があるルールに基づいて2つの数のうちの一方を宣言する』と取り決め、各囚人はその通りに宣言する」となります。

ちなみに、各囚人が「見えない2つ数のうちの1つを適当に宣言する」とすれば、全員が釈放される可能性はほぼゼロ (1/2の100乗≒宝くじで1等を5連続で当てる確率) となります。

ヒントの2つめ
次の性質を持つルールが存在します: そのルールに基づいて各囚人が宣言した場合、1/2の確率で「全員が正しい数を宣言する」が、1/2の確率で「全員が間違った数を宣言する」。

※1 もし問題に条件を追加して、「他の人が被っている帽子を見た後、何らかの意思疎通を行って良い」とか、「宣言する際には一斉に行う必要はない」とかとするならば、100%の確率で脱出できる答えが出てきます。


答え

答えは「相談タイムにて『(囚人1の番号, 囚人2の番号, ..., 囚人99の番号, 未使用の番号) という順列が偶順列(※2)である』と山を掛ける。各囚人は、他の囚人の番号を見て、前述の順列が偶順列となるように自分の番号を決め、それを宣言する」です。
このようにすると、50%の確率で全員が解放されます。もし、山が当たった場合(すなわち前述の順列が偶順列であった場合)、全ての囚人は自分の番号を正しく定めることができるため、開放されます。一方、不幸にも前述の順列が奇順列であった場合は、全ての囚人が自分の番号を誤ります。

各囚人は、必ず一意に自分の番号を決めることができます。自分の番号となる数は2つあり、そのうち1つを選ぶと前述の順列が偶順列となり、もう1つを選ぶと奇順列となります。理由は、任意の2要素に対して、それらを交換した順列は奇偶が逆になる(※3)ためです。

# 順列の偶奇を使わずに解く方法を考えてみたのですが、思いつきませんでした。もし思いついた方がいらっしゃいましたらぜひ教えて下さい。


注:
  • ※2 異なる整数からなる順列 (a1, ..., ai, ...)があるとき、「その順列に対する転倒数」を、「ijかつ aiaj である組(i, j)の個数」と定めます。転倒数が偶数である順列を偶順列、奇数である順列を奇順列と定めます。
  • ※3 順列 (..., ai, ..., aj, ...) と、2要素 aiaj を入れ替えた順列 (..., aj, ..., ai, ...) の偶奇が逆になる理由について説明します。まず、順列の i<・<j 番目の部分で、aiよりも小さい要素の個数をm個、ajよりも大きい要素の個数をn個とします。すると、入れ替えることによって、以下の理由から、順列の転倒数の偶奇は反転します。
    • aiの位置がi番目からj番目に移ることにより、転倒数はm減り、(ji−1)−m増えます。
    • ajの位置がj番目からi番目に移ることにより、転倒数はn減り、(ji−1)−n増えます。
    • aiajについて、もしaiajならば転倒数は1増え、aiajならば転倒数は1減ります。
    • 上の3点を合わせると、転倒数は −m(ji−1)−mn(ji−1)−n±1=2(−mnji−1)±1 だけ増えることとなり、転倒数の偶奇が反転します。