这个观点害死了很多人。。
说一段我自己的经历吧:
2010年加入创业时期的360,担任高级工程师,负责一个远控软件,同时要跟操作系统底层打交道。
入职后才发现在Leader的神操作下,部门的代码耦合成了一个大泥球,一个主类就有几万行,主类里的一个函数就有几千行。。
那个Leader最常说的就是:能跑起来不要想着去改,跑起来就行!
后来因为副总裁要求一个大功能,这哥们直接卡壳了,他带着我们几个小弟想改改上线,发现怎么都改不出来,,硬是delay了1个月都做不出来。
副总裁直接怒了,快速给他转岗到其他部门,让我先暂代技术经理职位,同时开始招聘。。。
面对前任Leader留下来的数十万行耦合严重的代码和框架(大白话:代码屎山),压力巨大。360素来以打仗凶猛著称,发版以天计,那段时间一天好几个版本。面临的最大困境是:如何在高速迭代的过程中重构整个旧的框架。至今还记得,面对那个主类的心情,那是崩溃和无力的。但越大的压力,你扛下来往往是更高的成长速度。
一瞬间,又回到了大三的那种疯狂状态,每天极限Coding,甚至接近入定的状态,上班往那一坐基本不动弹,就靠几瓶水几个面包,一天的三餐就对付了。
我们将代码组件化、模块化,实现了一边飞奔一边换轮子。就带了两个实习生,花了3个月搞定了这一堆恐怖的代码。
当系统彻底被改造完毕之际,那种兴奋难以言表。
因为成功完成了技术改造,同时还满足了副总裁的各种需求,副总裁直接给我晋升技术经理,招技术经理也再没提过了。
那段时间为了更好的重构代码,我还看了很多计算机经典书籍,包括《重构》、《代码整洁之道》《高性能Web编程》等等,把书本上的知识应用于工程实践,这种成长真的是难以言表的舒爽。
顺便送大家一份非常宝贵的计算机经典书籍资料,我把工作中用的经典电子书库(包含代码重构、数据结构、操作系统、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展)、面试找工作的资料汇总都打包放在这了,学完进大厂很容易:
我已经帮大家打包好了,点击下方链接直接获取:
这段时间,我的架构思维开始突飞猛进,我们在每一次的重构之前,都会先画出业务时序图、类结构图、工程关系图,然后按图索骥,每每在实现的那一刻,不由得惊叹:程序世界,太奇妙了。
所以你看看,带着代码能跑就不要动的观点,真的会害死人的,程序员有的时候就得直面大泥球,不断重构,不光锻炼能力还能保证后续需求的迭代。
干这一行的老兵都知道,稍微上一点规模的代码库,都是很复杂的,多年积累下来的各种奇奇怪怪的需求,导致了各种代码补丁和Hack,这些复杂度是外行难以真正体会的,在这种复杂度下,看起来人畜无害的一个修改,很可能导致连锁反应,然后代码屎山会爆炸的!
但不全是坏消息,好消息是——软件这玩意没有磨损!
换句话说,只要软件现在能运行,在外界环境不干扰的情况下,软件会持续运行下去!
就拿网上这张著名的图来说,大家很可能觉得这真是凑合,因为这个红绿灯已经坏了,不去修的话,风吹雨打,最后红绿灯肯定会彻底坏掉的。
但是,在软件的世界里,和硬件不一样,软件是没有磨损的,管他风吹雨打,软件还是一样的0-1序列,硬件坏了,换一个同样规格的硬件就是了,软件继续运行。
所以,真的,只要代码能跑的起来,能不动就不要动了,此乃经验之谈!
在实现鸽子飞行功能的过程中,程序员使用传统技能ctrl+c复制了百度/谷歌搜索到的CSDN上直升机类中旋转螺旋桨的飞行方法,并抱着实践出真知,跑起来就不算错的心态,直接粘贴到项目中鸽子类飞行功能中,并将符合方法参数类型的鸽子头绑定到了一起,代码顺利运行!
发现效率和控制方法上有些许差异,于是减小了头的旋转周期并给脖子添加了控制飞行方向的方法,随后更新了代码文档。
数日后,负责鸽子程序的程序员鸽子了程序,新来的程序员吐槽了老员工后,将飞行代码的参数由鸽子头修正为鸽子翅膀:
有一个原因其他回答没有提到:
因为在国内互联网大厂,主要产品的程序靠谱与否、流畅与否,消费者都只能买账,特别是那些动辄上百MB的巨型聊天、购物软件。流畅也得用,不流畅也得用,崩溃了你都得硬着头皮重启用。
每个应用都越来越卡,卡到你受不了,只能换新手机。国外程序员代码是写的好,可你我总不能在国内用eBay日常购物上Uber叫车上电报日常汇报工作吧?
既然跟计划经济时代的自行车一样不愁你不买涨,程序员还优化干啥?自然有各种困难理由。
就说健康码吧,最新款的iPhone13ProMax,开支付宝+开健康码竟然也要二三十秒,前两年的旗舰更是快1分钟,查询流量大的时候还白屏。
嘿,人家就是不优化,人还觉得30秒能查出健康码老厉害了,你有本事把防疫人员物理说服了,不然就乖乖憋着。
假如苏联的某个汽车厂厂长说:汽车能开的动,就不用更新换代,那的确计划经济,大家只能买他们的车,但这种言论会被做成苏联笑话在中文互联网上传承;
到简中IT行业,这就成了屎山动不得了。
这就和为啥钢铁厂和电站有一本厚厚的安全手册一样。。那本安全手册中的每一句都是人命累积而成的。
你以为这些代码写在哪里,看起来很蠢。。但是他们都是为了满足某一个时间上的一个需求写出来的。只不过,电脑程序有特殊性,你改了代码,大不了程序跑不起来。没啥大危险性。
你要这么喜欢系统重构,建议你下次去钢铁厂和电站进行这种工作。你去看看知乎上生产事故中的那些二货,有看汽轮机皮带斜了,用脚矫正,直接截肢的。有看炼钢炉出水口歪了,手欠去拨动,直接化灰的。
首先,这句话显然不是程序员专属的,而是一句著名美国俗语的意译。
if it ain't broke, don't fix it
不要跟我争论语法。
也不要跟我争论说明明你是在某本技术书上看到这种说法的,毕竟这句话在 1970 年代就流行了,被后来的技术书籍反复引用难道不是很正常么……
反过来,正是因为技术书和技术讨论中会引这句话,所以你看到的时候它已经被意译得不那么接近原貌了。
然后,这句话本身流行开来的背景也很简单,就是一个政府官员 (Bert Lance) 表达了反对某些类型的改革的立场:
Bert Lance believes he can save Uncle Sam billions if he can get the government to adopt a simple motto: "If it ain't broke, don't fix it." He explains: "That's the trouble with government: Fixing things that aren't broken and not fixing things that are broken."
但是各位习惯键政的可能立刻就看出来问题了。
Lance 也不是真的字面意义上的反对一切改革。他纯粹是反对那些他反对的改革,支持那些他支持的改革——就像那些他这样的政客一样。(废话体在这里还真好用)
这个政治版本的俗语,其实关键点根本不是这个近乎语意重复的因果关系,而是“什么是 broke,谁来规定哪些东西 broke 了”。 Bert Lance 可能觉得政策 A 是 broken 的,得改,而觉得政策 B 是不 broken 的,不应该改。换一个人说同样一句话,可能他其实想表达的意思是完全相反的。
翻译到这里,你就会发现这就是最最最平常的政治辩论,“我说得对,你说得不对”。仅此而已。
既然说完了这句话本身的来源,那么我们再看软件。那么上面的政治版问题直接翻译过来,就是这些:
什么叫“代码能跑”呢?
谁来定义“代码能跑”呢?
一份代码是否“能跑”,取决于哪些条件?这些条件何时会变化?
这几个问题其实并没有通用的回答,而我觉得回答这几个问题,比纠结这句话本身在说什么要有意义。
而这句话本身,大概就是一种把自己的观点包装在废话体后面的话术吧。
你是刚入职的程序员, 发现公司的代码一团糟. 你在想"这是谁写的烂代码". 你决定尝试优化清理下.
优化需要产品测试运维的配合. 他们推脱没有收益? 你成功的用"追求卓越"勾起了他们曾经的激情
经过一个月的努力, 优化版本上线了.
这里有两种结果:
让我们总结下. 最好的结果是你们辛苦一个月没有物质收益. 更可能的结果是你们辛苦一个月最终被处罚. 现在你大概开始认识到这是多么愚蠢的投入了吧.
什么? 你还是认为这种尝试是有价值的? 小伙子你精神可嘉, 如果幸运遇到个好的平台一定是个不错的程序员. 但是好的平台太少了. 我这里说的好的平台是指:
想想就明白, 这种平台万中无一
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有