2019年/11月/23日

首页回退

观止

软件不仅是智慧的结晶,也是信仰、尊严和魅力的代名词。
好的技术不一定都能换成钱。不能换成钱的技术,不是成为别人去买的技术,就是成为历史。
在行业外的人看来,编写软件的人,特别是所谓的高手,大多有些古怪之处。
开发软件不是一件简单的事,分析需求、定义功能、设计架构、编写代码、测试集成……每个环节都不容易做。
但难度最大的,最难以控制进度的,其难度又经常被低估的,即时定位和去除臭虫,也就是所谓的软件调试。
把打造NT的过程比喻成一场“戏”;一场虽没有刀光剑影,但也绝对堪称紧张激烈的戏;
异常发生在高科技领域,但也处处彰显人性光芒的戏;
一场有欢乐,也有悲伤的戏;一场让人拍手叫绝的戏……
小的失误积累起来一定会拖延进度,而开发团队的负责人要努力推动项目前进。
软件将个人电脑变成了一个精密的思考工具,帮助个人或组织控制最有价值的资产:信息。
编写优秀的代码逐渐成为了大团队的工作。然而这样的团队经常沦为平庸,因为单就其大小就足以滋生官僚主义和缺乏创新。
每个大的团队都将面临这样的挑战:在组织好那些才华横溢的成员的同时,又要鼓励领导能力和灵活性。
工作就是他们的全部。朋友退居幕后;婚姻紧张甚至破裂;孩子们被忽视,或者推迟生孩子的计划;业余爱好也没有了。
计算机代码意味着一切。如果还能照顾到什么个人的梦想,那也只是为了减轻创造软件的痛苦。
伟大的成就在阴冷的背景下出现。把懒散、困惑、没有竞争力视为敌人。
我们只有一件事情需要关心——交付这个产品,并且尽己所能做到最好。
每一个有价值的创造都交织着爱和狂热。
cutler对自己的前途很有把握,在他体内的某个地方生长着被傲慢包裹着的信心和一种信念,他相信他无论干什么都能成为最棒的。
编程“是最奇怪的事情,因为你过去习惯了做一些事情,而且你觉得你做的是对的”,cutler说:“但实际上错了。
你只是没有注意到它是不对的。电脑对差不多正确是没有一点宽慰和原谅的,差不多就意味着你还是错的。”
最大的前进障碍会来自程序员自己。就像转变到一种新的宗教信仰一样,他们经常表现出思想保守,掩盖了他们的狂热。“程序员是非常古怪的一个群体!”
cutler是一流的程序员。他全身心地投入,沉迷其中,争强好斗。他有非常坚强的意志和信心。他投入非常大的精力来注意细节。
而且,他在设计和编写代码时不断地追求更好。cutler会从自己的成功中学习。下一次,他会做的更好。so,每一次他都上升到一个新的高度。
cutler喜欢奚落他的伙计们,但是为了改善他们的代码质量,他会不遗余力。他要求他的团队要绝对诚实。“当你做过头或犯错误时,他会立刻批评你”
平庸是留给弱者的,要成就伟大就要有意愿去打破荒谬或者突破传统(而且不管什么后果)。
“首先,质量是每个人都必须坚信的东西,”cutler写道,“这意味着要管理到所有层面,从上面到最下面的工人。
不给那些总是顺着市场部门的方向倒的无能经理们留一点空间。也不给工程师们留空间去通过降低质量伪装做了更多的工作。
要站起来对质量问题说不,有时需要勇气,不过我项目里的所有人都拿到了这样的许可。如果某个地方的某个笨蛋想要发布没有准备好的软件,那我们会告诉他滚蛋!”
“运行你的程序是一个绝对的考验,”盖茨说:“你写一个程序,运行它,测试它是否能工作。”
盖茨,他会经常坐在他的房间里设想他的未来,“像哲学家似的,一个抑郁的家伙,总在琢磨我应该怎样对待我的人生。”
盖茨,“如果可能,你朝我大脑里面看看,它其实充满着关于技术的想法。”
盖茨的检验标准是不固定的:他掌握了在对的时间改变风向的窍门。这个世界上,人们往往之抱住一个坚定信念不放,但盖茨不会墨守成规。
然而,他也会情绪化和感到焦虑,有时候甚至是个妄想狂。他会想象失败的下场,也幻想他被敌人包围的场景。这些想法使盖茨“害怕地奔跑”,不过他认为这是有力的条件。
“自满是毁灭之路,”他说,“你必须要一直想谁将取代你。”
对于管理,盖茨有一个简单的方法:让你周围都是极富智慧的人。“聪明人,”他说,“是掌握充分事实后,能推算出所有可能性的那种人。”
软件业优秀的两大传统精神:自视清高,超然出世,厌恶商业伎俩;却又是实用主义者,坚持“想就去做”的观点,同时也是很聪明的自学型人才。
“好设计不可能出自委员会(“委员会设计”指很多人同时进行设计,却没有统一的看法)”
技术争论既是实验室里的福音,又是祸根。工程和发明总是用不同的方法得到同样的结果。关于技术的恳切争吵在所有的技术公司都很常见。
有人这样说不死队的风格:“他们把自己想象成为男巫,而不是科学家。男巫意味着阴暗和神秘。
他们不把世俗的成功象征当回事——金钱、地位、女人对他们来说不值一提。这些家伙是那种坐在计算机科学实验室最后一排的人,他们的成绩很糟糕,但也许是故意的。
他们通常并不广博,但是在某一方面很出色。而且他们不喜欢解释自己。”
一种偏见的观念:测试员们乐于作弄程序,让其看起来很糟糕。测试员们不同意这种说法,他们觉得他们不会故意让任何人难堪,
但是事实上这是真的,正如一个测试员所说的:“我们的目标就是把一个程序搞死——要使其产生个灾难性的问题。”
如果编写代码的人把自己看成高明的手工艺人,那么测试员把自己看做是劫匪,四处寻找代码中的弱点,然后残忍的利用它们为自己添光加彩。
最有力的测试技术并不复杂:向程序施加压力直到它完蛋。

