代码量统计存在的问题和对策

本文是针对当前业界代码量统计工具现状的分析以及对策。虽然用代码量来代表工作量历来被广大程序员所诟病,但是代码量数据背后确实能够反映出部分软件开发中存在的问题,特别是增量开发,以及维护旧版本的时候,代码增量是很重要的一项参考数据。

代码量统计工具现状

目前研发代码量统计使用的工具是TextDiff和diffcount,主要用于代码量的总量统计和增量统计。但是这两个工具的功能不完善,很多情况下存在统计错误的情况,导致代码量的度量不准确,甚至偏差很大。

典型场景分析

文件重命名

这种情况实际代码没有变化,只是文件名变化,代码变化应该统计为0.实际上两个工具都会认为原有文件被删除,又新增文件。比如原文件1K,统计结果就是新增1K,删除1K。

##文件移动
这种情况实际代码没有变化,只是文件的存放位置变化,代码变化应该统计为0.实际上两个工具都会认为原有文件被删除,又新增文件。比如原文件1K,统计结果就是新增1K,删除1K。

函数移动

这种情况实际代码没有变化,只是函数在文件内部位置变化或者从文件1移动到文件2,代码变化应该统计为0.实际上两个工具都会认为原有函数被删除,又新增一个相同的函数。比如该函数是10行,统计结果就是新增10行,删除10行。
删注释

增删空格和换行

子目录遍历

代码总量统计

上述情况下,这两个工具都存在统计不准确的情况。特别是随着敏捷的推进,不断强化代码的重构,这种情况会更加突出。度量的基础是数据,只有在原始数据准确的前提下,度量才有意义。

工具 有效代码行 函数移动位置 文件重命名 文件移动位置 增删注释 空格换行 子目录遍历 代码总量
textdiff 不算{} X X X X X X X
diffcount 算{} X X X X X

#解决方案
目前商用和开源代码量统计工具,均没有能完全解决上述问题的。建议自己开发工具。

工具方案:将源代码解析成全局变量声明或者函数(类的方法)这一粒度后,进行比较。 虽然上述方案能最大程度接近真实情况,但是由于实际代码变化的复杂性,不可能完全解析数代码的真实变化情况,还是会存在误差。

企业知识管理

本文是三年前写的汇报材料上截取出来的干货,希望对您理解企业实施知识管理有所帮助。

知识管理介绍

什么是知识管理

知识管理(KM)包括一系列企业内部定义、创建、传播、采用新的知识经验战略实践。这些知识和经验包括认识,可以是个人知识,以及组织中商业流程实践。知识管理的目的是把个人及组织得到的知识进行有效管理,提高企业效益、增强竞争优势、创新、分享教训、持续发展。

为什么要实施知识管理

  1. 竞争
    • 市场竞争越来越激烈,创新的速度加快,企业必须不断获得新知识,并利用新知识为企业和社会创造价值
  2. 顾客导向
    • 企业要为客户创造价值
  3. 工作流动性
    • 雇员的流动性加快如果企业不能很好地保存这些雇员所获得的知识,企业有失去其知识基础的风险
  4. 环境不确定性
    • 在动态的不确定环境下,技术更新速度加快,学习已成为企业得以生存的根本保证
  5. 全球化的影响
    • 全球化经营要求企业需具有较好的沟通能力以及知识获取、知识创造与知识转换的能力

知识管理的作用

  1. 提高组织智慧
  2. 提升组织记忆
  3. 减少重复劳动
    一个组织的学习能力,和将学习转化成行动的速度,将是他战胜竞争对手最终的关节优势。——杰克·韦尔奇

如何实施知识管理

  1. 把知识积累起来
  2. 把知识管理起来
  3. 把知识应用起来
    知识管理通过积累->共享->学习->再利用->创新->积累->…… ,不断的重复来实现的。

实施知识管理的步骤

  1. 认知——统一企业对知识管理的认知,梳理知识管理对企业管理的意义,评估企业的知识管理现状
  2. 规划——通过对知识管理现状、知识类型的详细分析,并结合业务流程等多角度,进行知识管理规划
  3. 试点——选取适当的部门和流程依照规划基础进行知识管理实践
  4. 推广和支持——知识管理将大规模在企业推广,以全面实现其价值
  5. 制度化——重新定义战略,并进行组织构架及业务流程的重组,准确评估知识管理在企业中实现的价值。

