0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么你觉得旧代码异常混乱?因为读代码更难

机器学习算法与人工智能 来源:未知 作者:李倩 2018-05-23 11:07 次阅读

想要推倒旧代码,

重写代码的程序员们,

请注意:

保持冷静,继续前行!

程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的一切推倒重来。是的,他们决不会满足于简单的增量劳动。

或许这种微妙的心理定位可以解释:为什么程序员进入新项目组后宁愿丢掉旧代码重新写,也不愿意修修补补。他们认为旧代码简直一团糟。

但是,事实上真是这样吗?你之所以认为旧代码一团糟,其实是由编程的一个基本定律决定的,那就是:写代码容易,读代码难。

为什么你觉得旧代码异常混乱?因为读代码更难。

这大概就是代码Reuse难以实现的原因。 这就是你组里的每个人都喜欢用不同的功能将分割的字符串转换成一个数组。比起猜测旧的功能是怎样实现的,重新写一个自己的功能要简单和有趣多了。

作为这个公理的推论,你可以问问身边的程序员他们正在奋战的代码怎么样?「简直是一塌糊涂!」他们肯定会这样说。「我简直想推倒重来!」

为什么认为代码这么糟糕呢?「额,看看这个功能,竟然有两页长!完全不知道这些东西为什么在这里!完全不知道这些API是干什么的。」他们会这样回答你。

曾经,Borland的创始人 Philippe Kahn当初就是向记者们吹嘘:Quattro Pro会比Microsoft Excel要好用得多,因为它是从头开始编写的,全部都是新的源代码!

但是,认为新代码比旧代码好简直就是荒谬。旧代码是已经运行过的,测试过的。无数的bug在被发现前都上线运行过,发现之后程序员们可能在花了好些日子才修复了这些bug。这种修复可能是一行代码,也可能是几个字符,无数的时间和精力都花在了这些bug修复上。

当你决定抛弃这些旧代码从零开始的时候,你也丢掉全部前任努力的结果。

新代码一定比旧代码的好吗?NO,NO,NO重写可能会带来更大的风险。

对技术领导者来说,重写项目的代码也是一个异常艰难的决定。因为从公司层面说,重现代码甚至会威胁产品的市场竞争力。一旦决定重写代码,那么与竞品相比,你可能落后了2~3年——在软件行业,这时间可够长的。

你理想中的新代码会带来产品功能的提升

但事实上,即便重写的新代码可以实现旧代码的所有功能和需求,但是为产品带来的市场竞争力只有边际提升。因为重写用的新技术、新语言、新框架并没有给产品带来质的飞跃。

更不用说在重写的漫长过程中可能会遇到一些意外情况,比如:

缺钱:资金链的断裂

缺人:核心程序员离职

最终导致效果不佳:达不到原产品应有的所有功能和需求,白白浪费了时间和金钱,也丢掉了市场竞争力。

所以重写代码意味着,你在把自己置身于非常危险的境地,可能几年后你也写不出比以前更好的代码。你只是花了一大笔钱把已经存在的代码又写了一遍。

当你觉得眼前的旧代码很烂时,该怎么办?

你觉得旧代码写的很烂,那又怎样呢?它们已经上线,已经在实际运行中经受住了考验。所以当你发现前任留下的代码乱七八糟的时候,不妨冷静下来,从以下三个方面入手理解代码、改善代码:

1代码的机构有问题

如果一段网络代码突然弹出了自己的对话框,应该是UI代码需要被处理。这些问题可以被解决掉,你要一次次小心地移动代码,重构,改变接口。还需要一位细心的工程师立马仔细地检查这些改变是否有问题,从而不打扰到其他人。事实上,甚至比较大的结构变化也可以不扔掉代码来完成。

大牛程序员回忆说,曾经在某个项目中,他和他的团队花了好几个月重新架构在一点上:把代码动来动去、清理、创建有意义的基类,并创建了模块之间的完美接口。但是他们始终非常小心翼翼,并没有产生新的bug、也没有丢掉任何旧代码。

2代码的效率不高

曾经,Netscape的渲染代码被传非常缓慢。但事实上,这只会影响该项目的一小部分,这部分是你可以优化甚至重写的。你完全不必重写全部代码。优化速度的1%工作量,会让你获得99%的爆炸性提高。

3代码写得很丑

有些代码真的写的很丑,比如Joel曾参与一个项目,开始用下划线做开始的成员变量约定,但后来改用更标准的「M_」。所以一半的功能用「_」开始,一半用「M」开始,这看起来真的很丑陋。但这个问题5分钟就能解决,而不用从头开始写全部的代码。

最后,你要记住,从头开始再写一遍并不意味着你会写出比以前更好的代码。因为你没有参与到上一个版本的创建,所以你其实根本就不算有经验。一旦你准备推倒重写,你可能会再犯一遍版本一犯过的错,甚至会产生更多的新问题。

面对糟糕的旧代码,Keep Calm & Carry On !

在大型商业项目中,推倒重来是非常危险的行为。当然,如果你是在做实验,想到新算法可以随时重写。

