首页 > 其他分享 >中国软件业真的到了该反思的时候了

中国软件业真的到了该反思的时候了

时间:2023-06-21 13:05:59浏览次数:30  
标签:重构 软件业 代码 系统 设计 反思 软件 真的 我们



中国软件业真的到了该反思的时候了_软件设计

中国五千年文化造就了我们诸多的性格,其中之一就是好大喜功,这尤其反映在中国的软件产业。不错,我们确实拥有数量巨大的网民,拥有无与伦比的庞大市场与用户需求,但这并不足以让我们的步入世界领先行列。在巨大的市场优势面前常常让我们有些迷离,有些飘飘然,有些盲目地民族自豪感,喊出诸如“赶英超美”的口号。然而,客观地讲,我们现在却是差距巨大。

也许你觉得我这话有些崇洋媚外,但静下心来仔细分析我们自己设计的软件,我们注重了软件质量了吗?我们在如履薄冰地进行每一次设计了吗?我们的每一个系统都在编写高质量的代码了吗?也许每个项目的第一个版本我们做到了,但随着软件生命周期的延续,与软件需求的不断变更,我们真的越来越难以拍着胸口说,我做到了!这就是当今中国软件之殇:没有高质量的软件设计,哪来高质量的软件系统?

所以,作为中国软件业中的一员,你应该仔细反思了。下面这篇文章,一个真实的故事,也许可以给你许多的感悟:

2012年,我接到一个任务,对公司一个运行了十年之久的软件系统开展课题研究,使其能够由现有的省集中的运营模式,改为全国集中的运营模式。将原有的,每个省一台服务器的运营模式,改为将所有业务都集中于一台服务器进行运营,毫无疑问,这是一个性能问题,通过加入缓存、分布式处理、数据库分区、读写分离等技术,从而解决大并发访问与大数据量处理,问题就解决了。起初,我也是这样认为的,但我真正深入到这个软件系统的程序代码中时却发现,问题不是想象中那么简单。

虽然之前也有所耳闻,但我真正深入到代码中时,还是感到十分的震惊。整个项目中,一个类数百个方法,一个方法数千行代码的地方,比比皆是。当你游走于数百个方法,或者数千行代码中时,即使像我这样工作了十多年的老手,要读懂也是相当困难,更别说那些刚毕业的新同学。此时,我意识到,如果不改变现有的代码结构,这个系统真的无法承载任何的技术改造。

我造访了参与这个系统多年的老员工,那些“元老”们。他们告诉我,这个系统其实在最开初设计上还是很不错的。然而,经历是十年的维护,各种功能需求,加加减减,不断更新,版本升级上百次,问题就变得越来越大。随着人员的流动,一些代码变成了盲区,谁都不明白它的意思,同时谁都不敢去对它有任何修改,除非迫不得已。每个新员工加入,都不敢轻易修改原有任何代码,而是在原有代码的基础上不断添加代码。这样,随着功能的不断变更,新添的代码就想肿瘤一样不断膨胀,最后由数百行代码扩展成数千行代码,由数十个方法扩展成数百个方法,代码质量不断降低。

慢慢地,程序员越来越看不懂代码了,但他们又要完成自己手头的工作,因此开发工作变成了一种冒险。那么公司怎么能保证每次上线的新程序是正确的呢?那就是测试,投入巨大人力与时间的测试。由于程序越来越复杂,每次修改的测试成本都变得巨大。而这时,由于开发人员觉得,测试人员总数能测出问题来,所以自己只负责开发就可以了,所有的验证工作统统交给测试人员。毫无疑问,这个项目已经陷入了一阵难于自拔的恶性循环之中。维持现状已然疲于奔命,何谈任何技术改造?

然而,我认为这不是一个个案,而是一种普遍现象。大家想想,哪个软件公司没有运营数年的遗留系统?哪个系统不是遭遇频繁变更?在这些系统经历了数十次变更以后,谁还敢拍着胸脯说,我们的设计依然很清晰,我们的代码依然很优质,恐怕不能。

“就这样吧,好死不如赖活着!”也许大多数人都会这样想,然而却不包括我。我从业数十年就一直是一个救火队员,去拯救那些无法再运行下去的软件系统。我很少开发新的系统,总是在半途去接手一个老系统。这些系统起初代码都十分凌乱,维护十分困难。但是在我接手之日起,事情开始变得好转。我总是在不断改造它们,优化它们的代码,使它们慢慢变得易于阅读、容易维护、容易变更。慢慢地,我们的维护工作变得越来越轻松,我们开始喝着咖啡,听着音乐,享受编程生活。我采用的方法就叫“重构”。

