想请教一下大家对1软件架构与2基于已有开源产品内选择|的经验和理解。
这两天个人小项目的总体思路逐渐清晰,已进入基于功能模块的思路设计阶段,个别模块的核心功能已经写出最小实现的伪代码。
此时很自然的操作就是在各大平台特别是github上找前人做过的东西,尽量减少盲目试探和重复劳动,得到的结果与预想的一样:
- 自己能想到的功能基本上全有多个开源实现,而且不少是成熟商用的。
- 这些产品全都自称一体,内部构造复杂,功能众多,不可能快速了解其实现方式(至少是底层的和独到之处),只能通过官方教程和文档一点点摸索。
通过这两个情况我想到的是:
A. 从需求定位到原型实现的软件开发模式可能在以互联网产品为主的今天面对大多数项目时已经过时了,而这种模式恰恰是学校教育中的主流并在很多市面上教程内延续或残存。
软件作为服务(SaaS)让IT项目的开发和经营变成了必须要从选择既有产品为突破口。开发部分的多数工作也是基于已有产品进行修改和二次、三次开发。「不知道是否符合工作实际情况?」
B. 如何快速了解已有产品并结合到自己项目需要不只是一个学习方法问题,更是一个元知识管理和走向职业道路的问题。
这种情况下回看自己的小项目好比一个生活在闭塞环境里的人,采集后院里生长的植物辛辛苦苦花了好久做了一个篮子,然后他去城里的市场试图卖他的“创造”,结果发现市场里的篮子从塑料、布料、金属琳琅满目而且与自己相似的“绿色复古”材质的也有但作工更细而且是机械化批量生产。
“软件架构”是一个听起来高端且入门教程很少涉及的内容,我曾用Java、Python和Ruby练习实现了几个常见的设计模式,某种意义上对这个东西有所接触,现在看这个概念的重要性之一体现在所谓的“架构”反映了微观到宏观都贯穿的问题,比如信息流的控制、对计算任务的分解。
有一个比较老的材料,很多类似的都是源于像
Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions
by Gregor Hohpe,Bobby Woolf 2003这种书,按它的划分我至少能用到6种:主从
、管道-过滤器
、代理
、点对点
、事件总线
、黑板
模式,但它们要有机地融合在一起,这就让自己的设计过程充满了挑战:一方面我的要用尽可能简单的东西实现比较复杂的功能然后再扩展,另一方面模糊而交错的软件架构不易让人快速寻找已有产品作为参考。
前面现象2 成熟产品的复杂性我觉得有一个重要的外在原因:原先比较小且功能集中的产品经过市场化推广和各种加工的过程中向外扩展了很多本来没有或者非常次要的功能,再加上系统的整合和技术壁垒(一些东西故意做得复杂,让你看不透、一旦花大力气学了之后转别的费劲)。
大家怎么看,针对缺少经验的基础学习向初级开发过渡的入门者有什么建议?