上学期在读在职MSE时,遇上了位不错的优秀导师,教我们的面向对象设计课程;一个学期下来,收获良多,虽然这个学期不教我们里,但依然和我们有书信的来往交换问题的看法,指点我们。前几天,一位同学去信询问几个问题,其中一篇是关于最近网上很流行的一篇文章,也是讲“程序设计经验”的
(​​​http://bbs.zol.com.cn/index20060131/index_27_26468.html​​​),其中老师给出了他的一些看法,偶觉得也挺客观的,故摘取之并收藏之,虽然各人有不同的看法,但作为学生,也能从中看到今后努力的方向

1)你已经认为C++和汇编语言都是很简单的语言,并能够自如地运用;
-------------------------------------------------------------------------------------------------
老师:  这两类语言(注意不是说两种,而是说两类)的确非常重要,你必须熟练地掌握运用以备开发不同类型的应
用软件。但认为很它们很简单则是太自负的感觉(特别是一种实用的高级语言),其实语言设计要求太多的知识,并且
背后还有着重要的程序设计方法支撑。你最好不要认为你已经彻底掌握了某种或某类语言,即使你已经能熟练地运用它
们,你也未必理解了它们背后的设计思想与实现技术。熟练掌握Java语言也是必要的,因为在分布式应用开发中其地位
挺重要。在掌握某一类语言中的一种(譬如C++语言)之后,应该能比较容易地转向同类语言的另一种(例如C#、Java、
Python等),否则我认为你还是没有很好地掌握这类语言。
-------------------------------------------------------------------------------------------------

2)你能够在30分钟之内想到正确的五子棋AI算法设计思路和方向;
-------------------------------------------------------------------------------------------------
老师: 这倒未必,还不如说能在5分钟之内能够找到在什么资料上可以学到现成的博弈算法。
-------------------------------------------------------------------------------------------------

3)你完全理解STL为什么这么重要;
-------------------------------------------------------------------------------------------------
老师: 不是去理解STL为什么这么重要,而是除了会使用STL之外,能够知道在STL的设计与实现之中使用了哪些
技术,而这些技术你日后的什么软件开发中可以借鉴。对于C++而言是STL,对于Java而言就是JFC/Swing、JDBC、
流系统、多线程、网络编程等技术,重要是理解其中的各种设计思想与设计模式。
-------------------------------------------------------------------------------------------------

4)你能够独立地解决所有的编译与链接问题,哪怕你从来没有遇到的问题,你也不需要询问任何人;
-------------------------------------------------------------------------------------------------
老师: 这是肯定的,是最基本的动手能力衡量标准。只要多做一些程序,自然就解决了这一问题。
-------------------------------------------------------------------------------------------------
 
6) NTFS磁盘格式标准。
-------------------------------------------------------------------------------------------------
老师: 这个我也不懂。我觉得不必将它作为一个必要的选项。在使用NT或XP时,我只需知道NTFS与FAT32的外部
特性差异就够了;如果要开发更底层的应用,我会再找书看NTFS的结构。当然,操作系统中关于文件系统的基本概
念一定是一种必备知识。
-------------------------------------------------------------------------------------------------

7) 在集合论的角度思考算法问题;
-------------------------------------------------------------------------------------------------
老师: 不懂这句话想说什么。离散数学中展示出来的抽象数学思想的确挺重要的,能理解并运用之,是一种锦上
添花的东东,但并不是雪中送炭的家伙。
-------------------------------------------------------------------------------------------------

8)能够理解一个简单的驱动程序,能够理解一个简单3D交互程序;
-------------------------------------------------------------------------------------------------
老师: 能够理解可能是不够的,需要曾经实践过。譬如在操作系统课程的学习中(尽管我并不教这门课),我一
直主张学生必须真正动手去做一个或去改进一个现成的设备驱动程序、功能调用、进程调度、内存管理、文件系统
之类的程序。
-------------------------------------------------------------------------------------------------
 
10)你完全理解COM的设计思想,尤其能够理解COM为什么要设计成这样;
-------------------------------------------------------------------------------------------------
老师: 应该放在分布式计算的背景下学习软件组件技术,这样才会有更深刻的理解。建议以CORBA为对象学习分布
式对象技术,以EJB为对象学习组件模型。
-------------------------------------------------------------------------------------------------

11)当我说到虚函数的重要作用时,你不会急着去找书来翻;
-------------------------------------------------------------------------------------------------
老师: 准确说应该是面向对象程序运行时多态性的重要性,虚函数仅仅是C++实现动态绑定的手段(写下这些东西
的家伙可能特喜爱和熟悉C++),如果是Java语言则每一个方法默认都是动态绑定的。面向对象的设计几乎都是建立
在运行时多态性的基础上,所以我认为它才是面向对象所表现出来的最重要的特征(诸如封装、信息隐藏、数据抽象、
继承、类属等也很有用,但与运行时多态性相比,差远了)。能把我们课堂上讲的多态性内容搞懂了,自然对这些东
东有了深入的理解。衡量你有没有真正弄懂多态性的标准是,你是否已经学会了采用面向对象的方式进行软件设计(譬
如正确地使用设计模式)。
-------------------------------------------------------------------------------------------------

12)你能够说出C++为什么比其他语言优秀的理由,
-------------------------------------------------------------------------------------------------
老师:  呵呵,老毛病,应该是说出面向对象语言或方法的优点,而不仅仅是C++语言。我倒不是这么看,我通常
的观点是:如果你能够说出C++语言、Java语言、C#语言等你正在使用的语言的毛病,以及你在使用中用什么方法克
服(或至少绕过)这些毛病,那你就比仅仅能说出这些语言的优点要强多了。