`
1000copy
  • 浏览: 74702 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

为何引入Code diff?

阅读更多

2011126

13:52

 

  2510考古队挖出一块硬盘,记录这2010R公司的代码他们从redgate公司的档案柜内找到 reflector反向出来了这些代码,发现古人已经在编码方面注意标准化并且使用工具自动化这个过程。大家惊呼,哇咦,古人已经很聪明了。

 

我们的重构流程推行了两年。经过一段时间对重构流程的梳理、慢慢的建立和抛弃一系列的思想,然后不断的简化、淬炼、抽象,逐步的形成到具体的实践方法。本文就是我的简要的思考过程。我希望以此帮助大家了解我们在高质量编码方面的价值观,从而更好的实践新的流程。

 

重构是有效果的。我从这个过程中得到几点看法:

<!--[if !supportLists]-->1.       <!--[endif]-->对产品。经过有意识的、有节奏的代码重构,代码往往变得更加漂亮;产品也变得比较容易维护。维护代码的痛苦有所减轻。

<!--[if !supportLists]-->2.       <!--[endif]-->对个人。部分人养成了重构的习惯,知道一些常用的重构手法,知道如何利用工具来做安全的、快速的重构。code reviewer 本身的进步是最大的。

问题也不少。

<!--[if !supportLists]-->1.       <!--[endif]-->养成重构的习惯的人不多。很多个人的成长看得出来是非常缓慢的,亦步亦趋的。技巧层面的CheckError得到了广泛的应用,而重构技术方面(系统而全面的)并没有得到重视。有时候我也需要问问自己:写出好代码的能力难道真的只有少部分人才能够具备吗?

<!--[if !supportLists]-->2.       <!--[endif]-->代码一旦写成,即使采用系统的重构方法,代价也还是会很大。

<!--[if !supportLists]-->3.       <!--[endif]-->低质量编码的习惯养成了,就更加难以清除。

<!--[if !supportLists]-->4.       <!--[endif]-->Code reviewer现在是非常缺乏的。

 

当前的重构流程好像有些依赖性。这两年的做法一直是:大家写代码,我来做审查,指出方法,然后讨论修改。这样的做法就像是上游进行污染、下游加了一个污水处理厂一样——并且编码者总是不能建立上游治污的意识——甚至支持大家的新看法:“治污是污水处理厂的事情”。于是当代码大量的复制,功能大量的增加、组内成员变多后,以“一个人的力量”来发现问题,提出重构的方案,然后修改的这样的模式是很难走下去的。培训做了很多次,听就听了,真正动手的是比较少的。个案的解决一个个的重构问题,然后希望大家的代码意识得以提升是非常困难的,最后依然是时间问题,大家在排出日程来做这个工作方面总是觉得困难。学习和实践重构是程序员的责任。而现在这一点是如此的困难,以至于我们好像是一个进退维谷的境地!

 

继续,闯出新天地。清理下这些年乱麻般的思路,把它变成可以实践的套路,就是一条:Code Diff

 

做法的关键就是Code Diff Daily(每日代码差别比较)。要点是定期、流程化、轮值。

<!--[if !supportLists]-->1.       <!--[endif]-->定期。每天下班前15分钟就来做。项目组自己有代码高质量的意识,信仰高质量代码的对产品和团队的价值,建立开放坦诚的沟通环境,并且通过Code diff把理念落实到每一天。

<!--[if !supportLists]-->2.       <!--[endif]-->流程化。大家围在一起,通常是面对投影仪,有时候也是看一台电脑。然后,打开Svn Log,把今天提交的代码修改一一比较,查看代码问题,提出改进意见。开放环境的创建首先需要管理服务(Management as Service )

<!--[if !supportLists]-->3.       <!--[endif]-->轮值。Code Review发起人是轮值的。管理者应该为程序员提供更加友善、健康、正面的沟通环境。整个环境不但可以解决代码问题,还能够增进沟通,帮助大家说出想说的,让大家接受可能是难以接受并且习以为常。一句话,把问题摆在桌面上。

<!--[if !supportLists]-->4.       <!--[endif]-->尽可能采用自动化

 

流程就是这样,通过流程让大家更加开放的进行高质量编码。这是一个基础,一个管理服务。但是仅仅有了流程还是不够的。大家唯有理解了我们的价值观,才能让大家得到更多的益处;否则必然是简单的亦步亦趋、有样学样。这是我不想看到的。

 

克服一个拖后腿的“轻浮”想法。有人认为:“指出代码的问题是很容易的事情,人人都可以做到看到别人代码的问题”。这样的观点在我看来是非常轻浮的。重构仅仅在《重构》一书内就有上百的方法,大的原则是消除重复和容易,职责分离等等,小的步骤就非常的多了,遇到一个具体问题,运用这么多的方法,首要是投入和学习、实践,其次是灵活组合多种方法,小步的、安全的达到重构的效果。这些年来,国外的敏捷咨询机构进入中国的越来越多,比如ThoughtworksOdd-e,也有越来越多的公司采用了敏捷,比如ActiveNetwork,华为。而敏捷的一个核心实践就是重构,是咨询公司的主要收入源。而从我接触的一家咨询公司的评价上看,他们的很多客户做的并不好。可见,把重构视为比较简单的事情是过于轻浮的看法。感觉到是一回事,瓜分豆析的执行是另一回事。以前就常常有人说,“你看这个代码真的太,然而让他找出方法,他总是说,“这简直不可能,要考虑稳定,考虑进度...”。切。千人诺诺,不如一士谔谔。拿出妥善的、成套路的方法,并且一以贯之,才是这个王道。

 

观察高效程序员的做法,逐步厌弃低质量代码。我发现越是编码质量高的程序员,越是自然的排斥不良的编码。和他们的交流代码,常常发现他们会很愤恨的嘟嘟囔囔:“你看嘛,干嘛啰嗦,换个方法多简洁;这里的写法根本没有必要;还有这里,命名和大小写都成问题”。因为厌弃,才会逼着自己写出优秀的代码来,逐步养成新的习惯,“下笔如有神”,自然的写出漂亮的编码来。而整个团队的所有人都应该向这个信仰高质量代码的程序员一样,信仰高质量代码的对产品和团队的价值,相信自己在今天的投入会在未来得到回报。回报可能包括产品的稳定性、可维护性,个人水平的提升,产品的竞争力提升,balabala

 

程序员的心理过程需要关注。很多程序员在遇到其他人编写的编码时,也会有“做好我自己就行“的鸵鸟思想。看到不好的代码,常常不好意思直接的指出来——怕伤了面子,也怕被拒绝。理解我们的价值观,就是为了释放程序员的能力,让大家可以自由的、不怕争论的提出自己的做法、精炼自己的实践。

 

从源头狙击。以往的做法都是编码后检查,然后提出修改。存在更好的工具来帮助code reviewer从程序员一开始编码就强制规范。如TFS可以在提交代码前自动检查Naming规范,复杂度。再比如TeamCity可以查找重复代码。Reviewer 可以不必花费太多时间查验基本代码规范,做更有价值的架构分析和重构。程序员可以清晰的看到规范的存在,如同编译错误一样很容易定位这一类问题。

 

代码像水一样,但是你无法保证你就是下游或者上游——他们是相关的,任何人不能保证今天某人写的代码,不会明天流到你这里来,而你也不能保证你的代码某天不会流到某人那里。所以,建立一个开放坦诚的环境是必须的。建立一个高质量的价值观,并通过Code Diff 分解到每一天是必要的。

 

 

详细的做法,请看  Code Diff. ,我们做了

 

广告:最后,推荐大家上新浪微博@1000copy,这是我的微博。

暗号是:让Code 能够Diff,让Tech也可以Diff。让大家技术成长也分解到每一天的闲言碎语上:)。

0
3
分享到:
评论

相关推荐

    diff_code

    在IT行业中,`diff_code`通常指的是比较代码差异或版本控制中的差异分析。这个主题主要与编程和软件开发流程相关,特别是在使用版本控制系统如Git时。`Pascal`标签则表明我们将关注的是用Pascal语言编写的代码差异...

    diff-match-patch 各平台源码

    6. **应用场景**:diff-match-patch广泛应用于版本控制(如Git)、文本编辑器(如VS Code)、协同编辑系统、文档比对、代码审查等多个领域。它的高效和灵活性使其成为处理文本差异问题的理想选择。 在实际项目中,...

    在vue里使用codemirror遇到的问题

    由于其强大的功能和灵活性,越来越多的前端开发者在Vue项目中引入CodeMirror来提升编辑体验。 二、在Vue中使用CodeMirror的问题与解决方案 1. 引入问题 新版CodeMirror不再将codemirror.js文件放在lib目录下,而是...

    diff-check:提醒检查git diffs生成的内容

    `diff-check`是为Git设计的一款实用工具,它旨在帮助开发者更加谨慎地处理`git diff`输出的内容,提高代码质量。这个工具特别适合团队合作项目,因为它可以作为一个代码质量检查器,确保每次提交的更改都经过了充分...

    vc_diff:使用显示源代码的差异-Show source code

    在开源领域,"vc_diff"这样的工具尤为重要,因为开源项目通常由全球各地的贡献者共同维护。开发者们需要一种方式来查看和理解其他人的更改,以确保代码质量并避免引入新的错误。因此,"系统开源"的标签强调了vc_diff...

    Diffutils详解

    Diffutils的引入就是为了解决这个问题。 首先,我们需要理解Diffutils的基本工作原理。它通过对比新旧数据集,计算出最小的改动(插入、删除、移动),然后将这些改动以最少的操作传递给适配器,让适配器进行局部...

    Fine-grained and accurate source code differencing

    在这篇文章中,作者通过引入一个在抽象语法树(Abstract Syntax Tree, AST)粒度上计算编辑脚本的算法来解决这个问题,这个算法包括了移动动作(move actions)。算法的目标是计算出既短又接近原始开发者意图的编辑...

    the-current-time-of-the-code.zip_Time

    C++11引入了`&lt;chrono&gt;`库来处理时间: ```cpp #include #include int main() { auto now = std::chrono::system_clock::now(); std::cout () ; auto future_time_point = std::chrono::system_clock::...

    SourceCode:VueReact源代码-vue source code

    本资源“SourceCode:VueReact源代码-vue source code”提供了这两个框架的核心源码,对于深入理解它们的工作原理、优化代码以及进行自定义扩展具有极大的学习价值。 Vue.js是一个轻量级的JavaScript框架,以其易学...

    react-source-code:React.js原始解析-js

    React.js 是一个由Facebook开发并维护的开源JavaScript库,用于构建用户界面,特别是单页应用程序。...这个压缩包中的"react-source-code-master"包含了React库的源码,是你深入研究React的宝贵资源。

    jquery图片横向滚动

    接着,我们需要引入jQuery库。可以使用CDN链接,或者下载到本地引用。确保在页面`&lt;head&gt;`部分引入: ```html &lt;script src="https://code.jquery.com/jquery-3.6.0.min.js"&gt;&lt;/script&gt; ``` 然后,添加自定义...

    react-source-code:React源码调试

    当组件状态改变时,React会计算虚拟DOM的差异(称为Diff),然后只更新实际DOM中必要的部分,这称为“Reconciliation”过程。 4. **生命周期方法**: React组件有多个生命周期方法,如`componentDidMount`、`...

    react-source-code-analysis:React原型分析

    当组件的状态改变时,React会创建一个新的虚拟DOM树并比较新旧树的差异(称为“Diff”算法),然后只更新实际DOM中发生改变的部分,而不是重新渲染整个页面。 - **生命周期方法**:React组件有不同的生命周期阶段,...

    matlab_envelope-_code.zip_matlab例程_matlab_

    由于差分法可能会引入高频噪声,因此在差分计算后,还需要对结果进行平滑处理,比如应用滑动平均滤波器,以减少噪声对包络计算的干扰。 其次,希尔伯特变换是一种更为精确的包络提取方法。与差分法不同的是,...

    嵌入式常用工具-代码比较

    5. **Visual Studio Code(VS Code)**:作为流行的代码编辑器,VS Code内置了Git版本控制,提供了直观的代码比较视图,同时支持大量插件,使得比较和合并工作更为便捷。 6. **GitHub Desktop** 和 **GitKraken**:...

    React-Source-Code:React原始阅读笔记

    当组件的状态改变时,React不会直接操作实际DOM,而是先计算出新的虚拟DOM树,并与旧的虚拟DOM树进行差异比较(称为“Diff”过程),然后只对实际DOM做最小的修改。这种优化策略大大减少了DOM操作的次数,提高了性能...

    jQuery图片跟随鼠标左右摆动.zip

    在这个代码中,我们设置了水平和垂直方向的偏移量(`xDiff`和`yDiff`),以便图片不会完全紧贴鼠标,而是有一定的距离。`speed`变量决定了图片摆动的速度。`mousemove`事件处理器计算出鼠标的位置,并根据当前时间...

    react-source-code-mark:React源码阅读记录

    React是JavaScript库,用于构建用户界面,特别是单页面应用程序。...React-source-code-mark这个项目可能包含了作者在阅读React源码过程中的笔记和理解,对于深入理解React的工作机制和优化技巧有着重要的参考价值。

    react-source-code:react原始码学习笔记

    当组件状态改变时,React会计算虚拟DOM的差异(Diff算法),然后仅更新必要的实际DOM节点,以提高性能。 2. **JSX语法** JSX是JavaScript的一个语法扩展,允许在代码中混写HTML。React使用JSX来声明UI结构,这使得...

Global site tag (gtag.js) - Google Analytics