質問: 良いプログラムを書くためには 今回、プログラミングの上達方法に関してアドバイス頂きたく質問しました。 現在、ソフトウェア開発の仕事に就いていてcやjavaなどでプログラムを書いたりしています。主にcで書くことが多いです。与えられた課題に対して動くプログラムは作れるのですが、先輩などからプログラムが汚いとよく指摘されます。 指摘される事柄は色々ありますが、何点か挙げるとまずモジュール分割が上手く出来ていない。1000行位の動くプログラムを書き始められた頃は、共通の処理などの関数が分割されておらず、同じ処理がやたら多いなど、余計な処理が多くコードに無駄が多いと指摘されました。それを改善したところ、今度は無駄に関数の分割が多くなり、読みにくいなどの指摘を受けました。 その他にも、例えば関数の中で、for(条件式)の条件式を上手く工夫すれば、for()の中で、余計な条件分岐などが減るなどの、細かい記述に関しても指摘を受けます。 質問はプログラムを作成する上で、大きな観点からだと、どのようにすれば綺麗にモジュール化などが出来るのか、モジュール化だけではなく、ソフトウェアの設計全般に関してです。また細かいことで、いえば先ほどのfor()の様に、文法を上手く使いこなすためにはどうすればよいか。本などのサンプルコードでは、forならfor、ifならifの説明など、主に単独の説明が多いように思えます。関数の中で、各文法同士を上手く使いこなし、他人が見ても読みやすいコードなどを書きたいです。 先輩からは、他人のソースコードを見ることなどと言われますが、何か他人のソースコードを見る上でも、上で挙げた指摘を改善するための見方とか、他にも自分でプログラムを作る場合に、こういう事に注意しながら作るといいなど何か改善するアドバイスがあれば宜しくお願いします。また参考になる書籍やサイトなどもあったら教えて頂くと助かります。 長くなりましたが宜しくお願いします。
回答: 一応、ソフトウェア設計を仕事やプライベートでやっている者です。 参考になるかは分かりませんが、 私はソフトウェアを作成する時、いきなりコードを書くのではなく、 最初は紙に以下のようなことを箇条書きに書きます。 (1)どういう動きをするものを作るのか? (2)インプットは何? (3)アウトプットは何? (4) (2)から(3)を得るにはどういう処理が必要? -> その処理の中に共通の動きをするものはある? (あればリユース可能にする) -> 関数化を検討 (関数は処理の内容ごとに分類。関数内の処理も一連の流れを決めて、その流れを守って作る。) (5)デバッグ あとは、コーディングやって、単体テストや結合テストなどをします。 コーディング作業は、やっぱり見易さを重要視して作業します。 (特にtabキーによるインデントや一行空けるなど。コメントも分かりやすく簡単に1行にまとめる。) こんな感じです。 何が正解かはやってみないと分かりません。 ただし、私でも1つだけ言えるのは、どんなソフトウェアを作るときでも、それは仕様書で決められている通りの、正しい動作をするものでなければならないということです。 納期やコストも大切ですが、上記に関しては手を抜いてはいけません。