[导读]关注星标公众号,不错过精彩内容来源|cnblogs写烂代码很容易,但是就算写成一坨屎,能用即可,你同意这种观点吗?程序员刚入行经常听到一些观点你要把精力放在需求文档/功能设计/架构设计/理解原理(ABCD)上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情。当时的...
来源 | cnblogs
写烂代码很容易,但是就算写成一坨屎,能用即可, 你同意这种观点吗?
程序员刚入行经常听到一些观点
你要把精力放在需求文档/功能设计/架构设计/理解原理(ABCD)上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情。
当时的我在听到这种观点时会有一种近似于高冷的不屑:你们就是一群傻子,根本不懂代码质量的重要性,这么下去迟早有一天会踩坑。
可是几个月之后,他们似乎也没怎么踩坑。而随着编程技术一直在不断发展,带来了更多的我以前认为是傻子的人加入到程序员这个行业中来。
语言越来越高级、封装越来越完善,各种技术都在帮助程序员提高生产代码的效率,依靠层层封装,程序员真的不需要了解一丁点技术细节,只要把需求里的内容逐行翻译出来就可以了。
很多程序员不知道要怎么组织代码、怎么提升运行效率、底层是基于什么原理,他们写出来的是在我心目中烂成一坨屎一样的代码。但是那一坨屎一样代码竟然能正常工作。
即使我认为他们写的代码是坨屎,但是从不接触代码的人的视角来看(比如说你的boss),代码编译过了,测试过了,上线运行了一个月都没出问题,你还想要奢求什么?
所以,即使不情愿,也必须承认,别人写的代码能正常运行,且不出错,那就是牛x。
烂代码终究是烂代码
但是偶尔有那么几次,写烂代码的人离职了之后,事情似乎又变得不一样了。
想要修改功能时却发现程序里充斥着各种无法理解的逻辑、改完之后莫名其妙的bug一个接一个,接手这个项目的人开始漫无目的的加班,并且原本一个挺乐观开朗的人渐渐的开始喜欢问候别人祖宗了。
总结几类经常被骂娘的烂代码:
ி 意义不明
能力差的程序员容易写出意义不明的代码,他们不知道自己究竟在做什么。
就像这样:
void Save(void){ int x; for(x=0; x<100; x ) { //防止保存失败,保存100次 Flash_Write(); }}
对于这类程序员,我一般建议他们转行。
ி 不说人话
不说人话是新手最经常出现的问题,直接的表现就是写了一段很简单的代码,其他人却看不懂。
比如下面这段:
很多程序员喜欢简单的东西:简单的函数名、简单的变量名,代码里翻来覆去只用那么几个单词命名;能缩写就缩写、能省略就省略、能合并就合并。
这类人写出来的代码里充斥着各种g/s/gos/of/mss之类的全世界没人懂的缩写,或者一长串不知道在做什么的连续调用。
还有很多程序员喜欢复杂,各种宏定义、位运算之类写的天花乱坠,生怕代码让别人一下子看懂了会显得自己水平不够。
简单的说,他们的代码是写给机器的,不是给人看的。
ி 不恰当的组织
不恰当的组织是高级一些的烂代码,程序员在写过一些代码之后,有了基本的代码风格,但是对于规模大一些的工程的掌控能力不够,不知道代码应该如何解耦、分层和组织。
这种反模式的现象是经常会看到一段代码在工程里拷来拷去;某个文件里放了一大坨堆砌起来的代码;一个函数堆了几百上千行;或者一个简单的功能七拐八绕的调了几十个函数,在某个难以发现的猥琐的小角落里默默的调用了某些关键逻辑。
这类代码大多复杂度高,难以修改,经常一改就崩;而另一方面,创造了这些代码的人倾向于修改代码,畏惧创造代码,他们宁愿让原本复杂的代码一步步变得更复杂,也不愿意重新组织代码。当你面对一个几千行的类,问为什么不把某某逻辑提取出来的时候,他们会说:
“但是,那样就多了一个类了呀。”
ி 假设和缺少抽象
相对于前面的例子,假设这种反模式出现的场景更频繁,花样更多,始作俑者也更难以自己意识到问题。比如:文件路径变更的时候,会把代码改成这样:需要加载的内容更丰富的时候,会再变成这样:之后可能会再变成这样:这类程序员往往是项目组里开发效率比较高的人,但是大量的业务开发工作导致他们不会做多余的思考,他们的口头禅是:“我每天要做XX个需求”或者“先做完需求再考虑其他的吧”。
这种反模式表现出来的后果往往是代码很难复用,面对deadline的时候,程序员迫切的想要把需求落实成代码,而这往往也会是个循环:写代码的时候来不及考虑复用,代码难复用导致之后的需求还要继续写大量的代码。
一点点积累起来的大量的代码又带来了组织和风格一致性等问题,最后形成了一个新功能基本靠拷的遗留系统。
ி 还有吗?
烂代码还有很多种类型,沿着功能-性能-可读-可测试-可扩展这条路线走下去,还能看到很多匪夷所思的例子。那么什么是烂代码?个人认为,烂代码包含了几个层次:▶ 如果只是一个人维护的代码,满足功能和性能要求倒也足够了。▶ 如果在一个团队里工作,那就必须易于理解和测试,让其它人员有能力修改各自的代码。同时,越是处于系统底层的代码,扩展性也越重要。所以,当一个团队里的底层代码难以阅读、耦合了上层的逻辑导致难以测试、或者对使用场景做了过多的假设导致难以复用时,虽然完成了功能,它依然是坨屎一样的代码。
ி 够用的代码
而相对的,如果一个工程的代码难以阅读,能不能说这个是烂代码?很难下定义,可能算不上好,但是能说它烂吗?如果这个工程自始至终只有一个人维护,那个人也维护的很好,那它似乎就成了“够用的代码”。
很多工程刚开始可能只是一个人负责的小项目,大家关心的重点只是代码能不能顺利的实现功能、按时完工。
过上一段时间,其他人参与时才发现代码写的有问题,看不懂,不敢动。需求方又开始催着上线了,怎么办?只好小心翼翼的只改逻辑而不动结构,然后在注释里写上这么实现很ugly,以后明白内部逻辑了再重构。
再过上一段时间,有个相似的需求,想要复用里面的逻辑,这时才意识到代码里做了各种特定场景的专用逻辑,复用非常麻烦。为了赶进度只好拷代码然后改一改。问题解决了,问题也加倍了。
几乎所有的烂代码都是从“够用的代码”演化来的,代码没变,使用代码的场景发生变了,原本够用的代码不符合新的场景,那么它就成了烂代码。
重构不是万能药
程序员最喜欢跟程序员说的谎话之一就是:现在进度比较紧,等X个月之后项目进度宽松一些再去做重构。
不能否认在某些(极其有限的)场景下重构是解决问题的手段之一,但是写了不少代码之后发现,重构往往是程序开发过程中最复杂的工作。花一个月写的烂代码,要花更长的时间、更高的风险去重构。
曾经经历过几次忍无可忍的大规模重构,每一次重构之前都是找齐了组里的高手,开了无数次分析会,把组内需求全部暂停之后才敢开工,而重构过程中往往哀嚎遍野,几乎每天都会出上很多意料之外的问题,上线时也几乎必然会出几个问题。
从技术上来说,重构复杂代码时,要做三件事:理解旧代码、分解旧代码、构建新代码。而待重构的旧代码往往难以理解;模块之间过度耦合导致牵一发而动全身,不易控制影响范围;旧代码不易测试导致无法保证新代码的正确性。重构之后能提升多少效率?能降低多少风险?很难答上来,烂代码本身就不是一个可以简单的标准化的东西。
总结
不写代码的人认为应该重构,重构很简单,无论新人还是老人都有责任做重构。
写代码老手认为应该迟早应该重构,重构很难,现在凑合用,这事别落在我头上。
写代码的新手认为不出bug就谢天谢地了,我也不知道怎么重构。
✉ 写好代码很难与写出烂代码不同的是,想写出好代码有很多前提:✔ 理解要开发的功能需求。✔ 了解程序的运行原理。✔ 做出合理的抽象。✔ 组织复杂的逻辑。✔ 对自己开发效率的正确估算。✔ 持续不断的练习。
写出好代码的方法论很多,但我认为写出好代码的核心反而是听起来非常low的“持续不断的练习”。
很多程序员在写了几年代码之后并没有什么长进,代码仍然烂的让人不忍直视,原因有两个主要方面:
1、环境是很重要的因素之一,在烂代码的熏陶下很难理解什么是好代码,知道的人大部分也会选择随波逐流。
2、还有个人性格之类的说不清道不明的主观因素,写出烂代码的程序员反而都是一些很好相处的人,他们往往热爱公司团结同事平易近人工作任劳任怨–只是代码很烂而已。
而工作几年之后的人很难再说服他们去提高代码质量,你只会反复不断的听到:“那又有什么用呢?”或者“以前就是这么做的啊?”之类的说法。
那么从源头入手,提高招人时对代码的质量的要求怎么样?
前一阵面试的时候发现了一个现象:
一个人工作了几年、做过很多项目、带过团队、发了一些文章,不一定能代表他代码写的好;反之,一个人代码写的好,其它方面的能力一般不会太差。
悲观的结语
说了那么多,结论其实只有两条,作为程序员:⊱ 不要奢望其他人会写出高质量的代码⊱ 不要以为自己写出来的是高质量的代码
参考地址:
https://www.cnblogs.com/huya-edu/p/15002012.html
------------ END ------------
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
北京2022年10月19日 /美通社/ -- 10月18日,北京市经济和信息化局发布2022年度第一批北京市市级企业技术中心创建名单的通知,诺诚健华正式获得"北京市企业技术中心"认定。 北京市企业技...
关键字:
BSP
ARMA
COM
代码
实际上函数指针本质也是一个指针,只不过这个指针指向的不是内存中的一段数据而是内存中的一段代码
关键字:
指针
数据
代码
苏州2022年10月17日 /美通社/ -- 开拓药业(股票代码:9939.HK),一家专注于潜在同类首创和同类最佳创新药物研发及产业化的生物制药公司,宣布其自主研发、潜在同类首创的福瑞他恩(KX-826)治疗痤疮的中国...
关键字:
ST
FDA
代码
ADI
在智能汽车时代,保障智能汽车数据安全已成为一项新的重要课题。
关键字:
丰田
代码
信息安全
南京2022年9月16日 /美通社/ -- 说到"世界清洁地球日",恐怕很多人都一头雾水。作为全球最重要的环境保护活动之一,该节日"致力于通过影响人类行为模式的改变以应对世界上的垃圾问题&q...
关键字:
电热水器
BSP
温度
代码
芝加哥2022年9月17日 /美通社/ -- 采用尖端微应答器技术彻底改变实物产品与材料跟踪的公司P-Chip Corporation,今日推出最新突破性p-Chip Code™安全跟踪标签。p-Chip代码跟踪器将基于...
关键字:
CHIP
代码
应答器
矩阵
东京2022年9月6日 /美通社/ -- 电通集团(Dentsu Group Inc.,东京证券交易所股票代码:4324;国际证券识别代码:JP3551520004);(总裁兼首席执行官:Hiroshi Igarashi...
关键字:
OS
代码
BSP
GROUP
(全球TMT2022年8月25日讯)8月22-24日,2022中国国际智能产业博览会在重庆开幕。蓝卓受邀参加本次盛会,展示新一代工业操作系统supOS4.0的新能力。 本次智博会,蓝卓重点展示supOS4...
关键字:
POS
操作系统
APP
代码
最新发布的2022年《中国新富人群财富健康指数》表明: 金融素养与投资风险意识呈正相关,投资者教育势在必行 新富家庭财务需求多样,共同协商可助家庭克服理财盲点 新富人群期待投顾服务为财富管理保驾护航...
关键字:
BSP
ADVANCED
INA
代码
浙江湖州2022年8月24日 /美通社/ -- 近日,森赫电梯与建业集团达成战略合作,成为其电梯设备设计、供应及安装维保服务集采供应商。森赫电梯与建业集团成功携手,未来,双方将继续展开多元化的深入合作。...
关键字:
电梯
BSP
代码
数字化
2022年上半年收入7.1亿元 同比增长14.5% 嵌入式软件和安全支付产品发展势头强劲 收入同比增长28.7% 香港2022年8月16日 /美通社/ -- 金邦达宝嘉控股有限公司及其附属公司(以下合称“...
关键字:
数字化
嵌入式软件
供应链
代码
南京2022年8月12日 /美通社/ -- 热水器"冷热不均"一直困扰着普通消费者的家庭,作为以技术力、创新力享誉海内外的家电巨头A.O.史密斯以消费者的痛点作为出发点,凭借百年沉淀的品牌底蕴,一举推...
关键字:
电热水器
BSP
温度
代码
上海2022年8月12日 /美通社/ -- 8月11日上午,全球领先的多元化专业服务与投资管理公司高力国际(纳斯达克和多伦多证券交易所代码:CIGI)与中国绿发在VOCO千岛湖阳光大酒店举行了战略及合资合作协议签约仪式。...
关键字:
代码
纳斯达克
行业标准
COM
苏州2022年8月9日 /美通社/ -- 北京时间2022年8月9日,开拓药业(股票代码:9939.HK),一家专注于潜在同类首创和同类最佳创新药物研发及产业化的生物制药公司,今日宣布,其自主研发的新型靶向雄激素受体(A...
关键字:
OTA
AC
ST
代码
上海2022年7月25日 /美通社/ -- 近日,高力国际发布2022第二季度上海办公楼市场研究快报。 2022年第二季度,在疫情影响下,上海办公楼市场整体活跃度显著降低。新项目均延迟入市,租赁需求及成交活跃度大幅放缓...
关键字:
COM
CORPORATE
互联网
代码
上海2022年7月25日 /美通社/ -- 7月21日,2022年亚洲企业社会责任论坛暨颁奖典礼顺利召开,全球领先的多元化专业服务与投资管理公司高力国际(纳斯达克证交所交易代码:CIGI;多伦多证交所交易代码:CIGI)...
关键字:
TI
ASIA
代码
可持续发展
上海2022年7月12日 /美通社/ -- 7月12日 上午,由业界领先的多元化专业服务和投资管理公司高力国际(纳斯达克和多伦多证券交易所代码:CIGI)在上海成功召开全力以"复",跑出&q...
关键字:
加速度
BSP
代码
楼宇
深圳2022年7月12日 /美通社/ -- 近日,深交所通报了主板、创业板上市公司2021年度信息披露考核结果,考核结果显示,CTI华测检测(证券代码:300012)获得深交所2021年度信息披露“A”级考核结果,这是C...
关键字:
TI
代码
COM
可持续发展
DXC成为俱乐部数字转型合作伙伴、主要衫袖合作伙伴和曼联基金会的展示合作伙伴 曼联将利用DXC作为数字化转型全球领导者的经验 英国曼彻斯特2022年7月6日 /美通社/ -- 随着足球俱乐部转向技术来改变运营并提升全...
关键字:
BSP
TECHNOLOGY
数字化
代码
百济神州与深信生物将共同推进数个mRNA-LNP项目的研发工作,百济神州将获得这些项目所产出的候选产品的全球独家开发和商业化权利 百济神州还将获得深信生物专有LNP技术的非独家使用许可,用于支持内部研发工作...
关键字:
神州
BSP
代码
TI