おすすめの方法はこんな感じです。
const int num_of_steps = 14;
read_minishell_pdf();
for (int i = 1; i ≤ num_of_steps; i++) {
read_man();
exec_sample_code();
read_step(i);
write_tests_for_step(i);
write_your_code_for_step(i);
read_reference_commit_for_step(i);
revise_your_code_for_step(i);
}
if (you_want)
{
for (int i = 1; i <= num_of_steps: i++) {
write_your_code_from_scratch(i);
}
}
このプロジェクトでは、インクリメンタルな開発を行います。インクリメンタルというのはどういう意味かというと、ステップバイステップで、常にその時点でのshellとして動くプログラムを維持したまま開発を進めるということです。
例えば最初の時点ではコマンドの実行すらできませんが、commandを繰り返し読み込むことだけができるプログラムとして作り始め、徐々にコマンドの実行や実行ファイルのパスの検索、リダイレクトやパイプなどが動くように少しずつ機能を追加していきます。
まず一つには、プログラムを書くのが簡単です。
必要なものを全部最初に見通すことは難しいです。インクリメンタルな方式ではその都度追加する機能に必要な分だけコードを追加するので、不必要な複雑性が入り込む余地がありません。
そして二つ目に、理解するのが簡単です。
後々必要になるからという理由で、その時点では使わない構造体やフィールドが追加されることはありません。その時に必要なものだけを追加していくので、理解が簡単です。
三つ目に、テストを書くのが簡単です。
どの時点でもそこまでに作った機能は完成しているため、いつでもそこまでの機能は完成しています。だからそこまでの機能はテスト可能です。テストを書くといいことがたくさんありますが、もっとも大事なことは、それまでの機能を壊さずに、新しい機能を追加することが容易になることでしょう。
結局、開発が早く終わります。これはやってみればわかりますが、早い人だと1週間くらいで書き終わるかもしれません。