Table of Contents:

程序员的心理疾病

无自知之明

由于程序员的工作最近几年比较容易找,工资还不错,所以很多程序员往往只看到自己的肚脐眼,看不到自己在整个社会里的位置其实并不是那么的关键和重要。很多程序员除了自己会的那点东西,几乎对其它领域和事情完全不感兴趣,看不起其他人。
这就是为什么我的前同事 TJ 作为一个资深的天体物理学家,在一个软件公司里面那么卑微。貌似会写点 node.js,iOS 软件的人都可以对他趾高气昂的样子,而其实这些东西的价值哪里可能跟 TJ 知道的物理知识相提并论。很多科学家其实都可以轻而易举的掌握程序员知道的那点东西。

垃圾当宝贝

其实软件里面有少数永恒的珍宝,可惜很少有人理解和尊重它们的价值。由于没有科学作为理论的基础,没有实验作为检验它们的标准,软件行业的很多东西就像现代艺术一样,丑陋无比的垃圾还能摆在外表堂皇的“现代艺术博物馆”里面,被人当成传世大作一样膜拜。

以语言取人

你的软件是什么语言写的,告诉别人的时候是千万要小心的,不到万不得已最好不要说。因为十有八九,对方会立即在心里对你的软件的价值做出判断,光凭你用的是什么语言。
在这样一个行业里,你会很难找到一个只把程序语言或者技术当成是工具的人。如果有人问你对某个语言或者技术的评价,是非常尴尬甚至危险的事情,所以最可靠的办法就是不做评论,什么都不要说。

分清精髓知识和表面知识,不要太拿经验当回事

在任何领域,都只有少数知识是精髓的,另外大部分都是表面的,肤浅的,是从精髓知识衍生出来的。精髓知识和表面知识都是有用的,然而它们的分量和重要性却是不一样的。所以必须区分精髓知识和表面知识,不能混为一谈,对待它们的态度应该是不一样的。由于表面知识基本是死的,而且很容易从精髓知识推导衍生出来。我们不应该因为自己知道很多表面知识,就自以为比掌握了精髓知识的人还要强。不应该因为别人不知道某些表面知识,就以为自己高人一等。

IT公司经常有这样的人,以为精通一些看似复杂的命令行,或者某些难用的程序语言就很了不起似的。

不要嚷着要别人写测试

在很多程序员的脑子里,所谓的“流程”和“测试”,比真正解决问题的代码还重要。他们跟你说起这些,那真的叫正儿八经,义正言辞啊!所以有时候你很迷惑,这些人除了遵守这些按部就班的规矩,还知道些什么。大概没有能力的人都喜欢追究各种规矩吧,这样可以显得自己“没有功劳有苦劳”。这些人自己写的代码很平庸,不知道如何简单有效地解决困难的问题,却喜欢在别人提交代码让他review的时候叫喊:“测试很重要覆盖很重要!你要再加一些测试才能通过我的review!”

杂项

名言

编码实践

一个好的后台程序需要具备哪些功能

错误的容忍度的处理

编程面对的问题

编程要能通过计算机解决实际问题,比如使用什么数据结构和算法,即问题模式
编程是人,而且是大量人来进行的,所以它还必须解决语言代码模式和复用能力的问题。即软工问题。即设计模式
再者,编程跟语言有关,所以它必须首先解决语言复杂度问题,即语言的语法;比如 OO,即代码模式

软件复杂度

对于软件的复杂度,唯一有效的推测方法是依据经验。而且还不是时时都好用。作为一个程序员,我知道,根据我之前开发过的相似的功能特征,我可以估计出现在的这些功能特征各自要多少开发时间。然后,我把总时间加起来,这就得到了完成整个项目需要的大致时间。然而,事实情况中,每个项目在开发过程中都遇到二、三个瓶颈。这些瓶颈会肆意的消耗程序员的大量时间你在遇到它们之前根本不会有所预见。它们会拖住整个项目,致使工期延后数周甚至数月。
这篇经典论文的核心论述通常被解释为复杂的软件工程问题无法靠简单的答案来解决

