复杂度如何更好分解
几个月前的一篇Blog——软件复杂度的构成中,已经对软件开发复杂度的构成有了分析。
The Boeing 747-400 “Jumbo Jet” has six million parts, of which half are fasteners. It contains 171 miles (274 km) of wiring and 5 miles (8 km) of tubing. Seventy-?ve thousand engineering drawings were used to produce the original 747 design. It is a very, very complex machine, and because of this complexity, no single person can have a complete understand of how a Boeing 747 works. Yet, this is a machine ?rst designed in the 1960s — modern aircraft have multiplied the level of complexity many times over. The only approach that will allow human beings to design such incredible machines is to break them down into smaller, more understandable modules.
除了问题域带来的复杂性之外,还有其他两个维度:
1)软件开发是多个个体通过分工协作进行智能产出的Process,人员的组织和Process的风格,当团队Scale后引入了人为因素的复杂性
2)技术作为工具,在不断发展更新,技术和工具的使用的同时也会引入额外的复杂性(配置和约定,不同语言的集成,操作系统/数据库/应用服务器/框架,更多的成为黑盒子,将程序员划分为不同的家族)
通过分而治之是解决复杂性的王道:通过抽象和松耦合集成,下放复杂性到内聚的子模块,上层很简单下层充分自治。
在软件开发团队管理方面,ScrumMaster只是Coaching的角色,让团队自己决定技术方向实现并承担失败的责任;在工具方面,Eclipse将各种IDE功能下放到松耦合的不同插件中去,而自己的OSGi+Plugin内核相对简单。