遗留系统现代化实战
姚琪琳
Thoughtworks 资深咨询师
5615 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
用户故事 (1讲)
遗留系统现代化实战
15
15
1.0x
00:00/00:00
登录|注册

03|以降低认知负载为前提:为什么遗留系统这么难搞?

你好,我是姚琪琳。
前两节课,我们分别介绍了为什么要对遗留系统进行现代化,以及遗留系统现代化的四个方向和三个原则。从这节课开始,我们将逐一讲解这三个原则。今天先来看看第一个原则:以降低认知负载为前提。
你可能会问,认知负载对改造遗留系统有什么帮助呢?别着急,学完这节课的内容,你自然就明白了。

怎样理解认知负载?

作为开发人员,不管是不是工作在遗留系统上,我想你都一定面临过来自业务方或项目经理的灵魂拷问:为什么这个需求这么简单,不过是多一项在下拉菜单,你们却开发这么长时间,要我做绝对不超过半天!言语中透露出一丝对于你工作能力的质疑,或是上班摸鱼的揣度。
然而实际情况真的如此吗?你恨不得翻出代码逐行展示给他看。来来来,你以为只是下拉框多了一项,实际上前后端都要加上;后端还要改五个服务,有两个我本地从未部署;搭环境调服务就用了一天,改代码修 bug 又是两天半;别问我为什么修了两天 bug,因为实际上服务要改六个;我已经连续加班三个晚上,你要觉得你行下次你上……
玩笑归玩笑,但类似的 battle 我相信每个同学都经历过。你在面对这样的质疑时,内心肯定是很委屈的。但是你是否思考过这里面的真正原因?
你可能会说,是架构不合理,新增一个下拉项要改五六个服务;是 DevOps 工具不好用或根本没有,在本地部署新服务搭环境要很长时间;是系统知识严重缺失,不知道要改哪些地方以至于漏掉了一个服务……
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

