使用 Exercism.io 提升编程技巧

  • Ben Linders
  • 侯伯薇

2014 年 12 月 30 日

话题:JavaRubyPythonC++语言 & 开发文化 & 方法

Exercism.io通过提供反馈和讨论,帮助开发者提升某种语言的编程匠艺。它是一个社区,也是一种工具,在那里开发者可以编写代码并对其加以讨论,从而加强解决问题的技能。

InfoQ 采访了 Exercism 的创始人 Katrina Owen 以及 Exercism 中 C++ 部分的贡献者 Richard Thomson。

InfoQ:请你们向读者们简单介绍一下 Exercism.io。

Richard:Exercism 是一个可以实践并提升软件技能的地方。对于软件来说,有两大要素会对其创建有比较大的影响:功能和匠艺。功能的方面是显而易见的;它要么可以实现声称的功能,要么无法实现。大多数讲授编程课程的重点都在于完成软件的功能方面。可以正常运行吗?足够健壮吗?我们如何修复这个错误?

软件的匠艺方面更模糊一些。软件匠艺只能通过体验以及把自己的工作呈现给他人来获得。当你第一次在没有人关注软件的匠艺方面的代码库中工作时,你会深深感到需要它。代码中满是长方法、起得很差的名称、混乱不清的职责以及大量重复代码。

随着时间的推移,业界已经创建出一些术语,通过像SOLIDDRY迪米特法则等设计模式来定义匠艺正确的方面。当代码缺少匠艺的时候,就叫做代码有各种各样的坏味道:重复代码、长方法、大型类等等。

Exercism 假设你已经知道如何达成编程的功能部分,但期望提升你的编程匠艺。提升你的匠艺意味着与其他程序员交流,并对一些代码进行讨论,你已经理解了那些代码中的问题,并且可以将其用于评估那种问题的特定解决方案。

Katrina:Exercism 在开始的时候,会让人们做简单的编程练习,从而对目标语言中的简单性、样式和惯用语做一些讨论。尽管人们通常是来做练习的,但一般都会做很多讨论。

InfoQ:Exercism 支持哪些编程语言,提供哪些类型的练习呢?

Katrina:现在 Exercism 拥有 19 种可用的语言。按照字母排序分别是:Clojure、CoffeeScript、Common Lisp、C++、C#、Elixir、Erlang、F#、Go、Haskell、JavaScript、Lua、Objective-C、OCaml、Perl (5)、Python、Ruby、Scala 和 Swift.

我们也正在安排最终的细节,以添加 PHP 和 Java 语言。

对练习本身来说,本质上都是一些玩具问题。格式是一个 README 文件以及一个测试套件,你可以获取到本地并在常用的环境下使用常用的工具来练习。测试套件为人们提供了很好的停靠点,问题有趣的部分在于迭代解决方案,试验不同的方法,并从其他程序员那里获得评论。

Richard:我们有一个概要页面,显示了当前在 Exercism 提供的语言,以及在每个语言的练习中提供的问题。

InfoQ:Exercism 的目标是帮助开发者产出更好的代码。但什么样的是更好的,我们真的知道吗?

Katrina:大多时候我觉得“更好”是一种直觉。

直觉一般是基于经验得到的。你的“更好”会和我的“更好”有很大区别,只是因为我们在不同类型的代码库中工作,解决的问题类型也有很大差别。你很熟悉的东西我可能完全没有概念。

我们可以对代码做静态分析,从而让讨论具有事实基础,但实话说,在 Exercism 上这些情况并没有太多出现。对话更多倾向于代码坏味道和可读性。

尽管我们所说的“更好”完全是主观的,但也是非常有用的讨论。

Richard:和 Katrina 一样,我认为代码的某些方面是主观的。通常这些问题会围绕选择的名称,当然还有关于空格和格式这个永久的的话题。

