这是我遇到的问题。
和你从不认识的人坐在一起,试图弄清楚他是个程序员还是个小丑。
我没有想侮辱任何人的意思,而且,我是第一个要感谢这么多年的教育和努力终于把我变成一个专业小丑的人。
但是,有些程序员,我的天。
就像最近,我面试了一位毕业生。我把他叫做Ada。对于程序员新手,我充满怜悯,为了和缓的帮他热热身,我给了他一道温和的问题来消解我们之间的陌生。
我让Ada写一段程序,在纸上,打印出“hello“这个词10次。用什么语言都行,我说。
下面就是Ada写出的。
不管怎么说,拼写是完全没有错误的。
我差点就被这些化妆成程序员的小丑给骗了。我本以为他会使用一些基本的循环句法。你说这种东西还要去告诉他吗?
是的,我觉得也没必要。
有些人喜欢集邮。我喜欢收集诡异的代码。我在代码审查的过程中收集它们,这些年已经有了丰富的收获。我收集它们主要是好玩,但在面试中它们却能派上大用场。
我会在一次面试中挑出10个代码例子,大多少是C#和TSQL代码,然后问面试者如何评价它们。
事实上,由于经常做这个,我已经记住了一段解说词,就像这样:
我会向你展示一些代码,这些代码都是在正式的代码审查中发现的,它们都是已经准备好要发布给客户的代码。你可以认为它们是经过编译,测试,能符合需求要求运行工作的代码。你需要指出的是这些代码中存在的一些涉及到日后维护工作的问题。
语法型小丑
这样,就比如我会展示一段像这样的代码
1
2
|
if ( long .TryParse(x, out number)) number = long .Parse(x); |
对于这段代码,你可能会惊讶,我希望程序员能发现这第二行代码完全是多余的。但语法型小丑会立即指出你没有声明x 和 number 变量。
“提醒一下”,我说,“这是从一大段程序中摘录出来的,它是编译通过的,而且经过测试。“然后我满怀希望的看着他。
语法型小丑执着的回复说“可是你确实没有声明这些变量!“
“你再说一次这些变量没有定义,
你他妈的再说一次,我看你敢。”
万事通女孩罗西型小丑
语法型小丑归罪于没有好好听,万事通女孩罗西型小丑问题更大了。
罗西女孩拒绝相信代码里有任何的错误,即使在我明确的说“这里有一些问题,你要找出它们!“很显然,在罗西女孩生活的魔幻世界里没有任何不好的代码。
“不会有写的不好的代码的,
而且,你看我这可爱的头发!”
“我一眼就看出来了,我只是不知道如何向你解释“型小丑
用力的一弹纸,确信的一点头,很显然,这种小丑清楚的知道问题出在哪里。
但是就是在这关口,他们无法找到正确的词来解释清楚。
即使你给他几分钟让他想想,他们还是想不出来。你等他一整天,还是如此。
即使你等到海枯石烂、对面只剩下一堆骨架,你也等不到他们能找到正确的词语来答复你。
尽管他们有发现问题的锐智和本能,这类小丑不能表达出来,这不能不让人惋惜。
“等等!我知道怎么回事!
可是,我怎么用简洁的话把它说清楚呢…
小题大做型小丑
这种小丑很神奇。当能用迭代器时他们绝对不愿意使用简单的循环。当能用递归时,他们绝对不愿意使用简单的迭代。如果你想派人参加代码混淆技术大赛,这些小丑正是你要找的人。
“这代码很明显缺少抽象—代理—façade模式…”
愤怒型小丑
很多次我都会被礼貌的问候,与他们愉快的谈论天气,倒杯茶,安排妥当,开始一场关于编程的对话。
接下来的事情会让你无法招架。
愤怒型小丑很酷,沉着,镇定—在你问他第一个问题前。
“我怎么他妈的会知道,这是他妈的什么破问题”
并不是都这样糟糕
公平的说,如果某个人在面试我,他也许会认为我是个小丑,也许认为我是这些类型小丑的混合体。这是面试官的特权。
不仅如此,一些程序员会认为给他们面试的人正是马戏团团长,这是他们的特权。
不管情形是怎样,亲爱的程序员们,你要明白,我只是想在我们之间建立一种融洽的关系。但有时候,我发现这很难。
还是很有趣的。
公平的说,不断的面试是种变相的提高
其实我是一个程序员。
有意思~~要做一个程序员,不要做小丑
打印出“hello“这个词10次,也太犀利了吧….
打印10次或许对Ada来说比较容易,所以写10次“print”轻而易举;如果面试官要他写10000次,或许Ada就会用循环了吧,嘿嘿~~~
记得第一次接触计算机,里面的题目是打印出
*
**
***
****
的确是这么写代码的,因为还不知道变量、循环什么的
Ada的做法很好, 但更好的做法应该是如下:
print “hello hello hello hello hello hello hello hello hello hello”
优点:1. 代码清晰易读
2. 避免了循环,不会破坏CPU流水线,提升了效率
3. 改多次I/O函数调用为一次调用,提升了效率
当然要是语言是python的话就更简单了
print “hello ” * 10
但是伤内存. 要知道内存访问比CPU慢多了, 速度不会更快的.
沒關係. 因為記憶體到console顯示之間是用DMA, 相對把字畫出來的時間, 這時間差可以忽略.
Console用固定闊度字型的話, MeasureString的時間差也可以省掉了.
10.times puts “hello”
囧,贴错了。。。Ruby 新手,莫怪莫怪
10.times do puts “hello” end
puts “hello”*10
我不觉得这清晰易读,因为要数一下才知道是10个hello,而且要全部看完才能确认每一个hello的拼写都正确。
你开玩笑吧,这么一句print也关乎你的性能?你是在给钥匙扣编程吗?
這個世界需要小丑
按正常思维来说的话,打印10次好像就是这样,再多想一点可能就会使用循环或是其他了吧
很形象,很有洞察力
哈哈哈!我要做程序员
人家用直白的方法写出你要的结果。。。
或许第一个小丑用的是Vim,我相信任何编程语言的for循环都不会简单过vim的yy10p的。
很独到的见解
vim是编程语言吗?这种比较有意义吗?
就像有人说:哦,面粉太难吃了,还是饺子和面条好吃啊
y 和 p 的搭配还是绕远了,直接用.(点)就可以重复,
比如 10.(点)
白痴才会用Vim的这个命令代替for循环,然后让每个阅读他代码的人用指头指点着数这个白痴用的是yy10p还是yy11p还是TM的yy1024p
小丑不可怕,可怕的是在一个位置上一直做小丑,更可怕的是现在一些培训机构在成群培养这种小丑。
我在想 我是属于哪一类小丑
我也常面试程序员,我觉得你的面试本身就有问题。
print 10次也未尝不可,只是对于程序猿这种比较懒的动物而言,这有点儿扯……
其实我还不是一个小丑。。。
我是知道了不会说的那种。。
没有小丑,我们吃啥?
我还算过
1+2+3+4+。。。+99+100
-.-让别人打印10次HELLOW WORLD, 一般人都会直接写10遍 . 不解释.
我觉得一般程序员的第一反应都不是直接写 10 遍……(懒惰是程序员的美德!
是个人都知道打印10遍hello是out.print “hello hello hello hello hello hello hello hello hello hello “;
100遍呢??
100遍你这是变更需求,当然得重新设计了。
你给的需求是10遍, 100遍你这是变更需求,当然得重新设计了。
小丑的眼里全是小丑。文章应该改名为“小丑的牢骚”。
这个作者,应该是挺有个性的程序员
我能说这篇文章很不错吗?
不错
哈哈
你应该让他打印1万遍,这样他就会想着用循环了。人都是逼出来的!男的女的都是!
请问 语法小丑 那段代码用的是什么字体,为什么我的firefox不显示代码,chrome正常显示
我赞成打印十次,既然需求明确何必费事写循环。
一般只在明确不知道执行次数时,才会用循环。
能做个小丑皇也挺厉害的!