近期读了一本书,名字叫做《软件随想录》。这本书的写作风格比较特别,特别之处在于它是由网志整理而成,因此在目录的排版方面不像一般的书籍那么有逻辑,它的目录更像是网志的一种归类。由于是网志,文章相对随意些,不一定会给你标准的答案或特定的结果,而更多的是引导读者去思考,或者给读者提供一个解决问题的思路。
作者比较注重思考,而且有点偏激。他有着独特的思考方式,表达方式比较幽默,有些地方用了夸张的手法,经常用量化的方式进行论证。
一句话,本书值得反复细读,理解并学习体会作者的思想与经验。
软件随想录
程序员部落酋长Joel谈软件
(美)Joel Spolsky 著
阮一峰 译
第一部分 人员管理
那些优秀的程序员是不会出现在招聘市场上的。
通常优秀的程序员在整个职业生涯中,可能会有4次求职。
代码的世界是非常公正的,也是非常严格有序的。许许多多的人选择编程,首要的原因就是,他们宁愿将自己的时间花在一个公平有序的地方,一个严格的能者上庸者下的地方,一个只要你是对的就能赢得任何争论的地方。
一定程度上,让程序员干有趣的活是吸引优秀程序员的最好方法之一。
另一类程序员喜欢干的活是开发一些非常简单或者非常流行的东西。
最后,许多程序员也会关注他们服务的公司的社会价值。
我只是在说,如果你能找到办法让程序员有接触新的语言、框架和技术的经历,那么他们会感到更开心一些。
三种管理方法:
1)军事化管理法
缺点:
人们并不喜欢被这样管,尤其是那些对智商很自负的程序员。
另一个缺点是操作层面的,没有足够的时间用在微观管理上,原因很简单,因为经理的人数不够。在军队中,通常情况是每个人都在做同一件事。在软件开发团队中,每个人干的活都不一样。
在高科技公司中,负责干活的个人总是比“领导者”有更多的信息,所以他们其实是做决策的最佳人选。
尤其要指出的是,软件开发团队中的优秀程序员可以去任何他们想去的地方工作。在这种前提下,如果被人当成士兵一样对待,他们会感到相当扫兴,因此你要是这样做,最后就只能成为“光杆司令”了。
2)经济利益驱动法
这种方法一个重大问题是,它将内部激励变为了外部激励。内部激励是指你内心想将事情做好的天然愿望。外部激励是指来自外界的激励,有人付钱让你干某事就是外部激励。
经济利益驱动法的另一个大问题是,人们有追求局部利益最大化的倾向。他们会想出办法将你支付给他们的报酬尽量最大化,但是实际上却没有达到你真正想要的结果。
内部激励比外部激励强得多。人们会为那些他们真正想做的事格外努力地工作。这一点并没有太大争议。
“经济利益驱动法”的最大问题是,它其实根本不是一种管理,更像是管理的退位,或者说是一种设计精巧的推卸责任的方法,不愿承担责任找到办法将事情做得更好。它是一个信号,表明管理层根本不知道如何引导人们做出更好的工作,所以他们强迫每个雇员在制度框架下自己想办法将事情做好。
3)认同法
这种管理方法的目标是,使得人们认同你希望达到的目标。它实施起来比其他方法难得多,而且还需要一些很不简单的人际沟通的技巧。但是,如果你真地做到了,它的效果就比其他方法好得多。
一般来说,认同法要求你创造一个有凝聚力的、像脱水一样粘在一起的团队,就好像家庭一样。这样一来,人们就会对他们的同事产生忠诚感和义务感。
天底下有多少个经理,就有多少种不同的管理方法。
第二部分 写给未来程序员的建议
经理存在的唯一理由就是把家具的位置摆好,不要挡道,只有这样,真正的天才才能做出优秀的成果。
有一件事我是非常确定的,那就是管理层获得的技术问题的信息是所有人中最少的。
能不能清晰地写出技术内容的文章决定了你是一个口齿不清的程序员还是一个领袖。
我注意到,微软公司中那些真正优秀的程序经理都是具有优秀写作能力的人。
如果你喜欢编程,那么你真是受到了上天的眷顾。你是非常幸运的少数人之一,能够以自己喜欢的事谋生。大多数人没有这么幸运。
一个普通程序员与一个优秀程序员的区别,不在于他们懂得的编程语言谁多谁少,也不在于他们喜欢用Python语言还是喜欢Java语言,而在于他们能否与他人交流思想。
你还可以动手写日记或网志。你写得越多,写作就会变得越容易。写起来越容易,你就会越写越多。这是一个良性循环。
第三部分 设计的作用
苹果公司的用户喜欢苹果的方法,微软公司的用户喜欢微软的方法。这并不完全都是粉丝情节。它反映了一个事实,如果你问人们喜欢什么样的风格和设计,除非这些人受过专门训练,否则他们一般会选择自己最熟悉的品种。在最常见的品味这个问题上,如果你做一个偏好调查,你会发现大多数人根本不知道应该怎么选择,他们只好选一个自己最熟悉的答案。
Dave Winer说过:“创造一个有使用价值的软件,你必须时时刻刻都在奋斗,每一次的修补,每一个功能,每一处小小的改进,你都在奋斗,目的只是为了再多创造一点空间,可以再多吸引一个用户加入。没有捷径可走,你需要一点运气,但是这不取决于你是否幸运。你之所以会有好运气,那是因为你寸土必争。”
你给用户的选择越多,他们就越难选择,就会感到越不开心。
软件实现上的小细节会导致在线社区发展、运作、用户体验上的大差异。
第四部分 管理大型项目
标准当然是很重要的,但是你不能迷信标准,你必须理解由于人会犯错,所以标准有时候会引发误解、困惑,甚至是争议。
DOCTYPE是一个神话。
一个平庸的网页设计师在网页头部加上DOCTYPE说明,然后就声称“这是一个标准HTML网页”。这是盲目自大。
Jon Postel提出了鲁棒性原则(robustness principle):“对于己方的行为要保守,对于他方的行为要宽容”。他想说的意思是,让一个协议健壮地运行的最好方法就是,每个人都要非常非常小心地让自己的行为符合规范,而且同时在与合作伙伴进行信息交换时,又要采取极端宽容的态度。也就是说,只要你能猜出对方的意思是什么就可以了,不可苛求对方的行为一定要符合规范。
回顾整个历史,程序员无时不刻不想做出正确的事情,但是有时候你不得向现实屈服。
第五部分 编程建议
你的目的是最有效率、最物有所值地使用你的时间。但是,如果你不知道每项任务所要花费的时间,你就不可能找出最经济的工作方式。
如果你马马虎虎,没有仔细想过你要做什么,没有在细节上想清楚详细的工作步骤,就在日程规划上为一个大型任务(比如“完成Ajax照片编辑器”)分配了3个星期,那么你其实不知道它究竟要花费多少时间,因为你没有仔细想过你要做什么。
只有真正负责开发的程序员才能估计出完成任务需要哪些步骤。
如果你不搞一个日程规划,程序员就会首先将容易的/有趣的功能做出来。然后,他们剩下的时间就不够了,你别无选择,只好推迟日程来开发有用的或重要的功能。
有效的日程规划是创造优秀软件的钥匙。它强迫你首先完成最重要的功能,让你做出正确的选择,思考要开发一个怎样的软件。这会使你的产品变得更出色,使你的老板感到更高兴,使你的客户感到更满意,以及最重要的一点,那就是使你下午5点能够准时下班。
当开发一个互联网应用程序时,你一定要小心,绝不能信任用户通过表单发送的任何字符串,绝不能直接就拿来使用。
我强烈赞成制定代码书写规范,最起码这会让错误的代码更容易被发现。
第六部分 开办软件公司
人们喜欢一项不断成长的生意,同喜欢园艺是一个道理。这是一种真正的乐趣,将一个小小的种子埋在地里,每天浇水、除草,眼看着一个微小的新芽长成枝繁叶茂、华美耐寒的大株菊花(如果你幸运的话),或者长成大荨麻(如果你不明白这种长得像野草一样的植物有什么用,请不要失去希望,你可以把荨麻用来做茶,只是要小心,别碰到它们)。
我猜想你会读这本书,是因为你也想开一家小型的软件公司。这是一本这方面的好书,但是既然让我在这里说话,我就提供给你我的3点个人意见,你应该先做到这3点:
第一点。如果你说不清楚你的软件解决了什么棘手的问题,就不要去开软件公司。
第二点。不要独自一个人创办公司。我知道很多人单枪匹马创业成功,但是失败的例子更多。
第三点。一开始不要抱太高期望。当产品上市的第一个月,没有人知道未来会赚多少钱。
总结一下,我所认为的创办软件公司的真正乐趣就是,创造一些东西,自己参与整个过程,悉心培育,不间断地劳作,不断地投入,看着它成长,看着自己一步步得到报偿。这是世界上最带劲的旅程,无论如何,我都不想错过它。
让我来告诉你原因,根本的一点就是软件的复制成本为0。这意味着,程序员的劳动力成本分摊在你销售出去的所有软件中。对软件来说,如果销售量很大,质量的改进并不会造成单位软件成本的上升。
本质上,软件质量的改进会创造出新价值,而且价值创造的速度要快于成本提升的速度。
还记得布鲁克斯法则(Brooks'Law)吗?——向一个已经延误的软件项目增加人手,只会使它更加延误——这就是原因。一个优秀的程序员独自完成一项任务,就不需要额外的沟通和协调。如果同样的任务让5个程序员一起完成,他们之间就必须沟通和协调。这会花掉大量时间。开发团队越小,就越能获得额外的收益。人力与工时的互换真的是一个神话。
用许多平庸的程序员取代少数优秀的程序员,这种做法的真正问题在于,不管平庸的程序员工作多长时间,他们做出来的东西都无法像优秀程序员做得那样好。
5个Antonio Salieri也写不出莫扎特的《安魂曲》。永远也写不出,埋头写100年也没用。
第七部分 经营软件公司
暂略
第八部分 发布软件
所以,我有几条软件开发周期的基本规则。
(1)确定发布日期,这个日期可以根据客观情况也可以根据主观愿望进行选择。
(2)列出软件要实现的功能,然后按照优先顺序排序。
(3)每当你落后于预定进程时,就把排在最后的功能砍掉。
如果上面的每一步你都做到了,那么你很快就会发现,那些被你砍掉的功能根本不会让你感到后悔。
怎么来挑选发布日期呢?你可以考虑采用三种方法。
(1)经常发布稍作改进的版本。
(2)每12到18个月发布一次。
(3)每3年到5年发布一次。
如果你的顾客人数较少,那么你最好经常性地发布小幅修改的新版本。
如果你已经有了(或者想要有)大量的付费用户,那么你最好不要太频繁地发布新版本。
第九部分 修订软件
日本丰田公司创始人丰田佐吉(Sakichi Toyoda)的思想,他提出了五个为什么。当某个地方出错的时候,你就问为什么,一遍遍地追问,直到你找到根本性的原因为止。然后,你就针对根本性的原因开始着手解决问题,你要从根本上解决这个问题,而不是只解决一些表面的症状。
如果你想把所有事情都做完,最后只会一事无成。
最后再说两句:
感觉Joel真花了不少时间去做各种研究,用数据和实例做证明,对问题的分析思路比较清晰、系统性。
由于国内外环境毕竟有些不同,有些观点不一定适合国内的情况,但内容仍然值得借鉴与思考。
本文的内容是读完书籍的部分笔记,为避免断章取义,如果大家对本书的内容感兴趣的话,还是建议去读一读。
(转载请注明来源:http://zhanjia.iteye.com/blog/1830739)
相关推荐
本文主要介绍代码随想录的刷题笔记记录,方便读者更好地利用该网站进行学习。 ## 刷题笔记记录的作用 刷题笔记记录是代码随想录提供的一个功能,用于记录用户在刷题过程中的解题思路和方法。它可以帮助用户更好地...
《软件随想录》是一本深入探讨软件开发与管理的经典著作,它涵盖了软件工程的多个重要方面,旨在为读者提供对软件行业的深度洞察。作者通过一系列的随笔和思考,揭示了软件开发过程中的关键问题、挑战以及解决之道。...
《软件随想录》是计算机科学领域的一部经典著作,由知名程序员、软件工程专家、敏捷开发倡导者Martin Fowler所著。这本书集合了他对软件开发的深入思考与实践经验,涵盖了软件设计、项目管理、团队协作等多个方面。...
软件随想录_扫描版_5.79M
根据标题和描述,我们可以假设“软件随想录.pdf”是一本关于软件的个人收集电子书。该描述还提到该电子书只能用于学习目的,并且不能用于商业用途,这提示我们版权和知识产权是软件行业中非常重要的方面。 由于实际...
《软件随想录》是许多程序员和IT从业者都推崇的一本书,它深入探讨了软件开发过程中的各种问题,包括团队协作、项目管理、代码质量、技术债务等关键议题。这本书结合作者的经验,提供了许多实用的建议,旨在帮助...
在计算机教育领域,尤其对于计算机专业的学生,提升个人能力至关重要。Joel Spolsky的建议主要聚焦于两个关键方面:软实力的培养和基础技术的扎实掌握。软实力,特别是良好的沟通能力,对于任何行业的成功都起着决定...
《软件随想录》是一本深受程序员喜爱的书籍,它主要涵盖了程序员的成长历程、编程理念、软件开发实践以及行业洞见等多个方面的内容。这本书通过作者的个人经验分享,旨在帮助读者提升编程技能,理解软件开发的本质,...
《软件随想录》是一本深入探讨软件开发与行业洞见的书籍,它汇集了作者在软件工程领域的诸多思考和经验总结。通过阅读这个压缩包内的文件,我们可以探索到一系列关于软件开发的重要知识点,涵盖了软件设计、编程哲学...
通过阅读《软件随想录》,读者不仅可以获得关于软件开发的实际建议,还能深入了解软件行业的文化和精神。Joel Spolsky的真知灼见为所有与软件相关的人提供了一种全新的思考方式,帮助他们在职业生涯中取得更大的成就...
内容概要:这是关于作者针对自己的代码学习笔记《代码随想录》,进行两年后的全面更新与汇总的一则公告。新的PDF版本整合了所有最新内容,并修复和完善了一系列题目解释。尽管如此,作者仍推荐优先在网站上阅读以...
通过上述内容,我们可以看出《软件随想录》不仅涵盖了软件开发过程中的技术细节,还关注到了团队协作和个人成长等多个维度。这对于希望深入了解软件工程领域的专业人士来说,无疑是一本非常宝贵且全面的指南。
2015-04_P292 软件随想录.pdf 1
代码随想录贪心算法知识,非常管用
《代码随想录》是一本深受程序员喜爱的算法学习书籍,其PDF版本为读者提供了方便的电子阅读体验。这本书主要针对准备参加编程面试或者想要提升自己算法能力的开发者,通过实例解析和实战演练,帮助读者深入理解算法...
《代码随想录》是一本深受程序员喜爱的算法学习书籍,尤其对于初学者来说,它提供了深入浅出的讲解和实战演练。...通过阅读和实践书中的例子,读者将能够更好地应对各种算法挑战,为今后的软件开发工作打下坚实的基础。
通过阅读《代码随想录》的PDF版,你可以随时随地学习这些内容,不受地点限制。然而,要注意版权问题,尊重作者的劳动成果,合法合规地使用电子资源。同时,实践是检验真理的唯一标准,理论学习之余,动手编写代码,...
软件大牛再出新书。相信第一本joel说软件 你也看了 想必收获不少 这本也不能错过