然而,我认为随着时间的推移,业界已经逐渐得出一些让代码变得更好的客观标准。类似于循环复杂度的代码标准会为一些简单的问题提供答案,比方说:什么时候一个函数或方法过于复杂?像“任何函数都不应该拥有超过五个参数“之类的经验法则可以告诉我们代码的某个版本要比另一个版本更好。

软件是可以无限延展的,而 Exercism 会引领人们讨论的方向,他们会讨论拥有相通功能的不同形式但其他人编写的更易于理解的代码。讨论的更深方面是经验规则背后的原则,以及对与像复杂度标准之类的客观数据的使用。这些都更扎根于经验之中,但当前的开发属于认知科学,提供了一种科学的基础,支持那些通过经验所获得的直觉。最近由 Steve Halladay 撰写的的一本书“基于原则的重构”识别出作者直觉背后的原则,当建议学生如何产出更好的代码时,他就会使用那些原则。

InfoQ:之前 InfoQ 发表过关于培养编程技能以成为软件工匠的文章。Exercism 会对此做出什么贡献?

Richard:有了 Exercism,你就拥有了测试,然后你可以编写实现让测试通过。那会让你更容易引入测试驱动开发,不需要同时考虑测试和实现。对于你针对问题的解决方案来说,拥有测试只是一个开端。讨论才是真正会出现好点子的地方。

我学习了一些新方式来提升我的 Python 和 JavaScript 水平,仅仅是借助于解决每种语言的第一个练习。我的解决方案可以工作,但并不漂亮,对于我在 JavaScript 的第一个问题中编写的大量正则表达式也不是特别满意。在这些语言中提交了我的解决方案之后,我可以浏览其他人的解决方案,从而学到如何以更简单的方式来做同样的事。即便没有来自于他人的特别反馈,只是浏览已经完成的解决方案就教会我如何改善自己的代码,并使其对于那些语言来说更加“中立”。

Katrina:我认为 Exercism 能够帮助你提升技能的最强大的方式就是,他给了你一种专注的方式来查看其他人的代码,以及清晰的能够改善它的方式。这会强迫你阅读和理解你没有编写的代码,并且系统且挑剔地对其进行思考。你开始意识到其中的模式和代码坏味道,并且会产生对可读性的非常实用的感觉。

更重要的是,你需要以一种合理的方式来表达这种意见。只是说“这样做吧”是不够的。得出直觉的理由,会让你在非常近的距离来检查你的偏见,有时你会对你自己的深刻见解感到惊奇。

InfoQ:hack.pledge() 是程序员在世界范围内的一项运动,目的是为了把大家集合起来相互指导。你对其看法如何?

Katrina:我觉得像hack.pledge()、#pairwithme、CodeNewBies 都棒极了。它们都非常重视人的因素,而我们经常会在改进编程技巧的大量博客中迷失自己。

Richard:我认为 Exercism 是 hack.pledge() 一种有力的补充。

InfoQ:假设现在已经是 2015 年 12 月份,Exercism 在一年之后会变成什么样子,你们在一年间会做出什么成果?

Katrina:首先,我非常乐意看到在所有语言的部分讨论的质量都能够保持良好。当有些部分比其他部分更活跃的时候,在某些语言中你会持续获得非凡的反馈(我想到了 Haskell),而在其他语言中会有很多人提交解决方案,但很少人提供反馈,或者提供的反馈质量良莠不齐。

其次,我希望提高站点的易用性,特别是它要可以搜索和过滤现有的问题和解决方案,并可以得到所关注的感兴趣的人和问题的通知。

Richard:在一年之后,我期望看到更多的语言部分,我期望看到在各种语言中有更多问题。我还期望有更多针对特定语言的问题。我期望有更多用户和共享者参与到 Exercism 项目中,使得它对所有人都变得更好。

查看英文原文:Improve Your Programming Skills with Exercism.io

JavaRubyPythonC++语言 & 开发文化 & 方法