阅读更多

4顶
0踩

研发管理

原创新闻 软件长寿法则,记住这7条

2015-02-10 14:39 by 副主编 mengyidan1988 评论(2) 有6927人浏览
【编者按】软件设计构造师Karan Goel在看到“joe”疯狂的成功之后,为我们总结了7个可以使软件寿命更长的规则,这其中包括:模块化、测试、持续集成、自动化等等。他表示遵循的规则越多,你软件的寿命就越长。下面一起来看看这些规则背后的细节。



以下为译文:

在“joe”疯狂的成功之后,我列出了一个我认为评判好坏软件的清单。尽管这使我对事物看得很清楚,然而对于任何给定的项目,很少有可以遵循这些规则的,包括我自己在内。但是你遵循的规则越多,你软件的寿命就越长。

什么让你远离编写好的代码?“快速打破事物”不是一件好事吗?

不!学习创建软件是一种技巧,任何人都能做到。而学习创建好的软件则是一种艺术,它需要时间、努力和奉献精神。

你希望世界上有更多的SEGFAULTs(段错误)吗?你希望系统管理员因为你的糟糕代码而不断的被电话骚扰吗?你希望你的PM是因为你的软件惹毛了用户而记住你吗?……

我并不反对任何形式的快速发展,因为我相信MVP和第一时间推出的力量。但是在某些时候,当时间充裕时,你必须要意识到低质量代码是走不远的。

当你走进医生办公室时,医生会询问你一系列问题来确定你的病因,他们不会在没诊断的情况下给你开药。

同样,知道在什么时间“写坏了”软件对你很重要。这里有些问题可以很好的帮助诊断我们是否正在编写糟糕的软件:

  • 更新软件花费很多时间和精力吗?
  • 当你做一个很小的改变时,整个系统还会运行OK吗?
  • 你的产品中是否存在碎片代码,并直到用户抱怨的时候才意识到它们的存在?
  • 当你的系统崩溃时你知道要如何做吗——如何深入备份并部署它们?
  • 你在某些事情上花费很多时间吗?比如在不同环境之间转移,或者重复运行着相同的命令……

因此,让我们来看看本文所说的规则有哪些?

1. 模块化
引用
处理有Bug模块的工作要比处理整个代码轻松的多

虽然相比较有史以来最复杂的CPU来说,人类要更加的复杂,但是你不得不承认人类有时也会有无法解决的复杂问题,简单的来说,如果不使用任何计算器,你能告诉我13x35等于多少吗?我打赌你做不到,至少在一个合理的时间内你做不到。

但是我们擅长将复杂的问题逐步的分解为较小的我们能够解决的问题。

13x10是多少?130,13x5呢?即为130/2=65。那么130x3是多少?是390,390+65呢?455。搞定!(PS:或许你会有更简单的方法。当问题越复杂的时候,分解的优势就越显而易见。)

将同样的逻辑运用到软件当中,通过多个文件、文件夹甚至是项目来划分你的软件,将所有相关性的事物遵循MVC或其他变化规律置于一个位置。

这不仅会提高代码的可阅读性,也会让你的调试变得更加容易。在大多数情况下,堆栈跟踪会领你前往非常小的代码集,而不是成千上万行的代码文件。当更新个别模块时,你就不需要考虑整个系统。

2. 测试
我因不经常为我的代码编写测试而愧疚,所有的产品代码都需要测试
我们习惯性的去把测试当作是一种不同于做软件的活动,即便是在学校,你被传授的是C++模块如何工作的,却没人教你它们是如何被测试的。

有些人会告诉你,在开始写实际的应用逻辑之前,首先要做的是编写测试。

何时编写测试各有喜好,只要写了就OK。当你第一次开始的时候,不要试图成为一个测试高手,从简单粗暴开始,如print(add(1, 1) == 2),然后再逐步到测试整个框架。

当你开始测试你的代码时,你将会明白你软件的复杂性。你将开始学习如何将你的软件模块化,以便可能独立测试。所以当你遵循了这一规则的时候,你同时也在遵循第一个规则——模块化。

3. 持续集成

引用
持续集成是伟大的,它们会在你添加broken code(碎片代码)的时候通知你

当你编写测试之后,你需要确保它们是合格的,同时也要确保它们在多种环境下是合格的(例如多版本的Python)。在代码作出任何改变时,你也需要测试。

当你能够手动的做这些时,你可以选择更方便、更快以及更便宜的持续集成平台。

Thoughtworks在CI上有显著的贡献,关于CI,你需要知道:

引用
Continuous Integration(CI,持续集成)是一个开发实践,需要开发者每天数次的频率将代码集成到一个共享的库中,每一次入驻都会被自动构建归档,以便团队提早发现问题。这里推荐两个:TravisCIDrone.io

4. 自动化

引用
有多个脚本需要运行测试和部署?将它们添加在单一的bash脚本中,减少步骤,节约时间

大的项目通常会有一些像引导代码或以不同的方式测试代码等任务,又或者部署到不同的服务器,备份部分的代码等等。

有些人会使用txt文本来存储这些命令,并在需要的时候复制粘贴。如果你是这样的,或许你应该抽个时间来学习一下bash脚本(或Python)。这里有些常见的任务,你应该用到简单的bash脚本来自动化处理它们:
  • 将README.md转换为其他格式(取决于不同的分配路径需求)
  • 自动化测试(包括创建模拟服务器或数据、删除临时文件等等)
  • 开发服务器的阶段代码
  • 部署到产品
  • 自动从属更新(注意,这一点不是总能使用,尤其是当更新会打破现有API时)

5. 信息冗余

引用
冗余版本控制,不要仅依赖于Github,使用多个同步的站外远程,增加信息冗余

当你访问git-scm.com时你会看到这么一段话:

引用
Git是一个免费和开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

在这段话里,分布式是关键。

如果你把代码仅仅托管于Github的话,或许你应该需要反思了。试想一下,但凡Github有一点故障,你的工作流程将会停止。你无法预料到意外何时会出现,所以保持代码的离线备份永远都不会是一个坏注意。这种情况下信息冗余对你而言是一件好的事情。

这里提供一些代码存储的参考:

  • 将代码存储与Dropbox的Codebase文件夹中,自动同步变化;
  • 同时将代码存储于Github;
  • 将最重要的代码存于另外两个地方。

6. 提交

引用
对于经常做出改变、提交和推动的人来说使用合理的提交信息是很有必要的。

看看你提交的历史,你会发现类似这样的信息:

引用
“fixed issue with module”

“fixed”指什么?“issue”又是什么问题?模块化有时哪个?

很多程序员多会把版本控制系统当作是一种备份,而不是维护历史的一种手段,充满这种信息的历史版本是没有用处的,除非你想去做检索文件。

如果你觉得很难去写好一个提交信息,或许可以参考以下几点:

  • 每个提交都应该有一个目的:修复一个缺陷、添加一个新特性或删除一个现有的特性等等;
  • 每次仅提交一个改变;
  • 在提交的信息中应包含问题编号;
  • 提交说明中应对改变作出描述;
  • 编写合理的提交信息,如:“fixed cache being reset on every insert caused by missed access after write. fixes #341”或“added a new form in header to make it easier to collect leads. close #3”。但是千万不要是这样:“remove stuff because why not.xoxo”

7. 计划

制定一个计划为最坏的情况做准备,一旦真的出现问题,你该怎么做?所以在文档中详细的写下步骤。

即便遵循以上六个规则,也并不是意味着你的软件是不可战胜的。说不定由于什么或者是谁的过失,灾难就会降临。所以有一个计划是明智的,一个计划会让你看上去“很聪明”,事实也是如此。

最后


如果您并不相信这几个规则,回答以下两个问题:
  • 你希望一个新人加入你的团队,并能够很轻易的理解现有的代码吗?
  • 重构代码是简单快速的吗?

如果你的回答是“No”,或许你应该再重新看一遍本文,与你的团队分享一下。

最后Happy programming!!!

原文来自:Medium
  • 大小: 35.6 KB
  • 大小: 81.3 KB
来自: CSDN
4
0
评论 共 2 条 请登录后发表评论
2 楼 wlddhj 2015-02-12 14:41
13x10是多少?130,13x5呢?即为130/2=65。那么130x3是多少?是390,390+65呢?455。搞定!(PS:或许你会有更简单的方法。当问题越复杂的时候,分解的优势就越显而易见。)

这个方法简单吗?真是无语,最简单应该是:10x35 + 3x35 = 350 + 105 = 455
1 楼 月白121 2015-02-11 14:26
13*35=455.这个美国佬应该不认识几个中国人。。。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 软件长寿法则 记住这7条

    Goel在看到“joe”疯狂的成功之后,为我们总结了7个可以使软件寿命更长的规则,这其中包括:模块化、测试、持续集成、自动化等等。他表示遵循的规则越多,你软件的寿命就越长。下面一起来看看这些规则背后的细节。 ...

  • 【转】软件长寿法则,记住这7条

    【编者按】软件设计构造师Karan Goel在看到“joe”疯狂的成功之后,为我们总结了7个可以使软件寿命更长的规则,这其中包括:模块化、测试、持续集成、自动化等等。他表示遵循的规则越多,你软件的寿命就越长。下面一...

  • 软件长寿法则——七点

    编者按】软件设计构造师Karan Goel在看到“joe”疯狂的成功之后,为我们总结了7个可以使软件寿命更长的规则,这其中包括:模块化、测试、持续集成、自动化等等。他表示遵循的规则越多,你软件的寿命就越长。下面一...

  • Atitit it业界与软件界的定律 原则 准则 法则 效应

    Atitit it业界与软件界的定律 原则 准则 法则 效应   1.1. 一切都是管理问题定律 1 1.2. 一万小时定律 专家定律 1 1.3. 定律 布鲁克斯定律: 人月=人*月,月≠人月/人 1 1.4. Conway’ s Law”(康威定律 ...

  • 十七条黄金定律

    『美国博士拿破仑·希尔说:...有时别人一句话能在自己的一生中起着决定性的作用,是起到好的作用还是坏的作用,这决定于你对人和事物的判断和处理能力和心态。』 1883年,拿破仑·希尔出生在一个贫寒之家,他...

  • 数据密集型应用系统设计-第七章分布式系统的麻烦-笔记

    这阵子在看数据密集型应用系统设计书籍,自己把书籍比较重要的内容整理出来,基本一天一更,请感兴趣的朋友多多关注! 整个系列会在这几天都发布出来,可以关注一下 链接: 数据密集型应用系统设计-笔记. 文章目录第...

  • HTML5 设计原理

    因为它违反了一条设计原理,这条设计原理就是著名的伯斯塔尔法则(Postel’s Law)。大家都知道: 发送时要保守;接收时要开放。 没错,接收的时候要开放,而这也正是Web得以构建的基础。开发浏览器的人必须...

  • HTML5设计原理【转】

    因为它违反了一条设计原理,这条设计原理就是著名的伯斯塔尔法则(Postel’s Law)。大家都知道: 发送时要保守;接收时要开放。 没错,接收的时候要开放,而这也正是Web得以构建的基础。开发...

  • HTML5设计原理

    因为它违反了一条设计原理,这条设计原理就是著名的伯斯塔尔法则(Postel’s Law)。大家都知道: 发送时要保守;接收时要开放。 没错,接收的时候要开放,而这也正是Web得以构建的基础。开发浏览器的人必须敞开...

  • 学习HTML5必读之《HTML5设计原理》

    因为它违反了一条设计原理,这条设计原理就是著名的伯斯塔尔法则(Postel’s Law)。大家都知道: 发送时要保守;接收时要开放。 没错,接收的时候要开放,而这也正是Web得以构建的基础。开发浏览器的人必须...

  • html5设计原理(转)

    因为它违反了一条设计原理,这条设计原理就是著名的伯斯塔尔法则(Postel’s Law)。大家都知道: 发送时要保守;接收时要开放。 没错,接收的时候要开放,而这也正是Web得以构建的基础。开发浏览器的人必须敞开...

  • 技术大牛谈HTML5设计原理(转载)-…

    因为它违反了一条设计原理,这条设计原理就是著名的伯斯塔尔法则(Postel’s Law)。大家都知道: 发送时要保守;接收时要开放。 没错,接收的时候要开放,而这也正是Web得以构建的基础。开发浏览器的人必须敞开...

  • 级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均

    级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,级联H桥SVG无功补偿系统在不平衡电网中的三层控制策略:电压电流双闭环PI控制、相间与相内电压均衡管理,不平衡电网下的svg无功补偿,级联H桥svg无功补偿statcom,采用三层控制策略。 (1)第一层采用电压电流双闭环pi控制,电压电流正负序分离,电压外环通过产生基波正序有功电流三相所有H桥模块直流侧平均电压恒定,电流内环采用前馈解耦控制; (2)第二层相间电压均衡控制,注入零序电压,控制通过注入零序电压维持相间电压平衡; (3)第三层相内电压均衡控制,使其所有子模块吸收的有功功率与其损耗补,从而保证所有H桥子模块直流侧电压值等于给定值。 有参考资料。 639,核心关键词: 1. 不平衡电网下的SVG无功补偿 2. 级联H桥SVG无功补偿STATCOM 3. 三层控制策略 4. 电压电流双闭环PI控制 5. 电压电流正负序分离 6. 直流侧平均电压恒定 7. 前馈解耦控制 8. 相间电压均衡控制 9. 零序电压注入 10. 相内电压均衡控制 以上十个关键词用分号分隔的格式为:不

  • GTX 1080 PCB图纸

    GTX 1080 PCB图纸,内含图纸查看软件

  • 深度优化与应用:提升DeepSeek润色指令的有效性和灵活性指南

    内容概要:本文档详细介绍了利用 DeepSeek 进行文本润色和问答交互时提高效果的方法和技巧,涵盖了从明确需求、提供适当上下文到尝试开放式问题以及多轮对话的十个要点。每一部分内容都提供了具体的示范案例,如指定回答格式、分步骤提问等具体实例,旨在指导用户更好地理解和运用 DeepSeek 提升工作效率和交流质量。同时文中还强调了根据不同应用场景调整提示词语气和风格的重要性和方法。 适用人群:适用于希望通过优化提问技巧以获得高质量反馈的企业员工、科研人员以及一般公众。 使用场景及目标:本文针对所有期望提高 DeepSeek 使用效率的人群,帮助他们在日常工作中快速获取精准的答案或信息,特别是在撰写报告、研究材料准备和技术咨询等方面。此外还鼓励用户通过不断尝试不同形式的问题表述来进行有效沟通。 其他说明:该文档不仅关注实际操作指引,同样重视用户思维模式转变——由简单索取答案向引导 AI 辅助创造性解决问题的方向发展。

  • 基于FPGA与W5500实现的TCP网络通信测试平台开发-Zynq扩展口Verilog编程实践,基于FPGA与W5500芯片的TCP网络通信测试及多路Socket实现基于zynq开发平台和Vivad

    基于FPGA与W5500实现的TCP网络通信测试平台开发——Zynq扩展口Verilog编程实践,基于FPGA与W5500芯片的TCP网络通信测试及多路Socket实现基于zynq开发平台和Vivado 2019软件的扩展开发,基于FPGA和W5500的TCP网络通信 测试平台 zynq扩展口开发 软件平台 vivado2019.2,纯Verilog可移植 测试环境 压力测试 cmd命令下ping电脑ip,同时采用上位机进行10ms发包回环测试,不丢包(内部数据回环,需要时间处理) 目前实现单socket功能,多路可支持 ,基于FPGA; W5500; TCP网络通信; Zynq扩展口开发; 纯Verilog可移植; 测试平台; 压力测试; 10ms发包回环测试; 单socket功能; 多路支持。,基于FPGA与W5500的Zynq扩展口TCP通信测试:可移植Verilog实现的高效网络通信

  • Labview液压比例阀伺服阀试验台多功能程序:PLC通讯、液压动画模拟、手动控制与调试、传感器标定、报警及记录、自动实验、数据处理与查询存储,报表生成与打印一体化解决方案 ,Labview液压比例阀

    Labview液压比例阀伺服阀试验台多功能程序:PLC通讯、液压动画模拟、手动控制与调试、传感器标定、报警及记录、自动实验、数据处理与查询存储,报表生成与打印一体化解决方案。,Labview液压比例阀伺服阀试验台多功能程序:PLC通讯、液压动画模拟、手动控制与调试、传感器标定、报警管理及实验自动化,labview液压比例阀伺服阀试验台程序:功能包括,同PLC通讯程序,液压动画,手动控制及调试,传感器标定,报警设置及报警记录,自动实验,数据处理曲线处理,数据库存储及查询,报表自动生成及打印,扫码枪扫码及信号录入等~ ,核心关键词:PLC通讯; 液压动画; 手动控制及调试; 传感器标定; 报警设置及记录; 自动实验; 数据处理及曲线处理; 数据库存储及查询; 报表生成及打印; 扫码枪扫码。,Labview驱动的智能液压阀测试系统:多功能控制与数据处理

  • 华为、腾讯、万科员工职业发展体系建设与实践.pptx

    华为、腾讯、万科员工职业发展体系建设与实践.pptx

  • 基于遗传算法的柔性车间调度优化 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

Global site tag (gtag.js) - Google Analytics