热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

大神们进来交流一下如何快速的理解现有的代码

现在的系统都很庞大、修改一处代码总要瞻前顾后的考虑一下对整个系统的影响而对于庞大的系统而言,自己修改过、完全理解的部分如沧海一粟大家在工作中如何快速的理解别人做的代码、修改代码时如何考虑对整个
现在的系统都很庞大、修改一处代码总要瞻前顾后的考虑一下对整个系统的影响
而对于庞大的系统而言,自己修改过、完全理解的部分如沧海一粟
大家在工作中如何快速的理解别人做的代码、修改代码时如何考虑对整个系统的影响
一起交流一下吧

先抛砖引玉一下:
最原始的方法莫过于grep,但grep也有很多弊端,比如检索用的关键字得凭借经验来决定,有时不够客观;工作量非常大,一层一层网上找,有时根本没个头儿;找呀找呀又找回来了,像在迷宫中散步似的

比较简洁的办法是在现有的系统中进行一下测试,如果有比较完善的log的话,通过一些工具(有可能得自制),生成出sequence图,可以比较直观的看到系统之间各个模块的调用关系;通过对比正常情况下和特殊情况下的log还能迅速找到产生差别的分歧点;这种方法的困难点在于:事前需要项目组统一好log的输出方式,否则铺天盖地的log也让人无从下手
还有一个问题就是:毕竟测试仅能部分展现代码的运行过程,具体的逻辑还得仔细研究代码才行

当某天,领导给你一份几十万行甚至上百万行的代码时,如何厘清这里面的脉络,是一个程序员必须面对的问题

除了灌水的,尽可能给每位发言的人都分配一些回帖奖励分数
大约在这个月底左右结贴,希望大家踊跃发言,不吝赐教

62 个解决方案

#1


可以考虑先只针对一个功能看,并且用笔和纸,将这个功能自己总结着写下来。
一个功能点能解决了,再看其它功能点就容易些了。
思路是 由点及面,方法是书面总结。个人觉得笔头写下来的过程中,会注意力更加集中。

#2


引用 1 楼 oh_Maxy 的回复:
可以考虑先只针对一个功能看,并且用笔和纸,将这个功能自己总结着写下来。
一个功能点能解决了,再看其它功能点就容易些了。
思路是 由点及面,方法是书面总结。个人觉得笔头写下来的过程中,会注意力更加集中。

赞同,我也是用这种方法来让自己集中注意力思考的,反正对于我来很管用~

#3


1、分析包以及包含哪些类,对整个项目有个概况了解,分析项目采用的框架结构;
2、看具体类以及类的公开接口(共有方法签名、属性),再看类之间的关系,从面向对象角度分析设计思路;
3、再看类的内部实现,这部分通常根据需要,需要看什么地方就看什么地方。

#4


找个功能,跟着走下去,看看处理流程,所涉及的代码!这样就好理解了!

#5


补充一下想法,好多代码直接试着去读,很难理解,Debug一下就豁然开朗了

所以,如果能Debug,不失为一种 读解代码的 好方法

#6


这和代码质量太大关系了。。如果那份代码有详细文档,清楚地说明了使用的框架结构,以及遵守了哪些设计模式,遵循了哪些接口约定,那你一个模块一个模块的去看很快就能搞清了。
怕就怕那些杂乱无章毫无章法的印象派代码风格,跟踪调试一个模块,这里一个调用,那里一个调用的,跟踪三四层绝对晕了。。

#7


良好的结构真的很重要,最好能把很多庞杂的功能的影响完全限定在很小的明确的范围内,这样做一些调查时会非常高效

代码是一次书写,终身阅读的东东,下手之前三思而后行,多考虑一下以后维护人员的心情,才能做出合理的设计

#8


根据文档和注释,写个大知道的模块调用流程

#9


引用 8 楼 u011643314 的回复:
根据文档和注释,写个大知道的模块调用流程


