はじめに
東京でSEをして5年。
プログラムを組んだり、読んだり、迷宮のようなスパゲティコードに迷い込んだり、
Javaも、C#も、PHPも、各種SQLやプロシージャも…色々な経験を積んできました。
その中で、良いプログラムと悪いプログラムが明確に分かれる事にいつしか気づきました。
プログラムとはプログラミング言語によって構成されています。
言語とは、何かを表現するためにあるもの。
つまり、その並びや表現方法によって、一般的に良い/悪いの判断がある程度成立すると考えます。
同じプログラミング言語が読める人達が集まって、「このコードは良い」「このコードは悪い」といった話はよく行われます。
それ自体が、既に芸術の走りだと思うのです。
芸術とは何か?
Wikipedia先生から。
現在でいう「芸術」は、近代以前には、単なる技術と特に区別して呼ぶ場合「よい技術、美しい技術」(beaux arts, schöne Kunstなど)と表現され、本来の「art」の一部を占めるに過ぎない第二義的なものであった。
18世紀ごろから加速する科学技術の発展とともに、それまで「ものをつくる」という活動において大きな比重を占めた装飾的な部分よりも、科学的知識を応用した実用性の向上が圧倒的な意味をもつようになる。これにともなって各種の技術は分業化と細分化が進み、現代でいう技術(technics,technology)に再編されるのに対し、建築などの人工物を装飾する美的要素がこれと分化独立しながら、従前の「art」という呼称を引き継ぐことになった。
@Wikipedia
→要約すると、今「芸術」と呼ばれているものは「技術」から始まり分岐したものである。的な感じです。
現在は1技術であるプログラミングも、そのうち「技術性」→「芸術性」といった考え方がもしかしたら出てくるのでは無いか。
というか、既にある程度は言語を使う人々の間で共通認識として確率されているのではないかと思います。
文芸的プログラミング
実際、1970年代には既に「文芸的プログラミング」といった概念が存在しました。
文芸的プログラミング(ぶんげいてきプログラミング、英: literate programming)とは、
@Wikipedia
プログラムとは「コンピュータへの命令」を書いたものですが、同時に「ドキュメント(仕様書)」も必要になります。
なぜなら、「コンピュータへの命令」だけ見ても人間には何をしたいか分からない事が多々あるためです。
文芸的プログラミングとは、その「コンピュータへの命令」と「ドキュメント」を別々に書かず、一つの文章として書く事を指します。
通常のプログラムでは、ドキュメント部分はコンピュータに無視されますが、
文芸的プログラミングに対応した言語では、ドキュメント部分にも処理に関わる記述をするためコンピュータの解析対象になります。
しかし、「文芸的プログラミング」はプログラミング時の負荷が高すぎるため、広く普及する事はありませんでした。
普及はしなかったものの、
「人間にわかりやすい」&「効率的な」コードを書くその思想は、現在のプログラミングにも受け継がれています。
良いコード・芸術的なコードとは何か?
良いコードが必ずしも芸術的なコードだとは言えません。
私達技術者が良いコードだと言われているのは、下記のようなものです。
良いコードとは?
一度作ったコードを変更・修正する想定で作られているか?
→メンテナンス性に優れているかにフォーカスされます。
分かりやすく命名されている
意味不明な変数名やメソッド名になっていないこと。
何をやる処理か、何のための変数か分かる名前になっていること。
似た処理が散らばっていない
何度も行う処理は、メソッド等にまとめられていること
処理を変更するときに、1箇所の修正で済むか?
(似た処理が入った箇所を虱潰しに修正する必要がないか)
コメントと処理に差異がない
プログラム修正時に、コメントやドキュメントも合わせて修正していること。
謎のコメントは、読む人を混乱させます。
などなど。
芸術的なコードとは?
極限まで効率的である
一切無駄が無かったり、コードの読みやすさを犠牲にしていても効率化を重視しているようなもの。
例:500バイト以下のテトリスなど
よくある例として、JavaScriptで組まれたテトリス等があります。
<body id=D onKeyDown=K=event.keyCode-38><script>Z=X=[B=A=12];function Y(){for(C =[q=c=i=4];f=i–*K;c-=!Z[h+(K+6?p+K:C[i]=p*A-(p/9|0)*145)])p=B[i];for(c?0:K+6?h +=K:t?B=C:0;i=K=q–;f+=Z[A+p])k=X[p=h+B[q]]=1;h+=A;if(f|B)for(Z=X,X=[l=228],B=[ [-7,-20,6,h=17,-9,3,3][t=++t%7]-4,0,1,t-6?-A:2];l–;)for(l%A?l-=l%A*!Z[l]:(P+= k++,c=l+=A);–c>A;)Z[c]=Z[c-A];for(S=“”;i<240;S+=X[i]|(X[i]=Z[i]|=++i%A<2|i>228 )?i%A?“■”:“■<br>”:“_”);D.innerHTML=S+P;Z[5]||setTimeout(Y,i-P)}Y(h=K=t=P=0) </script>
これをhtmlで保存して、ブラウザで開くとテトリスがプレイできます。
可読性は最悪ですが、この短さで動作するテトリスが作れる事に芸術性が見えますね。
コードそのものが美しい(主観)
完全に主観になるのですが、処理の流れに一切無駄が無いプログラムは美しいと想います。
例えコメントが無くても違和感なくトレースできて、「良いコード」を究極極めたようなイメージです。
縛りの中で作っている
古いプログラムに多いのですが、メモリの量に限界があったり、使える命令に限界があったり、ネストに限界があったり……
そんな中で、なんとかもがいて作った事が分かるプログラムに出会う事があります。
確かに、可読性は最悪で、メンテナンスもかなりの難易度ですが、当時の人がいかに頭を使って限られた資源を使っていたか。
1ミリ秒でも処理を早くするためにどれだけ試行錯誤したかが見え隠れして、そういったものにはやはり芸術性を感じる事があります。
20年選手のCOBOLなどでたまに遭遇する事があります。
最後に
プログラミングは地味な作業ですが、そこには作った人の思いが見え隠れしています。
みなさんも、コードを見るときは、その向こう側にどんな思いがあるのか想像してみると面白いかもしれません。
それでは。