写在之前:今年年初给自己安排了任务,每个月写一遍感悟性的文章。促使自己沉淀并思考。 这篇文章的内容本来只是一些想法, 想想还是记下来。几年以后自己再读这篇文章也许是另一种体会吧


编程和软件工程之间有三个关键的区别:时间、规模和权衡

1. 了解时间变化

When a novice is learning to program, the life span of the resulting code is usually measured in hours or days. Programming assignments and exercises tend to be write- once, with little to no refactoring and certainly no long-term maintenance. These programs are often not rebuilt or executed ever again after their initial production. This isn’t surprising in a pedagogical setting. Perhaps in secondary or post-secondary education, we may find a team project course or hands-on thesis. If so, such projects are likely the only time student code will live longer than a month or so. Those developers might need to refactor some code, perhaps as a response to changing requirements, but it is unlikely they are being asked to deal with broader changes to their environment.

大意:当新手学习编程时,编码的生命周期通常以小时或天为单位。编程作业和练习往往是一次编写的,几乎没有重构,当然也没有长期维护。这些程序通常在初始生产后不再重建或再次执行。这在教学环境中并不奇怪。也许在中学或中学后教育,我们可以找到团队项目课程或实践论文。如果是这样的,项目很可能是学生们的代码生命周期超过一个月左右的时间。这些开发人员可能需要重构一些代码,也许是为了应对不断变化的需求,但他们不太可能被要求处理环境的更大变化。

上面的这段话是很多人都有亲身经历, 在中国一个软件维护5年以上很少.一个连续工作多年的开发人员可能有10年的开发经验,鲜少或根本没有维护任何预期存在超过两年的软件的经验。web应用和移动应用有可能更短。可见很多的开发人员都是短期代码的开发人员。短期项目的开发人员对系统维护和系统升级并不了解。

实际上一些项目周期很长,甚至是无生命截止日期, 比如京东商城,天猫超市,金山WPS等。参与一个长期项目会有更多的不同感受,下图展示了项目生命周期和升级的重要性的。当做一个短期项目时,比如一个创业项目,项目会考虑快速完成, 升级并不重要,因为一段时间后项目就废弃了。当项目时间变长以后,为了提供更好的性能,扩展性,安全性等因素,“系统升级”变得十分重要。低点和高点表明某处有一个过渡,当到达一定阶段的时候,项目必然要对外界变化因素(需求变更、技术更新等)做出反应