知识管理在业界

  1. 联想在2003年就开始启动知识管理项目。
  2. 华为08年开始研发社区建设,10年成立公司层面的知识管理项目群,推进公司的全面知识管理。
  3. 西门子在上世纪90年代就开始组织和实施知识管理。
  4. GE在1989年发起了“群策群力”(Work-Out)活动,意在集中公司内外、上下各方面的智慧,培植、收集和实施好点子,集思广益,使员工们共享自己的知识,为公司带来效益。
  5. IBM 在1995年收购lotus后,将其打造成企业级通讯、协同工作及Internet/Intranet平台。
    IBM从自己的知识管理工作中受益匪浅:IBM自己统计的数据表明,截至2001年底,4年累积共节约资金57亿美元。

现状分析

无知和无序

  1. 员工头脑中的知识,没有有效输出形成显性知识,存在巨大的浪费和丢失的风险
  2. 埋头工作,无法及时获取到内外部知识,能力提升慢,效率提升难
    3 .各个部门各自为战,形成了一个个信息孤岛,不利于组织级的知识共享和改进

实施方案

提高认知

  1. 引起高层的关注
  2. 组建知识管理团队(有专职人员投入,吸引内部人员共建)
  3. 系统学习知识管理知识
  4. 引入外部咨询顾问
  5. 向业界学习优秀经验

开展规划

  1. 深入调研我司现状
  2. 挖掘出存在的问题和痛点
  3. 识别和梳理知识库、知识地图
  4. 组建知识管理系统开发团队
  5. 确定知识管理系统方案
  6. 开展迭代开发

试点合作

  1. 招募天使用户
  2. 与用户合作,不断完善知识管理系统
  3. 评估实施效果

推广和支持

  1. 面向更高一级层面全面推广
  2. 对各团队进行有效的支持
  3. 营造文化氛围

制度化

  1. 总结和回顾
  2. 开展新的规划
  3. 面向公司层面推广
  4. 端到端的知识管理打通(销售-研发-生产-用服)

知识管理系统方案

知识管理系统总体框图

支持个人、团队和组织三个维度的知识管理

知识管理系统功能清单

知识管理系统使用场景描述

我是爱岗敬业的员工,我在知识管理系统上能得到什么?


听起来还不错,那对于部门来说,这个系统有什么作用。

重复代码检测工具

何谓重复代码

简单说,就是指重复或近似的代码。程序猿在码代码时,往往使用CP(copy and paste)大法,飞快的完成开发任务。不经意间代码中充斥着大量的重复、相似的代码。重复代码不仅让代码量大增,造成编译速度慢,而且占用大量存储空间,更严重的后果是造成了代码可维护性差,代码质量下降。
重复可能是软件中一切邪恶的根源,许多原则与实践规则都是为了控制与消除重复而创建。……软件开发领域的所有创新都是不断在尝试从源代码中消除重复。——《代码整洁之道》 马丁

重复代码都有哪些类型?

最简单明了的是完全一样的代码片段。此外,还有如下类型的重复代码:

  1. 类型Ⅰ,代码片段中除了空格、注释以及换行以外的内容完全一致
  2. 类型Ⅱ,代码片段中除了空格、注释、换行以及变量名以外的内容完全一致
  3. 类型Ⅲ,代码片段中除了空格、注释、换行以及变量名以外的语句可能有增删改,功能不变
  4. 类型Ⅳ,两个或更多个代码段执行相同的运算,但通过不同的语法和变量来实现。

不同的重复代码检测工具,由于在实现算法上有所不同,其所能检测的重复代码类型也不尽相同,如下表所示。

名称 Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro
检测类型 Ⅰ,Ⅱ Ⅰ,Ⅱ Ⅰ,Ⅱ Ⅰ,Ⅱ,Ⅲ Ⅰ,Ⅱ,Ⅲ
支持语言 C/C++,Java C/C++,Java C/C++,Java C,Java C/C++,Java C/C++,Java Java
授权类型 商用,可免费 开源 商用,可免费 开源 开源 商用,可免费 开源
推荐星级 ** * ** * * ** *

怎么消除重复代码?

《代码大全》在第七章“高质量的子程序”中指出,创建子程序是消除重复代码的有效方法。
在《重构——改善既有代码的设计》一书中,建议如下方法消除重复代码:

  1. 提取类,如果多个类中含有相同或相似的成员变量,方法,可以定义一个新的类来实现这些功能。原有的类可以作为子类继承。
  2. 提取函数,如果多个类中含有相同或相似的方法,可以把这些方法集中到新的类,供其他类调用。
  3. 替换函数,相同或相似的代码可以通过调用实现该功能的函数来实现。