另眼相看“那些争议最大的编程观点”

另眼相看“那些争议最大的编程观点”

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

有感于中国小孩背9x9乘法表,而印度小孩背19x19乘法表!

补充:再进一步扩展到 100 以内任意两数相乘

如果把100以内的数分为10级,那么,10以内的数就是 0级,20以内的数就是1级,以此类推,90以内的数就是8级,100以内的数就是9级;

按此分级,任意两个100以内的数,如83和57就分别是8级和5级的数,这两者的级差是3;

由此级差概念的引入,我们可以方便计算 100 以内任意两个数的乘积,当然了,数越大,记数越难,但相对来讲通过算式的分解,就可以很容易口算得出结果;

如下列中:

37 x 26

= (27 + 1x10) x 26

= 27 x 26 + 1x10 x 26

= (7+6+20)x20+7x6 + 1x10x26

再或者 :

83x57

先进行级差分解:

= (53+3x10)x57

=53x57 + 57x3x10

接下来就对前面的同级两个数相乘运用之前的方法:

=(3+7+5x10)x5x10+3x7+57x3x10

那么,我们归纳整理一下:

假设100以内任意两个数的个位分别为 M、N(N为小数的个位),级数为K,级差(即十位之差)为P,那么

=(M+N+10K)*10K + M*N +(10K+N)*P*10

此式做了再进一步的分解,以级差和级数代替了整十位数的参与,这样,所有问题都转化成了十以内的数和十的运算;

不同级数的100以内两数相乘,无非就是后面要再加上大数多出来的整十部分与小数的乘积;

整十部分与人相乘,无非就是个位与人相乘,再在结果后面加个0;

乘10嘛,就是整体左移,右面补零占个数。

----------------------------------------------------------

19x19 此类20以内乘法也很简单:

13 x 16 

= 16 x 13 

= 16 x 3 + 16 x 10

= 10 x 3 + 6 x 3  +  10x10 + 6 x 10

= 10 x (3 + 10 + 6 ) + 6 x 3

=  (10 + 6 + 3 )  x 10 + 6 x 3

以上为本人推导过程,以下为印度乘法表算法:

= (16 + 3)x10 + 6 x 3

即为:被乘数 加上 乘数的个位,再乘以十,最后加上 乘数 与 被乘数 的 个位 乘积;

按我的观点是,乘数 和 被乘数 因 十位都是 10,所以,只取个位,个位无非是从 0 ~ 9:

= ((6 + 3)+ 10)x 10 + 6 x 3

即为:个位之和,进个位,左移位,再与个位之积求和;

进个位,就是 加10;移个位,就是 乘10;

最终把 两个数的个位用 M 和 N 表示,那么结果就是:

=((M + N)+ 10)x 10 + M x N

这种方法,好像真的不适用于超过19的数,只适用于十位为 10 的两数相乘,但这个局部的规律足以应对该范围的问题解决,这就足够了。

并不是所有的事物都有共同的法则,但当你把范围缩小到特定时间、空间时,很多适用于这个特定小范围的规律就会应运而生,那也得看你是否愿意去总结。

那么上面,我是用推导的方式推出来的十几这样的数相乘,那么二十几的两数相乘是否有规律可循呢,我们再推导一下试试吧:

26 x 29

= 29 x 26

= 29 x 20 + 29 x 6

= 20 x 20 + 9 x 20 + 20 x 6 + 9 x 6

= 20 x (20 + 9 + 6) + 9 x 6

如果假设个位分别为 M 和 N ,那么

=( M + N + 20)X 20 + M X N

再进一步扩展,十位如果为任意 0 ~ 90,用 K 表示

= (M + N + K)X K + M X N

这样一来,100以内,各十位段的两个数相乘的通用公式就是:

个位之和,加段乘段,再与个位之积相加;

试试 78x 73 ? 口算等于:5694

再用竖式来算:坚式用口算好像算不出来呀!!

那用计算器吧:5694,正相符。

不过这么大的数虽然也能算出来,但还是要复杂些了,脑袋中记数的能力要强,不过总比坚式算法要强,竖式要记的数不太容易用脑子记住 。

通过以上的论证、推导,就很容易理解,规律分大小,适应面儿越大的规律,越少,也越难理解;适应面儿小的规律往往更实用,但相对要多得多,虽然很容易理解和应用。

那么接下来,再看下面转载的文章中的观点,其实很多观点都不一定是对或是错,所处的环境不同,就得因地置宜,当然了,大多数情况,是求广范。

所以对待每一个问题,还是得辩证地看,多角度地看,适合自已的才是最好的,不要盲从!

那些争议最大的编程观点

www.MyException.Cn   发布于:2013-08-30 19:33:18   浏览:17203次

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

 

 

 

实际上2010年酷壳曾经有文章介绍过其中的十条,但观点本身没有翻译。

 

最初的问题“你最受争议的编程观点是什么?”(这里还能看到存档),由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. 软件工程的既定思维反而会阻碍你做出伟大作品。

时间: 2024-10-18 07:30:30

另眼相看“那些争议最大的编程观点”的相关文章

十条不错的编程观点

在 Stack Overflow 上有这样的一个贴子<What's your most controversial programming opinion?>,翻译成中文就是"你认为最有争议的编程观点是什么?",不过,在 400 多个主回贴,以及千把个子回贴中,好像并不是很有争议,而是令人相当的茅塞顿开,下面罗列一些,并通过我自己的经历和理解发挥了一些,希望对你有帮助. 1) The only "best practice" you should be

《高质量C++C编程指南》纠错与拾遗(一)

使用C++/C编程的程序员,几乎都看过林锐博士写的<高质量C++C编程指南>这篇百页经书,并且通过阅读这篇百页经书,受益匪浅.我也是这篇文章的受益者.通过这篇百页经书,我学到很多知识,也给于了我深入学习C++的动力. 最近,偶得机会,再次拜读林锐博士的<高质量C++C编程指南>,发现里面有些观点颇有争议,本文作者对这些观点进行的了考证,整理,汇总,形成了此文档,这里绝无批驳,贬低<高质量C++C编程指南>之意,其目的有二,一:阐述本文作者对<高质量C++C编程指南

TDD并不是看上去的那么美

出处:http://coolshell.cn/articles/3649.html 春节前的一篇那些炒作过度的技术和概念中对敏捷和中国ThoughtWorks的微辞引发了很多争议,也惊动了中国ThoughtWorks公司给我发来了邮件想来找我当面聊聊.对于Agile的Fans们,意料之中地也对我进行了很多质疑和批评.我也回复了许多评论.不过,我的那些回复都是关于中国ThoughtWorks咨询师以及其咨询的方法的.我对Agile方法论中的具体内容评价的不是很多,所以,我想不妨讨论一下Agile方

概率论快速学习02:概率公理

正文 内容来自 概率论相关书籍 及 资料,有疑问请留言. 随机试验 · 样本空间 任何一个过程,如果它的结果是随机的(无法事前知道),那么该过程就称为一个随机试验(E).具有三个性质: (1)每次试验的可能结果不止一个,并且能事先明确试验的所有可能结果. (2)进行一次试验之前无法确定哪一个结果会出现. (3) 可以在同一条件下重复进行试验. 实验所有可能的结果组成一个集合(set),叫做样本空间(sample space),用S表示.   举个例子  连续掷一个硬币两次:  S={HH,HT,

概率论02 概率公理

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   概率论早期用于研究赌博中的概率事件.赌徒对于结果的判断基于直觉,但高明的赌徒尝试从理性的角度来理解.然而,赌博中的一些结果似乎有矛盾.比如掷一个骰子,每个数字出现的概率相等,都是1/6.然而,如果有两个骰子,那么出现的2到12这些数字的概率却不相同.概率论这门学科正是为了搞清楚这些矛盾背后的原理. 早期的概率论是一门混合了经验的数学学科,并没有严格的用语.因此,概率论在数学的

综合布线技术研究:六类并非铜缆布线的归纳

六类标准推出的意义 2002年6月17日,美国通信工业协会正式通过了六类布线标准,并以ANSI/TIA/EIA-568B的附录形式在6月24日正式印刷出版,该标准正式命名为ANSI/TIA/EIA-568-B.2-1.自1997年8月首次提出六类布线规范以来,历经五年之争,经过多次草案修改,六类布线标准终于正式出台. 六类布线标准的出台,不仅结束了商家在产品性能方面的纷争局面,也为用户选择六类布线产品提供了一个可靠的技术依据.要区分真正的六类布线系统,只要检验系统性能指标是否达到六类标准中所有参

六类线标准推出的意义

六类标准推出的意义 2002年6月17日,美国通信工业协会正式通过了六类布线标准,并以ANSI/TIA/EIA-568B的附录形式在6月24日正式印刷出版,该标准正式命名为ANSI/TIA/EIA-568-B.2-1.自1997年8月首次提出六类布线规范以来,历经五年之争,经过多次草案修改,六类布线标准终于正式出台. 六类布线标准的出台,不仅结束了商家在产品性能方面的纷争局面,也为用户选择六类布线产品提供了一个可靠的技术依据.要区分真正的六类布线系统,只要检验系统性能指标是否达到六类标准中所有参

Java面试笔试题大汇总(最全+详细答案)

声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个题都自己测试给出了答案 ,如果你对某个题有疑问或者不明白,可以电脑端登录把题目复制下来然后发表评论,大家一起探讨,也可以电脑端登录后关注我给我发私信,我们一起进步! 以下内容来自这位前辈 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题

《R的极客理想——高级开发篇 A》一一2.4 R语言中的遗传算法

2.4 R语言中的遗传算法 问题 如何用R语言进行遗传算法的计算? 引言 人类总是在生活中摸索规律,把规律总结为经验,再把经验传给后人,让后人发现更多的规律,每一次知识的传递都是一次进化的过程,最终形成了人类的智慧.自然界的规律,让人类适者生存地活了下来,聪明的科学家又把生物进化的规律,总结成遗传算法,扩展到了更广的领域中.本节将带你走进遗传算法的世界.2.4.1 遗传算法介绍 遗传算法是一种解决最优化的搜索算法,是进化算法的一种.进化算法最初借鉴了达尔文的进化论和孟德尔的遗传学说,从生物进化的