Web 技術年末試験 2024 講評 #web_exam2024
Intro
2023 年の Web 技術を振り返る試験として、「Web 技術年末試験 2023」を実施した。
その問題と想定解答、平均点などを公開する。
Web 技術年末試験
この試験は、「去年の Web にはどんな変化があったか」「どんな新しい技術が出てきたか」などを、試験形式で振り返るコンテンツを作ってみたことに端を発している。2022 年に始まり、今年が 3 回目の実施となる。
試験形式であるため点数は出るが、目的は「今年はこんなことがあった」を振り返ることや、「こんなことがあったのは知らなかった」という取りこぼしに気づく機会になることである。
解答用紙/想定回答
- [解答用紙]: Web 技術年末試験 2024
- [想定回答]: Web 技術年末試験 2024
今年は Docs のタブ機能で、大問ごとのタブを分ける作りにした。
過去問は以下。
試験形式
自身で受験する場合は、以下の形式で実施してほしい。
- 範囲: 2024 年の Web 技術の変化、トレンド、重要トピックなど
- 方式: 選択、記述、コーディング
- 時間: 60 分
- 点数: 100 点満点
-
その他
- 何を調べても良い(検索、AI など)
- Google Docs で行うため、Google アカウントが必要
オンライン試験
オンライン試験のイベントを開催し、参加者は 60 分の時間制限で一斉受験し、終了後に問題の解説を行った。参加者のみ、筆者が採点を行い、点数を通知している。
- Web 技術年末試験 2024 - connpass
予想よりも多く 100 名以上の受験者が参加登録し、Meet には 45 人が出席、そのうち提出したのは 36 人だった。
事前に N > 10 の場合にのみ平均と中央値を公表するとしていたため、以下の通り公開する。
- 提出数: 36 人
- 平均点: 71.8 点
- 中央値: 73.5 点
作問は、ただただマニアックな問題や、時間内に完成できない問題を出して誰も点が取れなかったり、調べればすぐに出る誰でも解ける問題ばかりでは、実施する意味がない。
ある程度歯応えがありつつ、全く無理ではない問題として、平均/中央値ともに 50 点を狙って作問している。その意味では、狙いよりは高い点数になってしまっていた。
アンケート
アンケートの結果は以下だった。
- 問題量は「丁度いい」が 80%
- 難易度は「丁度いい」が 45% 「難しかった」が 42%
ここからも、今回の作問は、簡単すぎたというよりも、採点基準の甘さの方に課題を感じた。
特にコーディング試験の採点は、回答が一意に定まらないため、いくつかの観点を用意して、減点方式での採点にしたが、これをどのくらい厳しく行うかによって変わる部分が大きい。
もう少し、厳しい採点基準でもよかったかもしれない。
希望実施時間
アンケートで集めた「都合の良い試験時間」の結果は以下の通りだった。
- 22:00-23:00: 64
- 21:00-22:00: 50
- 20:00-21:00: 50
- 18:00-19:00: 25
今回の実施時間が最も人気だったようだ。
問題解説
作問意図
今回は、大問テーマとして何を選ぶかが非常に難しかった。
2024 年のトレンドという意味でも、PQC と Passkey の話は出したいと思っていたが、どちらもコーディングなどを問題にすると規模が大きく難易度が上がるため、半分が分かる問題に落とし込むのが難しかった。
最後まで、別のテーマにするかを迷い、入れたり外したりを繰り返した結果、完成が直前になってしまったため、事前に少人数に対して模擬試験を実施することもしなかった。
結果、当日になって一部、作問から回答を消し忘れるミスがあったため、そこだけ全員加点とした。これも、平均点が少し上がっている要因になってもいる。
アンケートでは最も難しかったのが「大問 1: PQC」で、最も簡単だったのが「大問 3: Popover」だったようだ。
大問 1: PQC
PQC は、2024 年にちょうど NIST によるアルゴリズムの選考が終わったため、このタイミングで出そうとは早い段階から構想していた。
とはいえ、耐量子暗号アルゴリズムなどの内容は難しすぎるため、最低限以下の 3 つが振り返られる作問にした。
- NIST が 3 つのアルゴリズムを採択したこと
- デプロイへの課題/問題
- なぜ Web にも PQC が必要なのか
アルゴリズムは、調べると「採用された名前」、「リネーム前の名前」、「規格の名前」の 3 つが混在して出てくる。そこを問題文で補強しておいたので、採用された名前は満点で、他は減点とした。
デプロイは、文章回答でバリエーションが多かったが、「分割されたパケットをうまく処理できない実装がある」という点が触れられていれば加点している。
最後の問題は、それっぽいが間違った選択肢をでっちあげるのが難しい(かつちょっと楽しい)が、多くの人にとってはさっと読んで正解できる問題だった(正答率も 100% だった)ため、もう少し難しくても良かったかもしれない。
大問 2: Passkey
Passkey の作問は、今回最も苦労した。
WebAuthn のコーディング問題も考えたが、規模が大きくなりすぎる。Signals API など 2024 年にあった変更について触れるのは、少しニッチすぎる。そこで、文章問題寄りにし、「そもそも Passkey はなぜ必要なのか」の部分についての知識問題に寄せることにした。
しかし、Apple が発表したばかりのころと比べ、「Passkey とは何か」「何がどうあれば Passkey か」というのは、非常にブレがある話になってしまった。これは Passkey が「仕様」というより「コンセプト」や「ブランド」のような色合いが強くなり、その使われ方も多様化しているからだ。
特に今回の T/F 問題は、どう作ってもケチの付け所が多くなりそうなため、あまりやりたくなかったが、これしかもう出し方が浮かばなかった。
作問観点は以下の 3 つだ。
- なぜ Passkey はフィッシング対策になるのか
- 今言われている Passkey は Apple の製品ではなく FIDO を主導としたもの
- Apple の製品だった頃の Passkey と、今の Passkey はどれくらい変わったか
フィッシング対策は、単に「サイトの一致」や「URL の一致」と濁されないように、あえて RPID を必須語句としたが、実際答え方はそこまで変わらない。「登録したサービスと同じでないと使えない」という点が説明できていれば加点している。
T/F については、Apple が発表したころは「iCloud Keychain で同期できる」ことが売りの 1 つであったが、今の Passkey は「同期」自体を必須とせずに、単に Discoverable Credential (Resident key)があり、それをどう扱うかの部分にかっちりした規定が無いという部分を前提に作問した(ここが気に食わない人にとっては、気に食わない問題になっていると思う)。
したがって、iPhone/Android のように同期できても良いし、1Password のように 3rd Party でも良いし、Discoverable Credential が保存できれば、パスワードマネージャである必要もない。
そのあたりを踏まえて「素直に」解けば解けると思ったが、多くの受験者が「自動車試験学科脳」になってしまったため、裏を読んだ回答をされてしまったようだ。次回から T/F 問題はあまりやらないようにしたい。
大問 3: Popover
Popover は、コーディング問題としても比較的出しやすい部類だった。今回は APG の menu pattern を参考に、Popover 以前と以降でどう変わるかという観点で作問した。
- そもそも APG というものがある
- 単に display を切り替えるだけでは問題がある
- Popover を用いるとキレイに実装できる
APG のリンクは、深いのと浅いのがあったが、そこを問いたいわけではないので、どちらでも加点にした。
HTML のコーディング問題は、「JS を用いず popover の機能のみでメニューの開閉が行えること」と書いたが、閉じる方を見落としている人が多かった。
CSS のコーディング問題は、position-area
と position-try-fallback
に書き方のバリエーションが多いが、指定通りに動くなら加点とした。また、他に CSS が書かれていても、動きそうであれば減点はしなかった。
CodePen での提出にし、挙動の確認をするという案もあったが、採点が大変になりすぎることと、動かない場合の部分点も難しいため、今後も今回のようにコード提出にすると思う。
大問 4: Iterator Helpers
Intl/Temporal とも迷ったが、難しくなりそうなので Iterator Helpers にした。
といっても、実際 Iterator Helpers 自体は単なる便利メソッドで、それ自体は簡単であるため、Iterator 自体の方を中心とした。
観点は以下だ。
- Iterator Helpers の使い方
- Generator/Iterable/Iterator などの語彙
- Iterator Helpers が呼べる Iterator の作り方
特に語彙がややこしいと思うので、これを穴埋めにしたのだが、想定回答からコピーする際に回答を消し忘れるというミスをやらかした。ただ、調べれば埋められると思うので、全員 6 点加点としている。
Iterator のコーディングは、フルスクラッチにするか迷ったが、さすがに時間が足らないかもしれないと思い、サンプルコードを提示してそれを元に実装できるようにした。最終的には Iterator Helpers を呼ぶ問題でありながら、サンプルコードの方では extends Iterator
していないので、これに気づかないと条件を満たせない。継承していないコードは減点とした。継承していると Symbol.iterator
は不要だが、書いてあっても動くため不問にしている。
fib.take(10).toArray()
を想定して「Iterator Helpers を用いること」という条件をつけたが、[...fib.take(10)]
のようなコードがいくつかあった。使ってはいるので加点にしている。
Outro
アンケートでも「振り返るいいきっかけになった」「楽しかった」といった感想をもらったので、試験実施の目的自体は果たせたと思う。
今回は作問がギリギリになってしまったので、来年はもう少し早く完成させ、配点や採点基準などをもう少し改善したい。