プログラミングの作業は、「私たちの奥深くに備わっている創造性の欲求を満たしてくれる」。また、「私たちが人間として共通に持っている感覚を楽しませてくれる」。そこには、5つの種類の喜びがある。
プログラミングの作業には、特別な苦悩が本来的に備わっている。
コードにはHow
テストコードにはWhat
コミットログにはWhy
コードコメントにはWhy not
怠惰
短気
傲慢
プラスで礼儀正しさと敬意
• コードが重複しまくっている
• 条件分岐の密林があちこちにある
• どこに何が書いてあるかわからない
• 変更した時にどこで何が起きるか推測できない
• やっていることは解読できるが、なぜ、そこでそ の処理が必要か意味がわからない
• パッケージ名/クラス名/メソッド名/変数名/コメン トが嘘だらけ
• でも動いてる
読みやすくて、理解しやすく、修正しやすいコード
良いコードにするには
簡潔さの罠 全てのコードをシンプルに保つのは実は不可能に近い。なぜならば、コードが扱うのは現実世界の問題であり、現実世界はとても複雑だから。よって、ソフトウェアが複雑になるのは避けられない問題で、これは認めなければならない。それでもシンプルにするとどこかにシワよせが来る。
複雑さ、簡潔さをどこに持たせるか 全てのコードをシンプルに保つのは難しいという話の通り、例えばRuby ではとても泥臭いことをやっている。しかし、そのおかげで、Ruby で記述されたプログラムを簡潔に保つことができるようになっている。
シンプルな言語でソフトウェアを作ればソフトが複雑になり、逆にソフトをシンプルに記述するためには言語がその複雑さを負う必要がある。
これを「怠惰のための勤勉」とまつもとさんは表していた。手抜きをしては美しいコードを書くことは当然できない。でも、苦労を見せびらかす(表面に見えるようにする)のは粋じゃない。まさに水鳥。
「全てをシンプルにすること = 美しい」ということではない。Ruby が簡潔な表現ができると評価されるのは、Ruby 自身が複雑さを引き受けているからでもある。
思考の流れにあっているコード 「○○を~して、~して、~する」のように、人の思考は左から流れている。そのように表現されているコードは美しい。
外面の美しさ コード(= ソフトウェア)には外面的な美しさもある。ここでは、「人にフォーカスしたソフトウェアは美しい」という話がありました。人を考慮した優しいコードは美しい。
使うことで使っている人を進化させるようなソフトウェア
Excel の表を見ながら電卓叩いている人を見ると、上手く最適化されていない気がする(その人にとってExcel の習得コストが高い*1)。
マスターするのは大変だけど、マスターすると進化につながるようなソフトが美しい。まつもとさんは自分のマシンのローマ字のキー配列をいじるコードを書いた。最初3日間くらいはまともに文字が打てなかったけど、今はいくら大量に文字をうっても腱鞘炎にならない。(怠惰のための勤勉)
http://hitode909.hatenablog.com/entry/2016/02/08/140232
http://bufferings.hatenablog.com/entry/2017/11/01/215751
http://qiita.com/tatesuke/items/36924274f043f37a391f
http://blog.jnito.com/entry/20110218/1297983647
クソコードとは 読む人を怒りの渦に 叩きこむコードである
sed -i -e "s/t/ /g" *
sed -i -e "s/s*$//g" *
・ドメイン固有のString – PersonName, MailAddress, Telephone, …
・ドメイン固有のint/long/BigDecimal – Money, Quantity, Rate, …
・ドメイン固有のLocalDate – DueDate, ExpireDate, DateRange, … データの用途を明確にする
ソフトウェアのライフタイムにおけるコストは,その 80% が保守に費やされる.
ソフトウェアの保守が最初から最後まで元の作成者によって行われることは,ほとんどない.
コーディング規約は,ソフトウェアの可読性を向上し、エンジニアが初めて目にするコードをすばやく完全に理解できるようにする.
このため、この規約は名前付けやスタイルを中心としており、次の項目が含まれています。
https://codic.jp/
https://ferret-plus.com/4680
https://findy.jp/15270
suffixを使うことにする
MINIMUM_APPLE_COUNT (replace with APPLE_COUNT_MINIMUM).
https://hilton.org.uk/presentations/naming-guidelines
http://www.ne.jp/asahi/hishidama/home/tech/lang/symbol.html
https://yakst.com/ja/posts/3859
https://gist.github.com/rowanmanning/77f31b2392dda1b58674#file-readme-md
https://github.com/kmindi/special-files-in-repository-root/blob/master/README.md
rubyでは長くても改行しないみたい
pythonは80文字ルールがある
参考
https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.5-line-wrapping
(1)=以外のオペレータの前で改行
(2)=のあとで改行
(3)(のあとで改行
(4),のあとで改行
(1) ローカル変数を利用
(2)カンマで改行
(3)優先度の低い演算子の前で改行,
基本方針:できるだけ上の行に続きっぽい感じで残す
基本方針:+とかーとかはできるだけ前にする。カンマとかは後ろにする。
1735 if define != ifndef:
1736 error(filename, 0, 'build/header_guard', 5,
1737 '#ifndef and #define don't match, suggested CPP variable is: %s' %
1738 cppvar)
1739 return
優先順位は以下のとおり
”+-*/ | &”->”,”->”(“->”.%->” |
http://www.triemax.com/products/jalopy/manual/wrapping.html
要件のIF
仕様のIF
実装のIF
要件のIFは、システムの外に元々存在しているもので本来要件として抽出が可能なもの(まぁ大抵は設計中に知るんだけどね)
仕様のIFは、システム開発のいろんな都合で追加されるもの。これが一番うざい
実装のIFは、プログラム的な都合で追加されるもの。大抵はnullで落ちるのを防いだり、ライブラリに正当な値を渡したり・・って為のもの
http://d.hatena.ne.jp/makotan/20081107#p3
業務エラーでは、例外を利用してはいけない。
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/
参考
http://d.hatena.ne.jp/kmaebashi/20100114/p1
http://d.hatena.ne.jp/licheng/20130608/p1
http://blog.shin1x1.com/entry/application-throws-exception-or-not
https://qiita.com/koher/items/a7a12e7e18d2bb7d8c77
https://qiita.com/omochimetaru/items/c30f7a021fb9b8f0fa92
http://gihyo.jp/dev/serial/01/java-system-operation/0008
オブジェクト指向 部品として考える
インデント タブvsスペース タブからスペースの変換は用意
スペースからタブへの変換は困難
メリット
タブの方が情報圧縮されている
スペースの方がエントロピーが高い
単一責務性の違反指数(SRP)を計算するようにしています。
SRP=R+U+((L/100)-5)
R:修正リビジョンのユニーク数
U:修正ユーザのユニーク数
L:モジュールのライン数
この値が大きければ大きいほど単一の「大きな」モジュールが「何度も多くの人に」触られている状態であると言えます。これはコンポーネントの変更の多さに対してモジュールの分割が不十分であることを証明しているという判断によるものです。
この指標を各コンポーネント内のコードに適用し,降順に並べ替えると,「王様モジュール」のようになっているものを割り出せます。
http://gihyo.jp/dev/serial/01/perl-hackers-hub/000803
function get_SRP() {
local target_filepath=$1
echo $(( $(git --no-pager blame --line-porcelain $target_filepath | sed -n 's/^summary //p' | sort | uniq -c | sort -rn | wc -l) + $(git --no-pager blame --line-porcelain $target_filepath | sed -n 's/^author //p' | sort | uniq -c | sort -rn | wc -l) + ( $(cat $target_filepath | wc -l) / 100 - 5) )) $target_filepath
}
# SRPが酷い順(大きい順)に "SRP ファイル名" を標準出力
for file in `git ls-files | grep -E '.cc|.h|.c'`; do
get_SRP $file
done | sort -k1,1 -nr