《高效能程序员的修炼》读书笔记

《高效能程序员的修炼 》 EffectiveProgramming More Than Writing Code

2013年  作者: Jeff Atwood  问答网站stack overflow创始人

软件开发远不只是写代码那么简单------

 

软件开发过程中的人文因素。

做个全面发展的程序员,全面一精。抬头看路,低头做事。

第一章 你想成为一个程序员

1、生命中最困难的,是想清楚你真正想要做的事情,而不是学上一堆假设将来会有用的东西。

2、如果你想成为一个程序员,你只需追随你快乐的感觉,并且爱上代码。不要为了学编程而学编程。(编程可以是兴趣、或者解决问题(例如成为程序员是想改变我所玩电脑游戏的规则)、或者问题引领着自己去学编程)

3、程序员的八种境界:

     面试问题引出,“你对自己未来5年的职业规划是怎样的?”

     作为一个程序员,最完美的职业生涯应该是什么样的?

(不朽、成功(比尔盖茨)、知名、胜任、普通、业余、低调、烂程序员)。

4、杰出的程序员关键要把想法表达清楚,清晰的注释和技术文档。

5、每个人都应该大量的写作,不管是撰写博客、写书、回复问题、写电子邮件,这种书面沟通有助于理清我们的思路。动手吧,开始写起来。

6、当然只会写代码还不够,如果想从优秀发展到卓越,你必须培养起有效沟通的能力:与你的同事沟通,与你的老板沟通,与用户沟通,最终于全世界沟通。

第二章 把一堆烂事搞定的艺术

1、学海无边!每一天,你一定要一起床就热情澎湃。否则,你就只是在打工。

2、让兴趣自由地引领我们去任何地方。(没有人是为了挣钱才来参与Stack OverFlow的,初衷是想做一些很酷的东西来让互联网变得更好。)

3、作为一名软件开发人员,你该如何磨快你的锯子(编程以外的活动)?

4、不要只顾着埋头写代码,要讨论、反思和学习。可以阅读优秀的编程博客,例如:HackerNews

5、痴迷是通向成功的一个最明显的风向标。

6、只要有可能,请远离干扰,并且避免同时做多个项目。程序员在切换认为时,必然会在时间、质量以及深度思考能力各方面都受到损害。

第三章 高效编程之原则

1、第一条法则:永远都是你的错

在怨天尤人之前,我们应该先自我反省、努力把自身的问题解决了。

2、大道至简:你永远都有简化的空间

  • 作为一个软件开发者,你就是自己最大的敌人。你越早认识到这点,你的境况就会越好。
  • 编码的本质——作为程序员,我们的任务是要意识到,我们所做的每个决定都是一个折中。
  • 代码评价的维度(代码简洁度、功能的完整度、执行速度、编码所花费的时间、健壮性、灵活性),从简洁开始,然后依据测试的结果按需要提升其他的维度。
  • 最好的代码就是完全没有代码(所谓“大道至简”)。如果你热爱编程——并且爱得情真意切——那你就应该惜墨如金。

3、避免写注释

  • 代码其实已经告诉我程序是怎样工作的了,我需要注释告诉我的是:程序为什么这样工作。你应该总是专注于编写代码,而忘了还有注释这种东西的存在。这会迫使你竭尽全力使用最简单、最直白、最能进行自我说明的方式把代码写出来。(不断重写、重构,直至百般无奈才加注释)
  • 初级开发者依靠注释来讲故事,而实际上他们应该依靠代码本身。如果你觉得你的代码在没有注释的情况下显得过于复杂,很难被人理解,那只能说明你的代码写的太糟糕了。重写你的代码吧,直到它不需要任何注释。如果经过努力,你仍觉得注释是必要的,那你就务必加上注释。

4、学会读源代码(源代码示例源程序)

  • Git clone一条命令,能把远程的源代码复制到本机。Git(分布式版本控制系统)是一个在开源社区里广泛应用的源代码管理工具,github网站给用户提供git服务
  • 我们需要接触到源代码,我们必须阅读别人的代码,因为只有理解了那些代码后,我们才能把自己的事情做好。

5、你的团队能通过电梯测试吗?

  • 团队里的每个人都应该通过有陌生人主持的“电梯测试”:在60秒之内,清晰的解释他们在做什么,以及为什么人们会在意他们正在做的事。
  • 软件开发者认为他们的工作就是编写代码。其实不然,应该是解决客户的问题,要有全局的观点。

项目远景模型可以有助于电梯测试即:

为了(目标客户)

他们(关于需求或者机会的说明)

这个(产品名称)是(产品类型)

它的(关键优势、吸引人的购买理由)

不像(主要竞争对手的替代产品)