如果你跳槽、或刚接手一个新项目,面对看上去异常混乱的旧代码,请冷静下来,忍住推倒重写的冲动,想想上面这些经验之谈。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66747
  • 程序员
    +关注

    关注

    4

    文章

    931

    浏览量

    29571

原文标题:为什么程序员千万不要重写代码?

文章出处:【微信号:machinelearningai,微信公众号:机器学习算法与人工智能】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    g代码和m代码表示什么功能

    G代码和M代码是数控机床程序中常用的两种指令代码,用于控制数控机床的工作动作和运动方式。 G代码是指控制机床工作动作的指令代码,它是一种简单
    的头像 发表于 02-14 15:49 1179次阅读

    devc怎么注释掉一段代码

    在DevC中,要注释掉一段代码,你可以使用注释符号来标记这段代码。注释符号的作用是告诉编译器不要编译这些代码,而是将其视为注释,这样可以方便开发人员在代码中添加解释、说明或者临时禁用某
    的头像 发表于 11-22 10:23 1063次阅读

    代码即注释,注释即代码的概念是如何形成的

    "代码即注释,注释即代码"这个概念是如何形成的呢?记得之前看一些讨论,程序员应该如何写代码的注释,大家的意见很多,不过我只对两句话记忆非常深刻:
    的头像 发表于 11-18 16:52 432次阅读
    <b class='flag-5'>代码</b>即注释,注释即<b class='flag-5'>代码</b>的概念是如何形成的

    代码异常跳过__WFI()命令问题说明

    代码异常跳过__WFI()命令问题说明应用有时会遇到无法正常进入低功耗的问题?
    发表于 10-23 07:04

    静态代码块、构造代码块、构造函数及普通代码块的执行顺序

    在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。 1、静态代码块 ①、格式 在java类中(方法
    的头像 发表于 10-09 15:40 431次阅读
    静态<b class='flag-5'>代码</b>块、构造<b class='flag-5'>代码</b>块、构造函数及普通<b class='flag-5'>代码</b>块的执行顺序

    ARM汇编指令:异常产生指令和伪代码

    异常产生指令 1、【SWI指令】 SWI 24 位的立即数 SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。 SWI 0 x 02 ;该指令调用操作系统编号位 02 的系统例程
    的头像 发表于 10-07 14:29 524次阅读

    Linux中断子系统Arch-speicific代码分析

    Arch-speicific代码分析 中断也是异常模式的一种,当外设触发中断时,处理器会切换到特定的异常模式进行处理,而这部分代码都是架构相关的;ARM64的
    的头像 发表于 09-28 15:27 305次阅读
    Linux中断子系统Arch-speicific<b class='flag-5'>代码</b>分析

    一段C代码关联的知识点

    之前有位网友在交流群里发了一段代码的截图,我觉得很有意思,在此分享一下。
    发表于 08-30 10:42 245次阅读
    一段C<b class='flag-5'>代码</b>关联的知识点

    关于使用STM32H7在用户代码内增加开启保护代码的问题

    在使用STM32H7系列芯片时,在用户代码内增加了开启保护的代码,有设置了通过指令触发解除保护的代码,再触发解除
    发表于 08-07 06:31

    代码评审一般都有哪些军规呢?

    其实,写代码的时候,没有必要写太多的注释,因为好的方法名、变量名,就是最好的注释。
    的头像 发表于 06-14 15:55 371次阅读
    <b class='flag-5'>代码</b>评审一般都有哪些军规呢?

    怎么快速把汇编代码和C语言代码对应起来呢?

    分析软件缺陷,有时候需要把ELF文件反汇编为汇编代码,然后分析汇编代码,需要把汇编代码和C语言代码对应起来。
    的头像 发表于 06-12 16:45 1754次阅读

    什么是良好的Verilog代码风格?

    为了省事,在代码中对数值型信号和逻辑型信号完全不做区分,用同样的方式赋值。如果这种时候稍微做一点点改变,就能让代码可读性大大提高,例如:觉得
    发表于 06-02 14:48

    道一云入选中国信通院《2023低代码·无代码应用案例汇编》

    近日,由中国信息通信研究院、中国通信标准化协会主办,中国通信标准化协会云计算标准和开源推进委员会承办,企业数字化发展共建共享平台支持的“2023低代码·无代码产业大会”在北京顺利召开。 在“成果发布
    的头像 发表于 05-31 16:54 455次阅读

    Python中的异常机制(二)

     [as  e]:  异常处理语句块 注意事项: try 块包含着可能引发异常代码, except 块则用来捕捉和处理发生的异常 执行的时候,如果 try 块中没有引发
    的头像 发表于 05-11 18:20 730次阅读

    如何使用参数化编写可重用的verilog代码

    因为我们可以更轻松地将代码从一个设计移植到另一个设计。 我们在verilog中有两个可用的结构,可以帮助我们编写可重用的代码 - 参数化和generate语句。这两种结构都允许我们创建更通用的
    的头像 发表于 05-11 15:59 705次阅读