为什么面向对象分析与设计的能力这么不受重视

2012-12-08 19:34:15 +08:00
 wog
我很好奇,为什么在面试的时候很少有人会问到关于面向对象设计的问题,我花了将近一年的时间学习面向对象分析与设计,模式设计,看完了四个老外那本《设计模式》,看完了《设计模式精解》,看完了《设计模式沉思录》,重写了上万行代码,前几天面试时候败在了一个排序上,原因是我之前一直用的是qsort,所以我用了大概三分钟,自己写了选择排序,而我学长只用了1分钟左右,面试的人说我基础不扎实,
我说我会设计模式,他说了一大串,总之意思就是:程序就是算法和数据结构,算法是程序之魂。。。
好吧。。。我基础不扎实。。。
可是之后那学长跟我说,以后面试要提前准备,像各种排序算法要提前背。。。
我知道,学长是好心,可我还是觉得很不舒服,为什么面试就只是问算法,抠各种奇怪的几年都用不到的c++语言知识,而且算法我也会,我3分钟自己写出来就比怎么他背出来的差,各种不懂。。。


Ps:经过这次我觉得我确实应该再静下心好好学一学,等读完手头的《linux设备驱动程序》《Unix高级程序设计》再去实习
15995 次点击
所在节点    程序员
103 条回复
chloerei
2012-12-09 17:08:28 +08:00
@zlxstar 自己写点小网站服务,兴趣为主,未说得上创业。
Rabbit52
2012-12-09 19:26:26 +08:00
@bhuztez 我觉得写的很好,很有感触
svampire
2012-12-09 19:38:59 +08:00
@akann 游戏公司一般招也是招注重算法的,因为一般招聘的程序并不会负责设计上的东西...
xuwenhao
2012-12-09 20:47:33 +08:00
让我们从另外一个角度来想一下这个问题,对于很多公司来说,他们希望通过面试来选出他们希望能够招募的工程师,但是这个过程本身有大量的限制和缺陷:

一般来说,很多公司会有2-4轮的面试,每个面试官都会有大约30分钟到1小时的面试时间,每个面试官都会通过多个问题做出自己的判断,而最终是否录用,又会根据多个面试官的评价来得出结论,这个过程看起来非常标准,也非常严格,对于很多被面试的人来说,甚至觉得有些繁琐。但是,这2-4轮面试,最多也就是4-5个小时,而招募来的工程师,我们希望他能够工作至少一年,理想情况,是能够呆上三年以上,面试的时间大概相当于工作时间的1/1000

也就是说,对于1M的数据,你希望通过简单的1/1000采样,来判断整个数据的分布,误差很有可能是很大的。

那么,在这有限的时间之内,我们倾向于寻找两种问题来考察面试者
1. 面试官容易给出明确判断Yes/No的。很多相对抽象的问题,面试官,特别是技术面试官很难通过面试给出判断,比如说,这个人是否是个负责的人,这种事情,面试是很难给出结论的。同样的,相对于基本的数据结构,算法和写程序能力,所谓“设计模式”或者设计能力,是一个相对更难考察的问题。对于应届同学犹然,因为相对来说,他们更少有大量的实际工程和设计经验,考察“设计模式”最有可能考察出来的,反而是“背诵能力”,而且相对于“背诵算法实现”,“背诵设计模式”更加容易
2. 和接下来的实际工作相关的。对大部分刚毕业的同学们来说,工作之后的半年之内,都没有机会实际去设计相对较大的模块,而更多地是学会写Production-Quality的code,所以面试直接根据算法来写代码,是一个更加合适方法。

此外,真正重视招人的公司,也倾向于错杀一千,而不是放过一个,所以即使被挂了,也不一定是你能力不强。

而事实上,我个人的观点也是,“设计模式”相比于“算法和数据结构”,“编译器”,“操作系统原理”在智力上的挑战更少,在经验上的挑战更多。而“设计模式”,在软件的设计能力上,只是具体技术上很小的一部分,即使是考察系统架构设计,去考察“设计模式”,也是非常不重要的一部分。
runay
2012-12-09 22:02:33 +08:00
@bhuztez
这番说法好奇怪啊。。。
就好比你指着满园子长满果子的果树说,这太荒唐了,这些树本应该如此这般的种才对,怎么可以那样种,那样种怎么会长果子,这些树甚至都该死掉,怎么会长出果实?
然而事实是,那些果树就好端端的在那里,果子也好端端的在树上长着。

--

一个应届毕业生找工作的时候,写个基本的程序都不行,还满嘴设计模式,总觉得这样的有点不靠谱吧。

当然不排除这样人中会有牛逼的,可毕竟几率太小了。站在企业的角度,招聘一个初级职位时,完全没必要在所有基础不好的人上花大量的时间只为找到一个不太可能出现的牛人,成本太高。
gaodayue
2012-12-09 22:39:24 +08:00
其实这不一定是坏事啦。算法和数据结构是程序员的基本功,别说国内,国外最优秀的IT公司面试也会问你算法,而且只会更难(不会只是让你写个quick sort的啦)。我大二的时候也迷恋OOP,后来也因为算法被鄙视过,当时心里也不平衡呀,但是从我现在的感受来看,研究算法比捣鼓各种设计模式更有意思,对程序员也更有帮助^_^
akann
2012-12-09 22:41:00 +08:00
@svampire 设计模式按软件工程阶段来说确实应该属于详细设计阶段,不应该属于编码阶段(敏捷法例外),一般公司招人都是招程序员,面试算法为主也是正常的。如果要招架构师的话,应该面试就不是以算法为主了。
88250
2012-12-09 23:01:03 +08:00
算法很难突破了,如果能有所突破,那果断不能呆在这个公司;反过来,OO 方法这条路也很难突破,但和 CS 不同的是,工程领域更容易发挥创造,细微的变化更多一些。