我们的产品(主要的差异化的特性说明)

  • 创建一个项目远景声明可以帮助团队持续专注于产品的关键方面,哪怕细节一直在快速变化也不怕;否则,团队很容易就会被短期(2-4周)开发迭代中的问题缠住,从而失去对整个项目远景的控制。
  • 即使在一个提供信息技术服务的组织里,每个项目都应当做是一个创造“产品”的过程。面向产品的思维方式能带来丰厚的回报。
  • 重要3点:用简单可行的方法来解释我们的产品是什么;把潜在客户愿意购买这个产品的原因解释的一清二楚;与货架上所以其他的产品相比具有独一无二的辨识度。

6、性能致胜

你的网站越快,就会有越多的人来用它。对于速度的需求,3点建议

  • 虔诚地遵循雅虎的指导原则    雅虎网站的加速优化实践    记住,80%~90%的终端用户响应时间都花在下载页面的所有组件上:图片、样式表、脚本、动画。     CDN(内容分发网络)
  • 善待匿名用户和注册用户(并且为他们进行优化)   无论你是否登陆,网站的内容永远是可见的。
  • 使性能成为一种(公开的)骄傲。对于网站的性能,有一个基本的宇宙法则是无法被绕过的:你永远不可能在服务器完成渲染之前发出一个网页。作为一名开发者,你要始终把每个页面的性能指标放在你的正前方。在开放的互联网世界里竞争,最后只会剩下两种网站:要么很快,要么已经死去。

第四章 招聘程序员须得其法

1、为什么程序员不会编程

(立足基本,动手编程)

2、怎样招聘程序员

(1、在什么情况下你会使用哈希表而不用数组?

用数组时发现有太多下标没用到的时候,比方说要求你写一个函数,根据输入的日期,输出那天的节日名称。

你就要考虑怎样存储一年中各节日的日期信息了,最简单的可以用char *DayName[365];

但一年中多数是非节日的平常日,这个数组中其中真正有用的元素只占少数,此时就可以……

2、“为什么程序员开玩笑说10月31号跟12月25号是同一天?”

译者注:10月31号用英语表示为Oct. 31,是万圣节(也叫“鬼节”);12月25号用英语表示为Dec. 25,是圣诞节。Oct.本来是October(10月)的意思,

而程序员可以把它解释成Octal(八进制);Dec.本来是December(12月)的意思,而程序员可以把它解释成为Decimal(十进制)。

于是,八进制的31等于3 x 8 + 1,结果等于十进制的25,也就是Oct. 31 = Dec. 25。)

3、如何做好面试刷选

   面试软件开发工程师时需要问的5个基本问题,它不能保证你会找到最棒的人,但能阻止相当一部分的人蒙混过关。

  • 编程。写一段简单的代码
  • 面向对象的设计。OO的概念---
  • 脚本编程和正则表达式。Eg,描述一下如何在50000个HTML网页里把电话号码都找出来。
  • 数据结构。 常用的数据结构的基本了解
  • 位与字节。位 字节 二进制数字

4、工作经验年数之神话

寻找并雇佣聪明、富有热情、有干劲、自学能力强的工程师。有些公司都痴

迷于雇佣经验和技术完全匹配的人,结果造成很多才华横溢的软件工程师都被拒之门外。他们似乎已经忘了,软件开发者最擅长的就是学习。工作经验年数与编程技能之间是没有必然联系的。

第五章 促使团队紧密协作

1、如何避免被自己的团队“枪杀”的一个总结:

  • 保持谦虚;(宣布你的发现之前,请确保你的观察结果是正确的)
  • 提出建设性的批评时要小心;(最好非正式的建议或巧妙引导)
  • 要想赢得信誉和尊敬,最好的办法就是努力工作并且取得实实在在的成绩;
  • 百说不如一干;
  • 没有一个通用的建议可以适合于所有的情况。
  • 最有效的一种领导技术就是以身作则。。

2、结对编程与代码评审

结对编程:让两个开发者在同一台机器上工作。一个负责编写代码,一个负责阅读、核对,每隔一定时间交换角色。(代码被很快地完成,而且不需要返工。当代码确实需要改动的时候,则有不止一个人熟悉代码)

3、会议是浪费工作时间的最佳去处

为什么要开会,就我而言,我采用以下几个原则,以确保我的会议是真正有用的:

  • 会议绝不应该超过一个小时,否则应该判以死刑;
  • 每个会议都应该有一个清晰的目标声明;(开会要达到声明目标?)
  • 开会之前预先做好功课;
  • 把会议变成可选的;
  • 在会议结束时概括一下待办事项。