如何持续保持这个流程和最新的代码一致呢?

#10


首先对整个项目要有初步了解,弄清楚整体框架结构,功能块的组织,然后以功能区为单位,找到问题点,由点及面这样抽丝剥茧。大体上应该是由全局到局部,再由局部到全局。
六楼说的很有道理,原始代码的质量的质量太重要了,如果给你的是一份改了很多次,经了很多手的代码,如果在没有文档注释,那可真是头疼。

#11


值得讨论,好贴推荐

#12


从主页开始看,一点一点就能懂

#13


感觉要先看文档 大致了解整个软件的功能有哪些 针对这些个功能点找到对应的代码 然后各个击破

#14


都成推荐了。。再补充一句,其实丰富自己的经验,充实自己的知识库也是很重要的
比如要你研究Linux内核源码,不说最新内核版本,就说各种分析各种深入浅出烂大街的2.6版本,代码应该说相当规范了,文档也几乎不能再详细了,但要你研究出个什么结果还是不太可能的,能看得懂结构逻辑与算法就已经算牛逼的了,更多的人可能没几个模块看得懂的,因为这涉及到很多操作系统的知识,没看过理论分析的几乎是不可能直接看得懂代码的(当然天才级大师除外),同时就算你懂一些操作系统理论,不了解很多著名算法还是看不懂,线程调度文件系统安全加密等都涉及到大量基础算法,以及他们的衍生“杂交”品种,没得功底修炼不了传世之作,不然只会走火入魔。

#15


值得讨论,好贴推荐

#16


不错 很好的资料

#17


#18


1.业务知识
2.指导文档
3.ER图
4.略懂一些该语言的代码。

#19


引用 14 楼 vnvlyp 的回复:
都成推荐了。。再补充一句,其实丰富自己的经验,充实自己的知识库也是很重要的
比如要你研究Linux内核源码,不说最新内核版本,就说各种分析各种深入浅出烂大街的2.6版本,代码应该说相当规范了,文档也几乎不能再详细了,但要你研究出个什么结果还是不太可能的,能看得懂结构逻辑与算法就已经算牛逼的了,更多的人可能没几个模块看得懂的,因为这涉及到很多操作系统的知识,没看过理论分析的几乎是不可能直接看得懂代码的(当然天才级大师除外),同时就算你懂一些操作系统理论,不了解很多著名算法还是看不懂,线程调度文件系统安全加密等都涉及到大量基础算法,以及他们的衍生“杂交”品种,没得功底修炼不了传世之作,不然只会走火入魔。


没得功底修炼不了传世之作+1

#20


先看业务框架,再看技术框架,最后再看源代码.

#21


引用 20 楼 xxyj6450 的回复:
先看业务框架,再看技术框架,最后再看源代码.
支持 ++ 

#22


先理解业务,业务最重要。再根据业务去熟悉代码

#23


#24


其实我觉得如果有同事最好就最好和同事先交流一下, 然后把我一下整体, 再从自己那部分梳理

#25


一个系统项目再大, 框架是死的,所以我一般先了解这个项目用的框架,之后通过一个功能的代码来熟悉这个框架的使用方法,基本上其他的功能都是一样的了。。

#26


1. 先了解你要读的代码是用来做什么的,这样就会对代码产生一个比较直观的认识。比如,快速的做一遍功能测试,如果有功能测试文档,那就按照文档走一遍。
2. 比较大的工程,代码的风格,和各个功能的实现都是十分类似的,如果不是这样,也就预示者这个项目的架构设计比较失败,难于维护。带着问题去阅读代码中的某个模块。比如,解决某个bug,通过解决这个bug,并对bug所在的这个模块深入理解。这样,结合1,你就能猜到整个系统的实现大概是个什么样子。

#27


光看代码太累了
所以这时候才体现了文档的价值
快速理解现有代码
我建议是先弄清楚这上百万行代码构成了一个什么系统
然后根据功能模块去细看代码
这样理解起来会更快
因为你知道这部分代码是干什么的
后面只需要关注是怎么实现

