評価1: Zigの設計思想を理解する - 評価基準

評価の目的

この評価では、学生がZigプログラミング言語の歴史的背景、設計哲学、そして他言語との比較を通じて、Zigの本質的な特徴と適用領域を理解しているかを確認します。Zigの設計思想を深く理解することは、効果的なZigプログラミングの基盤となります。

学習目標

  • Zigの開発背景と歴史的文脈を説明できる
  • Zigの4つの核となる設計原則を理解し、具体的なコード例で説明できる
  • 未定義動作の概念とZigのアプローチを説明できる
  • 異なるシナリオに対して適切なプログラミング言語を選択できる
  • comptime、エラー処理、メモリ管理などのZig固有の機能を実装できる

評価項目

1. 基礎知識の理解(20点)

項目 配点 評価基準
**歴史的背景** 6点 3点:Zigの開発年、開発者、最初のリリース時期を正確に答えられる
2点:3つのうち2つを正確に答えられる
1点:3つのうち1つを正確に答えられる
0点:答えられない
**設計哲学** 8点 8点:4つの核となる原則をすべて正確に挙げ、それぞれの具体例を示せる
6点:4つの原則を挙げられるが、具体例が不十分
4点:3つの原則を挙げられる
2点:2つの原則を挙げられる
0点:1つ以下
**未定義動作の理解** 6点 6点:C言語の未定義動作を正確に説明し、Zigの3つ以上の対策を具体的に説明できる
4点:未定義動作を説明できるが、Zigの対策の説明が不十分
2点:未定義動作の概念を理解している
0点:理解していない

詳細評価ポイント:

  • 歴史:Andrew Kelley、2015年開発開始、2016年2月最初のコミット
  • 設計原則:明示性(No hidden control flow)、パフォーマンス、安全性、保守性
  • 未定義動作対策:整数オーバーフローの検出、境界チェック、null安全性

2. 言語比較と選択能力(30点)

項目 配点 評価基準
**シナリオ分析** 15点 15点:5つのシナリオすべてで適切な言語を選択し、技術的根拠を示せる
12点:4つのシナリオで適切な選択と根拠を示せる
9点:3つのシナリオで適切な選択と根拠を示せる
6点:2つ以下、または根拠が不十分
**技術的根拠** 10点 10点:各言語の技術的特徴(メモリ管理、パフォーマンス、エコシステム)を考慮した説明
7点:技術的特徴を考慮しているが、説明が浅い
4点:一般的な説明のみ
0点:根拠なし
**トレードオフ理解** 5点 5点:各選択における利点と欠点を両方説明できる
3点:利点のみまたは欠点のみ
0点:トレードオフを考慮していない

評価のポイント:

  • Linuxカーネルモジュール拡張:C(既存コードベースとの互換性)またはZig(C互換性を保ちながら安全性向上)
  • 新しいWebサーバー:Go(並行処理の容易さ)またはRust(パフォーマンスと安全性)
  • 組み込みファームウェア:ZigまたはC(小さいバイナリ、直接的なハードウェア制御)
  • 金融取引システム:Rust(メモリ安全性の保証)
  • リアルタイム画像処理:ZigまたはC++(予測可能なパフォーマンス、SIMDサポート)

3. コード理解と分析(30点)

項目 配点 評価基準
**明示性の理解** 10点 10点:`try`、`defer`、明示的なアロケータの役割を完全に説明できる
7点:3つのうち2つを説明できる
4点:1つのみ説明できる
0点:説明できない
**整数演算の理解** 10点 10点:`+%=`(ラップアラウンド)と`+\ =`(飽和演算)の違いと結果を正確に説明
7点:違いは理解しているが、結果が不正確
4点:概念的な理解のみ
0点:理解していない
**comptimeの理解** 10点 10点:コンパイル時計算のタイミングと利点(実行時オーバーヘッドなし、型安全性)を説明
7点:タイミングは理解しているが、利点の説明が不十分
4点:基本的な理解のみ
0点:理解していない

正解例:

  • コード1:try(エラー伝播)、defer(確実なリソース解放)、明示的アロケータ(隠れたメモリ確保なし)
  • コード2:x +%= 100 = 44(255を超えて0に戻る)、y +|= 100 = 255(最大値で飽和)
  • コード3:fact_5はコンパイル時に120として計算され、実行時コストゼロ

