2022年 プロジェクトマネージャ試験 合格

まとめ

  • IPAのプロジェクトマネージャー試験に合格しました
  • 試験までの勉強について書きました

IPAのプロジェクトマネージャー試験に合格しました

きっかけ

2022年1月からWebエンジニアとプロジェクトマネージャーの兼務を解除し、PdM専業になりました。 PdMとしてプロダクトの開発/運用やプロダクトにまつわる課題と向き合う中で、開発チーム内でも様々な職種のメンバーとのやり取りや、期限のあるプロジェクトの進め方に悩むようになりました。 チームを見回したときに元PjMの同僚が上記の課題をうまく進めているように感じたので、自分もプロジェクトマネジメントについて学んでみようと思いました。

また、初心者PdMとしてどういうスキルをつけていったらよいか悩む中で、Project Management Triangleを見てプロジェクトマネジメント力をつけていくのは今のプロダクトに関わる仕事に活きてきそうだと感じたからという理由もあります。 productlogic.org

2022年春期に情報処理安全確保支援士に合格していたので、2年間の午前1免除があるうちに資格まで取っちゃおうという目論見でした。

勉強について

午前2 (80/100)

対策

参考書を一巡読み、その後はひたすら過去問道場で過去問練習しました。

参考書:

過去問道場: プロジェクトマネージャ過去問道場|プロジェクトマネージャ試験.com

過去問道場に載っている過去14年分を2順くらいして、1年分を10分で解き、9割正答が出てくるようになるまでやりました。 体感では過去問が8割くらい解けるようになれば新規問題が全問不正解でも合格点(6割)取れるかなと思いました。(未検証) 午前2は毎日15分で1年分くらいを繰り返すほうが続けやすいと思います。

本番ではゆっくりお昼を食べて午後に集中できるようにしたかったので、20分くらいで解き終えて退出しました。(多分3-4人目くらい) 当日は自己採点しなかったですが、手応え通りくらいの点数でした。

午後1 (76/100)

対策

参考書2冊分の問題を解きました。

参考書:

PjM試験では1-2題本文中から答えを抜き出す問題があるので、ここを取りこぼさないのが大事です。 逆に、PjMの知識で回答するタイプの問題は回答を見てもなんで?となる問題が多いので参考書の解説を読むことが重要でした。 参考書1冊分を解いたあたりで回答のクセが見えてくるようになったので、追加でもう一冊分解いて午後2対策に移行しました。

本番は問題2,3を選択しました。 問題1がある(リスク|理由)とは何かという問題が多かったため避けました。 このような問題は過去問で解答がしっくり来なかったタイプの問題なので、自分が苦手としてる問題だと感じたためです。

問題2,3にはそれぞれかなり迷った問題がありましたが、全体としては回答を作りやすかったと思います。

午後2 (評価A)

論述の経験が無かったのでかなり手探りでした。

参考書:

私は人月を計算するタイプのプロジェクトを運営した経験がなかったので、工数の設定は妥当か、どんなプロジェクトを論述すればよいかよくわかりませんでした。 準備としては、まず自分の関わった開発プロジェクトについて列記し、目的や人数、特徴を書き出しました。 直近2年分の過去問から各年1題ずつ論述を作成し、選択しなかった2題についてもプロットを作成しました。

実際に論述を作成してわかったことは見切り発進で書き始めると途中で筆が止まる上に全体が矛盾したりちぐはぐになることでした。 本番の解答用紙はマス目に沿って書くので、数文字書き直したいだけでも大幅にその行を書き直さないといけなくなるので、あとからの修正が大変です。 また、時間もカツカツになるのであまり主題や話を書き直す時間はないので、書き出しの前に全体の構成を考えておく必要があります。

当日に書いた論述は自己評価ではあまりプロジェクトマネージャーとしての知識や経験を十分に反映できたものではなかったと思います。 結果としてA評価が貰えた理由として考えられるのは、聞かれている項目をすべて書くようにしたことかと思います。

