提出这个问题,其实是想对自己的思维方式有个客观的态度。
对于编程语言,以前我一直觉得,那些我没使用过的,听一些牛人提起过的语言是比较好的。
我曾经去面试过一家中意的公司的Java开发职位,没有面上,为此一直很遗憾。后来听说他们使用Ruby语言,心里一直暗暗猜测,Ruby应该要比Java好吧?要不然他们怎么会改用Ruby了呢。
有个程序员朋友,做了五六年C++开发,他在我眼里也是热爱学习,属于优秀的程序员一类。有一天他跟我说在自学Python,用C++写几百行也解决不了的问题,Python几行就解决了,还特别强调这是一门黑客使用的语言。我想,Python应该也是很好的语言吧,要不然黑客怎么会用?
为此,我使用Google搜索 "the worst python code",点开前三个结果。
一个是C#语言的例子,有人这样写
string currentTime = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
明明可以使用DateTime.Now.ToString()配合参数来获取需要的时间。
还有这样的
int min3(int a, int b, int c) { if (a < min(b,c)) { return a; } else if(b < min(a,c)) { return b; } else if(c < min(a,b)) { return c; } } int min4(int a, int b, int c, int d) { if (a < min3(b,c,d)) { return a; } else if(b < min3(a,c,d)) { return b; } else if(c < min3(a,b,d)) { return c; } else if(d < min3(a,b,c)) { return d; } }
这样最糟糕的地方在于算法复杂度是O(N!) , 即使使用快速排序把所有数字排一遍,也只需要O(N*logN)的复杂度
这样的例子相信还有很多。 但这至少可以证明,无论高级还是低级编程语言,都能写出难看的代码。
进一步讲,语言只是一种工具,工具用得好不好,得看人。
但你可以说,每种工具有其适用的范围。只能说有些工具适应性比较强,粗活细活都能干;有些工具好上手,不需要太多学习;有些工具敲核桃是绝佳的……这是可以的。
可话说回来,我为什么会觉得,Ruby比Java好呢?
可能的原因是,我并没有真的向他们了解过这门编程语言。"xxx更好"这种先入为主的观念让我没办法看清真相。下一个定论是一种比较容易的方式,谦虚请教是比较难的。随便上网找一些资料证明自己的观点是容易的,自己静下心来下载开发包搭建开发环境写代码是相对来说更难的。吹嘘一些高级的概念,"元编程"、"函数式"是容易的,可真的能把这些特定用到位是难的。
另一个可能的原因是,我觉得当我有这样的判断是,我就比我周围许多的人要显得更牛。我可以向他们吹嘘,而大部分人也不会反驳我。
有一次吹嘘被戳穿的经历让我很难忘。去一个公司面试,我很希望可以被聘用,公司也给了我面试的机会。面试过程里,面试官问我看过哪些书?我转念一想,让他看中我的机会来了!就说自己看过<Junit in action>,是一本关于测试的英文书,我确实看过一遍,但留下来的东西实在有限。我说自己看过,可我也明知道自己没有收获。当他问及一些具体的概念时,我就答不上来,反倒很想争辩。最后当然是他很有礼貌的把我送走了。
这种浮夸,源自我的不自信。当我想去讨好或是让别人觉得我更好的时候,我就容易变得浮夸。
或者这样说,若非亲自实践,我就没有资格评论哪门编程语言更好。若非亲自实践,不应该轻易下判断。因为这样的判断可能出于浮夸,出于无知,但不是出于信心。
这是今天的思考。