因为感染新冠在家,看到书架上10年都没有再碰过的《C语言程序设计-现代方法》,随手翻了一下,里面有一段讲IOCCC(International Obfuscated C Code Contest 国际模糊C语言大赛),鼓励参赛者写最难懂的C程序。例如,1991年的“最佳小程序”如下:
v,i,j,k,l,s,a[99];
main()
{
for(scanf("%d",&s);*a-s;v=a[j*=v]-a[i],k=i<s,j+= (v=j<s&& (!k&&!!printf(2+"\n\n%c"-(!l<<!j)," #Q"[l^v?(l^j)&1:2])&& ++1||a[i]<s&&v&&v-i+j&&v+i-j))&&!(1%=s),v||(i==j?a[i+=k]=0: ++a[i])>=s*k&&++a[--i]) ;
}
这段程序用于打印八皇后问题。
工作10年后,看到IOCCC这样性质的竞赛,还有这段天书一样的代码,心情完全不一样。佩服写出上面这段代码的牛人,思维能力有多强才能写出和理解这样的代码。
工作里面看的、写的都是商业代码,总体的要求都是易读、易维护、易扩展。而C语言本身是与机器紧密结合的,决定了C语言难以理解的特点。所以,后来才有了《代码整洁之道》、《重构》等书籍在C语言中的用武之地。
编程比较重要的是抽象思维,是对一个需求或功能使用程序或代码来表达,在写代码前做一下设计、建模,实际就是对需求或功能进行抽象,有助于写出更好理解和更好扩展的代码。
我们的工作中可能永远都不会写上面的程序,写易读、易改的代码更符合主流的审美。
make it easier to understand and cheaper to modify.
——Refractoring - Improving the design of existing code
IOCCC官网: