AI 洞察一切,你的编程能力排第几?

2017-11-08 11:44:43 +08:00
 CodingNET

本文作者为 Coding 数据分析总监曾屹,加入 Coding 之前,曾老师在微软研究院任职项目主管,研究云数据分析、SQL 数据库方向。

在 Coding 推出“码力值” 的功能后,经常有人问我: “码力值真的可以评测出来一个程序员的编程水平吗?” “码力值评测的机制是什么?”
“本人初学编程,我上传一些别人的代码,是不是我的码力值会高些?”

作为“码力值”这一产品的设计者,今天我来解答一下这些问题。

码力值是怎么评测出来的

码力值是基于大数据,采用机器学习等技术研发出来的,能客观的评测出一个程序员的编程能力的一套评分系统。

码力值评测的数据基础,来源于程序员在过去一段时间编写的代码以及编写代码过程中的一些行为特征,基于海量数据,我们利用机器学习算法建立起来一组评测模型,这些模型覆盖了绝大部分与程序员编码能力相关的维度,比如:个人经验、代码质量、编码生产力以及个人的技术多样性等等几十个左右维度,评测模型会逐一的评测每一段代码在每个维度上的得分,最后逐步累加成为码力值。

这组评测模型里面,有几个模型比较重要,比如:代码质量模型,行为特征模型以及码力值模型,下面简单说明一下这几个模型的机制。

代码质量模型

代码质量的相关的原始数据有数百个相关指标,全部用来计算码力值显然不合理,建立这个代码质量模型的目标就是采用降维分析的方法筛选出那些与代码质量正相关的指标,然后把降维后的数据输入到码力值模型。

模型中,首先采用随机森林算法将各个指标加以分类,并筛选若干与代码质量正相关的指标,然后通过主成分分析等技术做降维处理,最后,输出的数据就是一组与代码质量密切相关的数据。

行为特征模型

用户特征行为模型的目标就是通过分析用户提交代码的行为,提取出一系列特征指标,进而鉴别出用户的工作状态,工作强度,交付能力等等与个人经验能力相关数据。

模型的实现主要是基于时间序列算法,然后基于时间序列提取特征指标, 比如:峭度,裕度,方差等等,最后将这些特征指标输入码力值模型。

码力值模型

主要采用 TensorFlow 的神经网络算法以及非线性回归算法。

如果把代码质量的指标,按百分制评分的话,指标与分数之间一定是存在某种幂次的关系,因此,码力值模型通过非线性回归的算法,找到其中的幂次关系,然后将上游的各种输入指标以及经过训练的神经网络得到各个相应的权重系数加权累加后,计算得出码力值的总分数。

对于码力值的评测模型的机制, 上述做了一些简略的技术性的介绍,实际的研发过程则复杂的多,我们也走过了一些弯路。下面我们来看一下码力值模型中的一些具体的评测维度,大家也可以从另一个侧面了解一下 “如何写出来好代码”,以及“如何提高码力值”

如何提高码力值

码力值评测的逻辑支点是:一个好的程序员一定能写出高质量的好代码。因此,只要不断产出优质的代码, 那么你的码力值就会越来越高。

评测维度中,代码质量相关的维度权重最高,其次是一些个人经验相关的维度。 因此如果想要取得一个高分的码力值,就必须做到两点:1.写出高质量的代码 2.通过日常的积累提升代码经验值。

想要提升代码质量,首先应该着眼于代码的可扩展性。

扩展性

扩展性是指代码在编写的时候,是否让未来可以很方便的修改或追加新功能。 扩展性好的代码,修改,删除,增加代码的功能时,对于其他的代码的影响微乎其微。 扩展性差的代码,修改或增加功能的时候,会很让人很痛苦,牵一发而动全身,你本来只想增加几行代码,结果越改越多。

一个好的产品是不断修改和重构而迭代出来的,如果我们的代码没有一个良好的扩展性,会导致迭代过程中,困难重重。其实,想要提高代码的扩展性也不是很难做到,只要我们在编写代码的时候能多想一步,考虑一下将来都有哪些修改或增加功能的可能性,代码的可扩展性就会逐步提升的。

复杂度

一段程序的循环复杂度是其线性独立路径的数量就是代码的复杂度。 若程序中没有像 IF 指令或 FOR 循环的控制流程,因为程序中只有一个路径,其循环复杂度为 1,若程序中有一个 IF 指令,会有二个不同路径,分别对应 IF 条件成立及不成立的情形,因此循环复杂度为 2。

代码的复杂度和缺陷个数有高度的正相关,复杂度越高缺陷的数量就会越多,项目的复杂度越大,代码的可扩展性就会变得越来越差。 降低复杂度的一个方法,就是模块化,使代码模块之间存在松散的耦合关系,同时保证其被其它系统重用的能力。

可读性

可读性好的代码不仅有助于提高程序的扩展性,还能提高整个团队的工作交接效率和沟通效率,代码可读性应该是一个合格的程序员的基本素质。哪怕傲慢是程序员的三大美德之一,也不应把这股傲慢劲体现在不让别人看懂你的代码上。

提高代码的可读性有很多方法:

  1. 撰写清晰的代码注释。
  2. 充分的命名,变量名、函数名都含有充分的信息以说明它的用途功能。
  3. 代码逻辑清晰,易于理解。

坏味道 - 重复代码

重复代码堪称为代码坏味道之首。喜欢复制粘贴的程序员,要注意了,当你把代码复制粘贴到几个地方的时候,相当于在产品中埋下了定时炸弹,当产品迭代中需要修改这段代码的时候,你可能会漏改几处造成 bug。

想要减少重复代码很简单,把这段代码抽象出来一个函数或者类,就解决了。

健壮性

健壮性是指代码的容错能力,当发生异常的时候,代码能否适当应对。 庆幸的是,一般程序员都会比较重视程序的健壮性,随着经验逐渐丰富,一般程序员的代码健壮性会越来越好。

其他一些维度

这里正好可以回答下面这几个问题:

“我上传了一些别人的代码,我的码力值会有一个高分吗?” “我提交的代码有很多框架代码,评测模型会排除这部分代码吗?“

模型还包涵了很多时间相关的评测维度,从一个较长的时间轴上,来发现编写代码的行为特征,码力值首先是根据这些行为特征数据,鉴别出来那些本人写的代码, 然后才开始做代码质量的评测,因此上传他人代码,或者框架代码都会被码力值评测模型鉴别出来并排除掉的。

码力值还在改进

根据用户反馈,码力值的准确性已近 90%,但仍有可以优化的空间,经过分析,我们发现了码力值与个别用户的真实水平有偏差的原因,这些也是我们下一步的改进方向:

  1. 增加更多评测维度 目前,基于静态的代码质量的评测维度的比重较大,而代码“运行时”的质量指标还没有计入码力值评测维度,这样的话,代码中的业务逻辑错误就没有计入码力值的评测过程,这会在一定程度上让码力值会有一些偏差,下一步,我们会加入一些“运行时”的数据维度,让码力值更全面,比如:测试用例失败率,代码覆盖率等等。

  2. 部分用户不使用 Coding 作为主要的代码托管产品 目前码力值的评测主要来自用户上传到 Coding 的代码数据,如果代码量少的话,则无法支撑码力值全面的判断一个人的真实技能。使用 Coding 做为日常工作的代码仓库,码力值才能全面的反应你的代码能力。 一次性上传大量代码,并无益于码力值的增长,只有日积月累的使用 Coding 才有助于提高码力值。 同时,我们在技术上也计划采取一些措施引入第三方代码仓库的数据,比如 Github、Gitlab,这样码力值评测的数据覆盖就会更全面。

  3. 支持更多的编程语言 目前码力值还只支持 4 种编程语言,Java, PHP, Python 和 JavaScript,不久的将来,码力值会支持越来越多的编程语言, 包括:Objective-C,C++,C#,Go,Ruby 等等

将来

随着越来越丰富的数据的积累,码力值会像芝麻信用一样,逐渐成为程序员行业的一个职业标尺,衡量每一个程序员的综合职业素质,到时候,中国的软件行业一定会呈现越来越多的高质量的产品。 码力值的增长依靠的是点点滴滴的积累,从今天起养成良好的编程习惯,提升码力值,成为代码高手吧!

如果大家在实际操作中有什么问题,可以访问 Coding 帮助文档

3900 次点击
所在节点    Coding
3 条回复
whypool
2017-11-08 11:50:32 +08:00
然并卵.....
l00t
2017-11-08 11:51:05 +08:00
模块化能降低复杂度?怎么降?
hienchu
2017-11-08 12:04:06 +08:00
题图是 google 风嘛

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/404554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX