因为程序员工做的性质,他们长期以来受到的所谓“黑客”式的“熏陶”,造成了一种行业性的心理疾病。患了这种病的人对于不少新入行的人,甚至一些外行人士形成了持续的伤害。慢慢的,这些不幸的受害者也造成了“条件反射”,进而成为了这个心理变态的系统的一部分,致使愈来愈多的人,愈来愈快的变成“怪胎”。这是一件可怕的事情,因此我以为有必要警醒一下。html
这里我就简单的把我所观察到的一些症状总结一下,但愿做为对于 IT 业界人士的警示,有则改之,无则加勉。也但愿为遇到相似问题的新手和外行人士提供一些精神上的支持,以避免他们也成为这个系统的一部分。node
因为程序员的工做最近几年比较容易找,工资还不错,因此不少程序员每每只看到本身的肚脐眼,看不到本身在整个社会里的位置其实并非那么的关键和重要。不少程序员除了本身会的那点东西,几乎对其它领域和事情彻底不感兴趣,看不起其余人。这就是为何个人前同事 TJ 做为一个资深的天体物理学家,在一个软件公司里面那么卑微。貌似会写点 node.js,iOS 软件的人均可以对他趾高气昂的样子,而其实这些东西的价值哪里可能跟 TJ 知道的物理知识相提并论。不少科学家其实均可以垂手可得的掌握程序员知道的那点东西,有人却认定了他们不是这个专业的,不懂咱们的东西,或者故意把问题搞复杂,让他们弄不明白。程序员
其实对于一个物理学家,他心目中知识的价值是这样排序的:web
COBOL 在那么靠前的位置我以为是用来搞笑的,不过你大体看到了不少 IT 技术在真正的科学家眼里的价值和它们的有效期。面试
若是力学工程师犯了错误,飞机会坠毁;若是结构工程师犯了错误,大桥会垮塌;但是若是软件工程师犯了错误,大不了网站挂掉一小时,重启一下貌似又好了。因此所谓“软件工程师”,因为门槛过低,他们的工做严谨程度,实际上是无法和力学工程,结构工程等真正的工程师相提并论的。实际上“软件工程”这个名词根本就是扯淡的,软件工程师也不能被叫作“工程师”。跟其余的工程不同,软件工程并非创建在科学的基础上的—计算机科学其实不是科学。数据库
按照 Dijkstra 的说法,“软件工程”是穷途末路的领域,由于它的目标是:若是我不会写程序的话,怎么样才能写出程序?编程
为了达到这个愚蠢的目的,不少人开始兜售各类像减肥药同样的东西。面向对象方法,软件“重用”,设计模式,关系式数据库,NoSQL,大数据…… 没完没了。只要是有钱人发布的东西,神马垃圾都能被吹捧上天。Facebook 给 PHP 作了个编译器,能够编译成 C++,还作了个 VM,多么了不得啊!其实那种东西就是咱们在 Indiana 第一堂课就写过的,只不过咱们是把比 PHP 好不少的语言翻译成 C。咱们根本不想给 PHP 那么垃圾的语言作什么编译器,让垃圾继续存活下去并不能证实咱们的价值。设计模式
其实软件里面有少数永恒的珍宝,惋惜不多有人理解和尊重它们的价值。这在其它的工程领域看来是难以想象的,然而这倒是事实。因为没有科学做为理论的基础,没有实验做为检验它们的标准,软件行业的不少东西就像现代艺术同样,丑陋无比的垃圾还能摆在外表堂皇的“现代艺术博物馆”里面,被人当成传世大做同样膜拜。网络
为了凸显本身根本不存在的价值,又提出一些新的“理念”,就像有些现代艺术家同样,说“艺术的目的不是为了美,而是为了自由。”哦,这就是为何大家能够自由地把那些让人反胃的东西放在博物馆里,还要买门票才能参观?函数式编程
固然了由于没有实质的技术,为了争夺市场和利益,各类软件的理念就开始互相倾轧。一下子说软件危机啦,面向对象方法来拯救大家!一下子又提出设计模式。过了一下子又有人说这些设计模式里面有些模式是“反模式”,而后又有人把函数式编程包装起来,说是面向对象编程的克星,一下子是关系式数据库,一下子是 NoSQL,一下子是 web,一下子是 cloud,一下子又是 mobile…… 每一个东西都喜欢把本身说成是将来的但愿。
这就是为何有人说在软件行业里须要不停地“学习”,由于不断地有人为了制造新的理念而制造新的理念。在这样一个行业里,你会很难找到一个只把程序语言或者技术当成是工具的人。若是有人问你对某个语言或者技术的评价,是很是尴尬甚至危险的事情,因此最可靠的办法就是不作评论,什么都不要说。
在 IT 行业里批评一个技术难用,是一件很是容易伤自尊的事情,由于立马会有人噼里啪啦打出一些稀奇古怪的命令或者一大篇代码,说:就是这么简单!而后你就发现,这些人彻底不明白什么叫作设计,他们以本身能用最快的速度绕过各类前人的设计失误为豪,不少程序员甚至以本身打字快为豪。
每每也就是这些自夸打字快的人喜欢使用过分复杂的方法来解决问题。我能够告诉你,我打字的速度是至关之慢的。我大量的使用鼠标,方向键,并且把 Emacs 里最经常使用的功能都尽可能绑到 F 功能键上,这样我就能够用一个指头启动一个功能。Dan Friedman 的打字速度就更慢,并且他常常故意使用“一指禅”。为何呢?由于咱们写出来的代码很是精辟,几乎不带多余的垃圾,因此根本不须要打很快。
当遇到这样引难为豪的人,个人经验是,千万不要恭维他们。你必须嘲笑这些东西的设计,而且指出它们的失误之处,不然你不但滋长了这些人的气焰,让这种风气继续延续下去,并且未来本身的自尊也难保了。很惋惜,并非每一个人都有这种勇气把这些话说出来,这就形成了今天的局面,纷繁复杂的垃圾充斥着世界。
爱因斯坦说,你须要不少的天才和很是大的勇气,才能追求到简单。很是大的勇气…… 也许就是这个意思。
不知从何时开始,人们开始引用 Eric Raymond 的一篇叫作《提问的艺术》的文章,这篇文章后来就成为了对提问者没礼貌的借口。因为这篇文章的误导,当你但愿同事能给你一个手把手的演示的时候,他们每每会丢给你一篇不知道何时写的文档,让你本身去读,仿佛文档就能够代替人之间的直接互动。何况不说这文档可能已通过时,里面有不少地方已经不符合最新的设计,而这意味着在潜意识里,他们以为高你一等。
对于这种现象有一个专门的词汇,叫作 RTFM(Read The Fucking Manual):
在 IRC 的聊天室里,因为隔着网络的屏障,这种对提问者没礼貌的现象就更加嚣张。我曾经有几回去 Java 的聊天室问一些貌似基础,而其实很深刻的语言设计问题,结果没有一次不是以收到像“去读 API!”这样的回答而结束。API 谁不会读,然而我须要的是一个有血有肉的人对此的理解。因此后来我根本不去 IRC 这种地方了,由于那里面对你打字的基本上已经不是人类了。他们以为你问问题浪费了他们的时间,好像他们一天到晚泡在 IRC 里面就是在作什么正事似的。不想回答问题,不开口还不行吗。后来你发现,原来在 IRC 里面训斥新手就是这些人惟一的乐趣,因此其实他们是非开口说话不可的。然而此次他们遇到的却不是个新手,而是一个能够把 Java 整个造出来的人。
像 Haskell 之类的聊天室貌似稍微友好一点,然然后来你发现他们显得友好是有所企图的。由于当时 Haskell 尚未不少人用,他们须要吸引新手,因此竭尽所能的诱导他们。而一旦它用户稍微多了一点,有声势了,就有人开始居高临下,成为专家同样的人物。他们就开始写书,而后就开始牛气哄哄的了。而后你就会发现当对 Haskell 的设计提出异议的时候,这些“id”们是多么的不友好,有理也说不清。因此最后你发现,其实全部语言的所谓“社区”都一个德行。若是 Haskell 有一天像 Java 同样如日中天(固然不大可能),确定对大部分问题的答案也就是“去读API!”其实它已经在向这一步发展了。
不得不指出,《提问的艺术》等介绍“黑客文化”的文章对于这种现象的出现有着极大的责任。说穿了,写这些文章的人通常都是 Unix 的跟屁虫。这种文章试图抹去人类文明几千年来传承的文化,而从新给“礼貌”作出定义。其结果是,人类的文明由于这些文章,在程序员的世界里倒退了几十甚至几百年。不少外行人人不喜欢跟程序员说话,叫他们是 nerd,就是这个缘由。
跟上面的症状类似,程序员世界里的一条重要的潜规则是:只有菜鸟才会问问题。因此若是你有任何机会能够本身获得答案,就不要试图向人“请教”,尤为不要显得好奇,不然你就会被认为是菜鸟。我有几回不耻下问的经历,最后致使了我被人当成菜鸟。我只是以为那问题有趣,也许可以启发我设计本身的东西,因此吃饭时以为是个话题能够说一下,结果呢就有人忙着鄙视你,那么小的问题都没搞清楚。正确的态度应该是诚实,直接,见惯不惊,那有什么大不了的,我什么没见过,我很怀疑。
随之而来的引论就是:不要谦虚!那些“职场经验”之类的文章告诉你的进入新的公司工做,要谦虚好问,对 IT 公司是无论用的。有的大 IT 公司有所谓的“文化”,好比叫你要“humble”,其实只是用来贬低你价值的借口。他们只是想让你安于“本分”,作一些微不足道,不能发挥你才能的工做。看看那些叫你要 humble 的人,他们 humble 吗?因此跟江湖同样,在 IT 公司里面一件很重要的事情是,亮出本身的宝剑和绝招,给人下马威。介绍本身的东西必定要自豪,这就是世界上最好的,无敌的,没有其余人能作到!不能有任何保留。不要像科学家同样介绍本身技术的局限性,不然随之而来的就是有些人对你价值的怀疑和对你自信心的打击。
另外要注意的是对于别人介绍的东西,不要轻易地表扬或者点头,不然有人就更有气势了。你要问这样的问题:这里面有什么新的东西吗?这个事情,另一种技术早就能作了啊,没以为有什么了不得。
你的软件是什么语言写的,告诉别人的时候是千万要当心的,不到万不得已最好不要说。由于十有八九,对方会当即在内心对你的软件的价值作出判断,光凭你用的是什么语言。
不少程序员都以本身会用最近流行的一些新语言为豪,觉得有了它们本身就成了更好的程序员。他们看不到,用新的语言并不能让他们成为更好的程序员。其实最厉害的程序员不管用什么语言都能写出很好的代码。在他们的头脑里其实只有一种很简单的语言,他们首先用这种语言把问题建模出来,而后根据实际须要“翻译”成最后的代码。这种在头脑里的建模过程的价值,是很难用他最后用语言的优劣来衡量的。
有时候高明的程序员用一个语言并非由于他只会用那种语言,而是其余的缘由。他们的头脑里有着万变不离其宗的理念,可让他们当即掌握几乎任何语言或者工具,因此他们对所谓的“新语言”都不觉得然。但是不少人误觉得他们不肯意学习“新东西”,从而从内心鄙视他们。其实计算机的世界里哪里有不少新的东西,只不过是有人给一样的东西起了不少不一样的名字而已。若是连这样的程序员都不能理解你的技术,就说明你的技术设计有问题,而不是他们有问题。就像 Seymour Cray 说的,我只能理解简单的东西,若是它太复杂了,我是不能理解的。
早些年的时候,你们都认为招募某种特定语言的程序员是一种浮浅的作法,不少公司看重的都是解决问题的能力。但是近些年我发现这些浮浅的作法愈来愈广泛。能够说如今像 Google 这样的公司面试员工的方式和态度,其实还不如八年前个人第一份国内工做。而这种现象在使用 Python,Ruby,JavaScript 等“流行语言”的公司里就更为广泛。
有些程序员对新手和同事是那么的不友好,然而对大牛们拍马屁的功夫可真是出类拔萃。我刚到旧金山的几个月有时候参加一些程序语言的“meetup”,后来我发现这种 meetup 都是宗教气氛很是浓厚的地方,跟传销大会差很少。Scala 的 meetup 里面的人几乎全都对 Scala 和 Martin Odersky 顶礼膜拜,甚至把 Rod Johnson 请来讲一堆胡话。Clojure 的,固然基本上把 Rich Hickey 当成神,甚至称他为“二十一世纪最重要的思想家之一”。各类 talk 老是宣扬,哇,咱们用 Scala/Clojure 作出了多么了不得的东西云云,其实只不过是在向你兜售减肥药。
不少人喜欢作这些新的语言和技术的“evangelist”,尽显各类马屁神功,而后就开始写书,写 blog,…… 目的就是成为这个“领域”的第一批专家。这就难怪了,再垃圾的语言也有一大批人来鼓吹。由于这些没真本事的人,随便把一个东西捧上天都有本身的好处。
因为受到这些“先知”的影响,有些人开始在他们本身的公司里“布道”。好比有人在 Python 的 meetup 集会时告诉我,他试图在本身的小组里推 Python,但是一些老顽固必定要用 Java,认为 Java 才是王道。很鄙夷不高兴的样子。我并不认为 Java 是很好的语言,然而 Python 也好不到哪去。它们在我眼里只不过是临时拿来用一下的工具,但是我仍然能用它们写出一流的代码。
看到这些宗教性质的聚会,我终于理解了一些地区是如何被从一个国家分裂出去,最后沦落为另一个国家殖民地的。最先的时候,通常是派传教士过去“传经”,而后就煽动一小部分人起来造反。到后来就能够名正言顺的以“保护传教士”,“保护宗教自由”,“维持和平”等理由把军舰开到别人家门口……