努力使我们必须要开的为数不多的会议开得更有效率。让我们快速干活,少说废话,抓住工作的重点。

4、处理坏苹果

  • 一个有问题的团队成员,也就是一个典型的“坏苹果”—团队的毒药。
  • 你不必和团队中的每个人都成为好朋友。
  • 如果你的团队主管或者经理没有处理项目中的“坏苹果”,那他就是玩忽职守。
  • 团队的绩效可以从团队里最差的那位成员身上准确地预测出来。

5、关于远程办公

  • 编程的世界是真正全球化的!
  • 远程开发代表着未来

第六章 蝙蝠洞:程序员的高效工作场所

1、程序员的《权利法案》

“程序员应有的权利你都要去争取!而且记住:你可以让公司做出改变,要不然就换一家公司。”(在我大中华也可以这么屌么O(∩_∩)O~)

      基础条件

  • 每个程序员都应该有两台显示器
  • 每个程序员都应该有一台快速的电脑(向高配置看齐吧~)
  • 每个程序员都应该自己选择鼠标和键盘
  • 每个程序员都应该有一把舒适的椅子
  • 每个程序员都应该能快速接入互联网。任何东西只要能“偷”来,好的程序员是从来不会自己写的。互联网是有史以来“偷”东西的最佳去处。
  • 每个程序员都应该有安静的工作环境

2、电脑工作站的人体工程学

我醒着的每一刻几乎都是在电脑前度过的。我就是那种所谓的“技术宅男”。

购买一张优质的桌子和一把优质的椅子会是你作为一名软件开发者所能做的最好投资之一,它们对你每一天工作的快乐度有着最直接的影响。

 

 

 

 

第七章 设计时要把用户放在心上

1、做好细节

程序是所有微笑细节的集合。

2、用户界面代表了软件。—重要性

(如果你的系统有一个糟糕的界面,你基本上一无所有了。哪怕系统内部使用了最高深的技术,那也于事无补。)

用户界面须优先设计。写代码前,就要想清楚这个程序的用户界面看起来是什么样子的。

纸上画原型设计时一种永远不会过时的方法。

3、分页显示该休矣

一旦你有几千条信息,你要解决的不是分页问题,而是搜索和过滤的问题。

我们应该避免没头没脑地生成一个包含有成千上万个条目的列表,然后用“一刀切”的方法把他们分页显示出来。这样就是把所有负担扔给了用户。这是不合理的。记住!我们发明计算机是为了让人们的生活变得更轻松,而不是更难。

总之,你应该努力不扯上分页这玩意,因为你应该让用户在几个条目中就能找到他们需要的东西。这是高于一切的!

第八章 安全基础:保护用户数据

1、所有网络通信都应该加密码

  • 连接免费、开放的wifi访问各种网站时,他们很有可能截取你用以标识身份的cookie。
  • 使用加密的https网络通信。
  • Https意味着没人能在互联网上监视你。
  • Https不可避免的会比普通http要慢一点。

2、防范字典式攻击

  •  限制每个用户的登陆尝试次数是安全领域的101.

3、每个网站都采用不同的强类型密码,采用相同的密码很容易被盯上。

第九章 加强代码测试,别让它太差劲

1、与客户患难与共

  • 把开发人员带到客户的“战壕”里去是至关重要的,因为开发人员交付代码之后,客户才是真正与代码休戚与共的人。代码是开发人员写的,但他们并不会像他们的客户那样经常性的去使用。如果你对你的用户和客户缺乏最基本的认识,那你也不可能做出贴心的软件来。

2、结交“混世魔猴”(捣蛋的东东)

  • 每件事发生的背后总是有原因的,要想避免失败,最好的办法就是不断的失败。

3、代码评审:说做就做

  •    同级之间的代码评审是你为提高代码质量所能做的最大的贡献。
  • (Peer Review同级评审—软件交付给原作者以外的其他人帮忙检查缺陷、促进提升的一种活动。Karl书籍《软件同级评审》)
  •   就我个人而言,在找到一位同事帮我检查完代码之前,我是不会认为我已经完成了编码的。数据证明,代码评审是很有功效的。。

4、加大测试力度

  •    如果你觉得用1~2个测试用例就够了,你倒是轻松了,实际上你也离失败不远了。

5、我同情那些不写单元测试的傻瓜

   大家对单元测试(模块测试)的普遍接受,已经成为软件开发领域在过去5~7年里最大的进步之一。

 

 

         12. 它比不写单元测试而直接写代码的效率更高

6、低保真的可用性测试

  •  你怎么知道你的应用程序能够正常工作?
  • 即使通过了编译,通过了所有的单元测试,成功部署到了一个正式的服务器或打包成了一个安装程序,连最终集成测试都通过,这些都不能保证你的程序可以正常工作。
  • 只有找真正的用户来做可用性测试,才能知道。

