已剪辑自: https://mp.weixin.qq.com/s/GhYfH3ndRsOWHFyAnFVvPQ
没有什么东西是建在石头上的,一切都是建在沙子上的,但我们必须把沙子当做石头来建筑。— Jorge Luis Borges
编程≠软件工程
编程:编程是生产代码的直接行为。
软件工程:软件工程是一组必要的原则、实践方法和工具,使得代码在跨团队协作和使用时能更加的有效。
编程和软件工程的三个关键差异点:时间,规模和权衡。
- • 首先,对于一个软件工程,工程师需要更多的关注时间的流逝和可能的需求变更。
- • 其次,软件工程需要更多的关注团队规模和集体效率,无论是其使用软件的组织,还是生产软件的组织。
- • 第三,软件工程师,需要做出更多复杂且高风险的决策,通常是基于对时间和增长的不精确的预估。
软件工程的3个特性
软件工程不是编程,软件工程是随着时间而不断集成的编程工作。
软件工程在时间、规模和权衡3个维度上的表现特性分别为:
软件工程的可持续性:在软件的预期生命周期内,在业务和技术的双重发展中,都需要有能力做出对有价值的变化的有效反应,这就是软件的可持续性。
软件工程的规模性:软件工程师一项团队工作,团队的协作,包裹更多人的参与,甚至多个团队的协作,都会到来新的问题。在规模增加时,如何能够更好的交付有价值的系统。
软件工程的复杂性:随着组织的成长和项目功能的扩展,软件系统的生产是否能够变的更加高效,持续交付的成本是否可控。
时间与变化
在软件的预期生命周期上,在低点和高点之间显示某个地方出现了一个转变:某个项目必须开始对不断变化的外界做出反应。
对于任何一个一开始就没有计划升级的项目,这种变化可能是非常痛苦的,原因主要有三点:
- \1. 正在做的一项任务,还没有完成,但已经有更多的隐含的假设被注入程序之中。
- \2. 尝试进行升级的工程师机会不太可能有此类任务的相关经验。
- \3. 升级的规模往往比平时要大,一次进行累计了几年的大升级,而不是渐进式升级。
一个系统,不但要完成第一次大的升级,且要达到能够可靠地一直保持这种持续的最新状态,才是其长期可持续性的根本。
可持续性要求对所需变更的影响进行持续的规划和管理。
海勒姆定律(Hyrum’s Law)
海勒姆定律:
当一个API有足够多的用户时,在约定中你所承诺的已不再重要:所有在你系统里被观察道德行为,都会被一些用户所依赖。
这是软件系统的熵增:随着时间的推移,对变化和维护的讨论,必须要意识到海勒姆定律。
根据热力学第二定律,熵永不减少,但并不意味着我们不应该去尝试提高功效。
在软件工程中,我们不能完全的避免海勒姆定律,但我们可以去减轻它。
目标不是“没有变化”
对于大多数系统,在足够长的时间内,系统的所有内容都可能会发生变化。
规模和效率
左移思维
一个事实:在开发工作流程中,越是在早期阶段发现问题,越是能降低成本。
譬如,在一个功能的开发作业流程的从左到右的时间线上,从概念和设计开始,到代码实现、评审、测试、提交、金丝雀部署和最终的生产部署等。在这个时间线上,将问题的发现移动到更早的左边,会比等到更晚阶段在发现,成本要低很多。
安全性检测不能推迟到开发过程结束才开始,这被称为安全左移。道理很简单,如果产品的安全性问题在产品发布之后才被发现,那这个问题带来的损失可能会更大更多。
没有一个流程或工具是完美的,我们只有假设一个纵深的防御方法,来尽可能早的发现更多的问题。
权衡和成本
成本不仅仅是资金上的,成本更多是为软件成功所做的努力,可能涉及的主要因素有:
- • 财务成本(金钱)
- • 资源成本(CPU时间)
- • 人员成本(工程工作的人员投入)
- • 交易成本(采取行动的成本是多少?)
- • 机会成本(不采取行动的成本是多少?)
- • 社会成本(这种选择对)
所有的成本总结为:一个组织的健康,不仅仅是看账户里面有多少钱,还要看组织成员是否感到有价值和富有成效。
对于像软件工程类似的,高创意、高收益的领域,“人”才是限制性的因素。让工程师(创意型人才)保持快乐、专注和投入所带来的效率很容易影响其他的因素。
最后
3个起发点:
- • 编程不等于软件工程。软件工程是在时间、规模和权衡决策上的系统性工程;
- • 软件工程的三个特性:可持续性、规模性和复杂性;
- • 软件工程中的2个法则:海勒姆定律 和 左移策略。