遗留系统现代化的重要原则是以降低认知负载为前提。文章通过实际案例引出认知负载的概念,详细解释了内在认知负载、外在认知负载和相关认知负载,并强调了在软件开发中要减少外在认知负载,增加相关认知负载。作者分析了架构不合理、DevOps工具不好用以及系统知识匮乏对外在认知负载的影响,并指出了一些实践可以长远降低外在认知负载。文章深入浅出地阐述了认知负载对遗留系统现代化的重要性,为读者提供了有益的技术思考和指导。文章强调了降低外在认知负载的重要性,以及如何在遗留系统现代化中应用这一原则。通过举例说明了代码重构、架构拆分、持续集成流水线优化等措施如何降低认知负载。最后,文章提出了两个开放式的思考问题,引导读者思考项目中的分支策略以及实践中降低和增加外在认知负载的情况。整体而言,本文强调了降低外在认知负载对于遗留系统现代化的重要性,并提供了相关实践和思考问题,对于从事遗留系统现代化工作的读者具有一定的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《遗留系统现代化实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 李威
    置顶
    1、我们日常是所有人均在develop分支上进行开发,开发完成后,将develop分支代码发布到测试服进行测试; 2、测试通过后,再把develop分支合入master分支,并发布到预发布环境进行测试验收; 3、产品经理进行验收测试通过后,将master分支的代码发布到生产环境; 4、如果在develop分支上进行开发的过程中,有一些线上bug要修复,或者老板们加塞一些紧急的小需求时,就先保存develop分支的代码,然后切到master分支上,并基于master分支拉出一个专门的分支用于修复bug或加塞紧急需求; 5、基于这个专门的分支进行开发测试验收通过后,就将此专门的分支合入develop以及master分支,然后基于master分支进行发布,最后切回develop分支继续之前的开发工作,并删除临时创建的那个分支。 以上,就是我们当前的分支开发模式,我也搞不清楚到底应该叫么子分支模式。烦的就是常常在develop分支上干得好好的,时不时就来个加塞需求,老是要在各种分支间切来切去,恼人的很,有时候不小心没看清楚当前处于哪个分支,结果有时候还得重搞一遍。 针对我们当前这种分支开发方式,不知道姚老师能否提供一些改善建议,感谢。

    作者回复: 我理解你说的develop应该就是每个开发人员在开发需求时,从master分支上来出来的个人开发分支吧?这个实际上就是feature branch模式。这种模式其实是有一些问题的,比如你的代码是没法持续push/merge的,只能等开发完成后才merge全部代码,没有办法做到真正的持续集成,同时对重构也不友好,因为merge的频率太低了,重构会导致大量的冲突。 而且如你所说的,各个分支切来切去,还要想着向各个环境去merge代码,开发人员除了开发需求外,脑子里还得想着各种跟开发需求无关的东西,大大提高了认知负载。 更理想的分支策略当然是主干开发,但这也是有一定门槛的,国内真正能实施主干开发的项目也并不多,一方面对于人员能力要求比较高,另一方面对需求管理的要求也比较高,尽量不要让需求临时中止开发。但这些都属于内在认知负载,一旦掌握就一劳永逸。而不像内在认知负载那样,需要时刻想着这个想着那个。主干开发还可以解决多分支切换的问题,因为你的代码始终是可以merge的,你可以把手头的代码merge完之后继续在主干上修复bug。 所以我建议你根据自己项目的实际情况进行改善,比如是否可以将比较稳定的需求(或者一个团队内部)建立一个公共分支,某种程度上可以作为你们的主干,可以解决合并冲突和不敢重构的问题。 分支策略是个讨论不完的话题,我甚至觉得光这个就能写一个专栏了……

    2022-04-15
    7
  • aoe
    睡5秒真是魔幻啊!

    编辑回复: 笑中带泪……

    2022-04-15
    5
    5
  • Kent
    目前实践下来我比较倾向于这样一种方式: master / dev / test / prev / release 基于每个需求ID,开发人员各自从master切出新分支"开发人员名字_需求ID" 开发时,需要集成自测时可自由合并到dev 确定需求完成提交测试时,需要由主管codereview再合并需求分支到test,prev类似 测试产品验收通过的需求,即可合并到master 迭代到期,master合并到release进行发布 --- 这样的好处是:master在任意时间点都保证是生产环境可用的代码,随时可以发布,迭代到期有需求没开发完也不担心影响其他需求发布 目前存在的问题是:项目初期遇到开发人员需求相互依赖的情况,需要特别备注清楚,被依赖需求需要先测试完毕合并到master

    作者回复: 感谢分享

    2022-05-08
    2
  • 子夜枯灯
    目前工作的系统是ssm得单体架构,供应商提供的。经过了各种魔改,现在项目代码800m。动任何一个地方都要大量人力测试。

    作者回复: 感谢分享。

    2022-04-26
  • Geek_a10fcf
    已学习

    编辑回复: 编辑回复,快把学后收获交出来~

    2022-04-24
  • 故事、自己写
    Rap嗨起来

    作者回复: 😀

    2022-04-19
  • Geeker
    分支开发,分支发布 master、dev、st、uat、bugfix

    作者回复: 嗯,这种可以算是国内非常常见的分支策略了

    2022-04-17
  • killer
    留系统最大的认知负载其实是无处可寻的业务知识。很赞同,其他的都好解决。但是怎么确保业务知识可寻?我们的现状:只要能大致测试通过,就会上线,而没有精力去偿还欠下的债务、改善外在认知负载。如此恶性循环,导致遗留系统的外在认知负载越来越高,修改起来越来越难,新人不易接手。

    作者回复: 确实在遗留系统中大家都是这么做的,而如果一个新系统不注意这些,也会很快变为遗留系统

    2022-04-16
    2
  • 拉欧
    之前处理一个工作流代码,会在线上环境时不时的出bug; 我分析了一下午发现,原作者在构建工作流的时候用了clone方法,但是没搞清楚深拷贝和浅拷贝的区别,导致所有的工作流用的是同一个引用,只是在多线程下会时不时的更新其中的对象。。 我直接删掉了这个clone,改成new一个新对象,世界清静了 有一种把一坨积累了3天的粑粑排泄出去的清爽感
    2022-05-21
    2
  • DCChan
    第一次听语音,rapper起来了
    2022-05-13
    1
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部