Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何快速识别项目水平?

如何快速识别项目水平?

作者头像
Phodal
发布于 2020-09-24 07:35:46
发布于 2020-09-24 07:35:46
47000
代码可运行
举报
文章被收录于专栏:phodalphodal
运行总次数:0
代码可运行

软件开发是一个非常有意思的复制 + 粘贴活动。开发业务代码的时候,大部分人都不会不加思索地添加代码。毕竟,聪明的产品经理/项目经理们,天才式地想出了用代码行数的方式来计算 KPI,又或者是通过提交次数来进行考核 —— 虽然小步提交是个好东西,但是吧,大部分人不经过练习还是掌握不会的。

最近,我还我的朋友们说到,她们公司的打算强制一天只能提交一次代码。这绝对是代码行数计算 KPI 之后的,又一个伟大地创举式的地发明。如果我有直接颁发诺贝尔奖的权力,我一定给送给他一奖杯。

好了,回到正题。

自上而下的代码分析

最近,刚好因为项目的关系,需要分析某一系统的代码行数。通过一系列的复制 + 粘贴和 Excel 操作,我大致有了一套 DIY 的自动化分析方案:自上而下的代码分析。当然了,这肯定不是我先发明的,在某处一定有论文和代码、工具。只是我依据自己的想法和需求,完善了一下现有的方案。要知道,已经有大量地代码分析工具了。

其实总体的思路非常简单:项目行数 -> 包行数 -> 修改历史 -> 引用分析。

具体来说,就是:

  1. 通过代码行数(LOC)统计工具,统计总体的代码情况。
  2. 结合代码行数(LOC)统计工具,统计各个包的代码情况
  3. 获取 Git 提交历史,统计出经常修改的包或者是类。
  4. 构建语法树、制品(如 jar)分析,统计出引用次数最多的包。

唯一麻烦的地方就是做一些自动化。所以,这些功能就被我完善到 Coca 里了,笑~。

好了,让我们来看个示例。这里以开源项目 intelli-community (即 IDEA 的社区版)为例。

项目级代码行数