本番では私は1問目を選択しました。 https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2022r04_2/2022r04a_pm_pm2_qs.pdf 例えば1問目アであれば、プロジェクトの概要、目的、事業環境の変化、計画変更の要求をそれぞれ150字以上は書くようにし、それ以外のことは書かないように気をつけました。 参考書にも書いてありましたが、ちゃんと問題文で聞かれていることに答えることと余計なストーリーを展開しないことが重要なのだろうと思います。

当日の論述対象としては自分がPdMの補佐として仕様作成していた頃のプロジェクトを思い出して書きました。 工数などは大体実装に参加した人数*かかった期間で雑に書きました。 1人月がいくら位が妥当なのかは結局よくわからなかったですが、参考書の数字をベースに書きました。

その他

本番は申し込み締め切り直前に申し込んだため駅から遠い大学での受験でした。 余裕を持っていきましたが、駅からの徒歩が思ったより長くあまり時間の余裕はありませんでした。 受験を決めたら早めに申し込んだほうが良いです。

本番前日に100均で買った時計が初期不良だったので昼休みに近くの店で時計を探して回りました。 結局手に入らず、時間のわからないままに受けたので午後2は思った以上にギリギリでした(退出時刻ピッタリに提出)。 ちゃんとした時計を持っていきましょう。

試験を終えて

トータル3ヶ月くらい勉強しましたが、プロジェクトマネジメントの概論について一通り触れることができたという感触です。 PMBOKも参考書知識くらいですし、実際にプロジェクトをマネジメントの経験も無いので、PjM試験を受けるだけで大幅に成長するということはないです。 ただ、受験後に関わったプロジェクトではそれぞれのステークホルダーとのコミュニケーションをちゃんと取ろう、全体の期限をちゃんと引こうというように関わり方が変わったように思います。 今後PdMとして製品課題を解決する中で大きなプロジェクトを進めるうえでいい勉強になったと思います。

Dockerの multi-stage builds を使ってみた

背景

Node.jsで生成した生成したテキストファイルをphpで扱いたい時があった。 手元の環境にphpとNode.jsを入れたくない(&他の開発者も扱いやすくしたい)ので、コンテナで実行することにした。 公式のphpイメージにNode.jsを入れるよりもステージ間で成果物をやり取りできたほうが嬉しいので、multi-stage buildsを試してみた。

やったこと

最初は直列に書いてみたがうまく行かなかった。 FROM命令でステージが初期化されてしまうため、ファイルを引き継げないと思われる。

The FROM instruction initializes a new build stage and sets the Base Image for subsequent instructions. docs.docker.com

下記ドキュメントに書いてあるとおり、COPY --fromを用いてステージを指定することでそのイメージ上で作られたファイルを参照できる。 docs.docker.com

これでステージ間での受け渡しができた。

FROM node:latest AS node
ADD . /hoge
WORKDIR /hoge
RUN npm -v
RUN touch test.txt
RUN npm -v >> test.txt

FROM php:latest
COPY --from=node /hoge/test.txt /fuga/test.txt
WORKDIR /fuga
CMD ls -la && cat test.txt

backgroundから通知を送る

予定の開始時間が近くなったら通知してくれるChrome拡張を作りました。

この記事でできること

  • Chrome拡張を用いて定期的に通知を送る

やりかた

通知はChromeのNotifications APIを利用します。 developer.chrome.com 通知を送るべきか定期的にチェックするため、Alarms APIを利用します。 developer.chrome.com

manifestで権限を設定する

下記のようにmanifestのpermissionを設定します。 また、次の手順でbackgroundで実行するスクリプトを作成するので、backgroundにそのファイル名を指定します。 iconsは最低でも1つは指定することが必要なので作成してください。 もしChrome Extension Storeにて公開したい場合はサイズも正しく作ったほうが良いです。

