A Discipline of Programming看完了

(其实我倒数第三第四章跳了,实在看不动了。。。orz) 初看之下,这本书很逗比:身为一本算法书,只有十多个算法,一半的时间用来定义不知所云的奇葩语言,语言枯燥无比。。。简直什么鬼= = 如果你这样想,只能表明你完全没看进去:就跟Software Foundations是包着Coq皮(想歪的去面壁)的PL书一样,这本书比起纯正的算法书,更算得上是以算法之名,讲PL,讲如何编程,如果你只是来 看算法的话,你一定会失望。如果不是,你来对地方了:读完以后,你会对dijkstra 的The Humble Programmer之类的EWD有着更深的了解,会对computation 改变认识,知道该如何写代码,有一些reasoning/deduction的heuristic,也会感叹于dijkstra疯子般的radical reasoning下,就是不会学到什么算法(除非你算法跟我一样弱得过不去NOIP初赛) 前一半的不知道叫什么的语言已经是一绝了,我看之前完全无法想象跟while大同小异的一门语言能给我带来如此巨大的震撼-formalism跟minimalism尽管不是不可见,但是语言最核心是由nondeterminism construct构建起来的:你有没有考虑过其实你每天用的if语句其实是个败笔?该语言的variable设计也是神来之笔,我一开始看的时候也没明白为什么在极简主义的语言里面要引入如此复杂的东西,认为是画蛇添足,直到一遍又一遍的看,才领悟了精妙之处。。。完爆某另一个图灵奖得主写的算法书里面的不知所云的语言( 后一半是利用这个语言解决各种问题,比如equivalence class,比如shortest spanning tree。。。一开始他是以极度formal的tone做这个的,proof什么的一个都不漏,到了后期你明白怎么搞了,由于篇幅关系,跳掉了一大部分formal proof,left as exercise,更着重于:我们如何解决这个问题?并给出了一定的example/heuristic,比如对intermediate step做出assumption,(shortest spanning tree中,assume已经决定的set of edge自己也是shortest spanning tree)(换句话说在什么时候需要加强induction hypothesis),比如当你代码钦定了什么的时候,利用之来优化(对一个naive 算法由3 pass改成2 pass,得出Rem’s algorithm),比如把计算从循环中往外拉,改为incrementally update之。。。 这本书其实绝大部分时候都在讲如何去对一个又一个的问题进行分析,分解,最后解决之-一开始的语言设计是如此,后面的算法也是如此,看这本书的过程,更多的像是跟dijkstra一起研究如何解决一个又一个的问题-从问题的定义下手,用直觉更heuristic找出可能有用的insight,并用之分解问题(算法设计),亦或者从现有的方案下手,质疑一切,找出问题,然后精简,或者去掉之(语言设计)。确实,Dijkstra 最后说了大概这样一段话:我们的确不太可能看完一本书,就明白该如何思考,但是我希望你读完这本书以后,能用seperation of concern之类的办法(没错,Dijkstra 发明了seperation of concern,还发明了pair programming,是软件工程中很重要的人(雾)),对一个复杂的问题,进行分解,导致不再复杂,是intellectually manageable的。 不过语言的确很枯燥,英文勉强的不用读了,这更多的我觉得是dijkstra认为“难的东西就是难的,无论如何修饰也是如此”导致的。。。

December 17, 2018 · 圆角骑士魔理沙 · CC BY-SA 4.0