那些最有争议的编程观点

标签: 程序员 编程 | 发表时间:2012-08-31 14:52 | 作者:
出处:http://blog.jobbole.com

知名问答网站 StackOverflow之所以成功,合理的规则与严格执行是重要的原因,所以删帖是经常的。不过有时候执行得过严了,被删的问答不时会有惊艳之作。这不,他们的博客8月29日的文章 “20个最受争议的编程观点”说的就是这样一个被删帖。此文一出,立刻在  Reddit/ProgrammingHacker News等各大技术新闻站上引起了热议。

实际上陈皓曾经翻译 介绍过其中的十条,但观点本身没有翻译。

最初的问题“你最受争议的编程观点是什么?”( 这里还能看到存档),由Jon Skeet在2009年1月提出。此人可不是无名小卒,C#社区大名鼎鼎的人物,多年微软MVP,所著《 深入理解C#》(英文版 C# in Depth)一书是C#领域少数不可不读的名著( 老赵就说过C#他只推荐两本,这本和 CLR via C#),现在Google英国公司任工程师(还真不知道他在那里干什么)。

那么,这个问题当时都有哪些热门答案呢?顺序是随机的。

1、业余时间不会为了好玩而编程的 程序员,永远比不上那些以编程为乐的同学。

我认为即使是最聪明、最有才华的人,如果只是将编程作为工作,也永远成不了真正优秀的程序员。以编程为乐的人会在业余时也搞些小项目,或者弄弄各种不同的 编程语言和编程思想。

2、单元测试无助于编写优秀代码。

编写单元测试的唯一理由仅仅是确保已经能工作的代码不会出问题。先写测试或者按测试来写代码是无比荒谬的。如果在代码之前写测试,你都不知道边界情况是什么。虽然能让代码通过测试,但是在没有预见到的情况时还是会出问题。而且,好的开发人员会尽量降低内聚性,新增代码不可能使已有的出问题。

3、唯一能放之四海而皆准的最佳实践,是“用脑子思考”。

太多人喜欢追逐众多时髦技术,想方设法把各种方法、模式、框架用到不适合的地方。新技术和名人大牛的观点并等于适用于实际情况。

4、大多数代码中的注释实际上都是代码重复的恶性表现。

我们大部分时间是在维护其他人(或者我们自己)写的代码,而糟糕、错误、过时和误导性的注释肯定是代码中最令人纠结的东西之一。很多人最终会将它们干掉。应该把精力放在提高代码的可读性、必要时就 重构、少用惯用法和奇技淫巧上。另外,许多教材还在宣扬什么注释甚至比代码还重要,结果导致了大量废话连篇的注释。

5、依赖Google没什么错。

这种言论肯定会让那些学富五车的饱学之士恼火。但是谁都需要查资料不是?正确答案就是正确答案,管它是来自哪本秘籍或者私相传授,还是Google出来的呢?重要的是能真正理解,并给出成功的编程解决方案,让客户和老板满意。

6、程序员不是生而平等的。

经理往往认为程序员A==程序员B,因为他们的年头差不多。实际上,一个开发者的效能可以是另一个的十倍甚至百倍。

7、我实在不能理解为什么Java是最适合大学教学的第一门语言。

首先,我相信第一门编程语言应该重在学习控制流和变量,而不是对象和语法。其次,我认为没有调试C/C++内存泄漏经验的人,根本无法完全理解Java的初衷。而且,自然的发展过程应该是从“我怎样做这事”到“我怎样找到能做这事的库”,而不是倒过来。

8、如果你只会一门语言,无论多么精通,仍然不是优秀的程序员。

有人认为,只要精通了C#、Java或者其他什么你学会的第一门语言,就足够了。我不敢苟同。我学习的每一种新语言,都教了不少编程新知,能够反过来用于工作中。任何人只局限于一种语言,都无法充分发挥自己的潜力。而且缺乏求知欲和探索意愿,都不符合优秀程序员的特质。

9、偶尔写写垃圾代码也无妨。

有时候一些特定任务,快而脏的代码能搞定就行了。模式、ORM、SRP(单一职责原则)啥的算了吧。

10、print语句是合法的调试方式。

我认为用 System.out.println 之类的输出语句调试代码挺好。这经常比正式的调试要快,而且可以比较不同运行的输出结果。但是投入生产环境之前一定要删除这些语句,或者将它们放入日志语句中。

11、你的工作是要把自己摘出来。

你写的软件都应该让其他任何开发人员花一点时间就能理解并接手。软件应该设计优雅,代码清晰和一致,格式干净,文档合适,每日构建,有恰当的版本管理。如果你被车撞了、被开了、辞职了,公司应该很快能有人很快替代你。如果不能,那你就太悲剧了。有意思的是,你越这样做,你对公司的价值越大。

原帖下面有人评论:你如果无法被替代,也就无法升职啦。

12、getter和setter被极度滥用了。

成千上万的人都说公共字段是罪恶的,应该设为私有,提供getter和setter。我觉得其实没啥不同,除非程序是多线程的,或者访问方法中有业务或者展示逻辑(这可够怪的)。我并不是赞成用公共字段,只是反对用访问方法或者属性包一下,就号称封装、信息隐藏了。

13、SQL也是代码,请等而视之。

SQL和C#, Java或者其他对象、过程语言没什么不同,请注意代码的格式、可读性和可维护性。

14、UML图被高估了

有些图当然是有用的,比如Composite模式的类图。但许多UML图都毫无价值。

CSDN编者注:记得Robert Martin在《 敏捷软件开发(C#版)》里讲UML时,基本上是讲一个图然后说,好像没什么用,我就没怎么用过……同一个问题下面还有一个相关的答案:代码==设计。认为高级语言代码比UML图和文档更有效。

15、可读性是代码最重要的方面。

比正确性还重要。可读的代码也容易修正,容易优化、修改、理解。而且其他开发者也能从中获益。

16、XML被大大高估了。

很多随波逐流跳上XML这黑船的人都没过脑子。XML用于Web应用不错,因为它本来就是干这个的。此外的问题定义、设计思路应该尽量不用XML。

17、软件开发只是一份工作而已。

我热爱软件开发, 我现在一家创业公司干,每周公司60小时,而且工资不高,只因为团队很棒,工作很有趣。但站得高一点来看,这仍然只是一份工作而已。它不如家庭、我的女友、其他朋友、幸福等等重要。要是有足够的钱,我宁愿去玩摩托、游艇或单板滑雪。许多开发者忘记了写程序不是最终目的,它只是为我们提供条件,去高高兴兴地做生命中最重要的事情。

CSDN编者注:这条和第1条好像有点对着来嘛。

18、开发人员就应该能够写代码。

去年做了很多面试,我主要会测人们的思路,如何在白板上实现比较简单的算法。我往往从这样的问题开始:

已知Pi可以用函数4 * (1 – 1/3 + 1/5 – 1/7 + …) 计算,项越多越精确,请写一个函数,计算小数点后5位的Pi。

这是一个10行C#就能搞定的问题。但许多面试者甚至毫无思路。所以我只好接着问这样的问题:

已知圆的面积是Pi乘以半径的平方,写一个函数计算。

居然有超过半数的人无法用任何语言完成这个函数!唉,开发人员应该能够写代码,现在连这个都成有争议的观点了……

19、 设计模式弊大于利。

软件设计,尤其是好的软件设计千变万化,没法有意义地用模式去总结,尤其是那些大家记得住的几个模式,而且这些模式也太抽象了,其实没几个人真正记得住太多。所以设计模式其实没啥用。而另一方面呢,又有太多的人为设计模式的概念迷住,想方设法到处用——结果代码中往往除了一些毫无意义的单例和抽象工厂之外,几乎找不到什么设计。

20、代码少少益善。

如果用户看不到你的工作,才是做对了。荣耀在别处。

其他比较热门的答案还有:

21. 性能真的很重要。

22. 企业应用很滑稽。需要n年经验是胡扯。计算机科学学位课程纯忽悠。链接

23.  单元测试无助于编写好代码,软件工程大多数所谓的最佳实践都是为了防范烂程序员搞太多破坏。链接

24. 每个程序员都应该熟悉现代计算机的体系结构。

25. 编写小方法。

26. PHP真烂!

27. C++是有史以来最差的语言之一。链接

28. 大多数职业程序员都很烂。

29. 要想成为程序员,你得先学会打字。

30. 编程之外的各种流程规矩越多,代码质量越差。链接

资深的游戏程序员James Hague(名博 Prog21是也)也看到此文,觉得这些观点都没啥太大争议性。他专门写了一篇博客,又提出了他自认为更具争议性的观点,其中不少观点指向他之前发表的其他文章:

31. 计算机科学专业应该只作为辅修学位。

32. 新程序员还没有弄懂分解问题和将解决方法变成代码之前,就 给他们介绍面向对象是大错特错。

33. 复杂的编译器优化几乎都没什么价值,即使能得到更快的代码。它们会 大大降低编译速度而且很可能产生难以处理的bug,使 性能问题的处理更加困难。

34.  不能允许 没有十年编程经验的人编写供他人使用的库。忽略此条,抱憾终身。

35.  代码丑陋与否无关紧要。有没有格式与代码是否工作、可靠没什么关系,可以让自动化工具来整理格式。

36.  纯函数式编程没啥用。但在命令式代码里杂用一些效果不错。

37. 软件工程的既定思维反而会 阻碍你做出伟大作品

 

对这些编程观点你怎么看?你有什么值得争议的惊人之语吗,欢迎晒出来大家共赏析。

 

相关文章

相关 [争议 编程] 推荐:

热点争议:Web设计师需要编程知识吗?

- - Web App Trend
Web设计师是否应该学习编写代码是个充满争议的问题. 通常,在完成了一件网页设计后他们把创建网页代码的繁重工作都留给了程序员们. 这种现象不只出现在网络开发行业,在软件及游戏开发业也是如此.  在本篇文章中,作者 Deepu Balan 和大家分享了一些为什么Web设计师需要学习编写代码的理由,这会使广大的Web设计师们受益匪浅.

那些最有争议的编程观点

- - 博客 - 伯乐在线
知名问答网站 StackOverflow之所以成功,合理的规则与严格执行是重要的原因,所以删帖是经常的. 不过有时候执行得过严了,被删的问答不时会有惊艳之作. 这不,他们的博客8月29日的文章 “20个最受争议的编程观点”说的就是这样一个被删帖. 此文一出,立刻在  Reddit/Programming、 Hacker News等各大技术新闻站上引起了热议.

广东户籍改革引发争议

- 品味视界 - FT中文网_英国《金融时报》(Financial Times)
唐剑波(音译)在深圳一家电子厂工作,为了让4岁的儿子以后能够在当地公办学校上学,他现在需要赶回800公里外的湖南老家一趟,办理相关材料. 31岁的唐剑波在深圳这个蓬勃发展的城市生活了将近10年,但他没有户口(或者说居住权),而只要在深圳落了户口,他的儿子自然就有资格入读公办学校. 地处中国南疆的广东省有3700万外来人口,为了获得落户所需的积分——相关申请程序复杂已极——许多人....

911恐怖袭击的争议照片

- changlei - YesKafei Daily
这是一张禁忌照片,如果发生在中国,这是一张会被先行人肉的照片. 2001年9月11日,恐怖袭击降临纽约,5个年轻人坐在海边背对正在倒塌的世贸中心交谈着. 这是一张非常容易被人误会的照片,人们习惯了对待沉重事件应该有的严肃表情,和行为. 但人们应该尝试给出一个正面的理由,给你带来错觉的理由. Thomas Hoepker 在远处匆匆拍下这张照片,在他对照片进行整理,发现这一令人忧心的照片后决定不对外公布,直到2006年.

李双江之子撞人惹争议

- tomz - Solidot
wmr 写道 "中国军队歌手李双江的15岁的儿子李天一无照开着高档的没有挂牌的宝马牌高级车. 因为他前头一对夫妇开着车刹车,他便暴怒起来,下车对那对夫妇拳打脚踢. 目击者表示,两名车主在打人的时候,边打边喊“谁敢打110”. 美国之音认为,至少从标题来看,对李双江儿子打人一事,中国民间和官媒展现出截然不同的视角.

茅于轼文章引发争议

- lionhart - Solidot
bonnae1982 写道 "据《乌有之乡》网站的报道,茅于轼4月26日在中国《财新网》(已经删除,百度快照)发表了一篇读《红太阳的陨落》“把毛泽东还原成人”的文章.

“见死不救”引发立法争议

- cindykk - 南方周末-热点新闻
小悦悦事件中的“冷漠现象”引发了如何鼓励见义勇为和减少“见死不救”的大讨论. “见死不救”行为是否应该立法处理.

“分裂”的 Android 再引争议

- - 爱范儿 · Beats of Bits
就在一周前,iOS 平台上的热门免费游戏 Temple Run 终于推出了 Android 版本. 三天之后,该游戏在 Google Play 上的下载量就突破了 100 万(在 iOS 平台上的成绩为七个月 4500 万下载量),评分达到了 4.3 分. 不过,被下载是一回事,可不可以在海量的 Android 机型中正常运行又是另一回事.

Google阅读器改版引发争议

- lili - Solidot
Google阅读器今天改版,与Google+社交服务进行整合,取消了原来简单易用的社交功能,例如“跟谁朋友分享条目”,“评论”和“分享”,它们全被Google+的“+1”所取代,忠实和重度使用者过去所建立的小小社交圈子就在瞬间塌陷了. 逼迫所有用户使用Google+的意图已经引发了用户的抗议. 至今已有一万余人向Google署名情愿,一位抗议者称,取消Google Reader功能不会促使他使用Google+,而是变得愤怒.

Hadoop Streaming 编程

- - 学着站在巨人的肩膀上
Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如:. 采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer). 本文安排如下,第二节介绍Hadoop Streaming的原理,第三节介绍Hadoop Streaming的使用方法,第四节介绍Hadoop Streaming的程序编写方法,在这一节中,用C++、C、shell脚本 和python实现了WordCount作业,第五节总结了常见的问题.