笔记
Author: | Fox (yulefox at gmail.com) |
---|---|
Site: | http://www.yulefox.com |
Date: | Aug. 13, 2011 |
Contents
INTRODUCTION
之前没有把 Paul Graham 的 <黑客与画家> 一书读完, 上周就从同事那里把书带回家, 也一直没读, 到这周才有时间读完. 很久没有更新了 (一看时间, 整整 5 个月), 顺便把这篇写了几个月的感想放出来.
前几章的一点看法
这本书前面 8 章讲述的内容, 大多是我并不太感兴趣的, 比如财富, 比如创业. 不是因为它们本身怎么样, 而是因为我一直认为, 它们是没有办法复制的, 我宁可依循我自己的原则. 其中 Graham 的一些观点我比较不能赞同, 有一些我认为可以拿出来讨论.
Graham 用一种颠覆性的观点表达了他对计算机科学的看法. 不得不说, 我并不能完全同意他把计算理论对黑客的重要性等同于颜料化学成分对画家的重要性. 他甚至认为, 黑客新想法的最佳来源, 并非那些名字里有计算机三个字的理论领域, 而是来自于其他创作领域. 与其到计算理论领域寻找创意, 你还不如在绘画中寻找创意.
我无意带着恶意去揣测这与他攻读人工智能博士学位时遭受的挫折是否有关, 显然, 那应该不是一段愉快的记忆, 但这并没有妨碍他成为一名优秀的黑客. 只是, 我们无法也不应该告诉那些试图成为黑客的学生们, 计算机理论基础是多么的无足轻重. 如果需要做一些说明, 我相信大家对黑客的定义或许是有区别的.
我赞同 Graham 所讲的如果你不爱一件事, 你不可能把它做得真正优秀, 要是你很热爱编程, 你就不可避免地会开发你自己的项目. 我也强烈反对多人共同开发同一模块, 说的更直白一点, 我不喜欢别人弄脏我的设计.
从第 9 章开始, Graham 阐述和设计编程相关的内容, 这里就摘抄一些我认为比较重要的 (其实我只是把第 9 章看的比较细致, 其它章节基本都是扫过…).
什么是好的设计
-
好设计是简单的设计
少即是多. 当你被迫把东西做得很简单时, 你就被迫直接面对真正的问题, 当你不能用表面的装饰交差时, 你就不得不做好真正的本质部分.
-
好设计是永不过时的设计
数学家哈代说: 丑陋的数学在世界上无法生存. 飞机设计师凯利.约翰逊说: 如果解决方法是丑陋的, 那就肯定还有更好的解决方法, 只是还没有发现而已. 显然, 这些经典的观点也同样适用于编码设计.
-
好设计是解决主要问题的设计
-
好设计是启发性的设计
其实, 任何设计是都启发性的, 只是坏设计会成为项目中的 "破窗户".
-
好设计通常是有点趣味性的设计
好的设计并非一定要有趣, 但是很难想像完全无趣的设计会是好的设计.
-
好设计是艰苦的设计
-
好设计是看似容易的设计
只见贼吃肉, 没见贼挨打. 结合这句话, 你就很容易理解上面两条的含义了.
-
好设计是对称的设计
这条要看怎么理解了. 对称的危险在于它可以用来取代思考, 在大量使用重复的时候这种危险性更大. 只有知道什么是对称, 为什么需要对称才能做到好的对称.
-
好设计是模仿大自然的设计
-
好设计是一种再设计
很少有人一次就把事情做对. 犯错误是很正常的事情. 扔掉早期原型是需要信心的.
-
好设计是能够复制的设计
-
好设计常常是奇特的设计
唯一达到奇特的方法, 就是追求做到好作品, 完成之后再回过头看.
-
好设计是成批出现的
这是一个残酷的现实, 因为从历史来看, 大师的时代就是大师的时代. 不管你信不信, 反正我是信了.
-
好设计常常是大胆的设计
优秀作品的秘诀就是: 非常严格的品味, 再加上实现这种品味的能力.
我关于写代码的一些琐碎的看法
最后, 我想插一段自己关于写代码的一些想法. 之前我曾试图分析自己现在为什么会对代码的美感如此纠结, 那是无关乎代码运行的.
我有一个与自己要求完美的内心并不一致的方面, 我往往只是提出自己的要求和看法, 但并不会强制要求别人. 我觉得每个人有他自己的自由和尊严, 尤其是聪明的程序员. 但这与项目管理的要求或许是相悖的, 或许是因为自己比较希望自己的信念得到别人的尊重, 我会尽量尊重别人的观点, 至少表面上是这样.
我写代码的时候容易分心. 往往会因为环境不称心, 而分心去改善, 如果碰壁, 会挫伤我的积极性. 举个例子, 为了阅读代码, 我一定会努力寻求一个自己觉得舒服的编辑器, 于是我会在 Emacs 和 Vim 之间徘徊很久; 在发现 Vim 有很多强大的命令时, 我一定试图掌握更多的命令, 直到自己满意为止; 当我再次用 Vim 打开代码后, 我发现我虽然不需要一个强大的 IDE, 但我至少需要 tags, 在遇到不能跳转的 tag 时, 我会变得很烦躁, 进而无所适从.
在编码和其他一些事情上, 我不喜欢将就, 我希望能够尽我所能, 能够把一件事做好. 而且会为了达到这样的目标, 不惜花费掉很多在他人看来不必要的时间.
写代码的时候, 我不会满足于手动编写简单的 makefile, 我希望自己写出的 makefile 看上去足够 "专业", 于是会转去了解 makefile 规则; 然后会尝试 autotools…
这些毛病的一个直接表现是, 我为了解决过程中遇到的一点不爽, 强迫自己去 fix 它, 结果招致更多的不爽, 然后不断的去 fix 它们. 后果就是, 当我再回头的时候, 发现时间已经过去了很久, 我的精力大量投入其中, 耽搁了本来的工作, 虽然时间不能说是浪费, 但效果却并不是很好.
如果说有时候的付出是值得的, 但另一些时候的做法则有 "睡不着觉怨床歪" 的嫌疑. 比如, 比较烦躁的时候, 会觉得鼠标不给力, 耳机/音箱不给力, 显示器不给力… 转去考虑如何让这些莫名其妙的需求被满足.
其实, 回头想想, 这些东西不但没有让我感到羞愧, 而且得到了我内心的纵容, 至少在目前这段时间里, 我的思想就是这个样子, 也决定了我如何去做.