#28


引用 14 楼 vnvlyp 的回复:
都成推荐了。。再补充一句,其实丰富自己的经验,充实自己的知识库也是很重要的
比如要你研究Linux内核源码,不说最新内核版本,就说各种分析各种深入浅出烂大街的2.6版本,代码应该说相当规范了,文档也几乎不能再详细了,但要你研究出个什么结果还是不太可能的,能看得懂结构逻辑与算法就已经算牛逼的了,更多的人可能没几个模块看得懂的,因为这涉及到很多操作系统的知识,没看过理论分析的几乎是不可能直接看得懂代码的(当然天才级大师除外),同时就算你懂一些操作系统理论,不了解很多著名算法还是看不懂,线程调度文件系统安全加密等都涉及到大量基础算法,以及他们的衍生“杂交”品种,没得功底修炼不了传世之作,不然只会走火入魔。

这话说的在理!

#29


好难

#30


如果有需求文档就最好了,毕竟所有的代码都是为了实现需求的……通过需求文档和项目文档找到对应的文件包、程序集,模块的位置就自然浮现了吧,其实我是菜鸟

#31


这个问题的确头疼,因为接触新系统,完全不了解流程,一般的做法是先看两三天代码(老板应该不至于让你当天就开始改),注重某一项业务慢慢去改,边改边测试当前模块。

不知道说的对不对。。。

之前看过一个文章说的就是僵尸代码,大系统遗留的代码,不敢删除,也不敢修改,等更多好的建议

#32


进去跟一下代码就明白了

#33


先搞懂框架怎么用的 根据界面 一点点的跟代码吧

#34


一个良好的程序员,耦合性是很低的。从单独的模块入口看起,一般都是能理清楚的,主要这都是业务逻辑比较simple,看框架可能就要结合这接口的声明来看了

#35


#36


从头开始看,一步步来最快了~~~

#37


引用 22 楼 xmt1139057136 的回复:
先理解业务,业务最重要。再根据业务去熟悉代码

这个我赞同, 其实我觉得都没必要看代码,因为代码肯定看的懂,但业务确非如此。
对于“修改一处代码总要瞻前顾后的考虑一下对整个系统的影响”,我的理解是,还有比这更烂的系统么!

#38


好的文档加注释会有很大的帮助

#39


引用 36 楼 u010029389 的回复:
从头开始看,一步步来最快了~~~

同意

#40


一路看下来,个人觉得系统的结构更为重要,一个那么多代码的系统很难全部理解,也不是每个模块都能看懂的,根据需要,去处理需要部分的代码,这是比较理想的

#41


有文档没,代码注释多不。有的会容易很多。大的还是先看一个小模块把。

#42


     按功能来划分代码成模块,这是快速,大致上理解代码。
     然后逐步分解....
     当然,分解到何时何处是最基本,这要看系统的复杂程序和你的“循环层”and你想要的结果决定的

#43


有Demo最好,优先走一遍Demo

大牛们给出的意见普遍是,任何源码都从文档和框架走起。

Debug是一种手段,善用Debug,例如把项目的日志输出开到最大,安装虚机进行调试等等。

随时调,随时做笔记!自己理框架,有了轮廓其他的都轻车熟路了。

#44


#45


先看流程和页面  还有研究数据库文档、、、、接着熟悉框架、、、最后在整体框架下一小部分一小部分再根据更详细的流程啃掉、、、、

#46


熟悉业务,再跟代码走一遍。

#47


#48


1,根据文档和运行的项目了解功能,知道开发的目的。
2,根据类的名字,有时候也能看出点问题
3,个别不懂dug一下

#49


项目----->模块----->包-------->类-------->方法

#50


多谢大家的回复,每个回复都认真看过了

下周末结贴,有啥好想法请继续回复,加油!

推荐阅读
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
手机用户2602933853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有