写点什么

使用 Exercism.io 提升编程技巧

  • 2014-12-30
  • 本文字数:2748 字

    阅读完需:约 9 分钟

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

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

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

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

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

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

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

2014-12-30 07:393943
用户头像

发布了 340 篇内容, 共 130.3 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

架构训练营 模块六

小卷儿

如何找到靠谱的工长?

escray

生活记录 8月日更 装修记

苏宁精准测试方案探索和实践

薛飞

精准测试

用户体验再升级!Erda 1.2 版本正式发布

尔达Erda

云计算 开源 开发者 云原生 Go 语言

在线JSON转Schema工具

入门小站

html创建表格有那些小技巧,表单中真的有这么多功能吗

你好bk

html html5 大前端 html/css JavaScrip

Vue进阶(八十四):Computed 和 Watch 使用与区别

No Silver Bullet

Vue 8月日更

你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?

编程三昧

JavaScript 大前端 函数 8月日更 Arguments

从头配置阿里云服务器

阿Q说代码

SSL证书 8月日更 阿里云服务器 域名备案

模块六作业

Mr.He

架构实战营

Linux之fgrep命令

入门小站

Linux

【架构训练营】模块六作业

zclau

百度地图开发-在地图上实现路线导航 09

Andy阿辉

android Android 小菜鸟 Android端 8月日更

微信业务架构&学生系统管理系统设计

Geek_dae

架构实战营

Spark 源码阅读 02:从 Spark-Submit 到 Driver 启动

程序员赤小豆

spark 技术 Spark 源码

技术调研,IDEA 插件怎么开发「脚手架、低代码可视化编排、接口生成测试」?

小傅哥

Java 小傅哥 低代码 IDEA 脚手架

Lua 入门到精通( 01 Lua 简介以及软件安装)《做一个脚本高手》

陈皮的JavaLib

lua Linux 运维 脚本语言 8月日更

拆分电商系统为微服务

木云先森

架构实战营

架构训练营模块六作业

喻高咏        

架构实战营

Rust从0到1-高级特性-类型进阶

rust 高级特性 类型 Types

详解可观测性监控系统中的“金三角”

尔达Erda

开源 微服务 运维 云原生 APM

架构实战营模块 6 作业

蔸蔸

架构实战营第一期--模块六作业

clay

架构实战营

电商系统微服务拆分-模块6

小牧ah

架构实战营

情窦初开,原来喜欢这么可爱的

4ye

Python 后端 8月日更 词云

云原生时代的 APM

尔达Erda

微服务 运维 云原生 APM 应用性能管理

模块六作业 - 电商系统微服务

babos

#架构实战营

java毕设开发经典选题

清风

毕业设计

Spark 源码阅读 01:环境搭建

程序员赤小豆

spark 技术 Spark 源码

面向多场景而设计的 Erda Pipeline

尔达Erda

开源 微服务 云原生 企业数字化转型 Go 语言

索引下推,这个点你肯定不知道!

艾小仙

MySQL MySQL 高可用

使用Exercism.io提升编程技巧_Java_Ben Linders_InfoQ精选文章