【IT168 评论】我在六个月前加入了Collective Idea 。在那时, 我有机会接触到一门新的编程语言。正如学习一门口语一样, 学习一门新的编程语言意味着学习一种新的思考方式。下面是我关于如何成为一个Rubyist的一些思考。
编程即人性
我最初被Ruby吸引是因为社区强调清晰的,人类可读性强的代码. 在我开始寻找一门更简洁,更理性的语言之前,我只能在PHP中写无数的foreach嵌套循环。当我开始研究Ruby的时候,我就被Matz的哲学设计理念---以人为本来增加程序员的幸福感, 和最小立异原则(唯一找到的一种翻译)震惊了。 我同样渴望用一门OO语言来编程。(尽管PHP有对象, 但是我过去工作的PHP框架基本上是面向过程的)。即使到了现在,当我在写Ruby中每一个循环的时候,我都情不自禁的享受它们看起来多么漂亮。
在读Russ Olsen的优秀作品 Eloquent Ruby的时候, 我意识到编程在是一个逻辑上的经验的同时,也可以是美学上的经验。 Steve Klabnik已经谈论过这些话题, 把编程和文学还有哲学联系起来。当你和另一个Rubyist谈论的时候,比较典型的常见词汇是‘美丽的’和‘聪明的’。对我来说, 是慢慢理解把编程和人类的其他追求连接起来。 毕竟, 一个社区能出现 _why 这种人物必须在懂得工程的同时懂得艺术。
模式即(有教育意义的)意见
在我加入Collective Idea很快就学到的一件事就是一个编程问题很少只有一个正确答案。意味着你在办公室里经常听到不同的意见,从Ruby的约定到Rails的模式。简单的说听这些谈话使我成为一个更好的程序员。也让我想花时间来发展我自己的被人支持的意见。
不仅仅有一个答案(甚至允许你打开任何类!)带来的自由极其强大,但它也可能导致瘫痪。当需要做出有架构性影响的决策时,我不确定如何更好的前进。我担心做出会后悔的决定。我仍然没有足够经验来权衡每种方法的利弊。
开始几个月时,我遇到一次显著的技术债务。我所工作的应用程序,主要是作为几个不同服务间的黏合剂。在某些行为下,它调用至少3个不同的服务,协调并处理每个响应。我的控制器实现已经无法控制,一些业务逻辑混合进了模型部分。测试也开始出现问题,边缘情况就可以击溃整个程序,我知道这样做是错误的。
和同事谈论如何以最好的方式进步,得到的建议是试试他们最近写道的一种模式,称为交互模式,它把所有与外部服务的交互分割到单独的类中。这种方式很酷,和之前相比好了些,我通过测试得到了一致的效果。
测试工艺
在没有意识到测试的重要性时你不要浪费太多的时间在使用Ruby上。首先,我有个典型的反应,不知道如何编写更多的代码来使得我的产出更多。我做的越多,越意识到好的测试对于引导你写出好的代码有多大的作用。我的第一个测试,当然很不尽人意,但是它会变得越来越好的。看完Geoffrey Grosenbach的excellent series on RSpec(最近已经更新到RSpec 2),我开始充分的领会到隔离性和意识到为什么小方法是可怕的。
我也开始理解业界里的流行词“软件工艺”的真实意思了。我在软件领域工作了足够长的时间,身临其境地知晓,软件项目是多么容易运作不佳、有多么容易预算超支。构建软件不像构建几乎所有其它类型的产品。本质上构建软件是一种协作性的编制逻辑的过程。因为软件产品具有无可比拟的可塑性,所以它需要一套清晰而具体的指导原则。要成为一个‘软件匠人’,就要放下身段,要认识到一个人不可能完全掌握整个软件技术栈(software stack)。我们写测试代码是因为我们知道我们将来会犯错误,也是因为我们还要维护我们所构建的软件产品,还因为我们不知道将来谁还有可能会同我们的代码打交道。对于TDD的拥趸来说,这些也许都是老生常谈,但那也抹杀不了这些观点的强大作用。
简而言之,成为一位Ruby爱好者是我软件生涯中最有回报的旅程之一。它让我能够从美学的层次感受我正在做什么,还给我带来一种我未曾料到竟然能够从编程中获得的创造性方面的自由。它还给予了我很多手段,使用这些手段,我可以构建出令我骄傲的软件产品。