百科问答小站 logo
百科问答小站 font logo



程序员是如何看待「祖传代码」的? 第1页

     

user avatar   luo-wei-zi 网友的相关建议: 
      

你们的祖传代码,太年轻了,朋友们。

我手上这一堆,从JDK1.2开始的。我其实特别喜欢看古旧的代码,现代的代码写出来,没有艺术感,一堆小朋友,最爱的就是混起来写,一行能多用几个方法就是多写几个,仿佛炫技的水平都在代码堆砌上了。古早的代码能活到现在没本注释掉的,都是不错的,看起来就像看古书,很有韵味的感觉,有时候没事情做,我也会泡杯茶,开个古筝古曲,翻阅下古代代码,权当娱乐。


user avatar   eflay 网友的相关建议: 
      

其实吧,能删掉重写的代码都算是好代码了,为什么? 起码那一部分基本保持了独立可替换,没有蔓延,那么更可怕的呢?

我来说说以前东家的winform项目屎山代码路数


代码复制变异,由于有个流程,每个流程都会对应一个列表,每个列表都可以打印报表,而这个打印功能我也记不清楚了,但是有点复杂,这个功能用现代的眼光一点都不难,用orm取点数据,通过webapi调用取到客户端,取需要字段调用报表组件即可。但是这个项目里,就是有个dataset装着很多表,在通过完全自己写的某种网络调法搞到客户端,然后从表里取字段填到报表上打印,其实这也没什么,但是死就死在,每个列表的代码都是复制过去的,随着时间的迁移,这些代码都散落到代码的各个角落,然后变异成不同的代码,我仿佛是在看某种进化分支,所以每次加字段加功能,基本都需要每个地方都改一遍,没有人有本事把这段代码提取出来,其实我觉得我再看看就能做到了,不过我还是已经离职了。

逻辑交叉,你能想象,一个列表页面单独可以做到无法维护么?我已经不记得我要改什么功能了,只记得快春节了,最后一个礼拜了,大家都有点浮躁,而这个问题,我跟踪事件来来去去都理不顺,以至于使用了猴子编程,这边改改,那边改改,最后测测看看好没好,emmm,反正是变好了一点点,春节后叫大家来review看谁能改谁改吧,也没人敢改。

卡UI,所有的网络通信都卡UI,导致winform界面加载要好久,我嵌入的最笨重的cefsharp加载网页反倒脱颖而出的快。。。。

控件库老,控件库多年没有更新了,想要做一个表头复杂查询的功能,我看了新版本控件是有的,而老版本根本没法做,因为不太可能自己定位下拉框位置,所以我说做不了,而不讲道理的领导硬是说能做的,反正我觉得做不了,你让有本事做的做去吧,这么说的次数多了,别人也说没法做了,才终于让这事情过去了。

没有x64版本的dll,也没有这些dll的代码,由于软件在某些地方大量的缓存界面控件,所以很占内存,而批量打印图片功能又由于打印预览功能本身内部就很消耗内存,这不是我们的锅,这是微软的锅了,但是32位系统不够用,就开始打印没有图片的报表浪费纸,领导一开始一直怪我头上,我也说,这没啥优化空间了,你自己看着办吧,然后我就开始搞x64位,并替换了managed.dx组件为sharpdx,office的COM组件为netoffice和npoi,基本解决了,有一个有源码的COM组件编译了64位版本动态加载了,而还有的c++dll,怎么问领导要源码都没找出来,反正我是让x64跑起来了,缺源码的功能我也没办法,接下来的问题就是1、32位浪费纸,一块钱一张的那种,怎么优化都不行 2、64位缺了点功能,没法正式用 3、采用调用一个新的进程的方式,我搞的图片打印就两个弹框再加两个cs文件,非常独立没有交叉逻辑,数据来源是调用别的地方的,你们有本事整理出单独的进程就整理去呗,结果貌似他们也没做成 。反正我离职很久以后很久,他们的矛盾还没彻底解决。我也想关心一下解决没解决。。。。。因为我试过64位打印几百张后占用几个G,退出界面后瞬间就清回去没有泄露,还是很爽的,反正我没锅。。。不知道他们爽的起来么

界面端代码不分层,后端分层过多,每次要维护后端代码时,就往下找好几层,每个模块写法还不太一样,找好几层找到sql去改,这还算好的,前端他不分层了,没有公共的方法和控件,每个地方自己写对后端的调用代码,每个地方都完全不一样,公共控件没地方放,公共的界面业务代码也不好放,反正大家碰到公共的也不会提取,只会复制任其变异。。。。