“我们主要雇佣那些必须限制他们工作的人,而不是催促他们工作的人。”一个老员工说。
盖茨有一种理念,只有扎实的程序员才能当经理,所有程序员的经理们都应该坚持写代码。
很多软件公司的通病是他们的经理成了手下程序员的俘虏,而微软的做法对这个问题是很好的解药。
更多的控制并不是办法。“看起来稍加管理还是必要的,”皮亚佐利说,“然而你永远无法做到只管一点点,你总是管得太多。
而没有足够的管理则是个非常不稳定的状态。然而想要成功你一定要管理到位。”
每个开发组有一两个资深程序员,称为架构师,他们负责设计重大的程序模块。这样做的思路是越少的人参与模块设计,整体的一致性就越好。作为设计的蓝图,
架构师的规格说明会交给一个或几个程序员进行开发。这里留有一定的灵活性:架构师有时候会亲自修改程序缺陷;开发人员偶尔也会去做设计。

“吃自己的狗粮”——使用自己开发的产品。程序员将有紧迫感去提高伙食水平,尽快修复错误的代码,从开始就编写更加耐用的程序。
对于复杂的程序来说,越早进行集成,越能尽早发现某些类型的程序缺陷。
作为原则性的问题,他希望构建尽快更新。构建来的越快,测试人员就能越早地开始对其进行测试,程序员就能越早的开始精炼代码。
因为真正评价代码的唯一方法就是运行那些代码。
cutler认为检入的代码质量是衡量一个程序员最真实的标准。他最生气的是有程序员在将代码提交给构建实验室之前不做测试。
管理集体创作的软件非常困难。最理想的软件团队是由一个人组成的。“从一个人能掌控的程序到由四个五个或七个人完成的程序,它们之间存在一个巨大的跳跃。
”霍恩想,“然后飞跃至一百个程序员编写的程序,这几乎是不可理解的。”
“系统太复杂,大多数的程序缺陷的代价远远超过单单程序员的宝贵时间,如果你不把它(程序缺陷)带进来,就不用费力去找它们,以及把它们清除掉了!”
编写软件是很耗时间的。很多工程师都低估了编程的难度,直到多年后他们才开始把它看作是最复杂的人类活动之一。
优秀的程序员善于抽象和通过符号来观察问题。
只看代码行数根本不能说明代码的质量。好的程序员抓住问题就绝不放松,一直向前推进寻找答案,即使干扰了其他快乐。
不论他们的经验多少和竞争热情如何,他们都认可发现新奇事物的能力,他们倾向于把自己看做是艺术家而不是工匠。

“在疲倦的状态下工作不会有很高的效率。”有些人浪费时间或者不能很好地安排他们的时间。
与一般的工程师一样,程序员们很容易被有趣但不相关的难题吸引而转移目标,脱离正规。
cutler的观点是:“总是要先把事情做对,让其可靠,然后再顾及性能。一边向前走一边逐渐加入修饰和润色,这是我所喜欢的做法。
”尽管这些话听起来有道理,但是cutler的原则回避了最关键的的时间问题。

在观念和风格方面的冲突会慢慢激发成为创新的源泉。因为程序员做设计时主要依赖逻辑和数学,所以他们在做技术决策时常常小看了人性的作用。
使用一成不变的方法做出创造性的发明只是幻想。总是有很多种方法来达到大体相同的技术目标。
技术方向的选择经常是与人相关的。尽管商业方面的考虑会影响技术决策,但是技术决策仍反映了人的价值观念和心理状态。
臭虫是不可避免的,它们出自人类的疏忽。要完全避免臭虫,“人必须做到完美无缺”,但事实上没有人能做到。在《编程的苦恼》(woes of the craft)一文中,计算机科学家弗雷德里克。布
鲁克斯曾经写道:“如果这种咒语的一个字符,一个停顿没有符合规定的格式,那么这个戏法也不灵了。
人类是不习惯于保持完美的,而且在人类活动的领域中很少有哪个需要这样。
我认为适应这种达到完美的要求是学习编程时最困难的部分。”