{
    "name": "Push Notify",
    "version": "1.0.0",
    "manifest_version": 2,
    "icons": {
        "16": "icons/Artboard@2x.png",
        "48": "icons/Artboard@2x.png",
        "128": "icons/Artboard@2x.png"
    },
    "permissions": [
        "notifications",
        "alarms"
    ],
    "background": {
        "scripts": ["background.js"]
    }
}

backgroundで実行するスクリプトを作成する

chrome.alarms.createを用いてアラームを作成します。 periodInMinutesで指定した数字(単位は分)ごとにaddListenerで追加した関数を実行します。 addListenerの中では通知を送る処理を行います。 下記の実装だと1分ごとに通知が送られるようになっています。 typeは"basic","image","list","progress"から選ぶことができます。 OSによって各typeは違いますが、イメージは下記を参考にすると良さそうです。 developer.chrome.com

chrome.alarms.create('NOTIFY', {periodInMinutes: 1});
chrome.alarms.onAlarm.addListener( function (alarm) {
  if (alarm.name == 'NOTIFY') {
    let options = {
      type: "basic",
      title: "subject",
      message: "message",
      iconUrl: "icons/Artboard@2x.png"
    };
    chrome.notifications.create(options);
});

導入する

Chromeの「拡張機能を管理」からディレクトリごと読み込むことで動作確認できます。 デベロッパーモードを有効にすると「パッケージ化されていない拡張機能を読み込む」ボタンが表示されます。 導入後は「バックグラウンド ページ」をクリックすることでconsole.logなどを用いたデバッグを行うことが出来ます。 f:id:niwaton:20220114162442p:plain

通知を受け取る際は、OS側の設定も行ってください。 Macの場合「通知と集中モード」のアプリケーションごとの通知の設定にてChromeの通知を許可しないとChrome拡張側で通知を送っても表示することは出来ません。

[Among Us]初心者がAmong Usをインストールして始めるまでの手引

Among Usとは

ざっくりいうと「宇宙船を舞台にした人狼」。
Crew(乗組員)はミッションをこなして宇宙船が無事に飛行を終えられるようにします。
Imposter(詐欺師)はCrewにまぎれてバレないようにミッションの完遂を妨害します。

誰が殺したか協力して推理したり、こっそり殺して何食わぬかををして歩きまわったりとどっちの立場でも楽しいです。
みんなとワイワイたくさん話せて楽しいゲームです。

f:id:niwaton:20210114230738j:plain
誰がこんなひどいことを(すっとぼけ)

Among Usを始めるまでの流れ

  1. Among usと通話ツールをインストールする(5分くらい)
  2. 初期設定を行い、ロビーに入る(2-3分くらい)
  3. ゲームの流れを知る(10分くらい)

Among Usと周辺ツールのインストール

ゲーム本体のダウンロード

iOS, Android, WindowsPC, Switchで動作します。
スマホ版は無料、PC, Switch版は520円です。
PC版が一番操作性がよいのでおすすめですが、まずは無料のスマホ版から入ってもいいと思います。
Switchの人はNintendoOnlineの登録も必要みたいです。

通話ツール

人狼でいうところの誰を吊るか相談する時間に通話をします。
ZoomやLINE通話でも可能ですが、オートミュートツール(吊られた人を勝手にミュートしてくれるツール)を運用する場合はdiscordが最強です。

ちなみに、スマホでAmong Usをプレイする場合は通話はPCなど別の端末で行ったほうが便利です。 オートミュートツールを使わない場合は頻繁にミュートボタンを操作するためです。

初期設定とロビーへの入るまで

起動直後

ONLINEを選択する。
f:id:niwaton:20210114222513j:plain

名前とサーバの設定

Playerと書かれたテキストボックスがあります。
このテキストボックスを選択し、名前を入力します。
スマホとPC版は日本語が文字化けするので、Switchの人も英語にしたほうがよいです。
ゲーム中よく見るので誰なのかわかりやすい名前にしましょう。
f:id:niwaton:20210114222950j:plain

右下にサーバを選択するボタンがあります。
使えるのはNorthAmerica Asia Europeの3つです。
参加者全員が同じサーバでプレイする必要があるので、あらかじめ決めておきましょう。

部屋を作成する(ホスト)

HOSTの「CREATE GAME」を選択し、Map, Imposterの数、チャット言語、最大プレイヤー数を選びます。
最初は初期設定のままで大丈夫です。
決定後にロビーに遷移するので、画面中央下のコードを参加者に共有します。

f:id:niwaton:20210114223450j:plain
コードはここ

部屋への参加(参加者)

PRIVATEのテキストボックスを選択し、ホストから共有されたアルファベット6文字のコードを入力します。

f:id:niwaton:20210114223842j:plain
ここにコードを入力する

ロビーへ入ったら

右上のコンピュータに近づき、CUSTOMIZEボタンを押します。
するとColor, Hat, Pet, Skinをカスタマイズできます。
Gameタブの中身は自分が何をいじろうとしてるかわからないうちはいじらないこと。(ゲームの設定なので適当に設定するとバランス崩壊します)
f:id:niwaton:20210114224316j:plain スマホ勢は右上の歯車でJoyStickかTouch移動を選べます。

ゲームについて

ここまでやれたらようやくゲーム開始です。 ここからはゲームの流れを説明します。

ゲームの流れ

探索フェーズとミーティングフェーズの2つを交互に行います。

まず自分がCrewであるかImposterであるか表示され、すぐに探索フェーズが始まります。
探索フェーズではマップでミッションをこなしたり、ImposeterがCrewを殺したりします。
探索フェーズ中に誰かが死体を発見するか、招集ボタンを押した場合ミーティングフェーズが始まります。
ミーティングフェーズは誰を吊るか、もしくは誰も吊らずに続行するかを話し合います。

ゲームの終了条件

  1. Imposterが全員死んでいること(Crewの勝ち)
  2. Crew全員がすべてのミッションを完遂する(Crewの勝ち)
  3. ImposterとCrewが同数である(Imposterの勝ち)
  4. 緊急ミッションを時間内にクリアし損なう(Imposterの勝ち)

1,3は人狼の村人、狼の勝利条件と同じです。
4はImposterが発動する緊急ミッションの2つはタイムリミットがあります。
制限時間内にミッションをクリアできなければCrewは全滅し、Imposterの勝利となります。

探索フェーズ

Crewは各自に定められたミッションをこなしていきます。
ImposterはCrewにまぎれてミッションをこなしていくふりをしながらこっそりCrewを殺したり妨害工作をします。
3種類のMapがありますが、ここでは初心者も探索しやすいTHE SKELDを例に解説します。

f:id:niwaton:20210119204534j:plain
THE SKELDのMap。Switchの人は日本語名になってるので注意。

Crewのできること

Crewは全員がミッションをこなすかImposterを全員追放したら勝利です。
序盤はミッションをこなしながら怪しい人を探します。

1. ミッション

宇宙船のあちこちにミッション(ミニゲーム)があります。
それぞれのミッションは少しコツはあるものの画面を見ればだいたい分かるものが多いです。 ミッションはCrewごとに別のものが割り当てられていますが、同じ箇所のミッションが割り当てられてることもあります。
この場合1人クリアすればOKではなく、2人ともそれぞれクリアする必要があります。

ダウンロードボタンを押したり同色の配線をつなげるなど簡単なものがほとんどですが、MedBeyのInjectionミッションとは最初は戸惑います。(スタートボタンを押してから1分後に一個だけ色が違う試験管の下のボタンを押す)
また、続き物のミッションもあります。(ex: ある部屋でファイルをダウンロードするミッションをした後に別の部屋でファイルをアップロードするミッションが発生する) 近いミッションの方向に黄色い矢印が出ているので参考にしてください。

最初の画面でfreeplay -> the skaledと選択すると一人でマップに入れるので、事前に少し触ってみるといいと思います。

2. 緊急ミッション

Imposterは4種類の緊急ミッションを発動して妨害してきます。
緊急ミッションの発動中はCrewへの妨害効果があり、招集ボタンを押すこともできなくなります。
これを解除するためにそれぞれの所定の位置にある緊急ミッションをクリアする必要があります。
特にメルトダウンと酸素枯渇は時間内にクリアできないとCrewは全滅しImposterの勝利となります。

緊急ミッションの発動中は改修ミッションのあるところに向けて赤い矢印が表示されているので、そちらに向かいましょう。

消灯

解決するまでCrewの視界がとても狭くなります。
解決方法はElectricalの配電盤の改修ミッションをクリアすることです。
ちなみに、このミッションは他の人の操作が影響してくるので、複数人で直そうとすると勝手に動いてうまくいかないことがあります。

f:id:niwaton:20210117191203j:plainf:id:niwaton:20210117191200j:plain
レバーを操作して全部緑になればOK

通信妨害

発動中はCrewはミッションのリストと位置を確認することができなくなります。 (ミッション自体はできます) また、Adminや監視カメラ(後述)も使えなくなります。

ミッションはCommunicationsにあります。
つまみを調節して波形が例に一致したらクリアです。

f:id:niwaton:20210119205618j:plain
通信妨害が一番むずかしい(個人の感想です)

メルトダウン

Reactorの上下に掌紋認証ミッションが表示されます。 上、下で2人が同時に掌紋認証することでクリアできます。(一人ではクリアできません)
発動から30秒以内に両方のミッションをクリアできないと反応炉が融解してCrewは全滅となります。

f:id:niwaton:20210119205241j:plain
2人同時に2箇所の掌紋認証する(こいつらって5本指なのか…?)

酸素枯渇

O2とAdminの2箇所で数字入力するミッションをする必要があります。
発動から30秒以内に両方のミッションをクリアできないと酸素がなくなりCrewは全滅となります。

f:id:niwaton:20210119205011j:plain
2箇所で数字をいれてやる必要があります

3. ギミック

監視カメラ

Secutiryに通路の監視カメラを見るマシンがあります。
見てる間は無防備なので殺されないよう注意してください。

f:id:niwaton:20210119203139j:plain

また、誰かが監視カメラを見ている間は各地の監視カメラが赤く点滅します。
Imposterは見られてるところで殺したりベントに入ったりしないようにしましょう。

Admin

Adminにどの部屋に何人いるかを見られるマシンがあります。

f:id:niwaton:20210119203244j:plain

廊下に出ると人が減るので過信は禁物ですが、状況判断に役立ちます。
ずっと動かない人が居るので見に行ったら死体だったということもよくあります。

4. Report

誰かの死体を見つけたら右下のReportボタンが表示されます。 これを押すと後述するミーティングフェーズに入ります。

f:id:niwaton:20210119203404j:plain
死体発見時はReportボタンが表示されます(画像はImposter視点)

Imposterのできること

ImposterはCrewと同じことができます。
さらに、下記に挙げるImposterのみ可能な行動があります。

1. kill

ImposterはCrewに接近するとkillボタンが表示され、これを押すとkillすることができます。
キルクールタイムが設定されており、一定時間経つまで次のkillはできません。
連続通り魔はできないので注意してください。

f:id:niwaton:20210119202609j:plainf:id:niwaton:20210119202606j:plain
緑のCrewを半分にしちゃった様子(右下にkillボタンが出ている)

2. sabotage(サボタージュ)

ImposterはCrewの項目で述べた緊急ミッションを発動することができます。
緊急ミッションの発動と通路封鎖をできます。
Reactor, O2, Electrical, Communicationsにそれぞれの部屋の緊急ミッションボタンがあります。
また、他の部屋にはバツ印の書かれた通路封鎖ボタンがあります。

f:id:niwaton:20210119201934j:plain
右下のsabotageボタンを押すと妨害用の画面を出せます

3. vent(ベント)

Imposterのみventという隠し通路を利用することができます。
全部のventを自由に行き来できるわけではなく、いくつかのvent同士がつながっています。
ventへ出入りしているところをCrewに見られないように注意しましょう。

f:id:niwaton:20210119201452j:plainf:id:niwaton:20210119201528j:plainf:id:niwaton:20210119201525j:plainf:id:niwaton:20210119201522j:plain
ventはImposterのみ赤く光り、上に乗るとventボタンが表示されます

ミーティングフェーズ

探索フェーズ中に誰かが死体を見つけてreportした場合、もしくはcafeにある緊急ミーティングボタンを押した場合にミーティングフェーズが始まります。

f:id:niwaton:20210117180145j:plain
死体の近くに行くとReportボタンが出ます

f:id:niwaton:20210117180010j:plain
ここに緊急招集ボタンがあります

誰がImposterであるか話し合い、多数決で宇宙船から追放する人を決めます。
また、Skip voteという誰も追放しない選択に投票することもできます。
同数の場合は誰も追放せずに次の探索フェーズに入ります。

f:id:niwaton:20210117175954j:plain
投票画面

時間までに投票をしなかった場合は無投票として扱われます。
多くの場合Crewが投票しないことは不利益になるため、必ずskip voteも含めてどこかしらに投票するようにしましょう。
投票期限の10秒前以降は投票ボタンの反応がかなり悪くなり5秒前から投票失敗する可能性が高くなります。
早めに投票先を決めましょう。

f:id:niwaton:20210117181354j:plain
追放されて宇宙をさまようことに…

死んだら

吊られたり、Imposterに殺されるとゴーストになり、Crewから見られなくなります。
Crewはミッションを継続できます。
死んだメンバーのミッションも完了条件に含まれるので、忘れずに全部のミッションをこなしましょう。

Imposterはサボタージュで妨害できます。

通話ツールでのふるまい

探索フェーズでは音声オフ、ミーティングフェーズになったら音声をオンにします。
また、discordでは死んだ人向けの通話ルーム、通称天国を別に立てることもあります。(ゴーストになってミッションを終えると暇なので)
ただし、探索フェーズ中に殺されてすぐに天国に行ってしまうと、他のCrewに死者がでたことが伝わってしまいます。
次のミーティングフェーズが始まるまで移動しないようにしましょう。

よく質問されること、気をつけたいこと

  1. 死体はミーティングフェーズに入ると消えます
  2. ImposterもMapにミッションは表示されます
  3. 招集ボタンは各自1回しか押せません(Imposterも押せます)
  4. ミッションの完了は死んだ人も含まれます。死んでも油断せずゴーストになってミッションを完遂しましょう。
  5. 消灯中もImposterは視界がせまくならないです。全部見えてるから注意。

慣れてきたら

アリバイを意識しましょう

  • どのタイミングで誰とすれ違ったかを覚えておきましょう
  • どの時点まで生きていたかを議論し、死亡推定時刻を割り出しましょう

Imposterを増やそう

  • 死んだImposterはゴーストでもサボタージュを発動できます。共犯者を援護しましょう。

別のMapにもチャレンジしよう

  • マップごとに新しいゲーム展開になります
  • マップごとに別のギミックがあるので色々試してみよう

ゲームをカスタマイズしよう

CUSTOMIZEの一番右のタブにGAME設定があります。
設定できる項目は緊急ミッションやキルのクールタイム、投票時間、視界、招集ボタンを押せる数、タスク数など多岐に渡ります。
まずはプレイをやってみてImposterが有利すぎるなどあればいじってみればよいでしょう。