7、比程序崩溃更糟糕的是什么


 

软件测试方法参考

第十章 创建并管理社区,同时从中受益

1、倾听社区的声音,但别被他们牵着鼻子走

2、别盲目听从你的用户

第十一章 揭露营销伎俩,以及如何规避

1、网络广告该休矣

2、软件定价,我们深谙其道吗

  •  这么多优秀的iphone应用程序,要么是免费,要么只卖区区几块钱。
  • 我非常赞同这样的观点:“软件定价就应该足够低,低到大部分用户看到价格的第一反应是‘为什么不买呢’的水平”。
  • 低价是一种销售推动力,它可以成倍地补偿价格降低的部分。(低价,销量多,总的销售收入多)

第十二章 轻重缓急,了然于心

1、程序员,你幸福吗

“------最难的是,要搞明白你没日没夜地拼命工作到底是为了什么。”

什么是幸福的真谛呢?总结出8点

1.经历胜过物质

东西会变旧、会变得平淡无奇,它还会磨损,很难拿来分享。但是经历是独特的,经历永远都可以拿出来与人分享,而且常常还会历久弥新。只要有可能的话,把钱花在经历上(比如带全家去迪士尼乐园玩),而不要花在物质上(比如买一台新电视机)。

2.助人为乐

人类本质上是社会性的动物。想一想,你能通过何种方式、只需花费自己一部分的钱就能帮到别人?勿以善小而不为。

3.让幸福细水长流

人是最能适应变化的。因此,最有效的花钱方式是经常买来一些小变化,而不是花大钱一下子买来一个大惊喜,然后坐等着新鲜劲很快过去。如果可能的话,把一个大的购买计划拆分成多个小的,一点一点慢慢买进来,更好地享受整个过程。就拿幸福来说吧,频率比强度更重要。大家需要改变一下观念,记住:很多次小的、愉快的购买实际上比一次巨额的购买更能有效地给你带来幸福。

4.少买保险

额外的担保或保险是在利用我们“损失厌恶”的天性,利用我们的一时冲动。因为人们的适应能力很强,当购买的东西出现故障时,其实他们并不会像原先想象的那样懊恼不已。

而且,因为人们放弃了享受完整承诺带来的情感利益,保险条款容易不生效或者慷慨的返还政策反而会引起更多的焦虑和不快。因此,避免购买保险,千万别贪图慷慨的返还政策。

5.为将来埋单

即刻的喜悦可能会使你冲动买下你承受不起的东西,或者不是你真正想要的东西。冲动购买使你丧失了必要的思考空间,让你难以做出合理的决定。

6.三思而后行

在进行一次重要的采购之前,考虑一下售后服务,同时也想想一旦拥有这样东西之后你到底哪些时间会用在它上面。试着设想将来典型的一天,一小时一小时地细细审视:这东西会如何影响你的生活?

7.小心比较购物的陷阱

“比较购物”转移了我们的注意力,使我们过多地关注在这个商品区别于其他商品的一些无足轻重的特性上,而忽略了去评估我们真正有多喜欢这个东西。换句话说,花2美元买到一块便宜巧克力(不错的买卖),跟这块巧克力好不好吃其实没什么关系。不要为了比较而比较,谨防掉入比较购物的陷阱。

试着去考量那些真正能给你带来快乐或提升体验的指标。

8.随大流

不要高估你的能力,别以为你能独立预测你会有多喜欢某样东西。从科学的角度来讲,我们在这方面极其不擅长!但如果某样东西可靠地给其他很多人带来了幸福,那它很可能也会给你带来幸福。在你做出购买决定之前,请认真考量一下别人的看法和用户评论。

赚钱不容易。跟钱财相比,幸福更是来之不易!因此,当你花钱的时候,请记住上面的8点,这样才能使你买到的幸福最大化。请记住:这是科学

附录 程序员必读之书

《代码大全》Steve McConnell    

《人月神话》Frederick P.Brooks Jr (计算机也许会变,但人不会变)

《点石成金》Steve Krug

《快速软件开发》Steve McConnell (讲失败的现实)

《Peopleware人件》Tom DeMarco (团队领导需要好好读此书)

《设计心理学》Donald A.Norman (魔鬼藏在细节之中)

《程序员修炼之道:从小工到专家》Andrew Hunt     

《精通正则表达式》Jerrrey E.F. Friedl

另外参考:StackOverFlow程序员推荐:每个程序员都应该读的30本书

 

posted @ 2015-11-08 22:04  peterYong  阅读(957)  评论(0编辑  收藏  举报