4. 実装能力(20点)

項目 配点 評価基準
**max関数** 5点 5点:正しく動作する実装
3点:ロジックは正しいが最適でない
0点:動作しない
**ファイル読み込み** 8点 8点:適切なエラー処理とメモリ管理を含む完全な実装
6点:基本機能は動作するが、エラー処理が不十分
3点:部分的に動作
0点:動作しない
**comptime関数** 7点 7点:正しいcomptime実装と動作確認
5点:実装は正しいがcomptimeの活用が不十分
2点:基本的なロジックのみ
0点:動作しない

実装チェックポイント:

  • max関数:三項演算子または条件分岐を使用
  • ファイル読み込み:tryによるエラー処理、defer file.close()、アロケータの適切な使用
  • comptime関数:再帰的実装、コンパイル時評価の確認

ボーナス課題の評価

Bonus 1: ジェネリック関数(10点)

配点 評価基準
10点 comptime型パラメータを正しく使用し、すべての型で動作する実装
7点 基本的には動作するが、型制約が不十分
4点 特定の型のみで動作
0点 動作しない

Bonus 2: 型の最大値取得(10点)

配点 評価基準
10点 `@typeInfo`を使用し、符号付き/符号なし両方に対応した実装
7点 基本的には動作するが、エッジケースの処理が不十分
4点 限定的な型のみサポート
0点 動作しない

Bonus 3: カスタムエラーセット(10点)

配点 評価基準
10点 複数のエラーセットを結合し、適切なエラー処理を実装
7点 エラー定義は正しいが、処理が不十分
4点 基本的なエラー処理のみ
0点 動作しない

Bonus 4: ベンチマーク比較(10点)

配点 評価基準
10点 複数言語での実装、正確な測定、詳細な分析レポート
7点 実装と測定は正しいが、分析が浅い
4点 限定的な比較のみ
0点 不完全

評価チェックリスト

マンダトリー要件

  • [ ] Part 1の質問すべてに回答している
  • [ ] Part 2の5つのシナリオすべてに技術的根拠を含めて回答している
  • [ ] Part 3のコード分析で各設計原則を具体的に説明している
  • [ ] Part 4の3つの関数がすべて実装され、動作する
  • [ ] mandatory.zigがコンパイルエラーなく実行できる
  • [ ] エラー処理が適切に実装されている
  • [ ] メモリリークがない(deferを使用)
  • [ ] answers.mdが適切にフォーマットされている

ボーナス要件

  • [ ] Bonus 1: ジェネリック関数が複数の型で動作する
  • [ ] Bonus 2: @typeInfoを使用した型情報の取得
  • [ ] Bonus 3: 複数のエラーセットを統合している
  • [ ] Bonus 4: 3つ以上のアルゴリズムでベンチマークを実施
  • [ ] Bonus 4: レポートにグラフまたは表が含まれる
  • [ ] すべてのボーナスコードがコンパイル・実行できる
  • 合格基準

    レベル 点数 説明
    **優秀** 90-100点 すべての評価項目で高得点を獲得し、Zigの設計思想を深く理解している。ボーナス課題にも取り組み、応用力を示している。
    **良好** 80-89点 主要な評価項目で適切な理解を示し、基本的な実装ができる。一部のボーナス課題に取り組んでいる。
    **合格** 70-79点 基礎知識を理解し、基本的な実装ができる。改善の余地はあるが、次のステップに進める水準。
    **要再提出** 0-69点 重要な概念の理解が不十分、または実装に重大な問題がある。復習と再提出が必要。

    最終評価の計算

    最終スコア = マンダトリー得点(100点満点) + ボーナス得点(最大40点)
    
    ただし、マンダトリー70点未満の場合は不合格
    

    学習の手引き

    効果的な学習方法

  • 歴史と文脈の理解
- Zigの公式ブログやAndrew Kelleyの講演を視聴 - なぜZigが作られたのか、どの問題を解決しようとしているのかを理解 - C言語の問題点とZigの解決策を対比して学習

  • 設計原則の体得
- 各原則を実際のコード例で確認 - 他の言語(C、Rust、Go)との比較を通じて理解を深める - 小さなプログラムを書きながら原則を意識する

  • comptime機能の理解
