ふぬんが。去年の4/1にやった四月馬鹿と、その後の一連のエントリの評判がよかったので2月から準備して、3月は日記も(ほとんど)書かずに脇目もふらずに準備していたのだが。風呂敷を広げすぎたようだ。
でもおかげで、自分のやりたいことが明確になったことは感謝している。今後もほそぼそと続けていれば、来年には大バカぶりをお見せすることができるだろう。それでいいのか、という思いもあるが。
坤、元亨。利牝馬之貞。君子有攸往、先迷、後得生。利西南得朋、東北喪朋。安貞吉。
彖曰、至哉坤元、萬物資生。乃順承生。坤厚載物、徳合无彊。含弘光大、品物咸亨。牝馬地類、行地无彊。柔順利貞、君子攸行。先迷失道、後順得常。西南得朋、乃与類行。東北喪朋、乃終有慶。安貞之吉、應地无彊。
象曰、地勢坤。君子以厚徳載物。
『易経上経』、「坤」より一部抜粋。
八卦の中で、いまのお気に入りは坤である。易経については、2/16のエントリで少し触れたが、超古代の思想の癖になかなか面白い妙味を含んでいる。2/16 はずるい議論をしていて、陰陽と{0,1}の割当てを勝手に決めている。the world が太極であるのは、私にとっては疑いようもないが、陰が 0 か 1 かは両方の解釈があると思う。陰が 0 なら、111 は坤ではなく「乾」にあたる。が、乾(乾為天)の解釈は坤の解釈よりもさらに曖昧なのである。まあ、オカルトの一つなので、どうでもいいことだ。
先迷失道、後順得常。乃与類行、乃終有慶。安貞之吉、應地无彊。結構、結構。私はひねくれものなので、柔順とやつが足りない。いみじくも本命卦が当たっている。
日本という文化圏は、西洋的な見方(複雑な物事を単純な物事に分解して、単純な方法で解決する)と東洋的な見方(複雑な物事を複雑な背景とともに把握して、過去の経験と知恵を適用して解決する)の両方を兼ね備えているという特徴があるのだから、後者も大事にしてもらいたいものだ。さらにいえば、一歩一歩考えを進めていくという方法(演繹的思考)と、想定外も含めた全体を想像して第三者的な立場から冷徹に判断する(禅的思考)の両方を持つことが、問題解決の重要なプロセスにつながると考えるようになった。後者については、どれだけ理性に束縛されずに自由な発想ができるかが問われる。
Simon Peyton Jones の 「すばらしい論文を書き、すばらしい発表をするには」を読んで、ソフトウエア開発手法にも共通するところがあるのではないか、と考えました。そこで、やや雑な議論になりますが、「すばらしいソフトウエアを作るには」というコラムをこれから書いてみます。
「昔はプログラムを書くのが嫌だったけど、今は違うんだ」
「わかったんだ、プログラムを書く真の目的は、つまんないアイデアや、あいまいでいい加減な屁理屈、ごちゃごちゃなものを、コンピュータの上で実現することで有頂天になることだってね」
「経験からわかったんだけど、プログラムを書くというのは恐ろしくて理解不明なもやもやを書くことなんだね、僕のプログラムを見てみるかい?」
/* http://www.ioccc.org/ */ /* 2004 17th International Obfuscated C Code Contest winner */ /* A pgm generator written by anonymous */ #include\ <stdio.h> #include <stdlib.h> #include <string.h> #define w "Hk~HdA=Jk|Jk~LSyL[{M[wMcxNksNss:" #define r"Ht@H|@=HdJHtJHdYHtY:HtFHtF=JDBIl"\ "DJTEJDFIlMIlM:HdMHdM=I|KIlMJTOJDOIlWITY:8Y" #define S"IT@I\\@=HdHHtGH|KILJJDIJDH:H|KID"\ "K=HdQHtPH|TIDRJDRJDQ:JC?JK?=JDRJLRI|UItU:8T" #define _(i,j)L[i=2*T[j,O[i=O[j-R[j,T[i=2*\ R[j-5*T[j+4*O[j-L[j,R[i=3*T[j-R[j-3*O[j+L[j, #define t"IS?I\\@=HdGHtGIDJILIJDIItHJTFJDF:8J" #define y yy(4),yy(5), yy(6),yy(7) #define yy( i)R[i]=T[i],T[i ] =O[i],O[i]=L [i] #define Y _(0 ], 4] )_ (1 ], 5] )_ (2 ], 6] )_ (3 ], 7] )_=1 #define v(i)( (( R[ i ] * _ + T [ i ]) * _ + O [ i ]) * _ + L [ i ]) *2 double b = 32 ,l ,k ,o ,B ,_ ; int Q , s , V , R [8 ], T[ 8] ,O [8 ], L[ 8] ; #define q( Q,R ) R= *X ++ % 64 *8 ,R |= *X /8 &7 ,Q=*X++%8,Q=Q*64+*X++%64-256, # define p "G\\QG\\P=GLPGTPGdMGdNGtOGlOG" "dSGdRGDPGLPG\\LG\\LHtGHtH:" # define W "Hs?H{?=HdGH|FI\\II\\GJlHJ" "lFL\\DLTCMlAM\\@Ns}Nk|:8G" # define U "EDGEDH=EtCElDH{~H|AJk}" "Jk?LSzL[|M[wMcxNksNst:" # define u "Hs?H|@=HdFHtEI" "\\HI\\FJLHJTD:8H" char * x ,*X , ( * i )[ 640],z[3]="4_", *Z = "4,8O4.8O4G" r U "4M"u S"4R"u t"4S8CHdDH|E=HtAIDAIt@IlAJTCJDCIlKI\\K:8K"U "4TDdWDdW=D\\UD\\VF\\FFdHGtCGtEIDBIDDIlBIdDJT@JLC:8D"t"4UGDNG\\L=GDJGLKHL\ FHLGHtEHtE:"p"4ZFDTFLT=G|EGlHITBH|DIlDIdE:HtMH|M=JDBJLDKLAKDALDFKtFKdMK\ \\LJTOJ\\NJTMJTM:8M4aGtFGlG=G|HG|H:G\\IG\\J=G|IG|I:GdKGlL=G|JG|J:4b"W S"4d"W t t"4g"r w"4iGlIGlK=G|JG|J:4kHl@Ht@=HdDHtCHdPH|P:HdDHdD=It\ BIlDJTEJDFIdNI\\N:8N"w"4lID@IL@=HlIH|FHlPH|NHt^H|^:H|MH|N=J\\D\ J\\GK\\OKTOKDXJtXItZI|YIlWI|V:8^4mHLGH\\G=HLVH\\V:4n" u t t "4p"W"IT@I\\@=HdHHtGIDKILIJLGJLG:JK?JK?=JDGJLGI|MJDL:8M4\ rHt@H|@=HtDH|BJdLJTH:ITEI\\E=ILPILNNtCNlB:8N4t"W t"4u" p"4zI[?Il@=HlHH|HIDLILIJDII|HKDAJ|A:JtCJtC=JdLJtJL\ THLdFNk|Nc|\ :8K"; main ( int C,char** A) {for(x=A[1],i=calloc(strlen(x)+2,163840); C-1;C<3?Q=_= 0,(z[1]=*x++)?((*x++==104?z[1]^=32:--x), X = strstr(Z,z)) &&(X+=C++):(printf("P2 %d 320 4 ",V=b/2+32), V*=2,s=Q=0,C =4):C<4?Q-->0?i[(int)((l+=o)+b)][(int)(k+=B) ]=1:_?_-=.5/ 256,o=(v(2)-(l=v(0)))/(Q=16),B=(v(3)-(k=v(1) ))/Q:*X>60?y ,q(L[4],L[5])q(L[6],L[7])*X-61||(++X,y,y,y), Y:*X>57?++X, y,Y:*X >54?++X,b+=*X++%64*4:--C:printf("%d " ,i[Q][s]+i[Q ][s+1]+i[Q+1][s]+i[Q+1][s+1])&&(Q+=2)<V||(Q= 0,s+=2)<640 ||(C=1));}
これはもちろん、ジョークですが、ほとんどのプログラマは恐ろしくて理解不明なもやもやを書いています。これはホントーです。
「皆をびっくりさせること、皆の注目を集めること、腕前を見せつけること」が、ソフトウエアを作る目的である。←誤解
アイデアをいつまでも温め続けるならば、もっとも優れたアイデアに価値が生まれる。
アイデアが浮かぶ→実現するためのライブラリ/フレームワークを探す→プログラムを書く
アイデアが浮かぶ→実現するためのライブラリ/フレームワークを探す→プログラムを書く
アイデアが浮かぶ→プロトタイプとしてのプログラムを書く→実現するためのより良いライブラリ/フレームワーク/言語を探す
ソフトウエアを作る前に、すんばらしいアイデアを持っていなければならない。←誤解
アイデアがすんばらしいか、つまんねえか、そんなことは関係ない。プログラムを書け。
ソフトウエアを作ることの目的とは...アイデアをユーザに伝えることである。
頭の中にしかまだないアイデアを、ユーザに伝えることが目的である。全てはそのためにある。
間違っても、こういう目的でソフトウエアを作ってはいけない:「ほげらもげらシステムに新しいボタンを追加する」
続きは...ご自分で。