次要和必要复杂度
在该论述当中,讨论到了次要和必要复杂度的差异。
所谓次要复杂度是指由人们本身所产生的问题,而这类型的问题是可以被解决的。譬如说,撰写和最佳化组合语言的复杂度就是属于次要的,它可以借由高阶程序语言如Java来取代。

必要复杂度则是从软件本身要解决的问题衍生而来,并无法被移除。如果软件需要提供三十个不同的功能,那么这三十个功能都是必要的,这些功能都必须被实作出来。
软件工程面临的问题在于我们已经清除了大部分的次要复杂度,而剩余的(主要复杂度)都无法改变。
在移除次要复杂度中最大的进展也许要算是高阶语言的诞生,像是Fortran和Java。

在欧洲中世纪的传说中,有一种叫"人狼"的妖怪,就是人面狼身。它们会讲人话,专在月圆之夜去袭击人类。而且传说中对"人狼"用一般的枪弹是不起作用的,普通子弹都伤不到也打不死它,只有一种用银子作成的特殊子弹才能把它杀死。Brooks在他最著名的随笔文章《No Silver Bullet》里引用了这个典故 ,说明在软件开发过程里是没有万能的终杀性武器的,只有各种方法综合运用,才是解决之道。而各种声称如何如何神奇的理论或方法,都不是能杀死"软件危机"这头人狼的银弹。他当时大胆声称并预言方法学家们10年之内绝找不到什么极好的的神奇银弹。他的文章发表后,被广泛引用,后来他的随笔结集成书,《人月神话》。从此,在软件界,银弹(Silver Bullet)成了一个通用的比拟流行开来。1975年所出版的《人月神话》—被称为软件工程圣经。

技术债务

僵尸代码就因为各种原因如(有可能是程序库升级,老的接口不再使用。有可能是需求调整)导致的没用的、但却留在程序库中的代码。这样的代码没有任何其它程序会调用它,没有任何函数、对象引用它。
死代码是应该删除的代码。没有用的代码也就是没有人维护的代码。最后将变成没有人知道它是有什么用处的代码。后来的人也开始不敢删除这样的代码,怕万一什么地方需要用到它。于是这样的死代码积累的越来越多。技术债务越来越重。健康的项目慢慢腐烂变质。最终没有人能维护。
死代码应该及时大胆清除。即使错误了也是svn呢

源码阅读

不懂一套源程序的主要原因

源码阅读的一些技巧、方法

很多人以为看大型项目可以提升自己,而没有看到大型项目不过是几十行核心代码的扩展,很多部分是低水平重复。几十行平庸甚至晦涩的代码,重复一万次,就成了几十万行。看那些低水平重复的部分,是得不到什么提升的。造就我今天的编程能力和洞察力的,不是几百万行的大型项目,而是小到几行,几十行之短的练习。不要小看了这些短小的代码,它们就是编程最精髓的东西。反反复复琢磨这些短小的代码,不断改进和提炼里面的结构,磨砺自己的思维。逐渐的,你的认识水平就超越了这些几百万行,让人头痛的项目。

c、c++

其他小经验

3个人搭档做一个模块,每天要抽出一点时间来跟其他两位阐述自己的代码,这样可以使这三个人更加了解这个模块,也可以顺便再梳理下自己的思路,及相互监督的作用,以及完成之后可以让任何一个人来维护这个模块

项目是在原来的系统上开发的要问清客户原来的系统的优缺点,因为顾客会在新旧系统之间计较,不爽的地方会即刻发现

测试

一个函数的实现要调用另一个没用完成对函数,可以写一个假的函数来模拟

Error codes should also be accompanied by descriptive error messages. However, only in rare circumstances should the error message try to predict why the error occurred. It should simply relate what happened

开发功能的要点

主要逻辑
疑问处
数据库
程序文件
配置文件
注意点
UI
未完成
已通过
收获
线上出的问题
gm命令
时间富裕的情况下的优化
测试要点