随着时间拉长应用系统必须得到升级, 有一项定律就变得尤为重要。 海勒姆定律(Hyrum's Law)也叫隐式接口定律, 维基百科中对此定律的解读是:有足够数量的API用户,您在公约中承诺的并不重要:系统的所有可观察行为都将取决于某人。 也就是说当API有很多的使用者时,API的某些说明和未说明的内容都会变成依赖的部分。

维基百科的解读怎么理解呢 ?举一个例子,我参与的某个项目中有个API接口, 当接口检测某些业务异常的时候,就会返回一些异常描述。调用者一般都会直接提示描述信息。 当使用此API接口的人多的时候,总会出现有人因某个特殊原因做一些特殊处理, 比如用正则或者其他匹配规则将某些提示归类然后再实现自己的业务。 虽然这个API接口中没有声明的有哪些异常,但这个异常一旦发生变化,就会影响到某些调用者的业务。这就让系统升级变得很难。很多情况下牵一发而动全身

海勒姆定律是软件随时间变化必然会发生的,不可避免。因此需要时刻意识到,API总会有人用意想不到的方式来使用,所以尽可能的降低影响范围

2. 规模与效率

One of the broad truths we’ve seen to be true is the idea that finding problems earlier in the developer workflow usually reduces costs. Consider a timeline of the developer workflow for a feature that progresses from left to right, starting from conception and design, progressing through implementation, review, testing, commit, canary, and eventual production deployment. Shifting problem detection to the “left” earlier on this timeline makes it cheaper to fix than waiting longer, as shown in Figure 1-2.

大意:我们看到的一个普遍真理是,在开发人员的工作流程中发现的问题,通常可以降低成本。考虑开发人员工作流程的时间表,从左到右,从概念和设计开始,通过实施、评审、测试、提交、金丝雀和最终的生产部署来进行。在此时间线之前,将问题发现转移到“左侧”会使修问题解决成本更低,如图所示

当规模扩大后,项目管理往往比项目开发更能提高效率, 软件项目管理又不得不提到“左移原则” 。即 安全问题不能推迟到开发过程的最后阶段,必须要求“在安全上向左转移”,提交之前通过静态分析和代码审查发现的bug要比投入生产的bug成本更低。在开发过程的早期提供高质量、可靠性和安全性的工具和实践是许多基础架构团队的共同目标

下图是一个反例,这是一年的外网问题统计,当我们减少了项目流程以达到快速交付了项目的目的。开发阶段人员自测不足,测试阶段没有完整测试,自从化测试范围不不等因素造成项目后期BUG数量飙升, 维护成本飙升,团队疲于奔命排查问题,客户抱怨问题太多质量不足。  这个项目并不是软件工程“最佳实践”,它违反了左移原则。虽然从交付时间上看软件开发的项目效率提高了,但是项目整体效率却是降低的。

3.权衡

Finally, the most precious asset of a software organization—the codebase itself—also needs to scale. If your build system or version control system scales superlinearly over time, perhaps as a result of growth and increasing changelog history, a point might come at which you simply cannot proceed. Many questions, such as “How long does it take to do a full build?”, “How long does it take to pull a fresh copy of the repository?”, or “How much will it cost to upgrade to a new language version?” aren’t actively monitored and change at a slow pace. They can easily become like the metaphorical boiled frog; it is far too easy for problems to worsen slowly and never manifest as a singular moment of crisis. Only with an organization-wide awareness and commitment to scaling are you likely to keep on top of these issues.

大意: 最后,软件系统最宝贵的资产代码库本身也需要扩展。如果你的构建系统或版本控制系统随着时间的推移呈超线性扩展,也许是由于内容增长和不断增加的变更日志历史,那么可能会出现无法持续的情况。会持出现许多问题,如“完成完整构建需要多长时间?”、“拉一个新的版本库需要多长时间?”或“升级到新语言版本需要多少成本?”都没有受到有效的监管,并且效率变得缓慢。这些问题很容易地变得像温水煮青蛙;问题很容易慢慢恶化,而不会表现为单一的危机时刻。只有在整个组织范围内提高意识并致力于扩大规模,才可能保持对这些问题的关注。

这段原文中,对“系统最宝贵的资产是代码库” 这句话有很深的理解,之前的公司理有个系统运行了近十年。(没有升级的原因有很多,这里不做讨论),因为框架限制,导致一些核心业务开展受到了影响,因此系统必须要升级。 公司领导作了一个决定,他们决定在最新框架下重新开发一套新的系统。2年后系统终于上线,上线后问题又程指数增长。升级整体成本巨大

我想一个核心软件完全抛弃代码库重新开发的做法并不一定是最佳实践,舍弃原来的代码,也许是认为重写比维护容易吧。但舍弃了原有代码库其实就是舍弃了积累的经验,我认为软件工程中经验是很宝贵的财富。 一蹴而就的完成系统替换也不是最佳实践, 开发周期很长看不到落地。


前一篇:进入软件行业的几点建议

《Google软件工程之道》软件工程随想相关推荐

  1. 《Google软件测试之道》目录—导读

    内容提要 Google软件测试之道 每天,Google都要测试和发布数百万个源文件.亿万行的代码.数以亿计的构建动作会触发几百万次的自动化测试,并在好几十万个浏览器实例上执行.面对这些看似不可能完成的 ...

  2. 现代软件工程讲义 1 软件工程概论

    现代软件工程讲义 1 软件工程概论 几乎所有程序员都知道 "数据结构+算法 = 程序 " 这句名言.但是在实际的学习和工作中,也有不少人产生了疑问. 例如: 1.       我写 ...

  3. 《Google软件测试之道》- Google软件测试介绍

    <Google软件测试之道>- Google软件测试介绍 2015-05-21 目录 1 质量与测试   2 角色   3 组织结构   4 爬.走.跑   5 测试类型   相关链接 与 ...

  4. 【推书】重新定义公司--来自Google运营之道

    <重新定义公司>--来自Google运营之道 未来企业的成功之道,是聚集一群聪明的创造人才,营造合适的氛围,充分发挥他们的创造力,快速感知客户的需求,愉快地创造相应的产品和服务.这意味着组 ...

  5. 北京大学 软件工程1 软件 软件工程 软件开发 软件工程框架

    软件的定义 重新定义软件 新一代信息技术 区块链 创造性思维 软件的特点 软件的种类 支撑软件:VC++,PyCharm等 应用软件:QQ,微信 软件工程的起源 软件开发的三个阶段 软件工程概念的提出 ...

  6. 浙江大学计算机学院的软件工程和软件学院的软件工程哪个好,软件工程专业最强十校,浙大第二、清华第五,这所师范类院校很意外...

    软件工程专业是2002年国家教育部新增专业,主要随着我国互联网行业的快速发展,以及社会的经济建设的需求,这个专业也是成为一大热门,许多知名院校都相继开设了此专业,作为一大热门工科专业,毕业出来的薪资都 ...

  7. 女孩学计算机软件工程,女生学软件工程好吗 就业方向有哪些

    软件工程是一个很热门的专业,男生学该专业的人数比较多,但是不少女生听说软件工程好就业也心动了,那么女生报考软件工程好不好呢,毕业后能做什么工作呢? 女生适合学软件工程专业吗 软件工程专业之所以适合男生 ...

  8. 《Google 软件测试之道》摘录

    最近刚刚看完<Google 软件测试之道>,受益颇多,遂记录下: 只有在软件产品变得重要的时候质量才显得重要 第一章:谷歌软件测试介绍 角色介绍 SWE(Software Engineer ...

  9. 《Google软件测试之道》读书笔记

    Google软件测试之道 像google一样进行软件测试 软件测试介绍 少则清晰,测试人员的稀缺导致测试资源很昂贵.(不要招聘太多的测试人员) 质量不等于测试 开发对质量负责(预防行为,不是检测) 卫 ...

  10. 从《构建之法:现代软件工程》走进软件工程的学习

    什么是软件工程 什么是软件工程?它跟一般的计算机学科有什么不同?BarryBoehm的定义是:运用现代科学技术知识来设计并构造计算机程序及为开发.运行和维护这些程序所必需的相关文件资料.可见软件工程更 ...

最新文章

  1. html 显示状态条,怎么控制html5 video 控制条显示和隐藏时间
  2. Visual Studio的调试技巧
  3. jdk类加载器执行步骤_[JDK 11] jcmd中的类加载器层次结构详细信息
  4. c语言题库325,2012年二级C语言笔试模拟325
  5. php观察者模式和注册数模式,PHP观察者模式
  6. 微信小程序自定义组件(二)
  7. linux命令大全 美pdf,Linux编程命令详解_10331298_(美)Richard..pdf-得力文库
  8. linux系统 mysql日志文件太大。造成数据库无法正常启动怎么解决
  9. Spring4学习笔记-泛型依赖注入
  10. python迭代器生成器
  11. Linux性能测试(UnixBench)(bench)一键脚本
  12. Ps cc 2014 安装与错误修改
  13. html导航折叠与展开,html展开收起
  14. mybatis sql语句格式化 trim prefix suffix
  15. vue form表单数据提交
  16. 【C语言】C语言中基础操作符详细讲解
  17. 英语从句(英语兔学习笔记)
  18. 深入JVM-垃圾回收
  19. 量化投资的神秘世界,聪明人玩的游戏!
  20. 常见的性能测试类型有那些?

热门文章

  1. Python | 使用 Python 分析《我不是药神》豆瓣电影短评
  2. 以前的互联网时代,其实就是一个以互联网技术为主导的年代
  3. LED流水灯切换中断的替代法
  4. oracle数据库查看所有表和注释,oracle数据库当前用户下所有表名和表名的注释
  5. JDK8 合理设置JVM内存参数
  6. 职场心理学-学习笔记
  7. 层次分析,critic以及topsis
  8. NOI 2005 聪聪与可可 题解
  9. [No00001F]阅读速度如何快一点、再快一点?-不知道读啥?试试这些电影剧本!...
  10. 你看过的知识最多、含金量最好、质量最棒的书是什么?