おすすめの方法はこんな感じです。
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_you_code_for_step(i);
watch_my_github_commit(i);
revise_you_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週間くらいで書き終わるかもしれません。