但最后可能干久了就发现磊代码、写代码、设计还是有些不同的 ~_~
AntiGameZ
2012-12-10 02:19:32 +08:00
楼主提到了学长,想必是应届生。校招的HR苦啊,成堆的简历,真要那种有写过靠谱项目,网上还能查到的,整组的人都会传着看。对着90%简历上项目经验为课程设计的应届生来说,谈设计模式没有意义——可能大部分人知道有设计模式这个东西,同时这部分人没听说过Proxy模式。

算法学校里都会教,现成的面试题一大堆。而对于冒泡排序面100个,50个人压根不会写的校招,再去谈设计模式,不更是给HR找憋屈么。而那些真正会对某个具体问题、具体技术死抠的招聘,一般都是急着找人填缺的小公司。
wog
2012-12-10 02:54:00 +08:00
@akann 感谢前辈的回复,我想我以后会把设计模式当做自己的基本功,长期积累,用来提升自己的水平,而不是再把它拿来作为技能来说,我觉得他对我的帮助相当大,特别是在阅读和理解别人写的大型开源系统的时候,
wog
2012-12-10 03:26:10 +08:00
@AntiGameZ 非常感谢前辈的回复。
这样的话,那我下次会把我的GitHub地址写进简历,之前确实是我自己太没有经验了,简历都不会写。
不过想想也好,像楼上其他前辈所说的,也许这样的公司并不适合我,或者说我并不适合这样的公司。
因为如果实习并不能让我比在学校学的多的话,我更倾向于在学校里提升自己的能力。
Ps:我是大三的学生,因为我们老师说如果我可以出去实习的话,下学期他可以帮我办所有课程的免听,所以我去应聘了一下。
另外,算法确实不是我的短处,虽然像《算法导论》这样的书我没看完,但两本《编程珠玑》和《编程之美》这样的书我确实看完了,不敢说全部理解,但我还是动手去解决过里面大部分的问题,之前我参加过我们学校的ACM集训,但是后来因为学院的原因(我是软件学院的,我们学校的ACM是计算机学院负责的)没能参加,并不是我想找什么借口,可是,ACM集训的老师确实跟我们说过叫我们不要自己写排序,用Qsort的效率比我们自己写要高得多。
wog
2012-12-10 03:33:42 +08:00
我没想到会得到这么多前辈的建议,真的很感激。谢谢各位前辈
AntiGameZ
2012-12-10 04:55:27 +08:00
@wog 实习当然很重要,尤其对非名校的学生,前提是,如果能去一家好公司的话,无论是对简历还是工作能力,比在学校待着“应该”会好不少。注意,我说的工作能力,而不是编程能力。编程、工作、竞赛,都是很不相同的东西。
akann
2012-12-10 06:29:26 +08:00
@wog 你的干劲还是值得称赞的,我还是觉得在国内大家都不太重视设计模式的情况下,可能这方面也的确存在短板,国内那么多公司都想做移动操作系统,明知这很重要,但却没有任何办法,说明国内在某些方面是存在短板的,要做一个移动操作系统首先就需要设计框架,这都需要设计模式的,愿你能学有所长,有一天能找到适合你的公司。
Sherlockhlt
2012-12-10 08:31:44 +08:00
其实我想说楼主虽然只是大三,但是看得出技术比这里许多说设计模式不好的人都要牛。
如果楼主想找工作的话,就去背面试宝典。
如果真的想搞技术做点什么出来的话,建议楼主出国读博,别浪费时间在国内的面试游戏上。
sampeng
2012-12-10 23:22:39 +08:00
这帖子不是说面试咋不问面向对象么。。怎么还跑楼了。。

和招聘没啥关系吧,靠谱公司不会问你面向对象的。。尤其是知道你是大学刚毕业的。

面向对象虽然说不是神,但好歹是10来年总结出来的东西。是方法论。。。但是。。

凡事有但是,新程序员知道这个东西有好处,因为方便和老程序员沟通。。大多数工作了个5年左右的程序员还是习惯用面向对象的思维的。。因为其他的沟通方式太繁琐太累。。说起协同都是我给你一个接口,你自己看注释去。或者怎么怎么用之类的。。。面向对象设计模式核心就是面向变化。万变不离其宗。没什么太神奇的地方。
谁说面向对象就一定是object了。就一定是一堆class了。。nodejs。erlang。c。到处都是面向对象的核心思想。。。
面向对象需要有大量的编码经验和读代码的过程,才知道怎么用,否则就是一个花样活。所以通常靠谱的面试是没人问你什么面向对象的。这个玩意太虚了。这是一种编码思维和工作方法,面试根本面不出来了。。。算法是内功,你背了比没背强,指不定哪天用到。但你花3分钟自己写和人家1分钟背你被刷了。不能怪面试官。面试官可不知道你是自己写的他是用背的。。。面试也是有风险的。。。

招来靠谱的要比招来不靠谱的难得多。。。很庆幸我们老大宁愿不招,也不招不靠谱的
est
2012-12-11 12:47:42 +08:00
如果你用不到状态,不写GUI,不写游戏,你用面向对象搞毛啊。

不服的来战。
dreampuf
2012-12-11 12:52:36 +08:00
@est 举几个用不到状态的例子
est
2012-12-11 13:03:23 +08:00
@dreampuf 打印helloworld,算Fibonacci,bogo排序。等等。
akann
2012-12-11 13:20:44 +08:00
@est TIOBE语言榜上前五名除了C不是主要以面向对象为主,其余四个java,Object-c,c++,c#可都是以面向对象为主哦。

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

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

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

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

© 2021 V2EX