转载

前言

如何使用本书

庖丁解牛,进乎技矣。

钢琴演奏家每天要练习数小时,研究音乐,熟练技巧和打磨技能。她会一遍又一遍练习同一段音乐,研究每一处细节以求完美。她希望在演奏时,把一个值得自己骄傲的表现献给观众,观众为了来听演奏,不光花了钱,还有时间。

职业足球运动员每天花几小时进行负重锻炼,跑步,跳高和一遍又一遍地练习技巧直到掌握它,他还要实践这项运动。他要研习比赛,看比赛录像。当然,他要参加训练赛和表演赛,以证明他已经准备好完成正式对抗。

空手道练习者一生都在练习kata(空手道的套路),即一系列模拟格斗或对战的动作,练习如何正确呼吸,选择正确的时机调整肌肉。他可能要把同一组动作重复上千次,在一次次重复中做到更好。

我见过最好的程序员也用同样的方式提高他们的技艺。他们并非每天只是工作,为雇主忙碌。他们投入私人时间学新的编程语言,完善技巧。确实,在工作中他们也能学到新东西,但是考虑到这时他们有报酬,他们被期望在工作中表现更好,而不仅是练习。

本书只包括如何熟练程序员的技艺。你可以翻开本书的一页,打开文本编辑器,敲出程序。你也可以创造自己的变体。你应使用一门以前没用过的编程语言,在练习中用得更好。

本书为谁而写

本书瞄准程序员中两个主要的人群。

首先,本书为初学编程的学生提供了课堂之外的附加实践。学生只做作业很难打磨好技能。未来的雇主需要你能展示出批判性思维和解决问题的能力,你需要实践来发展它们。本书以实际问题的形式提供这样的实践机会,这些问题许多开发者曾经都面对过,并且它们以符合你的能力水平方式组织。本书每章会覆盖一个编程的基本方面,比前一章略复杂,但基于你已经学到的,为你在课堂内外可能遇到的挑战做好准备。

许多编程初学者习惯于被教导具体如何解决问题。他们常常根据书面指南学习编程语言,指南上有代码,他们可以输入。这当然是一种很好的方式开始编码。但是他们面对遇到没有答案的开放式问题时会很痛苦。有经验的人会知道,软件开发充满了开放式问题。本书中的练习帮助你发展这种解决问题的能力,你会有自信冲击更大规模的问题,哪怕从没有人解决过的问题。

本书同样适合有经验,但希望能做得更好的程序员。当我学习 Go 和 Elixir 时,我使用与本书中类似的程序来练习。当我在iOS开发中试手时,我也试过这些程序。每隔一段时间,我会用我已经了解的编程语言实现这些程序。虽然我能流畅地使用 JavaScript 和 Ruby ,但是也有一种巨大的挑战,即看我能否用另一种方式实现同一个程序,例如使用不同的算法或模式。当我开始全职教授 JavaScript 和 Ruby 时,这些程序帮助我发现和解释一些语言独特的特性,这些特性我知道如何使用, 但并不是完全掌握。因此,如果你是一个有经验的程序员,我建议你做同样的事。试试用 Haskell 写一个程序。 或者试试用所有你知道的编程写同一个程序,再比较结果。或者与你的同事在一周内一起挑战同一个练习,并比较你们的答案。 或者使用这些程序来培训组内新进的员工。

教师注意

如果你在高中或大学教授编程入门,你也许发现本书中的练习对课程很有用。但是我不推荐使用它们做为总>结性作业,因为我鼓励本书的读者与别人分享答案。我推荐这些问题用于随堂练习,学生可以一起完成。这些练习在基于问题的学习环境中表现很好。

本书中有什么,以及没有什么。

本书最初和最重要的写作目的是为初学者提供挑战性问题,用于开始学习编程。因此,大多数问题开始相对的简单,逐渐地变难。本书的练习过程使实践编程的基础技巧富有挑战,但保持有趣,可以加速掌握一门新的编程语言。在第一部分,程序只是简单接受一些输入,并操作数据进行不同的输出,让你体会计算机程序如何处理输入和输出操作。它们是你开始学习编程的第一周应该做的程序。

接下来,你开始挑战写一些程序需要做计算。其中一些程序很简单,像计算房屋的面积。其它开始涉及金融和医药计算,就像你工作中遇到的。

然后你开始增加程序的复杂度,需要添加判断和循环逻辑,你也需要把它们组织成函数。

在此之后你发现一些问题需要使用数据结构,如数组和映射,才能解决。这些程序需要你利用你已前解决过的问题。

当然,没有一个程序一点也不涉及文件输入和输出,你会练习从文件中读数据,处理数据,把数据写回文件。

现代程序经常与外部服务交互,因此你会发现一些程序需要你使用第三方 API 处理数据。

最后,少量规模较大的程序需要你把所学的东西都整合起来。

另外,每一个练习都包括一些约束,在构建程序时需要遵守,同时一些挑战你需要基于这些程序完成。如果你以前从未编程,你可以想跳过这些挑战,以后技能提高了再来。如果你已经有经验,感觉程序太简单,你也可以直接完成挑战。由于选择的编程语言,一些挑战可以会很难。例如,如果你使用 JavaScript 和 HTML 创建程序,写一个 GUI 版本可能会简单。 如果你使用 Java 完成,将会有很大的工作量。因此你可以自由的修改挑战,只要你认为适合。

有些东西你不可能在本书中找到,那就是程序的答案。如果你努力思考,利用你身边所有可能的资源,你会找出如何自己解决这些问题, 这就是本书的观点

最后一件事,你不会找到那些著名的面试问题。这里没有 FizzBuzz 。你不需要反转二叉树,也不需要你写一个快速排序算法(除了做为答案的一部分)。如果你在找类似的东西,你只能到别处看看。那些问题当然有价值,但常常比较难做,因为你不知道为什么做。这使它们变得无法完成,变成学习的障碍。

本书中的问题都是简单,实际的问题,你可以轻易联系上,这有助你实践用代码解决问题。

你需要准备什么

一个你喜欢的开发环境就是全部你需要准备的,甚至这个环境你可能从未用过。本书没有特别指定编程语言。你只需选一种语言,找到参考手册,开始吧。但需注意,你选择的编程语言决定了有些程序的难度。例如,如果你使用 Python 或 Ruby 来完成本书,那么开发图形界面可能不容易。如果你选择浏览器中运行JavaScript,那么与外部文件或 Web 服务交互可能比其它语言都复杂。如果你选择函数式编程语言,而不是面向对象的语言,你解决问题的方法可能相当不同。但是这些练习依然有实际意义,它们帮助你学习编程语言,以及它与你已经知道的语言有多么不同。

你应该有一个互联网连接,以便完成一些需要第三方服务的程序,和参与本书的网上社区。

在线资源

本书的网站有一个讨论组,你可在这与其它程序员讨论本书。 在那里,你可以随便发布你喜欢的编程语言完成的答案,或与其它读者讨论答案。编程令人着迷的一点就在于不同的人用不同的方式解决问题,不同的程序员有不同的风格。

正文到此结束
Loading...