- まずは簡単なcomptime計算から始める - 型パラメータを持つ関数に挑戦 - @typeInfoなどのビルトイン関数を実験

  • エラー処理の習得
- trycatchの使い分けを理解 - カスタムエラーセットの定義と使用 - エラーの伝播と処理のベストプラクティス

よくある間違いと対策

間違い1: エラー処理の忘れ

// ❌ 間違い
const file = std.fs.cwd().openFile("test.txt", .{});

// ✅ 正しい
const file = try std.fs.cwd().openFile("test.txt", .{});
defer file.close();

間違い2: メモリリーク

// ❌ 間違い
const buffer = try allocator.alloc(u8, 1024);
// free()を忘れている

// ✅ 正しい
const buffer = try allocator.alloc(u8, 1024);
defer allocator.free(buffer);

間違い3: 型の不一致

// ❌ 間違い
fn power(base: u32, exp: u32) u32 {
    // comptimeを忘れている
}

// ✅ 正しい
fn power(comptime base: u32, comptime exp: u32) u32 {
    // コンパイル時計算
}

デバッグのヒント

  • コンパイルエラーの読み方
- Zigのエラーメッセージは非常に詳細 - エラーの行番号と説明を注意深く読む - 型の不一致エラーは特に注意

  • 実行時エラーのデバッグ
- std.debug.printを使ったログ出力 - Debugビルドでの詳細なスタックトレース - アロケータのリーク検出機能の活用

  • テストの書き方
- testブロックを使った単体テスト - std.testing.expectEqualなどのアサーション - テスト駆動で実装を進める

推奨学習リソース

  • 公式ドキュメント
- Zig Language Reference: https://ziglang.org/documentation/master/ - Zig Standard Library: https://ziglang.org/documentation/master/std/

  • チュートリアル
- Zig Learn: https://ziglearn.org/ - Ziglings: https://github.com/ratfactor/ziglings

  • コミュニティ
- Zig公式Discord - Zig Forum: https://ziggit.dev/ - GitHub Discussions

  • 動画リソース
- Andrew Kelleyの講演動画 - Zig関連のカンファレンストーク

時間配分の目安

パート 推奨時間 内容
Part 1 1-2時間 公式ドキュメントの読解、歴史の調査
Part 2 2-3時間 各言語の特性調査、シナリオ分析
Part 3 2-3時間 コード分析、設計原則の理解
Part 4 3-4時間 実装、テスト、デバッグ
ボーナス 5-8時間 追加機能の実装、ベンチマーク

合計: マンダトリーのみで8-12時間、ボーナス込みで13-20時間

評価後のフィードバック

評価者へのガイドライン

  • 建設的なフィードバック
- 良い点と改善点の両方を具体的に指摘 - 次のステップへの推奨事項を提示 - 参考となるコード例やリソースの紹介

  • 評価の一貫性
- 評価基準に厳格に従う - 主観的な判断を避ける - 複数の提出物を比較して公平性を確保

  • 学習支援
- 理解が不十分な部分を特定 - 追加学習のための具体的なアドバイス - 質問への丁寧な回答

学生へのフィードバック例

優秀な提出物の場合:

素晴らしい理解度です。特にcomptimeの実装は洗練されており、
Zigの設計思想を深く理解していることが伺えます。ボーナス4の
ベンチマーク分析は非常に詳細で、パフォーマンス特性の理解が
優れています。

次のステップ: より複雑なジェネリック型や、allocatorの
カスタム実装に挑戦してみることをお勧めします。

改善が必要な場合:

基本的な概念は理解していますが、エラー処理の実装に改善の
余地があります。特に、deferによるリソース管理をより意識的に
使用することで、メモリリークを防ぐことができます。

改善のヒント: Zig Learnの第3章を復習し、エラー処理の
ベストプラクティスを再確認してください。

参考資料

  • Zig Language Reference: https://ziglang.org/documentation/master/
  • Zig Standard Library: https://ziglang.org/documentation/master/std/
  • Zig Learn: https://ziglearn.org/
  • Ziglings (学習エクササイズ): https://github.com/ratfactor/ziglings
  • Andrew Kelley's Blog: https://andrewkelley.me/