《我编程,我快乐》试读:15 练习,练习,再练习

当我还是一名学习音乐的学生时,我经常彻夜在音乐学院教学楼里练习。训练室的墙壁很薄,我演奏的声音经常被一些十分难听的演奏声吞没。这并不是说我们学校的乐手都很差,正好相反,他们在练习。 当你在练习的时候,演奏出来音乐或许总是难听的。如果你在练习的时候,总能演奏出悦耳的音符,那就证明你一直无法突破自己的极限。这就是练习的意义所在。运动也是一个道理。运动员在训练的时候总是将自己推到极限处,这样他们才能在比赛中突破自己的极限。他们让丑陋的东西都暴露在平时的练习中——而不是真正的比赛中。 在计算机这行,经常会有开发师突破自己取得进步。但是,很多时候都是因为他们本来就不胜任自己正在做的工作。我们这个行业习惯于在工作中练习。你能想象一名专业的乐手,站在舞台上,演奏出来的却是大学训练室里那些难以入耳的声音吗?这肯定是让人难以忍受的。音乐家是通过公开表演而赚取报酬——是表演,而不是练习。同样,如果功夫高手或者拳击手在比赛中表现得疲惫不堪,那他在这项运动中也没什么发展。 我们应该寻找时间练习。在西方,与外包给那些国外团队的工作相比,我们经常把相对高水平的编程工作交给当地的开发人员。我们要在质量上与他们做竞争,就不能把工作当作练习来对待。我们要在提高技艺上面投资。 几年前,效仿练习演奏,我开始试着进行编程练习。第一条规则就是练习开发的东西绝对不能是我想要使用的。我不想图方便,仓促地达到目的。所以我开始编写我用不着的程序。 我没有走捷径,但是在练习中我发现很多想法都不能实现,这让我很泄气。尽管我尽可能地把它当做工作来好好做,那些设计和编码却不能达到我的期望。 现在回想起来,当时那种窘迫的感觉是个好的迹象。我编写的代码并不是完全没有亮点。我在开发大脑,突破自己的编程极限。就像练习吹奏萨克斯风时,如果练习的时候演奏出来的都是悦耳的音乐,那我知道我根本没达到练习的目的。同样,如果练习时编出来的程序都是很棒的,那我就是在发挥我的正常水平,而没有接近我的极限——好的练习应该让我接近自己的极限。

