写点什么

使用 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:393928
用户头像

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

关注

评论

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

云原生安全系列3:5个 Kubernetes API 网络安全访问最佳实践

HummerCloud

云原生 k8s 云原生安全 kubernetes 运维

火山引擎DataTester为企业降本增效:1个人也能成为一支A/B实验团队

字节跳动数据平台

大数据 AB testing实战 12 月 PK 榜

TDengine 时序数据库与一汽解放携手,助力商用车智能网联

TDengine

数据库 tdengine 时序数据库

华为云桌面Workspace-企业云上办公的最优选择

爱尚科技

华为云会议,开会就是如此简单

IT科技苏辞

华为云助力中建一局会议上云,沟通协同更高效!

IT科技苏辞

彪悍升级|尚硅谷Hive新版视频教程发布

小谷哥

流量与技术双重加持,小游戏迎来高速增长周期

FinFish

小游戏 小程序游戏 小程序游戏开发 微信小游戏

带你玩转OpenHarmony AI:基于Seetaface2的人脸识别

OpenHarmony开发者

OpenHarmony openha

华为云解锁云原生数据库发展新动能

华为云开发者联盟

数据库 后端 华为云 12 月 PK 榜

贾斯特里尼&布鲁克斯葡萄酒,提升用餐仪式感

联营汇聚

易观千帆 | 2022年11月银行APP月活跃用户规模盘点

易观分析

App 手机银行 用户分析

消息中间件执行原理

C++后台开发

分布式 中间件 消息队列 后端开发 linux开发

贾斯特里尼&布鲁克斯酿酒专家帮您区分干红葡萄酒和甜红葡萄酒

联营汇聚

边疆水土培养边疆人才,云南大学研究团队借助昇思MindSpore提出智慧医疗创新解决方案

Geek_2d6073

华为云桌面能为设计行业提供哪些“黑科技”?

爱尚科技

安全高效,华为云桌面打造全新云上办公体验!

科技怪授

推荐8个提高工作效率的IntelliJ插件

风铃架构日知录

后端 开发 Java、 intellij java架构师

【PCB设计】孔间距不可忽视,小心废板!

华秋PCB

工具 PCB PCB设计

一周刷爆LeetCode,字节技术官亲码算法与数据结构刷题宝典真香

Java永远的神

程序员 数据结构 算法 LeetCode 大厂面试

Iceberg 在袋鼠云的探索及实践

袋鼠云数栈

华为云桌面服务,拓宽公有云赛道,持续引领产业发展

爱尚科技

产品更新快培训成本高?华为云会议助力企业降本增效

IT科技苏辞

区块链NFT商城系统开发技术

薇電13242772558

区块链

揭秘百度智能测试在测试定位领域实践

百度Geek说

百度 测试定位 智能测试 12 月 PK 榜

双币质押挖矿分红模式系统开发技术模式方案

I8O28578624

华为云桌面Workspace带你走进云上办公新时代

爱尚科技

华为云桌面驱动数字内容变革,按下文娱社交行业升级加速键

爱尚科技

干货|3DMax优化模型的方法有哪些?

Finovy Cloud

云渲染 3DMAX

华为云会议助力中建一局视频会议数字化升级

IT科技苏辞

贾斯特里尼&布鲁克斯,优质葡萄酒都有甄选法则

联营汇聚

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