Category Archives: 程序人生

程序员必读的十篇文章

作为一个Java程序员和软件开发者,我从许多『关于某某每个程序员必知』这类文章中学到了很多东西,它们会就一个特定的话题给出很多有用有深度而且难以被发现的信息。我在求知的过程中遇到过一些很有用的文章,并将它们存为书签用于日后参考和重复阅读。

个人认为所有程序员都能从中受益,这也是我写这篇文章和跟大家分享所有这些文章的原因。这些都是从我个人书签里挑出来的。你将在本文中看到每个程序员都应该知道的经典话题,诸如内存、Unicode、浮点运算、网络、面对对象设计、时间、URL编码、字符串等等。因为初学者和新手的实际经验匮乏,所以本清单对他们来说非常重要。由于大部分文章其实是从实践中来的,所以初学者和中间件编程者可以从中获得很多知识。同时在职业生涯早期获得基础知识也有助于避免犯错,这些错误其他程序员和软件开发者在他们学习过程中都已经解决过了。

尽管仅仅通过一次阅读并没那么容易就汲取这些文章中给出的知识。你可能并不能理解浮点数的一些细节,或者被内存那些微妙的细节搞得头很大,但是手头留有这些文章列表并时不时联系上下文用作参考还是非常重要的。所以祝你们好运并希望你们可以享受阅读的乐趣。同时,请记得分享其他不在这个列表中的《关于某某,每个程序员必知》的文章。

关于内存,每个程序员必知

这是一篇很经典的文章,它展示了关于内存的方方面面,老的、新的、已知的、未知的。尽管内存问题相当普遍无处不在,也并不是每个程序员都足够了解它。如果你正在写高性能应用,关于现代系统中内存的知识尤显重要。硬件设计者会遇到更多复杂的内存处理和加速技术,比如CPU缓存,但是这些在没有程序员帮助的情况下并不能得到最优性能。我还在阅读这篇文章,我也无法告诉你从中我学到了多少关于诸如RAM、CPU缓存之类的知识。L1缓存和L2缓存、不同类型的内存、DMA、内存控制器涉及和通用内存。简而言之,这是一篇所有经验层次程序员都必读的文章。

关于浮点运算的每个计算机科学家必知

浮点运算是一个很微妙的东西,且并不容易掌控。甚至很多Java程序员都不知道当使用==运算符来做float或double类型的数值比较时会出什么错。我们中的很多人在用float和double类型做货币运算时都经常搞错。本文是此类文章中另一篇佳作,也是所有软件开发者和程序员必读文章。随着经验增长,你期望了解普通问题的细节,而浮点运算就是这些细节中的一个。作为一个高级Java程序员,你必须知道怎么用float、double或是BigDecimal类做货币运算,怎么对浮点数取整,等等。即使你知道浮点运算的基础,通过阅读本文你也会学到一些新的东西。

关于Unicode的每个开发者必知

字符编码是另一个让很多程序员纠结的领域,《每个软件开发者绝对必须要无理由知道的关于Unicode和字符集的最基本常识》一文旨在填补这个领域知识的空白。附注一下,没错,这就是这篇文章完整的标题。它的作者是statckoverflow.com的创建者之一————Joel Spolsky。Joel差不多在十年前就发表了这篇博文,而今看来它仍然适用于当前情况。本文将告诉你什么是Unicode,什么是字符编码,字符是如何用字节表示的,以及其他许多许多。这篇文章最赞的部分是它的表达方式(语言和流畅性),即使你对Unicode一无所知,你也可以无障碍阅读。总之,这是一篇对所有程序员、编程者和软件工程师而言更重要的必读文章。

关于时间,每个程序员都应了解的》(伯乐在线 2013年1月翻译)

在字符编码以外,时间和日期又是另一个让包括我自己在内的很多程序员纠结的领域。即使是高级开发者都会被GMT、UTC和夏令时,以及闰秒搞晕。坦白说,很难做到在处理时区问题时完全不犯错误,处理夏令时差以及它带来的影响同样也不容易。如果你用试错的方法时问题会更糟,因为这个办法永远无法帮你解决这个问题。有多少可能出错的地方,就有多少会发生误解的事。不管日期是否包含时区可以像地狱般把你搞混,将UNIX时间转化为其他时区会让你崩溃,从而忘记时钟同步和延时。我希望通过阅读这篇经典的文章可以消除你们对于时间的很多误解,可以打好关于时间的基础。

关于 URL 编码,每个开发者必须知道的

本文描述了一些大家对于URL编码的一般误解,在给出常见的问题及其解决方案前,先讲了HTTP的url编码。虽然本文并非针对某一具体的编程语言,它还是以Java来说明问题,并解释了如何在不同层次的Java web应用中解决URL编码的问题。你回学到URL语法基础,HTTP以及其他协议的通用URL语法。本文还阐述了URL的常见陷阱,比如字符编码、URL不同部分中的保留字符,以及URL编解码问题。如果你是一个Java程序员,你也将学会如何在Java应用中正确处理URL,如何构造URL和使用Apache CommonsHTTP客户端库。最后它还给出了最好的练习和处理URL的建议,比如应该在建URL的时候对URL编码,保证URL重写滤波器可以正确处理URL,以及其他很多很多。总之,这事一篇任何web开发者和程序员必读的文章。

关于Web开发的每个程序员必知

程序员和软件开发者必读文章。本文来自 stack exchange,是一篇每个程序员在发布站点前关于web应用需要学会的技术细节的文章。文章涉及接口设计、用户体验、安全、web标准、性能、搜索引擎优化、相关技术,还包含了一些重要资源。由于当今世界强烈依赖于互联网,程序员有个人网站和博客的现象很普遍,本文提供的经验不仅仅只对你的职业有帮助,也有助于你的私人工作。你将学到所有关键的技术,比如HTTP、HTML、XML、CSS、JavaScript、浏览器兼容性、降低网站载入时间的tips、XML地图、W3C规范和一些其他的关键细节。

关于SEO的每个程序员必知

这是另一篇对web开发者、程序员和博主来说非常重要的文章。SEO如此重要无法被忽视,因为很多程序员同时也是博客撰写者,所以学些搜索引擎优化基础来让Google搜到他们的文章并将文章展示给其他程序员很重要。在当今这个内联的世界,每个公司都必须将自己展示在网上才得以幸存,由此看来,SEO显得极其重要。如果你开办一个公司并开始销售商品,那么SEO就是你需要关心的东西。所有程序员,尤其是web开发者,都能从本文中受益良多。记住,搜索引擎优化是一个涉猎很广且变化迅速的课题,而且针对不同的搜索引擎差异很大,比如Google、Yahoo以及其他搜索引擎。所以为了掌握这门技术你将需要经常学习新知识。

关于未定义行为的每个C程序员需知

C语言有一个“未定义行为”的概念。未定义行为是一个有很多细微差别的很广泛的课题,这也是我喜欢Java语言的其中一个原因,Java的未定义行为少得多,混淆也很少,而且更加稳定和太平。C中很多看上去很合理的东西都有未定义行为,这也是程序里出bug的常见原因。此外,C中的任一未定义行为都允许实现方式(编译器和运行)来生成运行得很痛苦的代码,做一些完全不期望其发生的事,甚至更糟。这篇精彩的文章将带你在未定义行为的海洋中遨游。

关于网络,每个程序员需知

文中写道:“你是一个程序员,你是否曾想知道多人游戏是怎么运行的?这看起来似乎很神奇:两个以上的玩家通过网络分享同一段经历就像是在同一个虚拟世界里真正在一起一样。但是作为程序员,我们知道事实上发生的和看到的完全不一样。所有一切都是错觉。”

这是一篇关于网络的趣文,目标读者是游戏开发者,但我认为每个程序员和开发者都能从中受益。

关于String,每个Java开发者需知

这是我写的一篇关于java.lang.String的文章,我个人认为是每个Java程序员都需要了解的东西。String在每日的Java编程中很重要,所以任何Java开发者都必须了解这些。本文涉及了String的很多重要领域,包括string pool、string literal、用==和equals()比较String的区别、将字节转换为String、为什么String是不可变的、正确拼接String,等等。高级程序员可能已经知道所有这些情况,但是即使这样复习一下这些也是好的。

程序员都应该了解哪些安全知识》伯乐在线 2012年3月翻译

这个问题是StackOverFlow上的一个电脑编程的学生问的。就像我们学了很多常见的编程概念(比如操作系统、算法、数据结构、计算机架构等)一样,学一下安全相关的知识也很重要。虽然安全是一个很大的课题,它涉及加密/解密、SSL、网络安全、模糊处理、身份验证、证书授权等等,一些最基本的常识对每个程序员而言都是必需的。刚开始工作的时候,我个人对安全知之甚少,当开始写基于Java web应用的Servlet/JSP的时候,才开始了解网络安全和一些类似SQL注入、拒绝服务、XML注入、跨站脚本攻击等的安全威胁。作为一个Java开发者,现在我开始跟一些fortify、PMP和其他静态代码分析工具提供的安全Java编程经验。本文是非常好的安全主题集和链接集,不管你是否在编程,你肯定可以从中受益。

每个程序员都应知的延迟数字

这是一篇额外奖励的文章,但也是每个程序员必读之文。无论用哪种编程语言,如Java或C++,为了写出高性能的应用程序,你都应该了解基本的耗时数问题,比如,从内存、L1缓存、L2缓存、SSD随机读、硬盘中读取变量分别需要耗费多少时长。对互斥锁加解锁需要花多长时间,城市间传输一个数据包或是同一个数据中心循环传输一次需要花多长时间。这些耗时数与编程语言无关,属于内核知识的一部分,开发者必须写出高性能低耗时的应用。这篇文章好在它还提供了这些耗时数在多年来演变的对比分析。你可以看到这些耗时数在2006年和今天分别是什么样子的。

后话

以上是所有每个程序员必读文章清单。坦白说,程序员要学的东西太多了,学习一门编程语言,如Java,仅仅是冰山一角,但我们不都对学习充满热情的吗?编程是一项很有挑战的工作,在你的整个职业生涯中唯一能帮到你的就是基础知识,如内存、Unicode、浮点数、时间、安全相关对任何程序员都很重要。很少有什么是与特定的编程语言相关的,比如我那篇关于Java String和关于未定义行为每个C程序员需要些什么的文章,但对于初学者和开发者而言仍然是很好的学习材料。

from:http://blog.jobbole.com/71723/

Code Review CheckList

在关于高效代码审查的博客中,我们推荐使用清单(checklist)。清单是代码审查中的伟大工具——他们确保审查在团队里持续高效。它们也是确保常见问题被识别、解决的方便途径。

软件工程协会的研究表明,程序员常犯的错误有 15-20 种。因此把这种错误增加到清单里,你就能确保在它们出现时指出来,帮助消除这种隐患。

为了让你开始建立清单,下面是经典的条目列表:

代码审查清单

总体

  • 代码能运行吗?代码实现了想要实现的功能了吗,逻辑是正确的吗,等等。
  • 所有代码都很容易理解吗?
  • 它遵循了你们都同意的代码规范吗?规范通常包括花括号的位置、变量和函数的命名、行长度、缩进、格式和注释。
  • 有多余的或重复的代码?
  • 代码尽可能模块化了?
  • 全局变量能被替换?
  • 有任何被注释掉的代码?
  • 循环结构里有固定的长度值和正确的结束条件?
  • 有代码可以被类库函数取代?
  • 日志和调试代码可以被移除?

安全

  • 所有数据输入都被校验(为了正确的类型、长度、格式和范围)和转码了?
  • 第三方工具集在哪里用到了,能够返回被捕捉到的错误吗?
  • 输出值经过校验和转码了?
  • 不合法的参数值得到处理了?

文档

  • 有文档吗,文档描述了代码意图吗?
  • 所有的函数都加注释了?
  • 任何不寻常的行为和边界处理都做说明了?
  • 就第三方类库的使用和功能写文档了?
  • 所有的数据结构和测试单元都做解释了?
  • 有不完整的代码?如果有,它应该被移除还是打上’TODO‘之类的适当标记?

测试

  • 代码可测试吗?比如,不要增加太多的或隐藏的依赖,不能够实例化对象,测试框架能够使用方法等。
  • 有测试吗,它们全面吗?比如,至少包含了你们认可的代码覆盖率吗?
  • 单元测试实际地测试了代码正在实现的目标功能了?
  • 数组检查’越界‘错误了?
  • 测试代码可被已有 API 的应用取代吗?

你还可以为清单增加一些语言相关的问题。

该清单故意没有包含所有的问题,你并不想一个长长的清单,以致于没人去使用。只需覆盖常见问题即可。

优化你的清单

把该清单做为一个起点,你应该针对具体用例进行优化。有个不错的办法,那就是让你的团队在代码审核时,花一点时间提出所产生的问题。有了这些数据,你就能够甄别出团队的常见错误,然后就被改造成常见清单。要确保删除那些不会发生的条目(你或许希望保持较少地发生,还有诸如安全相关的重要条目)。

集思广益,及时更新

做为通用法则,清单上的条目应该是具体的,如果有可能,你可以就此做一份二元决策【注1】。这有助于避免判断上的矛盾,与团队分享清单,并得到他们对于内容的认同也是不错的主意。确保定期审查清单,检查每一项以确保仍然相关。

有了优秀的清单武装,你就可以增加代码审核中的瑕疵数量。这有助于你提升代码质量、避免不稳定的代码审核质量。

为了更多地了解 Fog Creek 上的代码审核,请观看下面的视频:http://fast.wistia.net/embed/iframe/vigy79tuhq

from:http://www.techug.com/increase-defect-detection-with-our-code-review-checklist-example

 

做程序员你需要明白这九件事

(本文为 Medium 驻站作家 Manual Elbert 撰写,以下以第一人称叙述)

三年前我在巴塞隆纳的神经科学实验室工作,忙着把电极贴到人身上、教认知系统的课,而现在我靠着设计、编写软件维生。

当然从前我在研究科学时就写过很多软件。如果你想要看懂 40G 的脑部扫描资料,你必须捲起袖子写些语法来处理这些数据,而我一直都是个很好的程序编写者。但直到我辞去了我的学术工作(可能也告别了我的学术生涯)并开始在一个小而有野心的新创公司工作之后,我才真正知道什么是软件工程师,以及在这一行是怎么回事,并不是知道更多程序语法、资料库、演算法跟设计模型就好。

如果我在读研究所之前就知道这些事情就好了,将会让我的工作生涯变得更轻松。这是一些对年轻的我的忠告,是我过去三年所学到的经验,不得不说,有些实在不是那么美好。

  • 1. 不要高估天赋的价值

年轻的时候,如果你很聪明,你便可以遥遥领先其他人,如同小池塘里的一只大鱼。如果你那半调子的口才很好的话,那么聪明的功效还能加倍。事实上,聪明加上口才好能够让你不用念什么书就顺利度过高中跟大部份的大学课程。(不过你还是得念物理,你总不能说服一个等式转弯)。

恭喜你,你很幸运,同时却也十分不幸运。因为当你毫无阻碍的就冲过了求学的终点线,对待学习如反掌折枝。在这同时别人必须去学习勤劳、坚持、人际网路这些之后远远比学识更加重要的东西。

我们的社会太过重视聪明才智了。当我跟人们提到我以前专攻神经科学,大家都会说:「哇,你一定很聪明」。的确我不是笨蛋,但我知道很多人也许不如我这么聪明,却是远比我好的神经科学家。

聪明才智当然还是能帮你打开一扇门,但绝不会帮你做好工作。勤劳、严谨、可靠的人际关系都是不只软件工程师,而是你跨出研究所的美好泡泡之后要成为任何专家都必须拥有的特质。

  • 2. 要对你的专业感到骄傲、乐在其中

这句话可能有点老梗,但对年轻的你来说仍然很重要:无论你做的是什么,都以它为傲,没有任何事情应该只被视为达成目的的手段。

不论对象是人或是试管,你都必须严谨分析你的资料并使你的统计数据有效,然后再重来一遍,因为有时候你会发现你犯了哪些愚蠢错误。如果你无法乐在其中,仅把这些步骤视为出版论文或发行产品的必须过程,那么你永远无法真正擅长这件事。

如果你是写软件的,这代表你要规画你的特色、研究现有的开源代码、学习新的模型与程序语言、修復你的错误、重建程序码并且维护它。如果你没有想要精通你工作的野心,那无论你是科学家、工程是或是任何你在做的工作,可能都只是浪费时间。

你可以拥有一些「宠物计画」,一些小小的、有点蠢的、并不一定能满足你的即时目标、你只是因为「享受」在做这件事情。有趣的是,这在软件社群里似乎很常见:许多我们现今正在使用的产品大部分都来自某人的宠物计画,而几乎不是来自科学圈。我最喜欢的名言之一是来自奥地利动物学家 Konrad Lorenz:

「对一个研究科学家来说,每天早上吃早餐前都抛弃一个宠物假设是好的晨间运动。」

如果你觉得这听起来很蠢,也许你不该当一个研究科学家。

  • 3. 学习新工具/新技术

作为上一点的延伸:投注时间学习新工具。不只是拓展你的抽象知识,而是实际去学那些能帮助你完成事情的工具。这很快就能见效。

一个学习新工具的好方法是上述的「宠物计画」。每次你要建造新东西时,也用新的方法建造它。记住,宠物计画就是拿来失败用的,你投资不多、你学到一点东西;如果计画不成功,或是你失去兴趣、或是你发现实在有点太难了,你不会有损失,不会伤到自己。

如果你从事学术工作,以下是我强力推荐的好东西:

(1) Git 跟 Github

Git 帮助你管理你的工作,再也不用担心备份问题;而 Github 上有一堆很好用的程序码,你不需要自己重造轮子。噢,请记得跟你的同伴再确认一次你的程序码。绝对不要用程序码来分析那些只有你看过的资料。(我不敢相信我得告诉你这件事情啊,年轻的自己。你一直以来都是一个好的程序编写者,但我仍然做了那些可能会被忽视的错误。如果不是有再检查一遍,我不会发现因为程序错误,有百分之三十的科学结果可能是假的。)

(2) 一个绘图软件

我通常都用 Inkscape,但标准的 Adobe Illustrator 跟新的 Sketch其实也一样好。用这些绘图软件来先处理你的图表和计画,这通常都比你在 Matlab 或是 matplotlib 上写绘图指令来得容易。

(3) 学习如何有效的利用你的文字与代码编辑器

Sublime Text 是个比 VIM 或 Emacs 来得容易学会的编辑器。知道捷径能够帮你省下一堆时间。

(4) 学习如何说话

看看 TED 上的演讲并注意这些讲者如何在十五分钟内就抓住观众,同时说出那些吸引人的故事。你可以在镜子前面练习,你的肢体与声音都是工具。

(5) 知道基本的 Python、R、HTML 跟 Javascript

这些工具可以帮上不少忙。如果你对写程序并非一窍不通,那学个新的面向编程或资料库。玩玩计算机视觉、自然语法编写、网页撷取、音乐合成跟机器人!

你所能看见解决问题的方法,永远都会被你所使用的工具所限。学习新工具代表你用新的角度看问题。如果你是大学生,我强力建议你一周之间拨出一天来学习新工具。如果你开始做硕博士研究,那就拨两天出来。长期来看,你会省下很多时间,而人们会被你的效率所惊艷。如果你觉得这听起来太困难、你没有时间、其他压力太大,那就跟你的老朋友谈谈,看看到底什么才是值得你花时间去做的。

  • 4. 成为真正的局内人

正常来说,你的长官或 CEO 会做出对机构或公司最有利益的事情,毕竟那是他的职责。

当我们说到「公司的最大利益」,其实我们是说某些局内人的最大利益。真正的问题是,你的长官或 CEO 到底把谁当局内人?这些利益共享者的利益又有多重要?

如果你的老闆认为他自己是唯一的获利者(越出名越好、越快获利越好),你最好快点逃走,逃得越快越好,不然你会被当成牺牲品。那谁才有资格利益共享?你的投资者或贊助者?员工?学生?人类?重点是:快点找出来。如果你不被当成受益者之一,那就快走。无论你有多爱你的工作,那都只是一厢情愿、被滥用的关系。

  • 5. 学会展现成果

「Shipping it」变成科技界一个相当流行的词汇,意即把你的产品从仓库拿出来给客人。但除了字面上的意思,它其实还有一种精神层面的意涵:你的东西要到了客人手上才会有价值,而这应该是你一直以来的目标。

在学术范畴中,我写的大部分软件都只会在一个系统上执行一次。为了产品而写的程序则是完全不一样的东西,这会让五十万人使用,而当写程序成为我的专业时,我发现我并不擅长这件事。

但这同时也代表琢磨好几年,直到完美产品诞生是没有意义的。你只要做出一点成果,就把它送出去,写一份最简单的报告你就有可能被录取。晚点再担心更复杂的学问吧,先搞定基础,尽快发表它。Just ship it。

  • 6. 懂得 80/20 守则

80/20 守则基本上是说,达成你预期目标的 80% 需要花你整个企画 20% 的时间,而剩下的 80% 时间就是拿来搞定剩下的 20% 目标。这就像你从郊区开车进城市,你用两成的时间开了八成的距离,但只要你遇到塞车,最后的两成距离会花你超久的时间。

这重要在哪?因为人们总是低估计画所需的时间,科学家跟工程师尤其常这样。这部分要归因于经验:你知道得越多,你越能预测之后有什么会出错、以及有什么是人们一开始不会注意到的有趣东西。

如果你还没有这些经验,只要把你预期所需的时间乘以五倍,并且预想五倍时间过后你就能达到「快成功了」的阶段

  • 7. 你没出卖你的灵魂

我念博士全都是因为一些错误的原因,其中一个我现在称之为「学术之罪」。我相信如果我没有追求博士,我就是浪费了我的天份,我觉得我亏欠所以在求学过程中给我帮助的人:教授们、帮我出奖学金的人等等。但我并没有,他们也许投资了我的学术未来,也或许对他们的投资没有兑现、没制造出一个伟大科学家而感到失望,但那是他们的问题,不是我的问题。

这跟做工作是一样的道理。人们总是会投资你,但那常常是因为这对他们最有利,而不代表他们买走了你的灵魂。

  • 8. 脱离你的舒适圈

以下是我如何看待这个世界的:

1-nUYG9kYTLBMxde_YNAw6hw

如果身边一切看起来很熟悉,代表你能学的东西极少。但如果你现在处于非常惊慌的状态,你可能什么都没学到。

在舒适圈内,你熟知圈子里的每个人、那里是你的归属,你知道如何应付问题,太阳底下没有新鲜事。如果你想学些新知并成长,你必须离开你的舒适圈,那才是学习的开始、有趣的事情发生的地方。那是一个你无法对每件事立即反应过来的地方。

当然也有某些时刻你会被压垮,那就是惊恐圈,你在那里昏倒、你所能做的只有勉强维生,并期待某人快来救你。

最棒的地方就正在你的惊恐圈正前面,那里才有挑战、你会在那里学到最多、改变最多。想办法去到那里吧。

「忘记安全。在你所畏惧之处住下。摧毁你的名声。变得恶名昭彰。」-鲁米,伊斯兰神祕主义诗人

  • 9. 学会驯服你的躁动

舒适坐好、闭上眼睛并正常唿吸。专注在你吐出的空气,通过你的鼻腔抚过你的上唇,没别的,就专心做这件事。

你刚刚专心了多久?五分钟?恐怕不到。

一分钟?很好。

比二十秒更少?恭喜你,你是正常人。你的脑袋就像猴子一样,会抓住最近的树枝。在学术上我会换句话说 …… 说好听一点是「联想思考」。如果你想要有创意,联想思考是很好的事情,但它却是专注力的杀手。

好消息是,你能学会如何专注。外面有一卡车的「提升生产力的技巧」,但他们都只抓到皮毛,你不会想要一个分心自由写作的软件,你想要永远抚平你猴子般跳来跳去的思绪。

对我有效的跟对你有效的可能完全不同。对我来说,定期静坐冥想非常有效(同时有其他许多优点与副作用),但就算是冥想静坐也有很多种不同的形态与传统,而我不可能找到一个对大家来说都适用的。我所建议的,是让你的意识保持一定的型态,并且很认真的对待它。你认为静坐是浪费时间吗?你会去健身房健身,但你应该要两倍的时间在脑力运动上。

只有好好地集中精神,你才能一步一步完成所有的目标。

from:http://www.techug.com/9-things-i-learned-as-a-software-engineer