background image

从程序员到软件设计师

(2)

在应用软件开发中,软件设计师担当承上启下的角色,也就是把用户的需求,基于应用的问题变成计算机系统中

 

可以解决的问题。设计可以分为功能上的设计和技术体系上的设计,但在实际工作中,这两者很难区分清晰。

彭六三谈到,

NC(用友大型 ERP 系统)是通过总体设计组这个团队共同完成软件设计的。首先要进行产品定义,

规定产品要做什么,以及相关的市场、产品周期和前景等问题,产品所应用的技术方向也会有一些描述。接下来
是总体设计,总体设计要考虑技术架构以及与应用有关的问题。像跨地域的大型产品肯定要选择虑

B/S 架构。每

个模块中功能节点也要定义,应用组件和描述的数据模型也要做出来,诸如形成哪些标准平台,软件如何分布,

 

应用环节都属于总体设计的范畴。总体设计再向下细分就是详细设计。详细设计完成之后就是编写代码了。

对于软件设计,廖恒毅有自己的观点。他认为软件设计师如果面对很复杂的设计,即便将架构设计出来,别人如
何去实现也是很困难的。既然自然语言不如程序语言表达的清晰,他喜欢先用代码的方式把整个框架架构好,并
编写基本的组件和接口代码。这样其他的程序员就可以很方便的复用自己的基础组件,并利用预留的接口添写完
整的代码。做为软件设计师,他能够提供一个平台性的开发环境,让其他的程序员方便的进行扩展开发。这不仅
降低了开发难度,而且节省了大量的重复劳动。复用模块也可以提高系统的稳定性,因为这是经过多次测试的代

 

码。

软件设计师的周围也有很多角色,应用专家对应用需求分析了解的更深。还有技术平台的专家,因为尽管设计师
对技术平台有一定的了解,但对于细节的内容还要请教技术平台专家的,还需要程序员做出原型并进行验证,通

 

过反馈和评估不断完善。最终用户的反馈也是软件设计师非常重视的。

 

软件设计师的要求

做为应用软件开发中最顶层的角色,软件设计师的能力要求更强,除了具备更强的编程技巧能力外,还需要了解

 

系统结构、主流软件技术和软件趋势,同时要具备相当的专业知识。

多年编程经验:既包括在专业领域的经验,也包括在软件工程领域的经验。对于一个构架团队,这些素质要求可
由各团队成员来分别承担,但其中至少要有一名构架设计师能够把握项目的全局。和任何行业一样,经验是最重
要的。软件设计不是纸上谈兵,一个软件设计师首先要是非常好的程序员。软件设计师在编程的时候,用的工具
和普通程序员没有任何差别,但使用深度是绝对不一样的。廖恒毅花了三天写了个处理表格的程序,因为考虑的
很巧妙,代码不到一千行左右,但有人写只是画表格单元的代码就有二千多行,这就是经验的差距。做软件设计

 

的时候,肯定要求是可实施和可测试的,如果没有做过程序员,就无法保证这个设计是可实施并进行测试。

抽象能力:一个程序员刚写程序的时候,无非就是为了解决某个功能而进行代码编写。随着程序编写越来越多,
他对自己所做的应用方面的理解也越来越多。不同的企业有不同的需求,但把这些企业放在一起来看的话,就会
发现他们的一些共性。将这些共性提炼出来,这就是抽象的过程。抽象出来的共性形成的模型可以把这些企业的

 

需求都包含进去,这是做通用软件必须要走的一步。

哪些东西是可以抽象的呢?邓适宜举例说:企业管理软件内部有很多内部票据流程,票据传递有自己的规则,要
把他们内部的关系比较灵活的组织起来,只能把流程做为管理对象,而不能把票据做为管理对象,因为票据只是
一个载体。这样做,整个系统的柔性会更强,产品才能适合不同的企业,让企业可以灵活的控制,取得最好的效

 

益。。

廖恒毅更是将抽象发挥的淋漓尽致。他整个管理流程抽象成不断矩阵运算的过程,软件本身就是做矩阵运算的乘
法器和分解器。其他程序员只需要将具体的业务抽象为以

XML 表达的矩阵,放入到这个矩阵中,利用乘法器做运

 

算就可以了。

面向对象的思想:面向对象是软件开发出现以来最伟大的创新之一,这是每个程序员都追求的,但是否真正掌握
了面向对象的思想,这是需要探讨的。面向对象并不受开发工具和语言的限制。很多程序员在用

C++写面向对象

的代码时候,实际上还是在写

C 代码。甚至使用 C#

 

这种完全面向对象的语言写出来的还是流程化的程序。

很多时候学习面向对象用屏幕上画图的方法,新的形状可以从标准的形状中转化而来,用来学习继承的概念。但
廖恒毅认为这远远不够,因为屏幕上对象相互之间是独立的,是没有作用的离散关系。要真正学习面向对象,就
要去学画表格。表格是由行组成的,同时也是由列组成的,行中又有独立的单元格组成。作为一个行,要整体去
操作这些格,做为列,也要去操作这些格,到底是以行为单位还是以列为单位去操作单元格。如果能把这个搞清

楚,那才表明你对面向对象理解的够深刻。廖恒毅笑着说: 有的程序员在程序中把所有的东西都继承到一起,爷
爷动的时候,孙子跟着跳,孙子动的时候,爷爷跟着晃。实际上,写面向对象的代码,一定不要用太多的继承。

” 

最关键的是如何传递消息和产生动作,以及考虑各个模块之间通过什么接口来联系,而不是再继承。