評価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点未満の場合は不合格
学習の手引き
効果的な学習方法
- 設計原則の体得
- comptime機能の理解
@typeInfoなどのビルトイン関数を実験- エラー処理の習得
tryとcatchの使い分けを理解
- カスタムエラーセットの定義と使用
- エラーの伝播と処理のベストプラクティスよくある間違いと対策
間違い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 {
// コンパイル時計算
}
デバッグのヒント
- コンパイルエラーの読み方
- 実行時エラーのデバッグ
std.debug.printを使ったログ出力
- Debugビルドでの詳細なスタックトレース
- アロケータのリーク検出機能の活用- テストの書き方
testブロックを使った単体テスト
- std.testing.expectEqualなどのアサーション
- テスト駆動で実装を進める推奨学習リソース
- 公式ドキュメント
- チュートリアル
- コミュニティ
- 動画リソース
時間配分の目安
| パート | 推奨時間 | 内容 |
|---|---|---|
| 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/