《Google软件工程之道》软件工程随想

news2024/9/20 16:55:22


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


 

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

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年后系统终于上线,上线后问题又程指数增长。升级整体成本巨大

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于遗传算法的自主式水下潜器路径规划问题(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

2022/11/18拓展班上机课

Vs的使用 新建项目 新建源文件 关闭scanf_s和printf_s检查:project -> 属性 -> C/C -> 常规 ->SDL:否 char* str"..."出现”"const char *" 类型的值不能用于初始化 "char *" 类型的实体“错误&#xff…

2022.11.17补题祭

前言: 考完期中考试了!!生物逆袭了!!全年级前十(可能是因为题目太简单我比较细心吧)但还是错了一些不该错的题目......(生物惨痛87分) 感觉这次期中考试情况良好&#…

荧光标记PEG衍生物——Fluorescein-PEG-Azide,FITC-PEG-N3,荧光素peg叠氮

荧光标记PEG衍生物——Fluorescein-PEG-Azide,FITC-PEG-N3,中文名为荧光素-聚乙二醇-叠氮,其所属分类为Azide PEG Fluorescent PEG。 Fluorescein-PEG-Azide的分子量均可定制:荧光素-peg 20000-叠氮/Fluorescein-PEG 5000-Azide、…

47-用户和权限管理

47-用户和权限管理用户的管理和相关管理命令用户的基础概念用户UID区分用户类别创建用户- useradd修改用户- usermod删除用户- userdel修改用户密码- passwd实验:用户的管理文件用户组的基础概念用户组GID用户组分类创建组- groupadd修改组-groupmod删除组- groupde…

qt 样式表 qss

Qt样式表是一个可以自定义部件外观的十分强大的机制﹐除了那些能够通过子类化QStyle更改的外观,其余的都可以使用Qt样式表来美化。 实现办法:调用setStyleSheet 函数,其中styleSheet一般通过读取配置文件.qss实现。 void setStyleSheet(const QString&a…

volatile如何保证可见性

在Java中, volatile关键字可以保证变量的可见性,如果我们将变量声明为 volatile,这就指示 JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。 Java内存模型: 1.Java所有变量都存储在主…

关于java语言当中的this关键字

/*** 关于java语言当中的this关键字:(其内存图见下图)* 1、this是一个关键字,翻译为:“这个”* 2、this是一个引用,它是一个变量,this变量中保存的内存地址指向了自身,this存…

APISpace接口推荐

APISpace 上面有各种类型的API,短信类、天气环境类、快递物流类、数据智能类等等,并且所有的API都提供的免费的调用次数,这么多的API肯定有你中意的!!!我们超多的热门API推荐给大家: IP归属地A…

CUDA与cuDNN安装教程(超详细)

前言 windows10 和win11安装 CUDA ,首先需要下载两个安装包 CUDA toolkit(toolkit就是指工具包) cuDNN 用于配置深度学习使用 官方教程 CUDA:Installation Guide Windows :: CUDA Toolkit Documentation (nvidia.com) cuDNN&…

ADMIN云计算系统管理

云计算系统管理一、inux简介Unix/Linux发展史操作系统 —— UNICS,后改为UNIXLinux版本及应用Red Hat系列版本二、Linux系统的安装三、Linux预备知识Linux目录结构四、Linux基本操作获取命令行右键“打开终端”命令行提示符pwd — Print Working Directorycd — Cha…

01-微服务探讨(摘)

1. 前言 1.1 微服务目的 有效地拆分应用,实现敏捷开发和部署,最终的目标是实现敏捷开发和部署,实现的方式是围绕业务能力*有效地拆分应用*。 微服务就是从各种角度,包括组织的、技术的等来阐释怎样有效地拆分应用,相对…

SSM-Spring

Spring Framwork 1. 核心概念 1.1 IoC控制反转 inversion of control控制反转 使用对象是主动由外部提供对象,此过程对象创建控制权由程序转移到外部。 Spring 提供IoC容器,用来充当IoC思想中的外部。负责创建和初始化等工作,被创建的对象再…

04-HTTPS证书格式及转换

PEM格式的证书文件(*.pem)由Base64编码的二进制内容和开头行(-----BEGIN CERTIFICATE-----)、结束行(-----END CERTIFICATE-----)组成,支持使用EditPlus等文本编辑器打开。本文介绍了将不同格式…

[附源码]java毕业设计教室用电控制系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

数据库的备份和还原(slqserver)

数据库的备份 1.语法&#xff1a; BACKUP DATABASE { database_name | database_name_var } TO <backup_device> [,...n] [ WITH{COPY_ONLY| NAME {backup_set_name | backup_set_name_var }| { NOINIT | INIT }| DESCRIPTION { test | text_variable }| PASSWORD { …

双端队列(双端bfs)解决边权只包含0和1的最短路问题

电路维修 达达是来自异世界的魔女&#xff0c;她在漫无目的地四处漂流的时候&#xff0c;遇到了善良的少女翰翰&#xff0c;从而被收留在地球上。 翰翰的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障&#xff0c;导致无法启动。电路板的整体结构是一个 R行 C 列的网…

关于 re.sub 部分替换的解决办法

关于 re.sub 部分替换的解决办法写作背景问题重现解决办法代码详解结尾写作背景 最近本菜鸡遇到一个问题&#xff0c;我想将字符串中某一部分替换成指定内容&#xff0c;而且为了定位到要替换的内容&#xff0c;所以使用正则的时候还需要前后一些字符作为锚点&#xff0c;这可…

linux下基本命令

linux下基本命令一、linux相关快捷键二、linux下内部命令和外部命令2.1 内建命令2.2 外部命令2.3 内建命令和外部命令对比2.4 命令类型查看方法2.4 内建命令和外部命令帮助三、man手册四、相对路径和绝对路径五、pwd和cd命令六、mkdir创建目录七、rmdir删除目录八、linux文件类…

JMeter如何自定义HTTP组件

JMeter是一个优秀的开源项目&#xff0c;我们可以在jmeter的官网了解到如何使用和如何二次开发&#xff1a;Apache JMeter - Apache JMeter™ 因工作需要&#xff0c;最近做了一个JMeter自定义的http组件&#xff08;其实就是在http的基础上加了点东西而已&#xff09;。现就该…