重构不是高端大气上档次的华丽名词,也不是病入膏肓才拿出来唬人的终极杀招。它不是将原有系统改得面目全非,更不是拿着代码一阵瞎改的鲁莽之举。而是一种科学而稳健的持续改善。经过多年的工作实践,我深深的感到,这种方法是解决中国软件之殇的最有效方法,因为:

  1. 假如你在维护遗留系统,这个遗留系统本身的设计并不好,代码质量存在问题,那么你可以采用这种方法,持续而稳健地改造,最后将软件的维护纳入到一个良性的循环中来;
  2. 假如你是一个设计者,你在设计一个新系统,但你的设计能力不足够优秀,不知道怎样适应今后的变更,那么没有关系,思考今天的设计。因为有了重构,我们不用担心日后的变更。这样每个人都可以编写出高质量的程序代码;
  3. 假如你是一个遗留系统的维护者,你发现原有的程序不能适应新的需求,那么没有关系,通过重构先改造原有系统,以适应新的需求,再添加新的需求。这样做,你会发现你很容易设计出高质量的代码,使得新功能的加入不会降低原系统的质量。

当所有软件企业都做到了这些,那么中国软件的质量就开始提高,中国软件业才真正能够腾飞。

参与过国内数十个大型软件研发项目。《大话重构》一书的作者。


中国软件业真的到了该反思的时候了_重构_02

标签:重构,软件业,代码,系统,设计,反思,软件,真的,我们
From: https://blog.51cto.com/u_15767091/6528186

相关文章

  • Android应用开发者,你们真的了解Activity的生命周期吗?
    一开始,我觉得Activity的生命周期虽然过于复杂,但它不应该是一个难题。我的意思是:对于Android开发新手来说,如何正确地处理Activity生命周期可能有点困难,但是我无法想象对于那些富有经验的android开发者来说,这依然是一个棘手的问题。我还是想的太简单了。一会儿我会告诉你整个故事,但是......
  • java 如何字符串中提取数字,这个方法真的很不错
    Java中提取字符串中的数字,可以使用正则表达式或非正则表达式的方法。1.使用正则表达式可以使用正则表达式"\d+"来匹配字符串中的数字,并使用Matcher和Pattern类实现。importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassExtractNumbersFromString......
  • java 如何字符串中提取数字,这个方法真的很不错
    Java中提取字符串中的数字,可以使用正则表达式或非正则表达式的方法。1.使用正则表达式可以使用正则表达式"\d+"来匹配字符串中的数字,并使用Matcher和Pattern类实现。importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassExtractNumbersFromString......
  • 虚拟列表,我真的会了!
    原文链接:虚拟列表,我真的会了!虚拟列表的使用场景如果我想要在网页中放大量的列表项,纯渲染的话,对于浏览器性能将会是个极大的挑战,会造成滚动卡顿,整体体验非常不好,主要有以下问题:页面等待时间极长,用户体验差CPU计算能力不够,滑动会卡顿GPU渲染能力不够,页面会跳屏RAM内存容量......
  • 英文中形容女人的词汇真的不少
    英文中形容女人的词汇真的不少,比如说: charm魅力、pretty迷人的、elegant优雅的、beautiful美丽的、gentle文雅的、polite有礼貌的。tender温柔的fabulous极高的赞美attractive吸引人的gorgeous也是很高的赞美带点“华丽丽”的意思stunning也是漂亮的意思。那么......
  • CAM(类激活映射),卷积可视化,神经网络可视化,一个库搞定,真的简单的不能再简单
    文章目录前言1.`pytorch-grad-cam`这个库可以做什么?2.安装`pytorch-grad-cam`3.具体使用案例3.1选择目标层(TargetLayer)3.2单个图像CAM热力图3.3批处理图像3.4一个CAM计算模板前言18年,我刚入门的时候,写了这样一篇文章,想要看之前那一篇的点击这里现在都还有很多朋友在看,但我......
  • 使敏捷反思会议成功的 8 个极其有效的策略
    ​又是年底,各大app都推出各种年度总结,年度回顾。这些总结有的很有趣,有的很扎心,在推动年底KPI完成的同时,也给我们带来不同角度的思考。而在敏捷工作方法中,反思回顾也是敏捷实践很关键的一环。那么我们如何从敏捷反思会中获得更多积极成果,并由此建立一支强大的团队?我一直觉得......
  • 你真的读懂了Java源码?Collections源码初探
    最近重温Java知识,遇到不懂的问题搜索互联网/博客很难直接找到答案,还好如今有了chatGPT,比大多数CV复读机/纯文档翻译的内容更有用。很多文章总结冠以“深入理解xxx”,“万字长文详解xxx”的文章,也不过是演示一遍调用代码,让你知道了怎么用,在什么情况下用。但至于为什么这么用,以及Java......
  • 定位调试两手抓,报错真的不可怕 | MindSpore报错调试宝典(二):网络构建与训练类报错之cont
    上一期我们讲解了数据加载与处理类报错如何调试解决,今天给大家继续带来网络构建与训练类报错中的context配置问题,本期仍将以案例的形式展开,详细讲解mindspore.set_context算子的使用方法以及配置方法,希望大家在后续使用context算子过程中可以轻松解决相关的报错问题!同时也欢迎大家......
  • 【若归】 【LGR-142-Div.4】洛谷入门赛 #13赛后反思
    比赛链接:【LGR-142-Div.4】洛谷入门赛#13rk288,比前几次差(可能是因为rated?)A十年OI一场空,不开longlong见祖宗#include<bits/stdc++.h>usingnamespacestd;intmain(){ longlongintn; cin>>n; cout<<"8"<<12*(n-2)<<""<<6*(n-......