#36 楼 @rasefon 详见 为什么我反对纯算法面试题
看过这上面的分析,我相信你明白我为什么反对纯算法面试题了。原因就是纯算法的面试题根本不能反应一个程序的综合素质!
那么,在面试中,我们应该要考量程序员的那些综合素质呢?我以为有下面这些东西:
* 会不会做需求分析?怎么理解问题的?
* 解决问题的思路是什么?想法如何?
* 会不会对基础的算法和数据结构灵活运用?
另外,我们知道,对于软件开发来说,在工程上,难是的下面是这些挑战:
* 软件的维护成本远远大于软件的开发成本。
* 软件的质量变得越来越重要,所以,测试工作也变得越来越重要。
* 软件的需求总是在变的,软件的需求总是一点一点往上加的。
* 程序中大量的代码都是在处理一些错误的或是不正常的流程。
所以,对于编程能力上,我们应该主要考量程序员的如下能力:
* 设计是否满足对需求的理解,并可以应对可能出现的需求变化。
* 程序是否易读,易维护?
* 重构代码的能力如何?
* 会不会测试自己写好的程序?
所以,这段时间,我越来越倾向于问应聘者一些有业务意义的题,而且应增加或更改需求来看程序员的重构代码的能力,写完程序后,让应聘者设计测试案例。
比如:解析加减乘除表达式,字符串转数字,洗牌程序,口令生成器,通过ip地址找地点,英汉词典双向检索……
总之,我反对纯算法面试题!
以上是摘自该文章总结,我以为我在网上可见的 开源项目 都完全体现了上面所有要求,而这些都是来自我实际工程生涯中的长期结果,要算法有算法,要代码风格有代码风格,要需求分析有需求分析,要文档有文档,要重构有重构,就看面试官能否有水平 Hold 住。
#21 楼 @rasefon 算法它的确也是实用的能力,但它只是数学模型,而不是工程模型。因为算法只是从工程中提炼,就像你不会因为 MongoDB 用了 B-Tree 而去为它买单,而是为它提供了良好的工程而买单。所以我以为用人单位对待面试者也应该如此。
对于你举例的"业务逻辑密集型软件,比如各种 ui,金融软件等",如果你觉得它们只是单纯的体力劳动,我不赞同,只能说明你的经验太浅了,我以为两者兼备,而且智力投入更重要,这个从国内外网站的质量就可以看出来。国内对开源软件贡献的太少,而国外的开源遍地开花。国内的只会死板的逻辑性分析开源软件,最多打个补丁,而国外更多在于创造解决方案。
所以对于成熟的软件工程师,比如三四年以上,我以为看 TA 如何解构分析 TA 之前做过的项目更为有益,或者就面试公司的实际工程问题,去考察面试者的经验和思路,以及迭代过程。
#17 楼 @rasefon 但是我反对面试时过多的考察这种单向编码的笔试,而是应该结合业务来互动为主,当然这个得要求面试官有足够的驾驭能力。
我最讨厌压力编码了,这就是变相的加班,把工程师当码农使。写程序其实是个创造性的过程,只有艺术家自己才能给自己压力,外在的压力只会导致堆砌垃圾冗余问题代码。
#18 楼 @camel 写和理解是两回事(我个人觉得最重要的是结合业务能深入的理解),做学术写的代码和做工程写的代码也是两回事。这种只占软件工程里一小部分的算法,我觉得没必要拿出来太当回事。
请问你写过的软件中有多少是需要你手工实现这种基础算法的,如果简单或有很强的应用,那为何我们写 Ruby 的基本就用不到呢,而是直接放到 Array#binary_search
就可以了呢。编写常用排序算法,也就是对不会实际工程的刚毕业的学生练练得了。
第 2466 位会员
ID: rasefon
Name: Raw
城市: 上海市
公司: Autodesk
Email: [email protected]
Since: 2012年6月08日
倍受大家喜欢的帖子
Ruby 发个很好的 Ruby VM 的学习资料 13 人喜欢, 9 条回复
数学 傅立叶变化的完美解释。 5 人喜欢, 6 条回复
算法 相似图比较算法。 2 人喜欢, 2 条回复
瞎扯淡 恒大威武!!! 0 人喜欢, 39 条回复
瞎扯淡 关于 C++,关于 gc 的一些东西 0 人喜欢, 24 条回复
瞎扯淡 分享一首非常赞的歌和歌词。 0 人喜欢, 1 条回复
Ruby 无意中找了 ruby 语法的伪 BNF 范式,发出来给大家参考一下。 0 人喜欢, 4 条回复
Ruby 2.0 respond_to?(x,x) 坑死人! 0 人喜欢, 4 条回复
瞎扯淡 最近想到一个关于上传图片的问题。 0 人喜欢, 8 条回复
Gem Ubuntu 下国内的 gem 镜像有问题。
对于这种以关注 VM, 傅里叶,相似图,BNF 范式的人去写二分查找,红黑树,AVL 树等数据结构为兴趣的人,本人表示不需要解释。
在资本家眼里员工只是可以替代的商品而已,所以福利该争取的还是先争取。
过去的就过去了,当学习人生和技术吧。年轻,一切都好,写代码的时候注意身体:)
#1 楼 @goinaction 从单独给这道题和我问的算法业务还真没看出来,就大部分应用层的 Rails 系统而言,真的不需要应用什么算法,当然这也不是说算法就不需要了解和掌握,它对你架构系统有好处。如果写一些底层库,可能需要那么一些算法,但是很多开源都有,而且也只是作为一个模块引入即可,所以应用层的开发人员只需要了解原理即可。
#2 楼 @linjunhalida "手写二分查找代码"难度其实挺高的,在同样了解基本算法原理条件下,除非面试者提前背书,否则写的代码真的有 BUG。二分查找算法"虽然早在 1946 年就有人将二分查找的方法公诸于世,但直到 1962 年才有人写出没有 bug 的二分查找程序。",我觉得我们论坛大部分人都比不过那些大牛吧,何况也没人发明个厉害的基础算法出来,所以面试中的大部分实现我可以说就是和高考一样的性质,背书而已。
本人不是算法大牛,智商也只是够考个三本学校而已,了解的常用算法最高层次也只有二分查找和 B-Tree 等相对直观的概念而已,其他高级的红黑树,优先队列等数据结构我可能就得花一点时间去明白其中过程。
但是这不妨碍我写诸多 Ruby 相关开源软件 和 统计分析引擎框架 statlysis 。就个人直观的理解,常用算法无非就是 CPU 和 IO 互换,或者发现里面某些规律,比如以下几种(数据挖掘和机器学习等排除)
以上可能有错误,望算法大牛指点!我分析的关键点是上面的都太数学了,是给 Knuth 等搞数学的人玩的,给那些写数据库,操作系统,网络等的大牛们玩的。
而对于像我这样的类似 DHH 一样容易数学不及格的人直观的理解这些算法即可,也许我们更懂得直观的如何像作一幅油画一样把一个大型程序写好并模块化,依我看 Web 开发大牛 @huacnlee 也是属于这种人。
#8 楼 @wppurking 嗯,能顺利解决问题的技术都是好技术。
混合语言是好事情,Ruby 这种脚本语言做数据处理肯定比 Java 方便多了。不过直接用 ElasticSearch 的 API 提供对外服务感觉像是把 MySQL 直接暴露在外网一样。。。不知道是否做了一层包装,还是我理解错了?
对于数据源来说,statlysis 其实是包括了"复用现有 Model"和"独立设计业务相关 document"两种 ETL 方案的,这个可以见 README 的两个案例,ETL::LessonLog 和 ETL::ProblemLog 两个 Mongoid Model 就是类似于你这里的"独立设计业务相关 document"。
我觉得 statlysis 采用 数据库 ORM,和 ElasticSearch 采用 Restful HTTP ,才是两种方案在 ETL 上的最大区别。
。。。本来是想和大家讨论 statlysis 的,意想不到的是抛砖引玉出了与其他成熟方案的对比,很有收获:)
目前待业正在找工作 ing,但是对比特币及其前景不太确定。
@hpyhacking 可以兼职后台数据统计分析部分吗?个人有 基于 Mongoid/ActiveRecord 的 statlysis 统计分析引擎 经验。
Sphinx 是个独立的程序,它本身没有问题。但是提供给 Sphinx 数据源时可能要注意 MySQL 查询的索引了,或者你发个贴和大家一起讨论下吧:)
你能用 MySQL 可以 Handler 的数据量,Sphinx 一定可以,而且它也是分布式的,见 用 sphinx 轻松搞定方便管理的多节点过亿级数据搜索 。
如果要用 ElasticSearch 的还是问 @wppurking 这些有经验的人吧:)
ElasticSearch 确实很强大,它提供的 facets,让我想起以前用 Sphinx 里面提到的 facets,只是没想到可以这样活用!你的分析很对,良好的 DSL 查询是必杀技。
我说一下 ElasticSearch 对于写 Ruby 的我和 statlysis 来说的三点不足吧,可能有失偏颇:)
个人觉得 ElasticSearch 最大的好处是它是独立的应用程序和解决方案,在稳定性上很好。而 statlysis 的目标就是面向用 Ruby on Rails 开发的中小型网站,当然 MongoDB 能 Hold 住的数据量,它也能 Hold 住,我目前的经验是十亿级别。
#4 楼 @kenshin54 在理,之前解决了相同的坑。
相关记录见 http://mvj3.github.io/2013/12/16/refectoring-code-at-sunshine-library-in-three-months/ "同步机制的范式转移"部分 和 http://github.com/mvj3/distribute_tree 项目。
RubyChina 这种讨论型论坛的数据量不大吧,每天备份一下就好了。
友情支持一个!
#9 楼 @luikore 大赞,果断 star 和 fork!
你写的数据结构内核比我的更精妙,不需要手工调整参数什么的。
不过原理上我感觉是差不多的,上午我想稍微改写一下,发现自己原来写的难以维护,调了几小时无果后放弃了,以后有机会再弄:)
#10 楼 @pepsin 加上网络部分后确实让人写代码的时候想脏 Hack 的成分会更多些,我后来不得已也是把 Source 类拆成了 Local 和 Remote 两部分了。写代码的过程已经被我记到 人类思维和软件工程学 的 混沌时代 这一段里了。
#7 楼 @luikore 我的树种在这里 https://github.com/mvj3/hangman/blob/48034eee7ec0c1167226984b512f99bf3cd07af5/lib/hangman/constants.rb#L53 ...
该项目数据结构的核心基本就在这里了。但是我这里不一样的就是,不是正式定义里的包括分类数据和判断过程的决策树(我可能说错了哈,没做过机器学习方面的工作),而仅仅是作为 为访问优化的数据结构 提供给外部程序逻辑 用于对决策条件的不断收敛。