编程和软件工程有三个主要区别:时间、规模和权衡。
#时间和变化
有些软件生命周期短,比如创业公司;其他软件可能生命周期比较长,比如Google Search、Linux内核、Apache HTTP服务器。
赫伦定律
对于一个拥有足够用户的API来说,你在合同中如何承诺并不重要。你的系统的所有可观察到的行为都将被某个人所依赖。
以哈希表为例,我们知道哈希表不保证顺序。如果您的哈希实现以特定的顺序返回内容,那么您的用户可能依赖于这个顺序,这是用户观察到的行为。然后,当您以不同的顺序散列内容时,Ken可能会导致问题,因为用户做出了不正确的假设。一些系统可能会引入随机性,以确保哈希访问返回的顺序也是随机的,但结果是,您的用户可能会依赖于这种随机性,并且在切换哈希行为时会出现新的问题。
为什么“变”不能被淘汰?在软件工程领域,众所周知,变化是不可避免的。我们不会为了改变而改变。改变通常是为了成本考虑,更好的功能和更多的钱。
#规模和效率
组织具有复杂的规模。
您的代码是可持续的,这要求代码在其生命周期中必须以可控的成本进行修改。而这种成本通常会随着时间非线性增加。这里的成本包括人工成本之外的其他资源,比如CPU、内存、存储、带宽等等。
代码本身会放大。因此,组织中所有生产和维护代码的活动都必须随着成本和资源的消耗而增加。
有些策略是不能放大的,比如要求用户适应新版本的变化,分支合并等等。
好的战略应该是能够规模化的。例如,使用配置项来运行您的测试,并使用论坛来共享知识。
左移Shifting Left
左移的意思是,在开发过程的早期(左)发现和解决问题的成本低于后期发现和解决问题的成本。
#权衡和成本
懂编程就不懂维护软件的生命周期。如果我们能够在规模扩大、拥有更多工程师和功能时维护软件,剩下的就是做决定了。
成本是多少:
1.财务成本,金钱
2.资源成本,中央处理器
3.人工成本,工程师人工月
4.交易成本,你需要采取什么行动?
5.机会成本,不做怎么办?
6.社会成本,这对社会有什么影响?
让工程师开心、专心和投入可以极大地提高效率,并极大地影响其他因素。
决策应该基于数据。有些数据很清楚,但并不是所有的事情都可以量化和预测。有些决策很难得到明确的数据。对于没有明确数据支持的决策,需要经验、领导力和谈判。
基于数据的决策可能会出错,因为可用数据可能存在问题。所以承认错误是必要的。随着时间的推移,不仅仅是软件系统,还有数据。
#软件工程VS编程
软件和编程不同,但并不意味着软件工程比编程更有价值。编程是代码的直接生产,而软件工程是在跨领域组织和团队中充分利用代码生命周期的一系列策略、实践和工具。