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

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


Ps:经过这次我觉得我确实应该再静下心好好学一学,等读完手头的《linux设备驱动程序》《Unix高级程序设计》再去实习
17234 次点击
所在节点    程序员
103 条回复
bhuztez
2012-12-11 13:39:53 +08:00
@est 但是 @wog 说的那些东西除了他自己说那是面向对象,其实和面向对象也没啥关系啊
est
2012-12-11 13:55:15 +08:00
@akann

Java - 企业级

obj-c - GUI

c++ - gui/game

C# - gui/web ui/xna

我没说错吧。
akann
2012-12-11 14:10:12 +08:00
@est 哈哈,我同意你的那部分观点,因为我现在还没有找到反驳你的办法,但从你上面那句话我觉得你的意思是面向对象的程序设计方法是小众化的设计方法,而这一点是我不同意的。
est
2012-12-11 15:58:29 +08:00
@akann OOP不是小众化的设计方法,而是被严重滥用的设计方法。那种纯OOP的smalltalk,才是小众中的小众。而OOP的精华——message passing,实现者erlang,更是几乎被视为异端。。。
dreampuf
2012-12-11 16:23:44 +08:00
@est Fibonacci中的递推变量能算作“状态”么?
akann
2012-12-11 16:51:47 +08:00
@est 看来你还是认为虽然OOP虽然很大众,但还是不应该使用,如果真的不使用OOP了之后,那目前OOP实现的这些功能,其他非OOP能胜任吗?这应该是计算机科学应该研究的问题,因为我现在还是搞工程的,我现在看到的是目前大部分编程任务还需要OOP来完成,因此你认为OOP不应该那么重要仍然说服不了我。当你说服大部分工程师使用非OOP方法做软件的时候,我会听你的建议的。
bhuztez
2012-12-11 18:14:19 +08:00
@akann 告诉我,啥是OOP,为啥OOP更适合你的任务?
wog
2012-12-11 18:53:53 +08:00
@bhuztez 那你跟我说下,我说的哪个跟面向对象没关系,除了排序,我只提到了设计模式和linux内核,我是初学者,可能有些概念没弄清,你跟我详细说说呗
akann
2012-12-11 19:30:04 +08:00
@bhuztez 看来你很像一个大学老师。
bhuztez
2012-12-11 19:56:19 +08:00
@akann 我只是不确定你说的OOP是buzzword OOP还是true OOP,如果你认为的OOP是buzzword OOP那你很难回答这两个问题,如果你认为的OOP是true OOP,那么你回答问题的时候至少思路是清楚的。尽管从上下文来看,我更倾向于认为你说的是buzzword OOP :-p
akann
2012-12-11 20:29:36 +08:00
@bhuztez 我不知道你所说的习惯用语OOP和真实的OOP的严格定义是什么,我理解你的真实的OOP的意思可能是smalltalk那种纯OOP,而习惯用语OOP是指普通口头意义上的OOP的话,我的意思确实是指习惯用语OOP,但我不清楚你为什么断定我很难回答你的两个问题。

从你说的话看来,你也是反对用算法来招人的,这一点我是和你有相同看法的。

实际上无论我们是否把这个问题争论得多么清楚,都不能改变我们现在使用的语言的大多数框架都是建立在OOP基础之上的,我的意思是现在的公司确实应该重视如何使用设计模式这类OO设计方法甚于使用各类算法,因为算法记不住是可以翻书查的,但设计模式你如果不下苦功夫去理解,查书都没有办法。
wyx
2012-12-11 21:56:52 +08:00
面试官叫我写1-100的加分,用迭代和递归分别写,我表示不会,然后面试官自己写给我看,想想真是幸运:P
bhuztez
2012-12-11 22:05:17 +08:00
@akann 因为当OOP是个buzzword的时候,很多语言分别实现了不同的东西,他们都管那叫OOP。

可以认为,Smalltalk是一系列不同的语言,而不是一种语言。Smalltalk 80那个其实也和true OOP没啥关系。最初的时候,Smalltalk 7?(不知道到底是1还是2或者都是)是受Simula 67和PLANNER启发,设计出来的一种语言(好像也没真正实现过),主要特性包括Pattern Matching,Message Passing以及类似后来被称作Actor Model的东西。Alan Kay管那叫实现了OO。他们还开发了另外多种Smalltalk。后来公开的Smalltalk 80就是其中的一种Smalltalk,Alan Kay在很长一段时间内都在鼓吹OO,于是很多人都以为公开出来的那个Smalltalk 80就实现了OO,而现在看上去是连Alan Kay自己在很长一段时间内都搞混了(说OO的时候Smalltalk就指最初的那个,说Smalltalk的时候Smalltalk就指Smalltalk 80了)...

Alan Kay一开始对OO的定义并不是很明确,只是在Simula 67的quasiparallel process的基础上进行改良,可以实现一种容易理解的,可以用来描述某些并发逻辑的模型。Simula 67的quasiparallel process按今天的说法就是coroutine啊。Simula 67里还实现了用于在quasiparallel process之间通信的队列什么的,已经有了一个比较简陋的。或者可以这么说,在1967年,gevent就已经被实现过一遍了。至于怎么改良,改良成什么样,只有一个大概的想法,也没搞清楚哪些是可行的,哪些是不可行的,有没有漏掉了什么。(http://propella.sakura.ne.jp/earlyHistoryST/EarlyHistoryST.html)

* Everything is an object
* Objects communicate by sending and receiving messages (in terms of objects)
* Objects have their own memory (in terms of objects)
* Every object is an instance of a class (which must be an object)
* The class holds the shared behavior for its instances (in the form of objects in a program list)
* To eval a program list, control is passed to the first object and the remainder is treated as its message

后来,Carl Hewitt在Simula 67和PLANNER的基础上提出了Actor Model的形式化定义。但是他的定义还引入了Capability,导致要完全实现非常困难,一直都没有比较好的实现,也就没有流行起来。后来他又提出了CSP,提供了几乎和Actor Model里的Capability等价的功能。这也就是后来的Newsqueak,Limbo,Stackless Python,Go,Rust这一系列语言所谓的并发模型。但是这就不能算OO了,OO的侧重点是Actor Model里的消息模型。

现在流行的语言里面,接近真正的OO的,也就只有Erlang了。如果你了解Erlang的模型了,你就不会觉得 @est 的想法有啥好奇怪的了。如果用我的话来不严格的总结一下的话,就是He who is not an Erlang fanboy, does not understand OO。
akann
2012-12-11 22:39:12 +08:00
@bhuztez 因为我是做软件的,我只知道我要做android软件只能用java或者c/c++,当然也可能scala,但我确实只需要java或者c/c++就能做完全的android软件了,即使我不知道什么是真正的OOP,同理我要做ios软件也只需用 object-c或者c/c++,我也只需用c#就能做完全.net程序了,但是如果我只能使用其他非OOP语言比如Lua,cobol,fortran无论如何是做不出ios程序的,我说的OOP方法更适合我的任务就是指这个意思。

但是如果我要做好这些java,object-c,c++程序,就应该懂得设计模式,因为所有这些语言的基础库比如c++的STL,java的jdk等等都是使用了很多的设计模式,你不理解设计模式,能够深入理解这些基础框架吗,进而设计出自己的框架吗?设计模式显然是OOP方法特有的,你能够将设计模式用于其他过程式语言吗?
akann
2012-12-11 22:54:27 +08:00
@akann 补充一下,设计模式是OOP方法特有的,但也可能将设计模式用于C等非OOP类语言,但即使能用于C语言,仍然属于OOP方法。
yupbank
2012-12-12 02:44:55 +08:00
多用几种语言,基本上就能明白设计模式是怎样的一种东西

-,- python农表示,偶尔日一次java,认识到设计模式干嘛的了。。

ps:感觉面试面算法啥的,就和找工作要看你本科毕业一样(新人)

以后进去可能高中生不到的水平就能干的事。。。门口就得把个关,入场券。。不然凭什么招你呢
bhuztez
2012-12-12 10:21:00 +08:00
@akann 你真觉得COBOL,FORTRAN什么的不算OOP语言?现实是

* BASIC
* COBOL
* CommonLisp
* Fortran
* Forth
* Matlab
* Perl
* PHP
* Prolog
* S/R
* PL/SQL

这些设计目标完全不同的语言都号称支持OOP,或者至少有一种实现号称支持OOP。当他们在说OOP的时候,他们其实指的是不同的东西,有时候是思路上,有时候是实现上。

当你在说OOP的时候,OOP就是那个buzzword,好像一个语言支持OOP就比别的语言高级了一点。你能说清楚什么算是OOP语言?难道你说的过程式语言和你说的OOP语言,真的有显著的区别么?
lch21
2012-12-12 11:24:50 +08:00
冒泡排序都不会,还编啥程呀

见过不会炒鸡蛋的厨师么?
akann
2012-12-12 13:44:06 +08:00
@bhuztez 休战,最近拉下不少工作了。
timonwong
2012-12-12 13:58:02 +08:00
@akann
模式无可避免。只是由于模式的实践性相当强,直接照搬模式不太可取,同一类问题可以有不同的模式来解决问题。比如Java世界常用Dispose Pattern,跑到C++来就有RAII,C#,python又有using/with statement,这些实践性的东西在单一的设计模式的书中都是没有的。


"但即使能用于C语言,仍然属于OOP方法"
模式(Patterns)只是解决问题的方法论。
举个简单例子:thread pool是一种pattern, 用C语言实现一个thread pool, 不见得要OOP。

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

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

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

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

© 2021 V2EX