找茬领导,这个领导的话都非常的矛盾,一会儿说,不管过程,结果好就是目的, 一会儿有说,这治标不治本啊。有时候说你要理解客户的想法,但是他转述客户的需求都是他理解过了的,我们还理解个毛线,只能照他说的做呗,反正逻辑奇葩,语言怪异,我也不生气,反正就是整天吐槽他,反正这份工作也是混日子,没想着一直做下去。


其实我已经公关了一些疑难问题了,比如富文本文字间距,64位,动态查询拼sql的整体重构,cefsharp如何在项目里不崩溃(写demo不会崩溃的用法,扔进去就彻底崩溃,一直在改cefsharp的源码),也是花了很多力气的奈何屎山还是屎山,没法撼动,领导又很不讲道理又很坑,我用个Task他都能吐槽变天,很多会有风险的问题我也不敢改,所以屎山还是永远的屎山。



再说一点真祖传代码,DICOM图像处理,有个祖传的c++库,用在一些老的项目上,win2000时代的东西了,所以很省内存,里面的代码都是在汇编优化指令集,那一个个方法我一个都看不懂,我也不知道一个方法里操作点寄存器是怎么优化代码的,我印象中嵌入汇编优化代码也是在业务层面用来优化汇编代码的,是自己的汇编比生成的汇编效率高去替换用的,没想到这样一个个方法还能这样用,我还是用C#的fo-dicom吧。


user avatar   yifeiyuan 网友的相关建议: 
      

加入阿里后见过太多太多历史遗留代码了。

看了后基本都是一脸蒙蔽,特别是首页跟详情的代码。

这代码什么意思?

为什么要这么写?

它想做什么?

这几个判断干啥的?

这业务场景是啥?

哈?????

。。。。。。。。

刚进阿里的时候动手改过点老代码,自己测的好好的,一到集成到处crash可把我吓的,现在我根本不敢动了。。。

就那样当祖宗供着吧。


user avatar   liu-yang-ming-28 网友的相关建议: 
      

刚入职的时候,熟悉项目代码,经常碰到各种奇形怪状的代码,有且不限于:各种进不去的分支,各种奇葩逻辑,各种风格不统一的编码风格,各种我也形容不上来但是看着很蛋疼的代码。。。每当问起老员工这里为什么这样实现时,他都会漏出一副深邃的表情:别问我,我来时就这样了,历史遗留问题。。。

至于如何对待,我举个例子。我们代码中有一行代码,在一个奇奇怪怪的地方设了个奇奇怪怪的标志量,然后后面一个注释:

// 位置不能动,不然时序就都乱了。

作为一个萌新我当然乖乖滴没去动它,直到有一期新需求,这个标志量的位置出现了点小问题,然后我就尝试性地把这句话往后挪了一小下,然后程序从头错到脚指甲。在体会到前辈的用心良苦后,我又在那个注释下面加了一句:经验证,真的不能动。。。


user avatar   ptteng 网友的相关建议: 
      

“不如重写”


程序员绍博说。



过了3年。



“不如重写”


程序员金超说。


user avatar   pyluo 网友的相关建议: 
      

有个项目有年费功能,就是1月到12月期间充值满多少钱,就升级为年费会员,新年的1月1号重置。

然后代码是这样写的
void AddMoney(int num){
count += num;//count>100就是年费
//TODO:后面接手的人记得在2017年12月31号把count清0
}


对滴,就是写个TODO


user avatar   tenacious-life 网友的相关建议: 
      

接手前辈的代码之后:

1.这种写法简直弱智,侮辱我智商,轻松想到优质得多的写法

2.开始优化,耗时2H,搞定了

3.噫!出现了BUG,开始修复,耗时1H

4.哇!又有BUG,原来这里不能这么写,继续修复,耗时1.5H

5.总算搞定了……MD这跟原来的写法有什么区别


user avatar   tim-chen-21 网友的相关建议: 
      

看过几年Windows内核的代码,也就只是看看,不能改。有时候看到一些奇怪的逻辑,不要慌张,这里面一定有一个很长的故事。

不过万事没有绝对。

