zoukankan      html  css  js  c++  java
  • 转载半年来的工作感受

    半年来的工作感受

    好久没有写博客,一方面因为工作太忙,另一方面是因为没有发现什么好写的。可是后来发现没什么好写的原因其实也是因为工作太忙了。忙得不正常,所以没有很多时间和精力来研究和欣赏自己喜欢的东西了。我在一家叫做 Coverity 的公司工作,我住在三藩市(San Francisco)。Coverity 是一个奇怪的公司,三藩市是一个奇怪的城市。Coverity 制造一种叫做“静态分析”(static analysis)的软件。这种软件可以在不运行程序的情况下,经过对代码的分析,自动的找到程序里面可能出现的问题。这有点像我之前给 Google 做的那个 Python 分析器,只不过针对另外的语言(C,C++ 和 Java 等),分析的侧重点不同,能处理代码的规模也貌似大一些。还有就是这么多年了,久经沙场考验了。Coverity 具有世界上最先进的一些技术,所以麻雀虽小,却让很多人离不开它。恐怕很少有人知道,这小小的公司有一系列的大客户:美国宇航局, 波音, 洛克希德马丁,雷神(Raytheon),BAE Systems,丰田,欧洲原子能中心(CERN)…… 貌似几乎所有对代码质量不敢有丝毫差错,又不得不用像 C++ 这样毛病众多的语言的公司,都购买了 Coverity 的产品。比如最近的火星好奇者号上的所有200多万行代码,都经过了 Coverity 的静态分析。当然,如此精密的设备不可能光靠 Coverity 查一下错就能确保万无一失,它必须依靠很多其它的技术,但 Coverity 确实是这些东西的开发过程里面比较重要的部分。我必须承认,Coverity 给了我足够的启发,甚至间接的让我发现了自己之前做的 Python 静态分析里面存在的一些问题。Coverity 的产品在大规模的代码上面的成功,也让我意识到了自己在 Python 分析器里的一些突发奇想的设计的正确性和价值。如果我现在做一个新的 Python 分析器,它将比原来的精确和高效(也可以推广到其它语言比如 JavaScript)。我也清楚的看到,Coverity 自发研制的一些“不大严谨”的做法,其实比程序语言领域里面一些看似高深的“逻辑”还要“正确”。这些微妙的“提示信息”,让我把多个领域的知识串通了起来。所以我觉得跟这公司还有点臭味相投,加入 Coverity 也是不枉此行的。然而我也发现,Coverity 缺少我所拥有的程序语言理论知识。绝大部分的 Coverity 工程师没有系统的学习过 lambda calculus 和函数式编程,从而无法利用这些东西里面的简单而精髓的思想。所以除了 C 和 C++ 以外,Coverity 在其它语言上面几乎没有什么建树,更没法做出 Python 的静态分析。在我的 Python 分析器中,其实包含了 Coverity 还没有的技术。Python 的静态分析本来就比 C++ 和 Java 之类的难,然而我的实现却异常的简单。这些微妙的技术,貌似很多人都可以说他“会做”,但是他们却很难把它做对。这就像“CPS 转换”一样,很多人都说他会做,可是真正做对的只有极少数人(我是其中之一)。这些技术源自于我对程序语言本质的理解,源自于 Dan Friedman, Kent Dybvig 和 Amr Sabry 等老师的教诲,也源自于我自己辛勤的实验,实验,再实验…… 在我简短而优雅的代码中,包含了许多人需要花费好几倍的代码长度才能达到的目标。所以虽然 Coverity 的工程师们技术实力很强,但在代码的简单程度和对程序语言语义的理解上,真的很难达到我的程度。这就是为什么我经常能够一眼就看出 Coverity 产品里存在的问题,并且很快的修正错误。举一个简单的例子,有一天我修改了一行代码,使得产品在某些 benchmark 上的内存使用量减少了一半。我为什么可以做到这一点呢?因为在我的 Python 分析器里,这个问题是从一开头就不存在的。它源自于一种幼稚的解释器写法,有点像 GoF 的《Design Patterns》里的那种。Coverity 的代码里面有好些类似的问题,都是我自己根本不可能犯的错误。我不是想贬低同事们的水平,他们都是 Stanford, Berkeley 等学校毕业的高材生,我们相处得也很好。可是我也很清楚,其实 Stanford 和 Berkeley 除了已故的 John McCarthy (我非常尊敬的人)以外,近年来在程序语言上面几乎没有什么作为,他们的教学队伍其实缺少真正世界级的程序语言专家,所以 Stanford 和 Berkeley 的人犯下那样的错误也就不足为奇了。然后我就经常发现这样的麻烦事:我顺手改掉了一个自认为很显然的问题,或者一个我根本不会犯的错误,然后就发现有大批的测试需要被修改,我也会被要求写出“regression test”,用以防止同样的错误再次发生。某些同事对于测试的战战兢兢的态度,其实跟我当年在 Google 实习的时候没有什么两样。然而这次我假装比较“听话”,照他们说的做。看到这里的问题了吗?这些我“根本”不会犯的错误,几分钟时间顺手就改掉了,但是我却要花成天的工夫去修改和创建测试,防止它“再次”发生。我不得不说,在这些测试上所花费的工夫,占用了比我修改代码多好几倍,甚至几十倍的工夫!想想这六个月以来我干了些什么,再比较一下在 Google 实习的那六个月独自从头做出来的东西,我发现自己简直什么也没有干。这就是我不喜欢“测试驱动开发”(TDD)的原因。在 Google 的六个月里,我忽略了同事对于测试的要求,从无到有的做出了如此精密的系统,一个测试都没有写照样做得好,为什么呢?因为我看得见事物的本质,我的代码非常的简单清晰。我随时都可以闭上眼,把它们完整的呈现在头脑里面,从而让“心灵之眼”可以看到可能出现的错误。也许这就是所谓的“逻辑思维”。对测试过分依赖的人,往往不具有这样的思维能力。他们不能够看到代码最简单的本质,所以需要做很多试探,以求达到“近似解”。为了不至于偏差很多,就写很多测试,用以捕捉和防止每一次的错误。这就像一个初学画画的人,一点一点的描,用橡皮反复的擦,可总也抓不住事物的精髓。这些人对“错误”的记忆能力特别强,往往深入的追究一块代码是“如何”错的,“为什么”是错的,下次如何才能不犯同样的错误。然而我却没法记住之前的代码是如何错的,我也不想知道为什么它是错的,我只记得“正确”的代码是什么样子。错误的方式有千万种,可是正确的却往往只有一个。把脑力浪费在记忆错误的东西为什么错,这就是为什么很多人不能写出优美而正确的代码。曾经有人问米开朗基罗,你是怎么做出“大卫”那样的杰作的。米开朗基罗说,我走到一块大石头前面,然后我就在它里面看到了大卫,剩下的工作就只是把多余的石头敲掉。试问如果米开朗基罗一天到晚都在研究分析丑陋的人如何的丑,为什么丑,他的眼睛还能看得见大卫吗?我受到的训练让我可以直接看到简单而正确的结果,就像米开朗基罗看见大卫一样,所以测试对于我来说分量没有那么重。当我的代码需要大量的测试才能确保正确的时候,那就是它该被推翻重写的时候。所以我的代码往往没有任何补丁和变通,可以说是无懈可击。当然,优美的代码并不是一蹴而就的,有的代码被我推翻重来几十次才最后成功,但最后的结果肯定不会留下丝毫错误的痕迹。所以我觉得,看一个程序员的水平,不要看他留下来多少行代码,而要看他删掉了多少行。我觉得做 Coverity 的工程师真累。这种累不止在于技术层面的繁琐,而且在于管理层对工程师的缺乏尊重以及不必要的压力。这让我在受到了足够的“启发”之后,开始怀疑是否还有继续为它工作的价值。对于公司管理,以及对于 IT 行业总体的看法,我还是以后再讲吧。2.我离开了Coverity

    在写这篇博文的时候,我已经不再是 Coverity 的员工了,我已经在今天下午向公司正式辞职。走出公司的大门,我觉得一身的轻松。这是我几个月以来第一次感受到加州美丽的阳光,AT&T Park 到处是欢笑的人群,他们是来看巨人队的棒球赛的。我第一次发现他们的面庞是那么的美,那么的友善。湾里的海水也格外的蓝,水面上船帆招展,一幅恬静自然,其乐融融的景象。我就像是一个刚从 Alcatraz(恶魔岛)释放出来的囚犯。我已经很久没有欣赏过这样的风景了,虽然我每天都从这风景中走过。进入 Coverity 之前,我就在 glassdoor(一个让员工评价自己公司的网站)上面看过给它的评价,只有 3.2 颗星,44% 的员工推荐朋友去那里工作。评价者们写到:“管理队伍非常不成熟”,“不重视自己的员工”,“高层总是互相打架”,“每个星期都有人莫名其妙的被炒鱿鱼”,“过劳工作,工资太低”,“工程师非常聪明,可是不受尊重”,“你不再是一个人,你是一个数字”,“对新人不友好”……可是6个月以前,我认定了 Coverity 拥有我想要探索的技术,所以尽管如此的恶评如潮,还是毅然的加入了这个公司。现在我如愿以偿了。Coverity 的产品里确实有几个超过我的点子,我很快的把它们都学过来了(虽然他们压根没教过我)。Coverity 实现了几个我设想中的点子,从而让我的眼光的正确性得到了免费的证明。然而很可惜的是,由于 Coverity 的工程师们的不虚心,他们没能从我这里学到任何东西,虽然我们相处合作很友好。然而,glassdoor 的评价者们对公司管理层的每一条批评,也几乎都一一的兑现了。对于管理层的不满,以及对自己的身体和心理健康的考虑,是我离开 Coverity 的真正原因。这恐怕是一个罕见的既有高科技,却又极其吝啬而压榨的公司。Coverity 工程师的水平都是高于普通程序员的(有多少人会设计静态分析软件呢?没有很多),好些工程师都有博士学位。可是这些极其聪明的工程师,却并没有得到他们应该得到的待遇和尊敬,他们过着非常不轻松的生活。他们的工资并不比其它公司的普通程序员的工资高。每个人的头顶上,都仿佛有一双眼睛在随时盯着,督促着你干活。你一天工作了多少个小时,每个任务的“估计时间”,你花在任务上的实际时间,全都使用一种叫做 Jira 的软件进行记录。开会时 manager 会不断地向你提醒 worst case time,best case time,要你做“top performer”…… 仿佛你的价值就只在于完成任务所花的时间,你还要跟其他人竞争!一星期一大会,一天一小会,要你报告前一天完成了什么,今天准备做什么。仿佛生怕你就偷懒了。这就是他们所谓的“Agile”管理模式,其原理就像是操作系统一样,把人作为可以任意调用和替换的“进程”,并且并发执行。很可惜,这种管理模式,造成了软件质量的低下,bug 多得不计其数,而且难以修复。最令我惊奇的其实是 manager 的言语里随时随地透露出来隐约的“威胁”口气,仿佛随时都在质疑员工的工作态度和积极性,随时都在检查员工是否工作够了时间,随时都在琢磨要炒谁的鱿鱼(这样可以节省点开支)。这是极度的不自信,仿佛他们不相信有人真的愿意为他们工作,随时都在对员工察言观色,生怕一下子走人了没人来给他们修补bug。所以公司里总是感觉一种人人自危的气氛。感觉这怎么不像是一个高科技公司,而是麦当劳呢?比麦当劳还小气,一副斤斤计较的穷酸样。这里没有 Google 那样漂亮的办公室,健身房,没有免费的午餐和晚餐,没有舒服的 bean bags,连冰箱里的免费饮料都是最便宜最不健康的可乐和雪碧一类的…… 所以相对而言,Google 的环境实在是好太多了(虽然我不大可能再去 Google 工作)。喂,从 NASA,洛马,波音那里赚来的钱都到哪里去了啊?我经常发现好几个工程师晚上工作到八,九点。一个同事因为住的远,6点就冲去坐火车(Caltrain),可是过不久我就发现他屏幕的 VNC 在动,我能清晰地看到他在继续工作,直到很晚…… 呵呵,我为什么知道这些呢?因为我以前也工作到很晚。我工作到很晚是因为我觉得那代码里面还是能给我一定启发,而他工作到很晚是因为他想拿绿卡。哈哈,绿卡,我才不会为了绿卡累坏自己。我知道自己的价值。我是唯一能够第一眼就看出 Coverity 的代码里的严重错误的人。我也知道,在弥补了我的 Python 分析器的几个缺点之后,我可以用很短的时间做出可以与 Coverity 匹敌的产品(如果我愿意的话)。当我向 manager 提到我可以做一个 open source 的 Python 分析器的时候,我收到的第一反应不是赞扬,而是“提醒”(或者说叫威胁)。他说,如果你现在做这个东西,恐怕 Coverity 的法律部门就会来找你,称这个东西属于 Coverity。呵呵,Coverity 根本就不会做 Python 的静态分析,我做出来倒属于你了?整个公司总是处于一种压抑的气氛之中,很少见到人们的笑脸。有少数的人总是嘻嘻哈哈,可是那些都是 HR,Sales,…… 我不觉得他们的笑声中存在真诚的喜悦。很假。当我递交辞呈的时候,HR对我说:“随便你到湾区哪一家公司,都是差不多的情况。”但我不相信这就是整个的“软件行业”,否则软件行业就是在制造新的奴隶社会。我相信,世界上还是有很多与我志同道合的人。

  • 相关阅读:
    deepinmind(转)
    不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据(转)
    shell 监控局域网的主机是否up(转)
    IntelliJ Idea中一个编译报错引发的
    Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸
    使用php-fpm状态页观察当前的php-fpm状态
    PHP连接Access数据库代码
    HDU 4107 线段树
    Effective C++之‘宁以pass-by-reference-to-const替换pass-by-value’
    xdebug的安装和配置方法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4434104.html
Copyright © 2011-2022 走看看