在软件公司从事咨询服务近20年,并对过百人进行了技术面试,有些想法不吐不快。
软件行业相对于其他传统行业来说十分年轻,不论美国还是中国的高校,计算机软件专业大多起源于数学系、核心课程的设置大多围绕如何能够最大限度、最有效地利用计算机的硬件资源,比如内存、CPU等等。然而,随着硬件技术的发展,原来昂贵稀缺的这些硬件资源变得十分便宜。花费了很大力气实施高效但却十分复杂的算法所得到的硬件资源方面的边际收益开始变得微不足道。
另一方面,绝大多数的计算机软件专业的本科毕业生在工作中需要解决的是各个行业的业务问题。如下图所示,最左边代表这个毕业生具备的知识、能力,以及所掌握的软件开发工具。而最右边代表软件开发工作的最终结果。大多数情况下, 这个毕业生会使用从学校学来的编程语言,比如Java,来编写代码、实施具体的解决方案。这种方式的问题是,整个过程中通用的纯计算机软件的问题每次都要重复(Reinventing the Wheel);实施的结果,软件工程的部分和具体问题解决方案的部分搅在一起,无法重复利用。
另一种方式是尽量使用成熟的商业软件,比如ERP中的SAP、数据库中的MySQL,等等。如下图所示,将从左到右、即从所使用的基本工具到最终解决方案的实现分成两部分,其中左边的部分实质上是纯软件的问题、即从各个行业的业务问题中抽象出来的共同的问题;而右边部分才是每个业务项目具体问题的解决部分。
这样的模式存在几个特点:
- 左边部分的问题由应该由软件公司来解决。软件公司产品的直接用户是程序开发员、而不是业务人员。比如,SAP和Oracle数据库是不可能直接被不懂 IT的业务人员所使用的。由于这一部分是从各个行业的具体问题中抽象而来,软件公司的产品才有可能由成千上万的用户使用来得到验证。从这一点上来说,印度只能说是一个软件服务大国,而根本谈不上软件大国。
- 右边部分是完全独特的业务问题,我们的毕业生真正能展现创造性的空间即在于此。然而这里需要的最重要的技能很多情况下并不是算法或者数据结构,而是对业务流程的了解、解决问题的创造性,以及与不同的利益相关人的沟通能力。
环顾软件以外的其他行业,对过去的案例进行深入分析、并从中学习,无论对个人还是行业群体都是非常有效的学习手段。在商学院、医学院、法学院、军事学院和体育学院中,案例的分析是学习内容中最重要的、也是最引人入胜的部分。然而,尽管在本人的软件服务工作过程中客户最享受的部分是“讲故事“,却没有在美国和中国任何高校的计算机系的网站上公布的授课内容中找到软件项目实施的案例分析。
因此,建议高校的计算机软件的课程设计应区分解决纯软件问题和解决特定的业务问题。并针对后者完成课程建制、丰富具体案例。