草庐IT

团队如何推进代码重构工作

fmrober 2023-03-28 原文

认识重构

  本人所在的技术部有很多的产品,面向不同的用户,产品的建设过程是依赖于需求推动的。当需求明确之后,往往会伴随快速的开发,并且因为开发人员的经验,导致不同的代码模块会有不同的代码质量。当产品在演进过程中,发现不得不重构的时候,往往就已经到了非常难的境地。而重构带来的代码清晰,结构清晰,质量和稳定性还有效率都更提高的方式,能够使产品更为的健康。除了产品健康以外,重构的过程也能锻炼技术人员的技术思维和技术能力,使得他在构建另外的产品或新的任务时,能够规避已经发生的问题,获得更好的提高。长期来看,无论是人员经验的提升,还是产品健康度的提高,无疑为这个团队和这个团队所承接的产品起到了非常正向的作用。

  一个能够提出重构工作的开发人员,是他的主动性和能力的体现。

为什么大家不愿意做这项工作?

  这里我们从不同的视角来看待这个问题。从组织和领导的视角来看,如果组织层面或领导的风格,并不认为这是一件很有价值的事情,那么往往在推进的过程中,团队会自然而然的以交付为主而放弃质量;从个人来看,当我对这段代码重构的时候,很容易陷入不改,则没有问题,改则出问题的境地,那么出问题又要需要承担缺陷带来的影响,这就是所谓老的传统企业的,少做少错多做多错不做就不错;组织如果是快速变化缺少稳定性的,那么必然会追求短期的利益而重构,只会带来长期的利益,可能与团队的或者是团队领导人的利益的预期不一致。

  但是我们要看到作为技术团队中的一员,产品的健康度和代码的清晰是技术团队产生的直接价值,而所谓的产品的推广程度,还有用户量,则更多是以业务和运营驱动的结果。所以代码质量将是技术团队的核心竞争力,我们丢弃了重构的主动性,则同时丢弃了随时改善代码的可能性,因为代码不是一朝一夕的,不是通过一次大的运动就可以解决质量的问题。

如何解决?

  • 组织层面尽量让技术团队面向的产品和用户相对稳定,规避人员和团队的快速调整,使大家只重视短期利益,长期利益就会被忽略。
  • 领导在追求长期利益的前提下,应该更多的关注代码的质量,并且认识到好的代码质量是长期效率提高的基础。可见的是,一个结构清晰代码的产品,无论是演进还是迭代,都将事半功倍;一个长期处于亚健康的产品,将在后续的演进中投入更大的开发,收获更小的成效。
  • 团队应该以质量为第一目标,鼓励大家在发现产品代码质量的问题是第一时间评估解决,任何为了工期赶进度而丢掉代码质量的风气,都会被无限放大,最终导致失控。
  • 团队应该给每个人都会有清晰的负责的模块,包产到户,这样他就会对自己负责的代码的部分有更好的设计与开发。
  • 个人应该认识到,重构这项工作对个人能力的成长,还有个人实现自身的价值是一个非常重要的渠道。

有关团队如何推进代码重构工作的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  5. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

随机推荐