聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

半年来的工作感受

2013-06-18 18:21 浏览: 12075 次 我要评论(0 条) 字号:

半年来的工作感受

好久没有写博客,一方面因为工作太忙,另一方面是因为没有发现什么好写的。可是后来发现没什么好写的原因其实也是因为工作太忙了。忙得不正常,所以没有很多时间和精力来研究和欣赏自己喜欢的东西了。

我在一家叫做 Coverity 的公司工作,我住在 San Francisco。Coverity 是一个奇怪的公司,San Francisco 是一个奇怪的城市。

Coverity 制造一种叫做“静态分析”(static analysis)的软件。这种软件可以在不运行程序的情况下,经过对代码的分析,自动的找到程序里面可能出现的问题。这有点像我之前给 Google 做的那个 Python 分析器,只不过针对另外的语言(C,C++ 和 Java 等),能处理代码的规模也大很多。还有就是这么多年了,久经沙场考验了。

Coverity 具有世界上最先进的一些技术,所以麻雀虽小,却让很多人离不开它。恐怕很少有人知道,这小小的公司的忠实客户,包括了一系列的世界级大拿:美国宇航局, 波音, 洛克希德马丁,BAE Systems,雷神(Raytheon),丰田,欧洲原子能中心(CERN)…… 貌似几乎所有对代码质量不敢有丝毫差错的公司,都购买了 Coverity 的产品。最近的火星好奇者号的自动着陆软件,也经过了 Coverity 的静态分析。

我必须承认,Coverity 给了我足够的启发,甚至间接的让我发现了自己之前做的 Python 静态分析里面存在的一些问题。Coverity 的 产品在大规模的代码上面的成功,也让我意识到了自己在 Python 分析器里的一些突发奇想的设计的正确性和价值。如果我现在做一个新的 Python 分析器,它将比原来的强大和高效很多(也可以推广到其它语言比如 JavaScript)。我也清楚的看到,Coverity 自发研制的一些“不大严谨”的做法,其实比程序语言领域里面一些看似高深的“逻辑”还要强大和精确。所以我觉得跟这公司还有点臭味相投,加入 Coverity 也是不枉此行的。

然而我也发现在我的 Python 分析器中,其实包含了 Coverity 还没有的技术。这些微妙的技术,貌似很多人都可以说他“会做”,但是他们却很难把它做对。这就像“CPS转换”一样,很多人都说他会做,可是真正做对的只有极少数人(我是其中之一)。这些技术源自于我对程序语言本质的理解,源自于 Dan Friedman, Kent Dybvig 和 Amr Sabry 等老师的教诲,也源自于我自己辛勤的实验,实验,再实验…… 在我简短而优雅的代码中,包含了许多人需要花费好几倍时间和代码长度才能达到的目标。所以虽然 Coverity 的工程师们技术实力很强,但在代码的简单程度和对程序语言语义的理解上,还真没有人是我的对手。

这就是为什么我经常能够一眼就看出 Coverity 产品里存在的问题,并且很快的修正错误。举一个简单的例子,有一天我修改了一行代码,使得产品在某些 benchmark 上的内存使用量减少了一半。我为什么可以做到这一点呢?因为在我的 Python 分析器里,这个问题是从一开头就不存在的!Coverity 的代码里面有好些类似的 bug,都是我自己根本不会犯的错误。我真的不是想贬低同事们的水平,他们有些是世界顶尖的高手,可是我也很清楚自己的技术地位。

所以我就经常发现这样的麻烦事:我顺手改掉了一个自认为很显然的问题,或者一个我根本不会犯的错误,然后就发现大批的测试需要被修改,我也会被要求写出“regression test”,用以防止同样的错误再次发生。看到这里的问题了吗?这些我“根本”不会犯的错误,几分钟时间顺手就改掉了,但是我却要花成天的工夫去写测试,防止它“再次”发生。我不得不说,用于修改和创建这些测试所花费的工夫,占用了比我修改代码多好几倍,甚至几十倍的工夫!

想想这六个月以来我干了些什么,再比较一下在 Google 实习的那六个月独自从头做出来的东西,我就发现自己简直什么也没有干。这就是我不喜欢“测试驱动的开发”(TDD)的原因。那六个月里,我从无到有的做出类似功能的系统,一个测试都没有写照样做对,为什么呢?因为我的代码如此简单,让我可以随时都把它们完全的浮现我的头脑里面,所有可能出现的错误都一目了然。也许这就是所谓的“逻辑思维”。

对测试过分依赖的人,往往不具逻辑思维的能力。他们不能够看到代码最简单的本质,所以需要做很多试探,以求达到“近似解”。为了不至于偏差很多,就写很多测试,用以捕捉和防止每一次的错误。这就像一个不会画画的人,喜欢一点一点的描,用橡皮来回擦。这些人对“错误”的记忆能力特别强,往往深入的追究一块代码“为什么”是错的。

然而我却没法记住之前的代码是如何错的,我也不想知道为什么,我只记得“正确”的代码是什么样子。我受到的训练让我可以直接得到正确的结果,所以测试对于我来说分量没有那么重。当我的代码需要大量的测试才能确保正确的时候,那就是我该把它推翻重写的时候。所以我的代码往往没有任何补丁和变通,可以说是无懈可击。这就像是一个会画画的人,闭目沉思,然后一气呵成。

所以我觉得做 Coverity 的工程师真累。这种累不止在于以上的技术层面,而且在于管理层给工程师造成的压力。这让我怀疑是否有继续为它工作的价值。关于公司管理的看法,我还是以后再讲吧。



网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复