市面上已经有大量的行数统计工具,大家可以自行寻找。这里我用的是 Coca (GitHub:https://github.com/phodal/coca ),集成了三方用 Go 实现的 CLOC 统计功能。

首先呢,我们要实现的是分析整个项目的行数情况 coca cloc .

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
Java 66554 5172301 688054 512630 3971617 603221
Python 10017 424614 31629 34876 358109 22329
Kotlin 6383 602814 89130 35660 478024 51292
Plain Text 4105 635689 5799 0 629890 0
Groovy 3397 154817 23296 12364 119157 4683
XML 2549 494074 10056 3008 481010 0
HTML 2329 63331 2988 3623 56720 0
SVG 2124 21078 23 87 20968 0
JSON 1155 346795 352 0 346443 0
Shell 535 8295 1138 734 6423 811
Markdown 425 9660 1434 0 8226 0
Properties File 384 42069 2545 1348 38176 0
YAML 384 3264 202 55 3007 0
XML Schema 345 196649 17963 0 178686 0
JavaScript 169 30569 1562 5151 23856 3895
...
───────────────────────────────────────────────────────────────────────────────
Total 101908 8389984 898893 629497 6861594 703260
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop $288,297,976
Estimated Schedule Effort 132.017220 months
Estimated People Required 258.681675
───────────────────────────────────────────────────────────────────────────────

嗯,从规模上来看,这真的是一个超级大的项目,接近 700 万行的规模。所以,我第一次看到的时候,也不知道从哪里下手,于是我便想着是不是从包(目录)结构能解决这个问题。

PS:Coca 当前只支持单体分析,考虑有多模块和微服务系统的存在,我会在未来必要的时候,添加对应的实现。

按目录分析

简单来说就是,我们可以按目录执行 cloc,然后汇总结构即可。

所以,进一步地我们就可以执行 coca cloc . --by-directory,得到一个 CSV 数据,根据自己的需要进行编辑:

package

summary

Java

Python

Kotlin

Plain Text

platform

1800542

1460686

106

244586

4669

java

1479891

1059828

0

35224

267792

plugins

1765695

983860

70301

151816

150158

android

1865010

769437

52

325659

101848

python

664760

240080

287641

24626

17855

xml

866926

108794

0

207

174471

jps

66671

63437

0

1498

729

还可以绘制成图表。

除此,我还提供了一个 --top-file --top-size 10 的参数,以了解行数最多的几个文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
| LENGTH | COMPLEXITY | LOCATION |
|--------|------------|-----------------------------------|
| 1642 | 236 | ConstraintLayoutHandler.java |
| 1492 | 375 | ConstraintComponentUtilities.java |
| 1189 | 166 | CommonActions.java |
| 1184 | 325 | ConstraintWidget.java |
| 1169 | 129 | SingleWidgetView.java |
| 1115 | 213 | ScoutArrange.java |
| 1097 | 281 | ScoutWidget.java |
| 1081 | 224 | 3d/Rasterize.java |
| 1016 | 159 | LayoutlibSceneManager.java |
| 1014 | 220 | TimeLinePanel.java |

接着,只需要层层下推,我们就可以分析出哪个是系统最复杂的一部分。如下图中的复杂点,依次是:platforms、java、plugins、android。

变更频次

紧接着,我们就可以通过获取 Git 提交历史来知道,对应文件的修改变化。这里,我依旧使用的是 coca git -t。它源自于对于 git log --all --date=short --pretty="format:[%h] %aN %ad %s" --numstat --reverse --summary 命令的分析结果,有兴趣的读者可以参考 Coca 的源码,自行编写不同版本地对应实现。

可怕的是,我在 intellij-community 执行了 coca git -t 之后,生成了一个 241M 的文件,回去 GitHub 看了一眼:累计 290,459 次提交。

在我第一次没意识到应该记录下 log 之后,我又重新执行了一遍。最终,拿到了结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
| ENTITYNAME | REVSCOUNT | AUTHORCOUNT |
|-------------------------------------------------------------------------------------------------------------|-----------|-------------|
| platform/util/resources/misc/registry.properties | 2473 | 224 |
| platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java | 1211 | 149 |
| platform/platform-api/resources/messages/IdeBundle.properties | 1209 | 181 |
| platform/platform-resources/src/META-INF/LangExtensions.xml | 1206 | 192 |
| plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties | 1113 | 159 |
| platform/platform-resources-en/src/messages/ActionsBundle.properties | 1004 | 161 |
| platform/platform-resources/src/META-INF/PlatformExtensions.xml | 937 | 162 |
| platform/util//src/com/intellij/util/ui/UIUtil.java | 779 | 120 |
| platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java | 763 | 133 |
| platform/platform-resources/src/META-INF/LangExtensionPoints.xml | 762 | 150 |
| platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java | 684 | 126 |
| java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java | 675 | 117 |
| platform/platform-resources/src/idea/PlatformActions.xml | 671 | 139 |

然后,看一眼 registry.properties 是一个有 1800+ 行的配置文件,EditorImpl.java 是一个有 5000+ 行的 Java 代码,UIUtil.java 也有 3600+ 行……。嗯,效果是不是也相当理想,再看看 UIUtil.java 这一个名字,一看就非常适合重构。

高引用

最后,可能会进入慢的一步,分析代码,生成 AST。考虑到 IDEA Community 的这个代码量。我就不重复演示了,以 GitHub 的示例为例 coca count

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+------------+--------------------------------------------------------------------------+
| REFS COUNT | METHOD |
+------------+--------------------------------------------------------------------------+
| 2 | com.phodal.pholedge.book.BookRepository.byId |
| 2 | com.phodal.pholedge.book.model.Book.toRepresentation |
| 2 | com.phodal.pholedge.book.BookRepository.save |
| 2 | com.phodal.coca.analysis.JavaCallApp.parse |
| 2 | com.phodal.pholedge.book.BookRepository.save |
| 2 | com.phodal.coca.analysis.JavaCallApp.parse |
| 1 | com.phodal.pholedge.book.model.Book.save |

最后,我们又回到了这个模型上。

高引用与高修改

考虑到 AST 的慢的程度,我已经有一个更好的实现方式。

结论

分析代码是一件很有意思的事情。一番操作下来,能学习到非常有意思的东西。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 phodal 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot 框架深入学习之示例教程详解
我将先介绍Spring Boot框架的基础概念与优势,再通过搭建项目、配置数据库等步骤展示其技术方案,结合RESTful API开发等实例供你学习参考。
啦啦啦191
2025/06/18
1150
Spring Boot 框架深入学习之示例教程详解
为了更好的代码,我写了一个工具:Coca
如我在先前的文章所说,我最近的工作主要是在做架构重构、代码重构。所以,一如既往地,我又写了个工具来帮助我完成相关的工作。这样一来,下次我可以更快速地完成相关的工作。
Phodal
2020/02/11
1.2K0
为了更好的代码,我写了一个工具:Coca
写个取代自己的工具:Coco —— 自动化项目分析与建议
即使如此,依旧没有解决一个问题:我需要人力来分析项目、再抛出这些链接。于是,过去我一直就在想:能否做一个工具来取代自己? 当然了,我的真实意思不是:取代我自己,而是取代我做的那些重复性活动。(PS:等写完之后,再写一个自动化写 PPT 的工具,就完美了。)
Phodal
2021/01/28
3540
统计项目的代码行数
统计项目的代码行数可以通过多种方法来实现,具体取决于你使用的操作系统和可用的工具。以下是一些常用的方法:
收心
2024/01/10
2.3K1
2019 前端框架对比及评测
我们将基于 RealWorld 示例应用对比前端框架。RealWorld 示例应用的特点:
NXF
2019/04/26
1.3K0
2019 前端框架对比及评测
构建你自己的 AI 辅助编码助手:从 IDE 插件、代码数据生成和模型微调(万字长文)
我们会在 GitHub 上持续更新这个教程: https://github.com/phodal/build-ai-coding-assistant,欢迎在 GitHub 上讨论。
Phodal
2024/01/02
5.7K0
构建你自己的 AI 辅助编码助手:从 IDE 插件、代码数据生成和模型微调(万字长文)
基于JavaAgent的全链路监控一《嗨!JavaAgent》
案例简述 JavaAgent是在JDK5之后提供的新特性,也可以叫java代理。开发者通过这种机制(Instrumentation)可以在加载class文件之前修改方法的字节码(此时字节码尚未加入JVM),动态更改类方法实现AOP,提供监控服务如;方法调用时长、可用率、内存等。本章节初步怎么让java代码执行时可以进入我们的agent方法。
小傅哥
2020/07/14
1.8K0
使用CLOC统计项目成员Git提交的代码量
在开发中,了解代码的增减变化是衡量团队或个人工作进度的重要标准。cloc(Count Lines of Code)是一个功能强大的工具,它可以帮助我们统计项目中各个编程语言的代码行数。配合 Git,我们可以精确地统计某个作者(如“liuguangzhi”)在特定时间范围内所做的代码更改。本文将向你展示如何使用 Perl 和 cloc 来统计代码量。
Damon小智
2025/01/28
1372
使用CLOC统计项目成员Git提交的代码量
wc 统计已过时,cloc 每一行代码都有效
我们通常用代码量来评判一个程序员技术的高低或一个项目的大小,阅读新项目源码时,也需要了解其代码量,心里有个预期。
程序员荒生
2022/07/14
4630
实用工具汇总
还可能会出现浏览器安全级别过高,而出现警告,以FireFox为例:(也可直接点击接受风险并继续)
fliter
2023/06/18
2190
实用工具汇总
统计代码行数的方法梳理
在日常运维工作中,会碰到对一项项目下的代码行数进行统计的需求,下面对代码行数的统计方法进行梳理,以供参考。 1)最简单的是使用wc -l直接进行代码行数统计。(wc的几个参数的解释:-c 统计字节数;-l 统计行数;-w统计字数) 1)统计当前目录下的index.php文件的行数 [root@huanqiu_web1 ~]# cat index.php |wc -l 17 2)统计web目录下,js文件数量: [root@huanqiu_web1 ~]# find web/ -name "*.js" |
洗尽了浮华
2018/01/23
3.2K0
只懂 Git 如何成为架构砖家?从代码的物理分析说起
物理分析这一词,来源于我同事 @NoaLand 所推荐的《大规模 C++ 程序设计》一书中所介绍的物理设计。
Phodal
2021/03/16
3110
只懂 Git 如何成为架构砖家?从代码的物理分析说起
原 荐 用 ActFramework 写一个
看到 t-io 老谭的 用t-io来写一个网页聊天室或客服是个怎样的体验, 一时手痒, 就打算用 ActFramework 来写一个网页聊天室, 看看是什么体验. 废话少说,撸起袖子就是干。 1. 创建项目 运行下面的命令创建一个新的 ActFramework 应用项目: mvn archetype:generate -B \ -DgroupId=com.myproj \ -DartifactId=chatroom \ -DarchetypeGroupId=org.actframew
老码农
2018/06/20
1.1K0
代码图形统计工具git_stats web
仓库代码统计工具之一,可以按git提交人、提交次数、修改文件数、代码行数、注释量在时间维度上进行统计,亦可按各文件类型进行简单的统计,非常方便.
陈不成i
2021/05/28
1.6K0
你们要的Intellij IDEA 插件开发秘籍,来了!
王昭霞,软件开发工程师,先后从事脚本工具编写、工具开发、Android基础模块开发等工作。
京东技术
2018/09/28
57.2K13
你们要的Intellij IDEA 插件开发秘籍,来了!
JPA关系映射系列四:many-to-many 关联映射
本篇文章引导你通过Spring Boot,Spring Data JPA和MySQL实现many-to-many关联映射。
java干货
2021/02/17
5320
为了Markdown,我写了一款Jetbrains插件
最近做了一个Jetbrains的插件,叫markdown-index,它的作用是为Markdown文档的标题自动添加序号,效果如下:
蝉沐风
2022/12/19
8460
为了Markdown,我写了一款Jetbrains插件
日常Tips-Mac查看项目代码行数
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
韦东锏
2021/09/29
8620
《IntelliJ IDEA 插件开发》第一节:两种方式创建插件工程
对于码农这一行业的编程学习生涯来说,会遇到很多的不会,不会搭建IDEA工程、不会写老师的案例、不会完成书中的效果、不会做项目的需求、不会实现复杂的逻辑、不会抽象工程的结构等等。但这些不会当中并不是所有的不会,都因为太复杂学不会,而是很大一部分内容因为找不到好的资料、没有清晰的文档、缺少完整的案例,导致不知道所以不会。
小傅哥
2021/10/20
3.1K0
全栈程序员这个月写了啥代码?
时间过得真是太快了,又到月底了。对于程序员来说,总结还是挺重要的,我也一直保持着一个习惯,就是每个月末都要看一下自己这个月的代码统计情况,比如写了多少行代码、写了哪些语言的代码、占比是多少等等。
程序员鱼皮
2021/06/04
8960
相关推荐
Spring Boot 框架深入学习之示例教程详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验