热门标签 | 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的持久化存储策略。 ... [详细]
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
  • top命令使用方法及解读
    本文介绍了top命令的使用方法和解读,包括查看进程信息、系统负载、内存状态、CPU占用等内容。通过top命令可以持续观察系统上运行的进程,并了解系统负载情况,及时关闭一些进程以减轻系统负担。同时,还介绍了top命令的快捷键和安全模式启动方法。通过本文的学习,读者可以更好地使用top命令来管理系统进程。 ... [详细]
  • Telnet的使用(Telnet远程连接Linux)
    一、环境描述:客户端:Win10操作系统 ... [详细]
  • 一、概述nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的 ... [详细]
  • 网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linu ... [详细]
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社区 版权所有