池建强:如何学习一门编程语言
关于学习编程这个主题,有各种读者多次要求写一写,而且要求文艺的写、抒情的写、充满社会主义特色的写,要做到:问题看起来巨复杂,读起来巨简单,学起来巨容易!看把你们惯成什么样子了,Mac 君你继续去面壁吧。
好吧不管他,我们接着聊。
如果你准备未来投身到 IT 江湖从事编码这份有前途的职业,学习一门语言显然是远远不够滴,就像你初入江湖,告诉别人,
「兄弟只会太祖长拳!」
问,「Level 可及乔峰?」
答曰,「不及万一」
人家一看你就是P2的命,PK 时一个大招直接秒掉。写到这我想起了一个叫做冰河的兄弟,也是奇葩一朵,在程序语言方面一生只爱 Lisp(Lisp号称编程语言的祖宗),在人类语言方面则除了中英文,还在同时学习意、法、西、德四门语言,而且不是随便学学,而且神志没有错乱,这一点让我简直佩服到逆天,一门英语已经从初中折磨我到现在了,在人类语言层面,我常常是被秒杀的。
所以,如果编程有可能成为你的职业,那么5-10年的学习和实践时间是需要的,因为你可能要学习编程语言、操作系统、算法、数据库(Sql 的 NoSql 的)、Web 开发等等,还有各种数不清的引擎和架构,特别令人发指的是当你熟练的掌握了一门技术之后,就会有位赤脚大仙走过来告诉你,孩纸,你学的技术已经不是方向袅,然后在你绝望的眼神里飘然离去……写 Java 的兄弟感受一下……
如果你的职业发展与编程无关,只是想学习一门语言磨练人生意志,那么这事就比较容易了,比如 Python、Shell、AppleScript、Ruby 等,根据自己常用的操作系统选一个就好,如果你用 Mac,这些语言可以任选,而且环境都是现成的,如果你用其他操作系统……,对不起,MacTalk 只说 Mac。这些语言除了能够帮助你锻炼意志和提高逻辑思维能力的同时,还可以在某些关键时刻帮助你处理各种繁琐复杂的工作,比如大量文本、定时任务、自动化任务、编写常用小工具等等,还可以引发跨界编程的轰动效应,不信的话去百度搜索「Python 女神」便知。
好的,写到这如果还没有打消你学习编程的热情,那就可以继续往下读,下面才是正文:
要有光
无论学习什么,一定要有明确的目的和目标,如果是抱着玩票的心态,最多能够「知道」而不是「学以致用」,所以搞清楚自己为什么要学习编程,准备学习哪门语言,要达到什么程度,想用多长时间等等,这些问题在你的头脑里有个大概的思路和计划,就基本解决了 Why 和 What 的问题,下面我们来找 How。
多说一句,其实学什么都有用的,大部分时间你只是不知道会在什么时候什么地方用。
经典教程
选定了语言不要着急去网上搜索各种秘籍、评价和下载各类盗版电子书,每个技术领域都会有一些经典的圣经级别的图书,找到它们,购买一本纸质书或电子书,最好是带练习题的,可以边学边做。
如何找到这些图书,豆瓣读书网应该是个不错的选择,虽然豆瓣的电影评价过于小清新口味,但图书评价还是值得信赖的,另外找乐于分享的老鸟推荐一下也是个不错的选择。
掌握基础,持续练习
每一门编程语言的学习内容都会涉及:基础运行环境、数据类型(数字、字符串、数组、集合、字典等)、表达式、函数、流程控制、类、方法等等,不同的语言还有一些不同的特性,这些内容并不复杂,尽快通过大量的练习击倒它们,然后再去深入了解面向对象、并发、异常、文件与目录、网络、标准库等内容,并辅以持续的练习,这些内容才能够让你真正进入编程领域并做出实际的软件。
初学者每天花1-2个小时是需要的,尽量保证阅读和练习的持续性和时间长度。其实1-2个小时根本不算什么,想想你们花费在看电视和刷微博上的时间吧,如果还说没时间,那就是不抽不舒服斯基了。
记住那句话:一边憎恶虚荣,一边找各种机会虚荣,在应该为了虚荣而努力的时候,丫拖延症犯了。
外事不决问 Google
现代人的生活和学习是如此的方便,因为我们有 Google!俗话说内事不决问百度,外事不决问 Google,技术绝对属于外事,你要是去问度娘技术问题,被人家的回旋踢踢飞可别怪我没告诉过你。
以前学习技术只能通过技术图书和口口相传,现在遇到问题从Google 那里就可以找到答案,所以用好 Google 你就能如猛虎加之羽翼而翱翔四海。如果你还在认为 Google 就是个搜索框,那就图样图森破了,Mac 君今天为你推荐这两篇文章:
「Google,Google,再Google」 http://wordpress.lixiaolai.com/archives/7572.html
「如何用好 Google 搜索引擎」 http://www.zhihu.com/question/20161362
让你的搜索与众不同。
用好工具
俗话说的好,欲练神功挥剑自宫,sorry 不是这句,工欲善其事必先利其器,想要学习编程一定要写代码,我们不提倡咬破手指写bloody code,所以一定要找到趁手的武器。我个人把工具分为三种,第一种是部分程序语言自带的 shell,第二种是文本编辑器,第三种是集成开发环境(IDE)。
1、Shell,如果你在学习 Python,那么python shell,bpython 和 ipython 都是不错的选择;如果你在学习 Ruby,那么irb就是 ruby 的 shell;如果你在学习 Shell,打开终端(Terminal)就是 shell;如果你在学习 Java 或Objective-C,对不起,这些语言没有 shell。
Shell 能够单步执行你的编程语句并给出即时反馈,这种交互式编程方式非常适合初学者,所见即所得,所以凡是提供 shell 工具的语言,推荐大家优先使用shell学习。
2、文本编辑器,这个领域向来是「猿家必争之地」,溢美之词和吐槽之声交相辉映,从古至今绵延不绝,说起来都是眼泪,比如Emacs和Vim程序猿,大家沿着不同的道路和目标前进,但总是会在某个点交叉相遇,见面就扔石头和臭鸡蛋,砸得对方鼻青脸肿,然后擦擦眼泪和口水继续前行。还有 IDEer 说 Vimer 装逼,Emacser 说 IDEer 垃圾balabala……种种血淋淋的事实足以拍一部惊悚科幻动作言情片。
我自己比较喜欢文本编辑器,但是也不排斥 IDE,这种人俗称两边不待见,但我还是那句话,不为自己设限,不同的环境应该选择最好的工具。下面给大家推荐几款文本编辑器:
(1)VIM:号称编辑器之神,全键盘操作,充满速度感,良好的插件体系,几乎满足一切程序语言的编写需求。
(2)Emacs:神的编辑器,捆绑了文本编辑器的操作系统。没了,大家感受一下……
(3)TextMate:Mac 专有编辑器,号称 Ruby 程序员最爱,当年1.0版一份39欧元,总共卖了十几万份拷贝,现在2.0免费开源,原来的开发者已经消失无踪,据说挣足银子去太平洋的小岛晒太阳去袅。
(4)Sublime Text:文本编辑器的后起之秀,发展迅猛,媲美 TextMate,跨平台,比 Vim 和 Emacs 容易上手,号称性感编辑器。
以上四款自成体系,都有完善的插件生态环境,诸君可任意选择。
对于TextMate 开发者赚了钱就跑的恶劣行径,大家完全可以批判,有时我们不得不痛苦的承认,国外程序员的鸡贼是我泱泱大国之IT民工永远无法理解滴「泪」。
3、集成开发环境(IDE)
IDE 是图形化的集成开发工具,具备精准的词法分析、编程提示、调试等功能,功能之繁复用户自知,如果做工业级编程和团队协作的话,还是推荐使用 IDE。
在这里推荐几个系列:
(1)Eclipse 系列,通过插件方式几乎支持所有的常用编程语言,免费。
(2)JetBrains 系列,产品线丰富,几乎都是精品,Java、Python、Ruby、Php、Objective-C、Web 等一应俱全,收费。
(3)Xcode,Mac 上优秀的集成开发工具,所有的 Mac App 和 iOS App 都出自此货之手,免费。
微软的技术不懂,就不推荐了,嘿嘿……
除了写代码的工具,你还需要记录、阅读和查询,所以再为大家推荐三款应用:Evernote(笔记)、Pocket(以后读)和Dash(代码检索)。具体介绍和用法就不说了,不要忘了上一篇提到的Google君。
找到你的 Master
小时候看西游记发现,师傅原来是用来人肉的;后来看天龙八部发现,牛人都不需要师傅,即使有也是要被别人一掌震飞的;再后来看射雕英雄传发现,愚钝的人首先得有师傅,其次得有很多师傅,再次每增加一个师傅功力都以指数级别增长,2、4、8、16……
所以,如果有人告诉你三人行,一个老师都没有,你至少要质疑这一观点,同时考虑自己会不会筋斗云,是否天赋异禀以一当百等等。如果不成,那还是去找师傅好了。
有老师的好处有这么几个:
(1)老师能够看到你自己看不到的地方,人这一辈子,很少人能给自己一个清晰的评价和认知,要么高估自己,要么低估自己,而旁观者,尤其是老师,往往能够看到你的弱点、长处、威胁、变化,并给你适时的提醒和指导,少走弯路。
(2)所有领域的知识都是成体系的,如果有这个领域的行家里手在你早期的学习阶段进行指导甚至设计练习技巧,与自己琢磨的效果是不可同日而语的。估计每个人都会有这样的经历,一个问题自己,想到心碎想到梦醒也没有结果,别人过来抽丝剥茧条理清晰的一讲,不仅你懂了,连你的小伙伴都懂了。这就是听君一席话胜读十年书的道理。
(3)好处多多,余不一一。
但是走出校门之后再想找传统意义的师傅就很难了,像绝地武士那样和 Master 出双入对同生共死更无可能,这时你就需要把身边的朋友、同事当做老师和资源,不耻下问,而且要问的有智慧,让人有回答欲望,那么如何提问呢,请参考我之前写的一篇「如何提问」。
参与社区和技术会议
自己学习和同事交流之余,可以参与一些网络社区的交流,推荐:
技术问答社区:http://stackoverflow.com ,在技术领域几乎包括万象,无所不知。 GitHub:https://github.com ,几乎全世界优秀的开源软件作品都在上面。
另外还可以参与一些群组,订阅一些优秀的个人博客,这个时代依然有人愿意贡献优质内容。
选择性参与一些技术会议,比如 QCon,不指望在会场能学到什么,但可以了解技术趋势,并看看别人在做什么。
刻意练习
之前写过两篇「刻意练习」的文章,自感对学习编程有一定帮助,大家可以去读一下。
逃离舒适区
这一部分适合已经有一定编程基础的童靴
什么是舒适区?如果你是个新手,你就没什么舒适区,什么都不懂嘛舒适个毛,在磕磕绊绊的学习中懵懂前行,期间可能还伴随着老鸟的嘲笑和进度的压力,终于有一天你武功精进,乾坤大挪移练到了第五重,工作中开始得心应手游刃有余,不断有新人或老人来找你解决问题,你微笑着迎接挑战,淡淡的送走难题,你挥一挥手,不带走一片云彩,这是什么境界?这就是你的舒适区,这和靠在沙发上看电视的舒适不是一回事,通常进入舒适区需要花费你很多的时间和精力,需要你不断的练习,一旦进入,你会enjoy it!
这时候,如果有人胆敢让你脱离舒适区,可算要了亲命了,你会勃然大怒,轻则争吵,重则离职。这种事遇到太多了,一个写前端的你让他学习一些后端技术,一个写Java的你让他学习一下C,得到的答复可能会,Sorry, I feel very uncomfortable!
没有人学新东西的时候非常舒服,一旦经历过从新人到老鸟的过程,再让你进入陌生的领域,那种痛苦会让你自发的去抗拒。但是一个人不可能永远躲在舒适区里,逃离舒适区会有助于你从不同的角度看问题,视野会更加开阔。人总要往前走的。
很多人在某个地方待久了就会非常懈怠,没退休就像在养老,这时候你就知道,他们在舒适区太久了,与在哪个地方无关。
最后一招「见龙在田」
实战总是很重要,为大家推荐一个在线学习编程网站: