阅读更多

1顶
4踩

非技术



作为 100offer 程序员拍卖的运营,我们常常和用户交流讨论,有一个话题经久不衰:程序员入职新公司后接手已有的代码,怎么处理?

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

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

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

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

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

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

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



漫画:读别人代码是一种怎样的体验?

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

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

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

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

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

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



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

更不用说在重写的漫长过程中可能会遇到一些意外情况,比如:
1、缺钱:资金链的断裂



2、缺人:核心程序员离职

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



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

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

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

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

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

2、代码的效率不高

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

3、代码写得很丑

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

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

总结

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

在大型商业项目中,推倒重来是非常危险的行为。当然,如果你是在做实验,想到新算法可以随时重写。如果你跳槽、或刚接手一个新项目,面对看上去异常混乱的旧代码,请冷静下来,忍住推倒重写的冲动,想想上面这些经验之谈。

本文为 100offer 程序员拍卖原创,首发于 100offer 微信(ID: im100offer)及博客:http://100offer.com/blog/posts/85
  • 大小: 78.2 KB
  • 大小: 633.8 KB
  • 大小: 18.9 KB
  • 大小: 20.8 KB
  • 大小: 17.8 KB
来自: 100offer
1
4
评论 共 5 条 请登录后发表评论
5 楼 mangguo 2015-07-27 14:39
恩,说的挺好,restful 架构
4 楼 if(i!=我){} 2015-07-27 08:54
一定是个编程多年且自以为是的家伙!殊不知不会被重写的代码只有两种情况:1、无需维护的代码。2、无法维护的代码。
显然作者的代码不是前者!
3 楼 kuchaguangjie 2015-07-25 11:55
嗯, 事情不能一概而论.

有些代码就是没有改的价值, 重写 比 重构 来的快 来的好, 重写的时候如果原来的代码还有 有价值的地方 也尽量重利用.

有的代码 确实只需要重构一下就可以了. 这样也可以节省自己不少时间, 还可以学习别人的 风格 和 有价值的地方, 也可以很大的锻炼自己重构的能力.

所以, 具体问题要具体分析以后, 再做出 判断 怎么样 更合适.
2 楼 white_crucifix 2015-07-24 20:45
对自己的代码要求高点,对别人的代码要求低点,是我一直以来的态度。

以前有个故事,主人公年轻的时候觉得别人的代码太糟糕,几年后,才发现没领会别人代码的设计精髓。

我觉得这是谣言。

看不懂的好代码,与看不懂的烂代码,给人的区分度是一目了然的。

所以,重构后的系统是否比重构前好,关键在于,人。
1 楼 zhangleijava1 2015-07-24 17:50
一般旧的代码有问题才回改的。没有问题除了优化重构,一般人都不会去改的。如果有问题的代码有的时候重写会更好,比如采用更好的算法,更好的技术。

发表评论

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

相关推荐

  • 程序员为什么千万不要重写代码?

    或许这种微妙的心理定位可以解释:为什么程序员进入新项目组后宁愿丢掉旧代码重新写,也不愿意修修补补。他们认为旧代码简直一团糟。 但是,事实上真是这样吗?你之所以认为旧代码一团糟,其实是由编程的一个基本...

  • 为什么程序员千万不要重写代码?

    重写代码其实意味着重新开始,而且也存在着更多的风险!想要推倒旧代码,重写代码的程序员们,请注意:保持冷静,继续前行! 程序员都有一颗工程师的心,所以当他...

  • 程序员 为什么千万不要重写代码

    或许这种微妙的心理定位可以解释:为什么程序员进入新项目组后宁愿丢掉旧代码重新写,也不愿意修修补补,他们认为旧代码简直一团糟。   但是,事实上真是这样吗?你之所以认为旧代码一团糟,其实是由编程的一...

  • 重点项目却总是腐化,程序员为什么会写烂代码?

    写在前面:作者李子昂,阿里巴巴集团研发效能部的第一个算法工程师,目前工作主要方向是代码管理和CI。本文探讨的是:从优化研发交付流程的角度,如何根本上提升研发效能。 先说结论 现在阿里主流的分支开发模式,...

  • 十年程序员的告诫:千万不要重写代码!

    对重写代码说不。 作者 |Roman Luzgin 译者 | 苏本如 责编 |屠敏 出品 |CSDN(ID:CSDNNews) 以下为译文: 重写代码消耗了12个月! 我们从头开始重写代码浪费的时间。 你能想象在软件行业,12个月的...

  • 程序员,为什么尽量不要重写项目代码?

    今天偶然读到一篇文章,感觉写的很有道理,想和大家分享一下,于是就把文章copy过来了,以后可以时常看看,提醒自己不要太自以为是呀!! 不过为了尊重原创作者版权,特意把链接也copy过来;链接地址:...

  • 为什么程序员一言不合就重构代码?

    为什么程序员一言不合就重构代码?     当你看到前任写成一团毛球的代码块;新增几行代码需先捋半天逻辑的超级大函数;好不容易在迷宫里找到方向,小心翼翼地添加上新代码,却将别的调用系统给弄垮时;还有...

  • 给所有程序员一个忠告:千万不要重写代码

    或许这种微妙的心理定位可以解释:为什么程序员进入新项目组后宁愿丢掉旧代码重新写,也不愿意修修补补,他们认为旧代码简直一团糟。   但是,事实上真是这样吗?你之所以认为旧代码一团糟,其实是由编程的一个...

  • java程序员面试手写代码_程序员面试时手写代码的意义?

    一.手写代码和上机测试我觉得,手写要写出思路,上机要能运行就够了写代码二.手写代码的意义和作用手写...提笔之前,想清楚自己要干什么。4.代码可读性,可维护性。5.边界问题,细节处理是否合理。直接关系到这个...

  • 原生js图片圆形排列按钮控制3D旋转切换插件.zip

    原生js图片圆形排列按钮控制3D旋转切换插件.zip

  • 类似c++数组的python包

    内含二维数组与三维数组,分别为list2nd,list3rd

  • 原生js颜色随机生成9x9乘法表代码.zip

    原生js颜色随机生成9x9乘法表代码.zip

  • 原生js实现图片叠加滚动切换代码.zip

    原生js实现图片叠加滚动切换代码.zip

  • 【Academic tailor】学术小裁缝必备知识点:全局注意力机制(GAM)TensorFlow

    【Academic tailor】学术小裁缝必备知识点:全局注意力机制(GAM) 注意力机制是深度学习中的重要技术,尤其在序列到序列(sequence-to-sequence)任务中广泛应用,例如机器翻译、文本摘要和问答系统等。这一机制由 Bahdanau 等人在其论文《Neural Machine Translation by Jointly Learning to Align and Translate》中首次提出。以下将详细介绍这一机制的背景、核心原理及相关公式。 全局注意力机制(Global Attention Mechanism, GAM)由 《Global Attention Mechanism: Retain Information to Enhance Channel-Spatial Interactions》提出,是一篇针对计算机视觉任务提出的方法。这篇文章聚焦于增强深度神经网络中通道和空间维度之间的交互,以提高分类任务的性能。与最早由 Bahdanau 等人提出的用于序列到序列任务的注意力机制 不同,这篇文章的重点是针对图像分类任务,并未专注于序

  • 基于SpringBoot的“篮球论坛系统”的设计与实现(源码+数据库+文档+PPT).zip

    本项目在开发和设计过程中涉及到原理和技术有: B/S、java技术和MySQL数据库等;此文将按以下章节进行开发设计; 第一章绪论;剖析项目背景,说明研究的内容。 第二章开发技术;系统主要使用了java技术, b/s模式和myspl数据库,并对此做了介绍。 第三章系统分析;包罗了系统总体结构、对系统的性能、功能、流程图进行了分析。 第四章系统设计;对软件功能模块和数据库进行详细设计。 第五章系统总体设计;对系统管理员和用户的功能进行描述, 第六章对系统进行测试, 第七章总结心得;在论文最后结束章节总结了开发这个系统和撰写论文时候自己的总结、感想,包括致谢。

  • 毕业设计&课设_iOS 商城项目,含购物与商家管理功能,用 Sqlite,有账号示例,适合 iOS 开发练习.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

  • 镗夹具总工艺图.dwg

    镗夹具总工艺图

  • 原生js树叶数字时钟代码.rar

    原生js树叶数字时钟代码.rar

  • 近代非线性回归分析-韦博成1989

    近代非线性回归分析-韦博成1989

Global site tag (gtag.js) - Google Analytics