关于程序员的产出效率以及代码的执行性能(思考题)

2014-07-17 00:38:55 +08:00
 vjnjc
我的问题是:程序员的开发、维护效率重要还是代码的执行性能重要?

不知道类似的想法有没有在v2ex上提及,事情的缘由是昨天我去SAP面试,和面试官观念冲突。

面试官:(这道算法题)为什么要用递归?
我:(我当然知道递归调用会消耗调用函数的栈,)我希望(别人)阅读、维护这段代码能够更轻松一点。
面试官:你的代码就是写出来看的?
我:。。。(别人看不懂怎么维护啊)
面试官:有其他的解法么?
我:有的,用个while套起来。

十分种后,我的比较优美的代码变成了我都不想承认的代码。
PS:括号里的是我结合语境杜撰出来的,当时对话并没有这些部分。

我的看法:由于鄙人是《人月神话》的忠实粉丝,所以当然是人力比较重要!!写出一段阅读性好,可维护的代码是程序员的职责,而写出奇葩、差劲的代码都是被(进度或者是性能要求)胁迫的。

不吐不快啊,欢迎各位exer表达自己的看法。
由于我能力有限,如有不对之处也欢迎板砖。
5236 次点击
所在节点    程序员
48 条回复
xuwenhao
2014-07-17 00:44:05 +08:00
我见过所有的面试程序不能快速将递归转成循环的我总结下来都是写程序不熟练或者说不太会写程序的。另外,人月神话是说什么的你确信你看过?
vjnjc
2014-07-17 00:49:13 +08:00
@xuwenhao 看过的,至今留有印象的是两部分,大型项目的焦油坑和外科手术的主刀医师,其他忘光了
jsonline
2014-07-17 00:49:29 +08:00
一般程序里面真的基本用不到递归,你确定递归更好维护?
vjnjc
2014-07-17 00:55:20 +08:00
@jsonline 我不大確定,所以看看別人都是怎麼做的。因为在更早的时候有过一次糟糕的过早优化,使得我每次去维护它都要看半天,所以现在写代码都是按照最简单的结构写。
66CCFF
2014-07-17 01:19:57 +08:00
递归的话栈大小可能会成为一个坑?
imcotton
2014-07-17 01:22:44 +08:00
使用递归的正确场景:

- 性能无关的工作环境中 ✔
- 面试官考察且有异议时 ✖


Q: 你的代码就是写出来看的?
A: “Write Programs for People First, Computers Second”


Q: 有其他的解法么?
A: 有 while {...}
vjnjc
2014-07-17 01:26:36 +08:00
@imcotton ...这位兄台太专业了,顶
vjnjc
2014-07-17 01:27:53 +08:00
@66CCFF 会成为坑的。关键是我经验不够,不知道多少数量级会成为坑,于是最简单的办法就是先让代码work,有性能问题就改
vjnjc
2014-07-17 01:29:11 +08:00
@imcotton 话说你的✔和✖是怎么来的?用了某一种输入法打的?
JustFuckingDoIt
2014-07-17 01:40:36 +08:00
《人月神话》有毒
akfish
2014-07-17 03:47:36 +08:00
递归并不见得就比循环更可读/更可维护,反之亦然。

最重要的是问题的语境,问的是算法题,算法侧重的是什么?效率和性能。End of story.

单独把一个算法拿出来叫你实现,就已经脱离了工程环境了,这种场合过于纠结可维护性等等问题,就跑题了。

其实算法题的目的就是让人家知道,如果有一天架构师决定某模块要用什么算法叫你写,你写得出来不。
lookhi
2014-07-17 06:31:03 +08:00
就递归来说
还有编译器最后会帮你一把
pepsin
2014-07-17 06:37:38 +08:00
很逗,现在高级点的语言都有编译器帮你在执行层面把尾递归转化为循环了。
abscon
2014-07-17 07:22:33 +08:00
@jsonline 要看要解决的问题,是否天生地包含了递归的概念。如果是的话,而且是那种无法转成尾递归的递归,那么避免显式递归就是矫情的。

因为此时递归一定会体现出来,要么是在函数层面,要么是你自己写一陀数据来模拟调用栈。显然前者更容易维护,有可能还更高效
huangyan9188
2014-07-17 08:43:05 +08:00
递归事实上在我们写程序中很少会用到的,递归本身有些不确定性。为什么说是不确定性,或者说是不稳定性,为什么说是这样,取决于算法的复杂程度。如果是一个复杂的算法,那么递归带来的机器损耗很难估计,因此算法性能的优化也很难进行,相反,如果是非递归算法的话,哪怕是while循环,仍然可以找到优化的办法。
因此,面试的时候,递归和非递归同时给出来,且说出两者各自的执行效率(时间复杂,空间复杂)应该才是最合适的。
但确实有一点就是,递归本身用到的不多。
shuax
2014-07-17 08:46:58 +08:00
看了楼上的评论,写erlang的哭了。
lengbing
2014-07-17 09:14:20 +08:00
看了楼上的评论,写lisp的哭了。
scorpius
2014-07-17 09:37:00 +08:00
@shuax +1
guoxx_
2014-07-17 09:37:40 +08:00
从楼主的语境中来看,在这道问题的解决方案上,是递归更易于维护,while效率更高。
那这里有两个问题:
1. 程序能否被编译器实现为尾递归,消除调用栈。
2. 能否实现成迭代形式。

上面两种形式任一种都能够使用递归,又不影响效能。
另外我认为代码是可读,易维护为第一标准的。前提是写代码的人有足够的能力。
tiancaiamao
2014-07-17 09:45:23 +08:00
scheme表示不支持while,只有一种方式实现循环,那就是用递归

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/123037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX