“计算性需求”:用数学知识建模之后,算法用于高效地(时空复杂度)实现该需求。战术层面。
“业务性需求”:用业务知识建模之后,OO、设计模式和框架用于灵活地(健壮、可维护)实现该需求。战略层面。

用户需求包含上述两种需求,实现两种需求所需建模和实现的知识和经验不同。
约瑟夫问题、公交路线搜索、关键词联想、内存管理、进程控制、图像处理、模式匹配等属于“计算性需求”,追求的是高效率,智能化,代码高度专门化,缺乏响应变化的灵活性。
工作流控制、发帖回帖、报表等属于“业务性需求”,对效率需求不高,基本上是让原来由人做(想)的事情自动化、电子化、无纸化,对效率和智能要求较低。

一般的企业ERP、网站等只需要“业务性需求”。
一般的企业应用(博客、介绍用网站、论坛等),和底层较远,和“应用层”较近。所以只要能实现“业务性需求”就行了。不过不少人干习惯了“业务性需求”,就懒得去学习“计算性需求”的技能了。

框架优化或者创造新框架,需要数学知识建模,尽量抽出不需要变化的部分并高效解决(这属于“计算性需求”)。之所以要抽取不需要变化的部分,就是因为算法高度专门化,缺乏响应变化的灵活性。
顶尖级别的像MS、IBM,成功并不是光靠算法,而是靠“抽出不需要变化的部分并高效解决”的能力。Windows的高层部分,例如注册表、服务管理什么的,其实应该算“业务性需求”。底层部分如内存管理、文件系统、硬件驱动,属于“计算性需求”。
所以MS和IBM不是不重视架构,而是他们还涉及底层。至于先设计底层还是先设计架构,似乎没有什么规定,可以同时进行。

两种需求各有作用。但不可否认,中国软件业很多人都去搞“业务性需求”了,可能是因为好找工作。但“计算性需求”迟早要搞的。
计算性需求是国家的科技,业务性需求是国家的经济。都去当经济学家、企业家,学MBA、EMBA,赚很多钱,的确有助于国家的经济,但不能当成立国之本。美国日本经济强科技强,中东的石油出口国家很有钱,科技一般。国际地位一目了然。

PS:
或许学框架不需要先学算法,但肯定要学数学知识建模方法。
就像程序员不需要知道三角函数和差化积公式,但肯定要知道什么地方要用这个和差化积,怎么用。

学C语言而不学编译基础,例如不理解while(*pszStrA++ = *pszStrB++);为什么是字符串拷贝,永远开发不出高效程序,因为不可能理解都用CACHE的程序为什么一个比另一个低效。如果一个程序员不打算开发高效程序,那他是个好程序员吗?

OO技能和框架使用的门槛比较低,虽然要做到融会贯通也很难,或许比精通算法更难。但注意到Banq认为“大学生不要学面向过程、算法和数据结构,应该直接学OO”,否则“会跳不出来”,这属于危言耸听,认为大学生的“跳出框框”的能力不行。

一个要澄清的部分:会用各种排序、最短路搜索、红黑树等经典算法,并知道这些算法的实现方法,并不算是懂算法,顶多是个学舌鹦鹉。学会这些东西,就像学会使用一个框架的API,一点技术含量都没有。面对一个问题,能够造出自己需要的算法才算算法高手,这一算法肯定是书上没有的。例如一个经典问题,给定一个N * M的矩形墙壁,用1*2的瓷砖去贴,有几种贴法。算法到了高手境界,和架构到了高手境界一样,已经无招胜有招了。就算你没听说某个算法,你也能想出这个算法。

我的感觉:熟悉C++的要转Java很容易(C++也是OO的,也可以培养面向对象思维和设计模式),熟悉Java的要转C++很难。这里Java单指程序设计,不涉及框架API;C++也不包括WindowsAPI和MFC。

原因何在呢?


[该贴被seedjyh于2010-06-03 09:12修改过]

呵呵。支持benq的观点。还不理解的人可以去学学计算机是如何实现的,从可见的物理硬件到微观世界。都学明白了,心里有基础了,再学编程。
我们直接学OO了。

人类文明的发展都是基于前人的总结,不然大家从出生都从原始开始吧。
有些技术直接拿来用就可以了。不必要先学会这些技术。

人不太可能面面具精的,即使全能,精力也不够啊,不然一个公司只雇一个员工好了。

[该贴被michaelx于2010-06-08 15:04修改过]

支持你,banq老师,潜水半年多了,第一次发帖。
我们生来就是被周围的环境打磨,或者说被周围的人所催眠,以至于我们都不是我们自己,而是社会的一颗棋子。所以,能有自己独立的思想,不受外界干扰的人实在是太少,如果大家都墨守成规,哪来的软件创新和发展?书上的东西都是错的,因为那是旧的,我们读书应该读它的思想,而不是去学他所谓的知识,而学习知识的目的也是为了思想的升华。我非常钦佩banq的这种打破常规的思想,也很认同OO的重要性。
看了很久,才看完本贴,实在是精华!
这些问题,我想,每一个做软件开发得人都思考过。但是,迷茫的人还是很多。上大学时,我也是着迷于算法,数据结构书看了N遍,各种算法记了又记。但是工作以后,发现工作中能用的到的算法不是很多。大多数时候,都是复制,粘贴,修改,测试,OK了。可是是不是算法就没有用了呢?我想不是,我们现在讨论的,是一个基础与应用的问题。一个行业,一个国家,不能没有基础研究的人,否则就只能在技术上跟着人家走,被牵着鼻子走。但是也不能缺少应用研究的,毕竟现实应用不是像基础算法抽象的那么精确,还是需要变通的。
也就是说,两种研究都是有前途的。没有什么好坏,优劣之分。关键在于我们是否真的下功夫去做了。就像楼上很多人说的那样,我们做不了操作系统,就是基础研究的不好,那么持这种态度的同志们,是不是专心去研究计算机基础,争取做出我们自己的高水平操作系统或是搜索引擎算法。另一方面,应用研究的同志们,可否放弃闭门造车(不是指全部),真正的去了解用户何时何地何需求,做出更好的ERP。
嘴上说说,讨论一下还是比较简单的,真正去做,就难了。我看到帖子后半部,基本上banq先生(照片判断,如误请指正)基本没发言,他在用他的实际行动,做了他想做的。那么我们要研究基础的同志,是不是也可以这样默默的去研究呢。有人说,中国人(国籍是中国)不可能获得诺贝尔和平奖(两岸和平)以外的奖项了。我觉得很悲哀,但是如果我们不静下心来专注自己的研究,那么就真的会这样了。
鄙人是做对日软件外包的。一个被很多人瞧不起的行当。但是,我确感觉从日本公司,日本人身上学到很多东西。在一个大项目里,都会有技术高手,一言不发,狂写代码,解决各种技术问题。但是也不乏业务精英,对要实现的业务一一精通。这样,大家才能把项目做好。精通自己的专长,与同事精诚合作,才是成功之道。
还想说说软件蓝领,其实,我就是软件蓝领。经常8点半上班,22点半下班。别人上8小时班,我们休息8小时。但是,怎么办呢?蓝领也是一种生存呀,谁让我们技不如人呢?这个世界需要高端人才,也需要我们这些低端的庸才呀。总是有人要去重复的写代码,测试。这些人曾经也梦想过去当大师,可是现实就是这样,只能普普通通的工作,养家。可能会被人说没有理想,但是我想说,现实更重要。可能,对于大多数普通人,做好本职工作,才是安身立命之道呀。
跟大家学了很多,有乱七八糟说了一些。呵呵,第一次上班发帖,如坐针毡呀!
[该贴被passport于2010-08-25 12:59修改过]
不会基础,像banq说的拿来主义。做项目可以,真正做研发不行。我想中国出不了自己的语言也就是这样了,太多人仅仅局限于拿来就用,对于里面的细节全然不知。当真正底层出了问题,束手无策。banq你的思想教会人家找份工作是可以,但要想真正做研发,必须扎实的学好基础,研究底层实现。
我坚信计算机技术的基础是数学,如果你只会OO和Java,永远都是代码工人。DDD看起来很好,现实世界的问题,比计算机复杂100000...倍,绝不是一种方法论可以搞定的。

学计算机一定要有坚实的数学基础,必须深入理解计算机原理、结构、操作系统理论、数据结构、算法、分布式系统原理、网络协议……

至于OO,DDD,设计模式,那都是以编程经验总结出来的,你没有写过十万行以上的代码,给你讲也是白讲,绝对不要相信一个框架一种思维模式能搞定所有问题。

学Java的同学,满脑子都是OO,设计模式,十分必要学习C、Python、Lisp这些语言,至少要了解,知道除了OO还有许多其他方面的设计思想

用Java做web的同学,更要花时间学习HTML、CSS、JavaScript、HTTP协议,学学PHP、RoR

总之,不要把自己局限在Java和OO上。

解决現實問題才是王道。什麽模式框架,你的武器而已。怎樣用好你的武器,要靠基礎知識,最後無招勝有招才是最高境界。
现在是2011年2月9日 21:28:43。
这个帖子好友生命力,当然也要感谢Banq,要是其他论坛早就结贴了吧。不知3年前的大牛们能预测到现在java的处境吗?3年过去了,话题依然火热。我这个本科生怀着对大牛们的崇敬看了两天,终于看完了,可对未来依然迷茫啊。
现在想想,很有意思的是,我们学校的两个方向恰好是这场争论的最好诠释,一个是网络方向,就是J2EE和中间件技术,另一个是多媒体方向,其实就是游戏引擎开发(绝对的算法,那个教材厚的……),还有什么好争得的呢,国家两方面的人才当然都是要的喽,大家各司其职,就是最好。
说的直接点:在历史的车轮下,一切都是尘埃……
banq老师在对牛谈琴,鉴定完毕!
仁者见仁、、妖者见妖、、
这个事情讨论得好奇怪。不过我自己的经验,喜欢技术的人总有一种渴望,希望搞明白这个东西是怎么实现的。你非要认为大家只需要学习面向对象,不需要去学习数据结构企不强求?其二,都是面向对象的语言,其设计细节也是不一样的,有时候会影响性能。其三,不同的语言各有各的优点,就像脚本语言,如果你那么膜拜面向对象很符合人类的习惯,脚本语言企不更满足这一要求。我是多么希望,我写一句我要吃饭,程序就自动去做饭啊。不了解编译原理,你又如何改进语言语法以达到这一要求呢。第四,环境不同,适用于企业级的java,到手机系统android,其细节就要改了。都是java语言,有些类就不能用。第五,世界是复杂的,有时候还会反复,我清清楚楚地记得信息管理软件当年多么膜拜客户机服务器模式,现在不也有富客户机模式吗?有些东西大家没进入前只看到好处,使用深入后又发现缺点。面向对象也是。搞不定哪天又发现面向过程的好处了(现在说不定已经有了).软件也是复杂的,每个人学习编程的道路也是多种多样的,适者生存,不适者被淘汰。你在你的企业级应用java领域,你的说法是有一定道理的,但是这种道理不能上升,不能神化到一切领域
首先支持 banq 的技术平台,给大家提供了好的讨论环境! 至于基础技术和模式的关系的孰优孰差,说白了,各自存在的意义不一样! 没有语言算法基础知识搭建不起来抽象层次的模式。
还是引用一句 Steve McConnell(代码大全作者): "在计算时代的早期,程序员基于语句思考编程问题。到了20世纪七八十年代,程序员开始基于子程序去思考编程。进入21世纪,程序员以类为基础思考编程问题"
[该贴被orangeyts于2011-11-03 22:27修改过]