编程和软件工程有三个主要的区别:时间,规模和取舍。
有一些软件的生命周期比较短,例如创业公司;另一些软件则可能拥有比较长的生命周期,例如谷歌搜索,Linux内核,Apache HTTP服务器。
Hyrum's 定律
对于一个有足够多用户的API而言,你在合同中如何承诺的并不重要,你的系统所有可被观测的行为都会被某人依赖。
以哈希表为例子,我们知道哈希表是不保证顺序的。如果你的哈希的实现返回特定顺序的内容,那么你的用户可能会依赖这顺序,这个就是用户观察到的行为,那么当你哈希返回不同的顺序的时候,肯能就会引起问题,因为用户做了不正确的假定。某些系统可能会引入随机性来保证哈希访问返回的顺序也是随机的,但是这样做的结果是你的用户可能对这种随机性产生依赖,当切换哈希的行为的时候,又会有新的问题。
为什么不能消灭“变化”?在软件工程领域,众所周知,变化是不可避免的。我们不会为了变而变,变一般是出于成本考虑,更好的功能,赚更多的钱。
软件组织具有复杂的规模。
你的代码是可持续的,这需要代码必须在它的生命周期内以可控的成本来进行修改。而这个成本通常会随着时间非线性增长。这里的成本除了人力成本,还包括其它资源,例如CPU,内存,存储,带宽等等。
代码本身也会上规模。所以组织中一切生产和维护代码的活动必须能随着成本和资源的消耗上规模。
有些策略不能上规模,例如要求你的用户适应你的新版本的变化,分支合并等等。
好的策略应该能够规模化。例如使用CI运行你的测试,使用论坛来进行知识分享。
左移 Shifting Left
左移就是指在开发流程中的早期(左)发现和解决问题的成本要低于之后发现和解决。
如果我们理解了编程没理解了维护软件的生命周期,如果当我们规模化,有了更多的工程师和更多的特性的时候,还能够维护软件后,剩下的就是做决策了。
成本包括哪些:
保持工程师高兴,专注和投入可以极大的提高效率,会很大程度的影响其他因素。
决策应该基于数据,有些数据很清楚明了,但不是所有的东西都可以量化和预测,有些决策很难获得明确的数据。对于没有明确数据支持的决策,需要依赖经验,领导力和协商。
基于数据的决策可能会出错,因为可用的数据可能存在问题。所以承认错误是必要的。因为随着时间推移引起变化的不仅仅软件系统,还有数据。
软件工程和编程是不一样的,但这并不意味着软件工程比编程更具价值。编程是直接生产代码,而软件工程是一系列的策略,实践,工具,以使得代码在其生命周期内,在跨域组织和团队中,能充分利用。