《高效能程序员的修炼》写的是给程序员的一些建议。书中并没有涉及到代码,而是编码之外的一些提高程序员技能的技巧,而这些技巧往往是程序员所缺乏的。作者Jeff Atwood
也是一个大牛,如果你没有听说过他,那么你肯定听说过他创立的一个网站:https://stackoverflow.com。
入门须知
程序员的八种境界:
境界 | 具体描述 | 典型程序员 |
---|---|---|
不朽程序员 | 人已经离开了这个世界,但是他的代码却依然活着 | Dijkstra,Knuth |
成功程序员 | 不仅拥有广泛的知名度,同时还运营着一家不错的公司,甚至控制着整个产业链 | 比尔盖茨,Carmack |
知名程序员 | 其他程序员或多或少听说过你,并且对所在领域有积极影响 | 阮一峰,张鑫旭 |
胜任程序员 | 你的能力使得你在工作中游刃有余,公司因你的加盟而得到了提升 | 你的某个领导! |
普通程序员 | 基本上能够应对一般的编程能力,并且不认为自己能够成为杰出的程序员 | 你们公司那种不错的程序员! |
业余程序员 | 有创意、热衷于编码,往往是一些有前途的学生或实习生 | 就比如我! |
低调程序员 | 服务于某家公司,没有什么成就,写代码仅仅是一份工作 | 你们公司最多的那种程序员 |
烂程序员 | 技能匮乏,所做的东西给同事带来痛苦 | 你们公司因为技术不行被开除的程序员 |
成为一名杰出的程序员其实跟写代码没有太大的关系,做程序员确实需要一些技能,还要有坚韧不拔的精神。除此之外,最重要的还要有良好的沟通技巧。这里说的沟通不仅仅是人与人的沟通还包括纸面沟通,比如写博客等。
写作的过程真的就是一次探索之旅,而且它会贯穿人的一生。
把一堆烂代码搞定的艺术
每一天,你一定要一起床就热情澎湃。否则,你就只是在打工。
金钱对社区是有毒的。
传统的“胡萝卜加大棒”(使驴子前进就在他前面放一个胡萝卜或者用大棒驱赶他)的激励方式仅仅对于那些重复的、机械的任务有效。(言外之意对软件开发是没有效果的,软件开发需要的是内在的激励,要让程序员主动地去投入自己的事业中。正因为如此,作者在创立Stack Overflow的时候并不在乎员工什么时候来上班,或者如何安排工作时间,也不会事无巨细的样样过问,正如你所见的Stack Overflow是成功的)。
如果你想造一艘船,就不要催着工人们去收集木材,分派工作,发号施令。你应该教会他们的是对无边无际大海的渴望。
如果想在某方面有所提高,最好的办法就是勤加练习。但是,如果你只顾着埋头写代码,连讨论、反思或者学习的时间都没有,你将得不到真正的进步。你必须在磨练工艺与思考如何提高工艺之间找到一个适当的平衡点。
沿着那条路下去,一定要快。如果有什么东西挡住了你的去路请绕开它(快速迭代)。
尽量避免多任务做事。
高效编程的原则
永远都是自己的错:程序员最基本的意识就是你写的代码在任何时候出现了问题,那一定是你的错(而往往不是电脑的问题)。
大道至简:如果你热爱编码,而且爱的情真意切,那你就应该惜墨如金。
避免写注释:最好的注释就是代码。
学会阅读源码:不管文档上面怎么说,源代码才是最终的事实,是你所能找到的最好的,最确定的,最新的文档。
向伙伴或互联网求助:即使没有得到你想要的答案,强迫自己去完整地解释自己的问题,常常也会引领你进入新的视野或者为你带来新的发现。
创新以人为本:在软件开发领域,执行意味着专注于构成你的应用程序的微小细节。
你的团队能通过电梯测试吗:60秒之内,清晰地解释他们在做什么,以及为什么人们会在意他们正在做的事情。
性能致胜:网站载入和显示的速度越慢,使用他的人就会越少(要么很快,要么已经死去)。
招聘程序员须得其法
怎样招聘程序员:
- 首先要求通过几个简单的“Hello World”在线测试。
- 提出要看看他们的文件夹。
- 只雇认同公司文化的人。
- 进行一个周祥的结构化电话面试。
- 给他们一个“视镜”项目。
- 找个房间面谈,并最后定夺。
- 上面没有哪条保证完全奏效的。
面试官应尽最大努力去避免的2大错误:
- 不要让候选人主导面试过程。
- 小心只会一招的“小马驹”。
软件开发者最擅长的就是学习。
工作经验年数与编程技能之间是没有必要联系的。
促使团队紧密协作
团队的问题往往都是人的问题。
如果你想提高团队的工程水平,你需要一个领导,而不是靠一个训导员去强制执行。
最有效的一种技术领导就是以身作则。
要有结对编程或者代码评审。
我们应该以怀疑的态度去看待会议,把它当成是一种降低工作效率的风险。
如何开好会议:
- 会议绝对不应该超过一个小时,否则应判以死刑。
- 每个会议都应该有一个清晰的目标。
- 在开会之前预先做好功课。
- 把会议变成可选的。
- 在会议结束时概括一下待办事项。
如何对待“换苹果”(一个坏苹果放在一筐好苹果中,那么很快这框苹果都会坏掉):
- 你不必和团队中的每个人都成为朋友(不要充当老好人)。
- 如果你的团队主管或者经理没有处理项目中的“坏苹果”,那他就是玩忽职守。
- 把某个人从团队中调走是很痛苦的,但是当你意识到你本应该在6个月前就把某人调走时,此时你已经更加痛苦了(没有必要留情面)。
远程开发需要遵循的原则:
- 远程团队最小2个人,需要找到伙伴(废话)。
- 只有非常热爱编程的资深程序员才可以申请远程开发的职位(主观能动性要强)。
- 为了保证效率,远程团队需要完全自治,并且还需要一个有强烈远景和执行力的领导者。
程序员的高效工作场所
可以提高效率的基础设施:
- 每个程序员都应该有两台显示屏。
- 每个程序员都应该有一台快速的电脑。
- 每个程序员都应该自己选择鼠标和键盘。
- 每个程序员都应该有一把舒适的椅子。
- 每个程序员都应该能快速接入互联网。
- 每个程序员都应该有安静的工作环境。
对于公司来说这几个基本权利很容易做到,这些要求并不过分。一个公司愿意付给一个开发人员6W~10W美元的薪水(在美国),却用糟糕的工作条件以及破烂的硬件设施摧残他,这令我难以置信(作者说的,不是我说的,虽然我也很认同,哈哈)。
购买一张优质的桌子和一把优质的椅子会是你作为一名软件开发者所能做的最好的投资之一了。
程序员标准坐姿:
- 显示器的顶端应该与眼睛平齐。
- 桌子的表面应该和肚脐基本持平。
- 脚应该在地板上平放,并且膝关节呈90°。
- 当你打字的时候,手腕应该和前臂成一条直线,不要上弯或者下弯,也不要侧弯。
拥有更多的显示空间确实会让你的工作更有效率。
购买优质座椅的必要性:
- 座椅是编程体验中一个主要的组成部分。
- 廉价的座椅很糟糕。
- 座椅是耐用品。
理想情况下你的显示屏不应该比灯光下的书本更亮。
设计时要把用户放在心上
令人赏心悦目的产品和让人勉强容忍的产品之间的差别,就在于他们的细节有没有被做好(细节决定成败)。
用户界面就代表了你的软件(前端的重要性)。
用户界面须优先设计。
在你草拟用户界面的时候,你必须置身于技术开发环境之外(不要被技术所束缚)。
你应该努力不扯上下分页这玩意儿,因为你应该让用户在几个条目中就能找到他们所需要的东西,这高于一切。
用户只会读取屏幕上足以让他们完成任务的、最少量的文字。
你的团队对用户反馈的响应速度会为你的软件定下基调。
即使第一版做的很差劲,也要坚持把它发布出去。
安全基础:保护用户数据
尽量使用HTTPS协议,因为:
- HTTPS不再是奢侈品了。
- HTTPS意味着没有人能够在互联网上监视你。
- HTTPS现在变得更快了。
限制每个用户的登录尝试次数是安全领域的101(101空降师是美国陆军的一只空中突击部队,在诺曼底登陆战役中闻名)。
安全的哈希算法应该能防止篡改,同时应该运行缓慢(减速暴力逆向破解的速度)。
加强代码测试,别让他太差劲
软件开发人员应该与客户患难与共。
同级之间的代码评审是你为提高代码质量所能做的最大的贡献。
如果不找来真正的用户做可用性测试的话,你是无法知道你的程序能否正常工作的。
创建并管理社区,同时从中收益
社区反馈的经验与教训:
- 90%的社区反馈都是垃圾。
- 别抵挡不住诱惑而误入歧途。
- 坦诚说出你不想做的事。
- 倾听社区的声音,但别被它们牵着鼻子走。
- 参与并支持你的社区。
游戏化的好处:
- 学习(应该)是有趣的。
- 游戏是学习的助手。
- 游戏促使人们齐心协力。
揭露营销伎俩,以及如何避免
常见的9中营销伎俩:
- 用不恰当的比较来误导。
- 利用消费惯性(如把黑珍珠与珠宝翡翠放一起来抬高黑珍珠的价格)。
- “免费”的诱惑。
- 假借社会行为准则(如利用社区或公益事业)。
- 故意允许拖延(如分期)。
- 利用禀赋效应。
- 利用人的“损失厌恶”。
- 制造不合理的期望。
- 利用对价的偏见。
游戏表面上看是免费的,但实际上他们要靠一小撮玩家通过花钱购买额外的东西来支撑(免费增值模式)。因此,玩家群体必须非常大,才足以维持这种游戏的业务模式。也因此,游戏的运营商通过会在互联网的广告空间里推广他们的游戏。(某迅游戏把这种营销方式发挥到淋漓精致)
低价是一种营销推动力,它可以成倍的补偿价格降低的部分。
轻重缓急,了然于心
幸福的方法:
- 把钱花在经历上,而不要花在物质上。
- 助人为乐。
- 很多次小的、愉快的购买实际上比一次巨额的购买更能有效地给你带来幸福。
- 少买保险(保险条款很容易不生效或者返利政策会让人不安)。
- 为将来买单。
- 三思而后行。
- 小心比较购物的陷阱。
- 随大流。
来也匆匆,去也匆匆(不是冲冲),到头来两手空空。
最后用文章最后抛出的一个问题,结束本章的内容:
对于程序员来说,最难的是要搞明白你夜以继日地拼命工作到底是为了什么?