那么,我们怎样才能知道要练习什么呢?怎样才能达到极限呢?作为一名软件开发师,就如何练习这个话题,可以单独出本书来讨论。作为开始,我还是会借鉴我作为爵士乐手的经验。我把爵士乐演奏练习分解成以下几个类别(由于很多人不是乐手,所以我把它们简化了):  身体与协调  视奏  即兴演奏 这个框架可以成为软件开发师练习的一种方法。 身体与协调:乐手要进行乐器演奏技巧训练:发声、身体协调(比如练习手指的灵巧度)、速度和精准度。这些都是非常重要的练习项目。 那对于我们软件开发师来说,这些基础练习又是什么呢?那些初级编程语言中,有没有你基本不怎么使用的?比如,你选择的编程语言支持正则表达吗?在很多的编程环境中,正则表达式非常强大但却很少被使用。大多数开发员即使可以用到它,也不去使用,因为他们的技术没达到那个水平。结果,创造出了很多不必要的字符串解析编码,并且不得不延续使用。 这条规则也同样适用于API和库。乐手们常说,对于技术,你要是没达到手到擒来的地步,那它们真能帮到你的时候你也想不起来它们。这就需要尝试深入研究,比如,在你选择的编程环境中,多线程编程是如何工作的。或者stream库、网络编程API,甚至是一切可用的处理集合和列表的工具。大部分现代编程语言都提供了丰富和强大的库,但是软件开发师们只学习了其中的一小部分子集。如果他们掌握了如何使用一整套工具,那么编程的效率就会提高很多。 视奏:对一名专业录音乐手来说,首要能力就是能够在第一时间完美地视奏。我曾经为Blockbuster公司(音像租售公司)的圣诞乐曲专辑中吹奏萨克斯风。在一曲大型乐队演奏的快节奏的乐曲中,我演奏了序曲和第二段高音部分。当磁带开始滚动的时候,我才第一次看见乐谱。我演奏了一遍序曲,又演奏了一遍第二部分。任何失误都会使整个乐团重新再演奏一遍,这样就会浪费时间,并且增加工作室的租金。 作为软件开发师,视奏又是什么呢?是需求规格,还是设计?开源社区是找到用来练习的代码的绝佳场所。有没有哪个开源软件是你最喜欢的?你可以给它加个功能。挑选一个你想要用来练习的软件,浏览它的待办事项,给你自己规定时间来实现这个新的功能(或者至少决定要实现这个功能需要哪些步骤)。 选择好功能之后,下载源代码然后开始开发。怎么知道要看哪里?有什么好方法在一组重要的代码中理出头绪?又要从哪里开始呢? 你可以经常进行这种练习,而且这种练习的周期不会持续很长。你并不一定要去实现这个功能,就把它当做是一个开始,练习真正的目的是以最快速度读懂你正在看的代码。但是一定要确保这个软件与你平时工作时使用的软件不同。要寻找不同风格、不同编程语言的软件进行练习。记录下是如何使整个过程增加或者降低难度。你使用了哪些方法帮助你理解这些代码?面对复杂的函数层次,你是以什么为线索,让调用栈有迹可循,带领自己穿梭其间呢? 即兴创作:即兴创作就是在某种结构或者限制的基础上创造新的东西。作为程序员,我发现自己往往在压力之下可以即兴创作。“哦,不!无线网络应用服务器出问题了,我们收不到命令了!”这情景常常发生在最具创造力、最即兴的编程过程中,比如通过无线网络从二进制日志文件中手动重发数据包来修复丢失的数据。没有人特意来为你做这些工作,特别是在这么紧急的关头。这种优秀并且迅速的编程能力在正确的关头发挥作用是非常重要的。 训练思维敏捷和提高即兴编码技术的好方法是通过自我限制的方式来练习。选择一个简单的程序,试着来限制你的编程过程。我最喜欢做的就是编写一个程序来显示那首老掉牙的歌曲“99 Bottles of Beer on the Wall”的歌词。如何能编出一个程序而不做任何变量赋值?或者在保证正确显示歌词的前提下,这个程序最小能做到多小?再加一个限制,你最快用多久能编出这个程序?可以使用定时器,练习编写一个难却小的程序。 这只是一种极限视角的练习方法。你可以从任何学科找到练习的对象,从视觉艺术到僧侣信仰。最重要的是找到你所需要的来进行练习,并且确保你不是在工作中练习。你必须要找出时间来练习,这是你的责任。 练 习 (1) Topcoder——Topcoder.com是一个很早就存在的编程竞技网站。你可以注册然后通过线上竞赛赢得奖励。就算你对竞争没兴趣,Topcoder还为你提供了一个练习室,里面有很多可以练习的问题。现在就去注册尝试一下吧。 (2) Code Kata——Dave Thomas是《程序员修炼之道》的作者之一,他接受编程练习这个想法,并使之实用化。他创造了一系列的很小却深具启发性的练习,被称之为Code Kata,程序员可以使用他们选择的编程语言来做这些练习。每一个Kata都针对某一特定技术或者思考过程,这样程序员的思维就可以更加灵活。 这本书的印刷过程中,Dave已经创造出了21个Kata,你可以在他的博客上免费使用(http://codekata.pragprog.com/)。在这个博客上,你还可以看到通讯名单的链接,以及别人解决这个问题的方法和相关讨论。 你的挑战:练习这21个Kata,并撰写使用Kata练习的日记(或者是博客)。当你完成这21个Kata后,开发你自己的Kata,并与别人分享。
1人

>我编程,我快乐

我编程,我快乐
作者: [美] Chad Fowler
副标题: 程序员职业规划之道
原作名: The Passionate Programmer:Creating A Remarkable Career In Software Development
isbn: 7115233527
书名: 我编程,我快乐
页数: 202
译者: 于梦瑄
定价: 39.00元
出版社: 人民邮电出版社
装帧: 平装
出版年: 2010-8