自 序
PREFACE
开发软件离不开编写代码,但仅仅具备编程的技能也还不足以胜任开发软件的工作。这就好比一个人会烧砖、砌墙,但要造一间可供人居住的屋子,他还得了解屋子的结构、不同房间的功能、水电管线的敷设、墙面地面的装修等方面的知识。对软件开发人员来说,编程领域的知识往往是最受关注的,它们确实也可以分为多个层次:编程语言本身的知识(如C、Java),编程范式和思想,面向对象编程和函数式编程,开发框架的知识(如Spring、AngularJS),等等。一个新人若想以软件开发为职业,大概需要阅读的范围就会集中在以上方面。然而,当他开始项目开发时,就会发现还有许多实际的问题需要考虑和解决,软件开发并不像编程教材上的代码样例和习题那样专注于某个算法或思想。
不妨考虑一个典型的业务系统,它是一个图形用户界面的程序,因而需要采用某种GUI框架开发界面;用户在界面上的操作通过事件机制调用相应的处理程序;用户界面、事件处理程序和体现需求的业务逻辑必须组成某种合理的结构,否则系统会随着功能的增加迅速变得难以理解和维护;系统越大,组件越多,越需要适当地保持它们之间的依赖关系,合理地应用接口是关键;这个业务系统显然比所有数据都来自即时输入的计算器复杂,许多信息要往返于数据库;最后,这是一个多用户使用的系统,必须适应不同用户的权限需求。编程语言和范式的理论知识没有触及这些实际的问题,开发框架虽然涉及实践,却又局限在具体的方案中,不易让人获得对知识的一般理解。
软件开发实践中遇到的各个方面的问题往往缺乏系统的理论,程序员凭着各自的理解动手,或者知其然而不知其所以然,或者每个人的所以然有出入甚至矛盾。例如,针对接口编程就是尽量多用接口吗?事件驱动编程的本质是什么?怎么样算是应用了MVC架构?极简主义就是越简单越好吗?文档型数据库和关系型数据库的优劣各体现在什么地方?基于角色的存取控制系统是如何理解权限的?在主流的软件开发理念之外能否另辟蹊径?客户端和浏览器之间的竞争究竟意味着什么?对这类实践中涉及的概念和遇到的问题,如果追根溯源,多思考一些是什么、为什么和怎么做,达到融会贯通的理解,既对实际开发有帮助,又有益于在纷繁多变的技术浪潮中看清技术的本质、把握解决问题的方向。
本书从以上思路出发,逐个讨论软件开发实践中的重要主题。第1章辨析对象间的依赖和针对接口编程。第2章讨论事件驱动编程的方方面面。第3章分析MVC架构的思想和实现。第4章比较图形用户界面的一些相关或对立的思想和技术,并介绍极简主义潮流。第5章分析热门的文档型数据库,并和关系型数据库做对比。第6章讨论存取控制的各个环节,分析基于角色的和基于属性的存取控制的优缺点。第7章介绍快速的Lotus Notes程序开发。第8章探讨软件的兴衰和客户端的潮流。顺序上靠前的章节内容具有一般性,不会依赖其后的部分,靠后的章节有可能应用前文的知识。编写风格上每章力图从主题的源头和本质入手,遵循逻辑层层展开,尽量全面地遍历主题涉及的方方面面。书中代码为正在讨论的理念和问题服务,只是示意性地勾勒出核心的部分,无关和繁冗的部分被省略。
野人献曝,未免贻笑大方;愚者千虑,或有一得可鉴。
是为序。
作者
2018年5月