让“山大王”做技术决策
把样本程序拿出来进行讨论就是在更大的空间内制造一个平台,加强更大层面的沟通和交流,甚至是争辩,以提高“山大王”们的水平,这是一种组织结构形式的“放权”,避免了CTO由于脱离一线的实践,而引起的技术决策问题。
以行业应用软件开发为主体的软件企业,面临着严重的技术组织困难。由于服务对象分散,它的管理有点像医生给病人看病,当病种快速变化,患者背景日趋复杂时,看病的流程和使用技术方法虽然类似但并不相同,其可能存在的最大问题是交流太少、各自为政。在软件企业内部,我们通常有一定的组织体系,典型组织结构是部门和项目组,样本程序的技术形成于这种组织之内。虽然很多企业也有CTO和研发中心之类的角色和机构,但是由于服务性质和专业分类的差异,很难统一控制这种分散的特征,无论从组织权力义务划分上看,还是从业务决策角度来看,总裁、部门经理、项目经理都是权力的主轴。在技术决策方面,我们面临着权力义务关系相互平衡的困难,这就造成CTO的执行力度是有限的。当部门经理和项目经理业务压力变大时,他们往往会降低对技术决策的重视程度,技术问题的决定权就分散落在了企业内部部门和项目组中的技术“山大王”中了,这些“山大王”在组内是技术上的权威,基础的技术文档一般也是他们的杰作,其格式也是百花齐放。这样做的好处是可以统一局部的方案,坏处是没人与其讨论推敲,甚至组织内部有些工程师觉得多一事不如少一事,懒得与他们讨论,这就使他们自己和各级单位的技术发展遇到了挑战。到底是以CTO们做的决策为主,还是以“山大王”们的决策为主,变成了这类软件企业的一个困境。
从表面上看,CTO和各级技术领导从决策者变成了一个“平台”的维修工,但是协调和引导本身就是他们的主要工作,这其实并不简单!在保证约定一致的基础上,用竞争的方式形成技术决策是此类软件企业技术管理的重要创新,从而带动整体行业应用软件技术水平和管理水平的提高。
更好地利用框架
目前的B/S结构编程有其固有缺点。以J2EE基础开发为例,样本程序要使用各种各样的框架,如Ajax、Struts、Spring、Hibernate等。每一个框架介绍起来都有厚厚的一本书,都需要使用者熟悉它们的每一个使用细节,而且新的框架还在不断涌现和升级,搞得“山大王”们也颇具困惑。他们不禁要问: 不用这些框架行不行?有了它们到底有什么好处和不足? 即使用了它们解决了目前工具的一些不足,但又会带来什么样的副作用?
在缺少沟通的环境下,样本的制定者显得十分孤立。框架这部分内容有时看起来也是最具技术的一部分,很多新的术语和概念往往会使许多初学者似懂非懂,甚至感到十分神秘,部分“山大王”也因为似乎能说一些新的术语而自鸣得意。可实际上,这部分内容介绍的时候恰恰需要的就是通俗易懂,很多所谓的“深奥”,只能是自己没想明白,或者表达不好,因为最好的印证是同样的功能在过去C/S结构和4GL编程时都没有这么复杂。
抄样本程序是我们做样本程序的真正目的。统一的编码与做古诗不同,我们要最大限度地减少编程人(作者)的差异,只反映业务内容本身的差异。抄样本程序也是对传统软件开发方法的一种改良。
框架的应用很多来源于分层概念的使用,典型的说法是MVC和三层结构。一段时间以来,分层的趋势越来越流行,分层的确带来了很多规划上的好处。如结构清楚、发现局部问题或测试容易、“事务”加入规划点明确等,特别是还有层间的协调。但分层也有它的不足,最主要的是数据传递量增大。因为层与层之间要不断交换数据,特别是当这种数据是一个“数据块”时,矛盾就变得更加突出。实际上,这种“数据块”有两个变化方向。纵向是列,涉及领域内容,我们将在下文讨论如何应对它的变化; 横向是行,涉及“数据块”的记录行集合。简单地说就是记录行集合类似“游标”的管理,或是类似动态数组的功能的管理,这就引出了所谓虚拟“数据块”操作问题,它的更复杂形式是涉及整体的领域概念所引出的主/从结构、或更复杂的“数据块”之间的关联,这就要求我们在基础技术层面先解决“数据块”的虚拟操作问题(当这类问题反映在表示层面的时候,也引出了我们称为Portal框架的一部分重要问题)。很多时候使用框架就是为了解决这类问题,因此我们要能在样本程序中看到它的实现机制。而在现实中,我们很多样本程序对框架的使用,只用了其中的最简单的部分。就像拿菜刀当锤子用,一样能钉钉子,但没有充分发挥出菜刀的优势。由于“数据块”问题涉及领域对象和技术支撑的交汇,它应该引起我们足够的重视,特别是“数据块”的传递,全局性存取是样本程序中必须讨论的问题。另一个使用框架的重要原因不是由于分层,而是在于编程的通用性。在我们的应用程序中要大量使用这种特性,即“配置文件”方法。这好比“开着车换轮胎”,也就是说,程序的修改只改配置文件,而不用修改源程序,也不用重新编译、连接和部署。当然这也会引起一系列问题,如配置文件编辑方法及它的有效性和完备性检查,数据类型检查和“反射机制”的支持以及运行效率等。总之,样本程序即使不使用框架,也要看它对这方面内容的处理。