引言:相信每个自学编程的人,入门之路都经历了许多坎坷。不过我们身边藏着很多“良师”,多以利用总是能够带来惊喜。善用“搜索”就是其中一位。
本文选自《一路编程》,如何通过搜索解决自学编程中遇到的问题。
假如你在做一个 JavaScript项目,其中你得到了一个字符串格式的日期(比如, ’2014-10-08’),你想要计算下一天的日期是什么。我们可以用 parseInt将字符串转换成文字,所以你就用了这个函数。
function nextDay(str) {
var num = parseInt(str); return num + 1;
}
var date = '2014-10-08';
var dateParts = date.split('-');
alert(nextDay(dateParts[1]));
一切顺利。然后有一天你意识到你的程序产生了一些很奇怪的结果,但只是在老版本 IE浏览器才出现:你的程序认为 ’2014-10-08’的下一天是’2014-10-01’,而不是 ’2014-10-09’。你设置了一些断点并单步调试代码,你会发现 parseInt看起来坏了:当参数是 ’08’时,在大部分浏览器中你会得到 8,但在 IE中你会得到 0。你发现了这个问题,但你不知道如何修复它。现在你要怎么办呢?随着你不断地编程,你会不断地遇到类似的场景。比困境更加让人沮丧的是不知道如何脱离困境。
parseInt解释
为什么老版本 IE的 parseInt会做如此奇怪的事情呢?原因是parseInt也对十进制之外的数字有效(比如二进制、八进制,以及十六进制)。如果你不告诉parseInt你在使用什么进制,parseInt就用它认为昀合理的进制来解析数字,而’08’看起来像是个8进制数。新的浏览器倾向于默认使用 10进制,即使字符串以 0开头,但老版本 IE仍然认为’08’是个 8进制。不管怎样,你应该总是在使用parseInt时指定进制:parseInt(’08’, 10);(以 10为基,或者十进制)会在所有浏览器中返回 8。在 Google时代,每个人都是搜索专家。不到几秒钟,你就可以找到各种信息,比如你正在看的电影女演员的八卦信息。因为互联网以前和现在都是由程序员搭建的,互联网上关于编程的信息格外的多。当你遇到像前面parseInt这样的问题时,你肯定会找到答案,只要你知道在哪里找以及怎么找。
找到正确的关键字
如果你不知道要搜索什么,你就不可能找到结果。在第一次我要用转义字符时就遇到了这个问题。我不知道有种叫做转义字符的东西。我所知道的就是撇号在破坏我的字符串。在 parseInt例子中,你可能并不知道哪里出问题了,那么你要如何搜索一个解决方案呢?关键在于找到正确的搜索关键字。如果你在找一些针对某个编程语言的东西,就在搜索中包含这个编程语言的名字。然后想象其他遇到同样问题的人会如何描述这个问题。例如,在搜索 parseInt问题的结果时,一个好的查询可能是“ javascript parseInt returns 0”。当我运行这个搜索时,第一条记录就返回了我要找的答案。
如果你不确定要搜索什么,Google的搜索建议可以帮助你。在你输入查询的开始部分时,提示可以帮助引导你找到可以搜到昀佳结果的查询关键字。这些建议意味着其他人搜索过这些关键字并且得到了昀佳结果,所以你也许能成功。下图展示了在搜索 parseInt解决方案时,一些有用的(以及一些不那么有用的)建议。
升级
你要找的资源依赖于你处于学习的哪一个级别。比如,如果你在考虑学习写 Python程序,你想要找些关于用 Python的好处的介绍性信息。在这样的例子中,你会想要用类似“ why use Python”(为什么使用 Python)和“Python features”(Python特性)这样的搜索关键字。在你决定 Python适合你之后,你会想要学习 Python基础。这时,你要搜索一些类似 “Python tutorial”(Python教程)这样的东西。在你用 Python工作一段时间后,你也许会遇到一个问题,需要使用正则表达式。你已经知道什么是正则表达式,以及在什么时候要使用它;你只是需要知道如何在 Python中使用它。那你可能就会搜索“Python regular expression”(Python正则表达式)或者“ Python regular expression documentation”(Python正则表达式文档),找到关于 Python中正则表达式如何工作的文档说明。现在假设文档抽象,难以理解;你可以搜索“ Python regular expression tutorial”(Python正则表达式教程)或者“ Python regular expression example”(Python正则表达式示例),找到一些比较容易消化理解的 Python正则表达式信息。这些例子要说明的就是,如果你在搜索关键字中指定你处于哪个级别,你就更容易找到需要的信息。
错误
错误可能让人特别困扰,因为你的代码不工作,同时错误信息看起来又特别模糊。不过错误信息有一个好处:错误信息中的文字基本上总是不变的。这就意味着,其他人也见过相同错误信息,并且很可能已经找到了解决方案。当你遇到一个不理解的错误信息,复制粘贴整个信息到谷歌,一般你都会找到问题的答案。
以终为始
在一开始,你也许并不知道自己到底要搜索什么。你可能不完全理解要解决的问题,或者甚至不知道你需要学多少东西才能解决它。仅仅因为你不完全确定你要找什么,并不意味着你不能搜索它。以终为始,追本溯源。首先,搜索你的昀终目标,在你搜索结果的过程中,留意不熟悉的字和短语;然后,搜索所有这些看起来相关的关键字,再次记录结果中所有不熟悉的字和短语。
当你到达一个点,能够理解几乎所有搜索结果中的东西时,就可以开始学习那些你不理解的东西,直到你又到达一个点,这时你了解的知识足够搭建你本来要搭建的东西。这个过程会帮助你在达到目标的过程中学到很多很棒的知识,或者,至少帮你意识到你的目标也许需要比预期更多的工作和学习才能达成。
这种追本溯源式的搜索引导我学习了 Web编程。我之前提到过给我的第一个网站实现“自动补全”功能。那时我并不知道那是自动补全,所以我搜索了一些类似 “google search suggestion”的内容,这让我发现了关键字“autocomplete”。我读了一些关于 autocomplete的文章,确保那就是我要找的东西,并且发现了关键字 AJAX。我了解到 AJAX就是实现基于用户输入的文字展现搜索推荐的技术。我做了些 AJAX调研,发现你必须写 JavaScript才能使用 AJAX。所以我开始学习 JavaScript,直到我学了足够的知识,可以使用 AJAX,我就可以搭建自动补全系统了。在这个过程中,我学到了很多 HTTP、Web服务器,以及数据结构的知识。我相信用追本溯源的方式解决编程问题会有给你很大的回报。
识别高质量资源
不幸的是,互联网上不是什么东西质量都很高。编程信息和其他内容都是如此。小心那些质量不高的网站和书。因为相信网站上那些过时、写得不好的信息,我学到很多错误指导和坏习惯。不幸的是,在能够区分高低质量资源之前,你也许得吃几次亏。如果你访问的网站有一大堆广告,特别是它们跟编程基本没关系或者一点关系都没有,那你就要小心了。小心那些尝试把各种话题都囊括进来的网站(比如, About.com包括了报税、园艺、编程,以及发型设计)。当你见到那种说你要学的东西很简单的声明,也要小心,如果太简单了,你很可能学到的是错误方式。大部分编程语言、库和框架都有网站,包含完整的、高质量的文档。这些网站一般包含完整的入门信息、初学指导、教程,以及参考材料。从这些网站上找到的信息通常都是高质量而且正确的。
个人博客:隐藏的宝藏
尽管你要小心从一个非官方网站上得来的信息,你还是可以在博客上找到一些有价值的信息。专业程序员喜欢把他们解决过的问题写出来,通常以博客的方式发表。文档和教程很棒,但没有什么可以跟真实的人描述一个真实世界的问题及其解法相提并论。不过在你相信这个信息之前,还是要调研下作者。看看他们的 LinkedIn简历、StackOverflow档案、GitHub档案,以及任何其他你能找到的资源。如果他们看起来明白他们在说什么,你就找到了一个很好的信息源。这类博客就像编程导师;他们给你如何更好编程的免费建议。记住,如果你接收他们的建议,要在文档中提一下那篇博客。