有一次和同事一起调试一个蓝屏,看到一段内核内存管理的代码,有一个地方没看懂,貌似for循环多循环了一次。恩,这一定是我们的理解能力太差了。然后我们仔细看了一下午,终于想出了几个貌似合理的解释。为了确认,我们鼓起勇气写信给当时Windows内存管理的大牛Landy(他现在已经是tech fellow了)询问了此事。

结果人家很快回复了我们。"It is a bug since day 1. I have just checked in a fix." 留下我们俩一脸懵逼。

就这样一个从NT开始藏了十多年的bug被两个小白给发现了。

ps. 这个bug没有什么显著影响,只是内核态内存分配性能略微受损。


user avatar   qian-xin-diligent 网友的相关建议: 
      

爷爷当年的汇编程序源码手稿,真[祖传代码]










_______更新_______

有评论质疑答案真实性,我回复一下

我爷爷1933年生人,因为社会战乱动荡原因,上学一直是断断续续,考上大学时已经是25岁,加上本科5年(据我爷爷说那时候大学都是5年制的),也就是说参加工作已经虚岁31岁。

我爷爷本科读的无线电专业,毕业分配工作去了广播电台,那时候主要是搞无线电,还没有接触计算机,直到1980年后,国内开始推广计算机,到84年他才被派去北京,学习了几天的Basic语言,后来又自己拿了一套汇编语言的教材,边自学边写的程序。都说35是程序员的一道坎,刨去大环境不谈,想想我爷50岁了还能写汇编,我也不好意思抱怨什么,砥砺前行吧。


我做程序员也算是受我爷爷的影响,他在我出生那年退休,后面我上学了就一直照顾我并辅导我功课,大概从我小学开始,就一直给我灌输“计算机科学好,以后什么都要计算机化,你以后一定要学计算机巴拉巴拉”。结果最后俺就真的就走上了码农之路。 - ̗̀(๑ᵔ⌔ᵔ๑)


user avatar   okstar-1 网友的相关建议: 
      

某公司有个很著名的故事:

有一个系统是用来发放固定电话卡号的。发放的时候为了让号码能随机化,需要取系统时间作为种子生成随机数。但这个算法有个问题,如果短时间内被调用多次,取得到的系统时间(可能是毫秒)就是相同的。那么计算生成的前后的卡号就是有规律的。

原来的程序员在代码中增加了一行语句sleep(1),通过这行语句强制每次调用取得的系统时间是不同的。

好了,故事来了。这段代码在网上运行一直好好的,但某一年有个新来的程序员,改另一个bug的过程中,瞅着这个sleep(1)左看右看,觉得都没有逻辑上的意义。(要命的是,这行代码没有注释),于是敲下两个斜杠,把这行代码给注释了!

由于这是顺手的行为,谁也不知道他把这代码给改了,因此在验证的时候也没有特意去测试发放卡号这功能,因此这个新注入的bug就被发布出去了。

这个bug后果是严重的,这直接导致某运营商发放的电话卡被人轻松推测出来,据说损失了好几十万。(二十年前的好几十万啊亲)

后来查啊查啊,就查到这行被注释的sleep(1),解决的办法就是恢复它。改代码那哥们下场是怎样,故事没说。反正像我们这种刚进去的新人,这个故事被反复教导着。教训就是:对于任何旧代码,如果没有明确的需要,千万别手多多去碰它。

说完了。




     

相关话题

  程序员如何提高安全的编码能力? 
  国内Java面试总是问StringBuffer,StringBuilder区别是啥?档次为什么这么低? 
  就代码能力和开发经验来说,姚期智是不是根本就不如稍微有三到四年开发经验的程序员? 
  如果同时有两个项目让你选择,一个是使用C++的QT,一个是用JAVA的Android,你愿意往哪个方向发展?请说出您的理由。 
  为什么女性程序员少于男性,因为女性不适合写程序吗? 
  十字军之王3有哪些玩法? 
  在技术上强到什么程度,才会成为年薪百万的技术型大牛? 
  为何 Linus 一个人就能写出这么强的系统,中国却做不出来? 
  DirectX是谁开发的?有什么过人之处? 
  程序员的产出为什么和投入时间不呈线性相关的关系? 

前一个讨论
俗话说“慈不掌兵”,中国自古以来有没有“以慈掌兵”且成功的例子?
下一个讨论
如何看待山东济宁市长辞职,称月薪 7000 元,每天工作超 10 小时?





© 2024-12-22 - tinynew.org. All Rights Reserved.
© 2024-12-22 - tinynew.org. 保留所有权利