不管是在某些论坛上,或者在微博上,都看到过很多人提问如何自学编程。心声共鸣啊,我就是从完全自学开启编程之路的。
要说到自学的过程、要多长时间才算学会、有什么具体方法等问题真不好回答。每个人对新鲜事物的接受能力不同,也决定了学习方法各异,难道说出一个标准的答案来。更何况这世界上本来就不存在标准答案,只不过是某些过于激进的文明,非要强调标准罢了。
不管怎么谈,我想啊,希望通过自学走上编程之路的朋友,都必须先认清自学的优点与缺点,尤其是缺点,你必须先有所了解,有心理准备,不要到真正实践的时候又打退堂鼓。
自学有以下缺点:
1、一切全凭自己摸索,走的弯路会多;
2、如果没有人指点,可能学习周期会更长;
3、方法不当,很有可能导致学无所获;
4、需要学习者对各种现有资源有一定的管理能力(如网络上的资源,图书,视频教程等),如果不具备总结判别等能力,庞大的信息来源会让你迷失方向,迷失自我。君不见,现在很多青少年就是在网络中迷失了自我不能自拨吗?
5、在学习过程中你会吃到很多苦头,受到很多打击。这是真的,不是吓你,我的真实经历。
道生万物,必有阴阳,有缺点自然也有优点。自学编程有以下优点:
1、自己探索出来的方法更适合自己,照搬别人的东西可能水土不伏。虽然前期的学习周期较长,需要花费的精力较大,但是,一旦你通过自学步入轨道后,你会发现你学习各种新知识的能力特别强,不需要别人指点你就能自己快速学会。前提是:基础扎实。
2、跟着别人学习,极容易入套,陷入他人的模式中无法自拨。万一你选择的学习资源不正确,或者一些图书的作者自身就没有扎实的功力,那很容易被误导;而自学的过程虽然艰苦,但被误导的成分不大,因为很多东西你都可以根据自己的实际情况而决定的。
3、通过自学打下的基础会比其他学习方式要扎实。这一点你可以反对,但据我观察,很多通过自学成才的人,基本功都特别硬。我这里指的基本功不是你会背几个概念的那些功力,而是你在艰苦自学过程中,对各种东西的深刻理解。从别人那里搬来的,你未必会觉得深刻,但若是通过自己的努力获取到的东西,估计你一辈子也忘不了。
4、自由。我今天喜欢学几个东西自己安排,学什么东西我可以灵活调度。你要是像大学里面的,大家一起上课,你懂了还是在那里上,你不懂也是在那里上,很难自由调配你的学习计划。自学可以做到有针对性地学习,同时对学习的内容可以自由进行筛选。
5、有助于培养独立解决问题的能力。在如“问问”等许多社区经常看到一些问题,但我是不去回答的,为什么?说难听一点——幼稚。不要什么破问题,动不动就问,不能过于依赖网络,该自己解决的问题尽量自己解决。一些翻翻书就有结果的问题最好不要问,你问这种问题,倒不得见别人会看不起你,首先是你自己就看不起你自己,你是不是相信你自己就是这么笨吗?
好了,上面那些优缺点,各位看了就过了,不要太在意。既然你决定要自学,就不要犹豫了。你要是举棋不定,那建议还是去一些培训机构,不过,我说一句客观的话,许多培训班的培训结果不怎么样,希望诸君心里有数。
关于一些抽象层面的东西我就不说了,那些东西我以前说了不少,估计能看懂的也没几个人。咱们来点实在的吧。用到“实在”这两个字,我总感到不悦,为啥? 就是因为现在的人过于追求“实在”了,所以现在大师级的人物是越来越少了。凡事皆有度,过了这个度就是“过尤不及”了。
因此,想要自学编程,你首先要戒掉一个很严重的通病——浮躁。浮躁这东西害人不浅,可惜人总是喜欢亲近它,真是“亲小人,远贤臣”,不治好这个病,就很难把基础打牢。我可以不怕得罪人地告诉大家:现在很多哪怕工作了三五年的程序员,很多都是基本功不扎实的。
在你要进入学习殿堂之前,先问你自己100遍:“我能坚持多久?”不要认为这样做很无聊,你要是真的试了,你会有不同的一番感受的,不信你试试看。如果你越问越没信心的话,那说明你心理上还没有准备好;如果你越问越有信心,越问越觉得斗志昂然,那说明你已经准备好了。
选择方向的问题
先谈谈选择方向的问题。
这个问题问的人太多了,但这些人也太可怜了。整天问:学A好还是学B好,A有前途还是B有前途? 我又不得不说一句很难听的话——幼稚。没前途的东西早就退出历史舞台了,还能被你知道吗? 比如,我估计现在学习编程时间不超过五年的人,有相当一部分人是不知道QBasic的,你信不信? 为什么你不知道它,因为它确实有点退出历史舞台了。
你要是问:你知道C语言吗? 我估计懂计算机的人都知道,为什么? 很简单,我用一句话概括:经典不怕问,传奇万代永存。你说,学C语言有没有前途? 呵呵。
技术是多元化的,知识的五花八门的,但是:思想是一致的,本质是不变的,这叫做“万变不离其宗”,所以现在一些小娃娃程序员是不懂创新的,他们单纯地认为,改头换脸就是创新,所以他们很喜欢天天喊创新,越喊越不懂,懂的人不需要张扬。
于是,会有人骂我保守。其实,你说我保守我很高兴,你要知道保守是一种很高的境界,一般人是达不到的。什么叫保守? 保守就是”保护前辈的智慧,坚守职业道德“,简称”保守“。你说,你给了我这么个高大上的称号,我能不高兴乎?
唉,可见,现在许多人是不保守的,呵呵。
我说了上面一堆话,就是告诉大家,只要你在出版的图书系列能看到的东西,只要你在网上还能见到的东西,都是有前途的。大市场有大市场的泡沫,小市场有小市场的盲区。要是某项技术全中国只有你一个人会,尽管是小众的,但你的身价是昂贵的。所以大家不要过于纠结这种问题,我曾经看到一条微博,说得很好,那微博上说:”往往没前途的人才会谈前途,整天生怕别人不知道似的;真正有前途的人是从不妄谈,从不空谈。“ 有道理乎?反正我觉得很对,我都抄下来了,现在还存在OneNote里面。就像那些越不懂武术的人,越是整天地说什么拳头要这样放,掌心要向哪边,胡扯的,武术用于实战时都是相机而动,灵活运用的。
大家知道我的主攻方向是.NET,可能你会问我:当初是如何选择的? 我告诉你,我当初选择.NET方向全凭个人兴趣,前途不前途我根本不考虑,只要学得好学得扎实学得入境学得出神入化,什么都有前途。
所以,选择什么方向,大家自己看着办吧。
选择什么样的书
一本好书真的很重要,尤其是带领你入门的书更重要,选好了不仅能让你学得开心,而且有助于你寻找属于自己的学习方法。每个人的口味和侧重点不同,可能选书的标准不同。我这里只说说我的个人看法,毕竟我也写过几本烂书。
1、书要精不要多。比如你要学PHP,你不要吃饱了没事干,看到PHP的书就买,买了一大堆放在桌上,自己又看不了。这样买书等于没买。现在网上购书也有章节试读的,你可以多看看试读的内容,综合分析一下再买,不用急,不会缺货的,”双十一“败家节都不缺货,平时更不可能缺,所以选书不用急。看书的时候,不要看作者是谁,没有必要的,权威人士写出来的东西未必好,草根作者写出来的就未必差,你重点看前言部分,看看这本书的主要内容,它是讲什么的,涉及到什么东东。
那些推荐序就算了,虽然我的书每次出版时出版社都会找些名人来写序,写推荐语等。不过我实话告诉你,那些东西我自己都不怎么看的,只是一种推广方式而已。还有书名也是这样,比如什么”深入浅出XXXX“,什么”精通XXXX“,什么”21天学通XXXX“,什么”XXXX速成教程“之类的,那只是一种”眼球经济“,吸引一下你而已,重点还是要落在书的内容上。
看完前言接着看目录,很多人看书有个极坏的习惯,不看目录,一拿到书就乱翻,看插图。我真不知道看插图干什么,里面又没有妹子看,你那么关心插图做什么。这就本末倒置了,你应该把目录看一遍,这样会了解一本书的整体思路,作者是从哪个视角去写作的,这个你得看懂,这不是什么编程基础的问题,这纯属个人的文字修养。
我个人的看法是,对初学者朋友而言,应当重视例子,但知识点也不能掉。有些书是示例很多,但完全是贴代码的,没有讲解部分,这样对初学者来说更痛苦。
可以从试读章节中,挑选语言比较易懂通俗的,有丰富的示例的书看,书不用买多的,就买好的就行了。
2、不要买薄书。不要买那些只有几十页的,很薄的,还什么什么”简明教程“的,这种书我说难听一点,是误人子弟的。哪有什么简明教程,不学编程的人也不去买这方面的书,人家要是只想了解一下某技术,人家还不如去搜一下维基百科,还会买这种什么”简明教程“吗?这种书可能是一些不懂编程的大学教师写的,因为大学教师每年都要完成一些所谓的”指标“,规定你今年要发表多少论文,写多少文字的书,于是那些老师就不管三七二十一,随便堆,随便拼揍,我怀疑还有不少是抄的。许多书特别衷情于MSDN,经常抄上面的内容。
3、使用示例要活。书本现在基本会打包书中的示例,要么是弄个光盘,要么是放在官网让读者自己下载。反正肯定会有的。拿到随书的示例代码后,一边看书一边使用这些代码。于是,就有了下面的话题。
如何使用示例代码
示例代码要结合书本内容来用,不然没有什么意义。先看书,看到示例后,先看完书上的例子,再从随书的示例代码中找到对应的代码。打开项后,不要急着去阅读代码,这样很迷茫,应该先把程序运行一下,你就看最终的效果。这里我介绍一种方法,我曾经用过,我觉得效果不错,不知道你是否适合,可以试试。
我这种方法叫”逆推法“,就是黑客们说的逆向思维。我举个例子。
一个加法运算器,在窗口中输入两数,点击计算后,会计算输入的这两个数的和,然后显示结果。
我会首先把程序运行起来,自己操作一遍,输入两个数——3和2,得到结果5。我会先问:为什么我点击按钮后就有结果呢,我不点击按钮时为么就不出现5呢?
原来应用程序是要与用户进行交互的,要得到最后的加法计算结果,那得先等用户输入两个数;输入两个数后为什么不会马上得到5呢?原来用到一个叫事件的东西,事件是一种消息体系,它是在某个条件成立时才会发生,如按钮被点击时,与事件有关的代码就会执行,这时候我会找到与按钮事件有关的代码,看看在点击事件发生后,代码都做了什么。可能会这样:
a、获取两个输入的数字;
b、……
c、计算两个数的加法运算结果;
d、显示出来。
于是,下一个问题出现:怎么样知道用户输入的两个数呢,原来,是用了两个TextBox控件,它是专门允许用户输入内容的控件。
上面”b“步骤用了省略号,因为还有一个问题又出现了:如果输入的不是数字呢? 所以我就想到,在获取到输入的内容后,要检查一下这两个输入的值是不是数字,然后才能计算。
那计算好的计算怎么告诉用户呢? 原来有个控件叫Label,它可以在窗口上显示文本。
这样一来,我不仅弄懂了程序是怎么来的,而且也知道了控件是什么东西,控件就是给用户进行操作的,程序是看不见的,摸不着的,你写的程序要给别人用,当然别人必须能通过像键盘、鼠标等输入设备和应用程序交流,不然,都看不见的,你说别人怎么用你的程序? 是吧,那你知道控件的作用了吧。就好像我给你家安装天燃气,但我不给你装阀门,你就很难控制天燃气的流动,甚至可能造成危险。如果安装电灯不装开关的话,难道你让它一直亮着,直到停电不成? 所以控件就像开关,就像汽车上的方向盘,用来给别人进行操作的。开车的人不一定会知道你车里有什么零件,发动机是怎 么动起来的,只要你提供操纵杆、方向盘、各种按钮给开车的人操作就是了。
程序也一样,用户不一定知道你的代码怎 么来的,但程序有了界面,有控件,用户就能操作。
因而,我觉得逆推法是不错的学习方法,尤其是在看别人的一些开源项目时,难道你一拿到代码就一行一行地看,哪怕你花一年时间看完,花一百年时间去背下来也没有用,你都不知道那些代码是干什么用的。阅读代码使用逆推法,会使得你在阅读时不茫然,已经有确切的目标,这样看起代码来也有效率,也不会说看完了也不知道什么东西。
先看最终效果,然后你对这个效果提出问题。比如为什么会弹出对话框? 为什么会这样? 为什么会那样? ……
然后你带着这些问题,到源代码中找,只要能回答你所提出的问题,你就算把代码看懂了。不然,你盲目地看,不分轻重地看,你看一千年也看不出子丑寅卬来。
我自学过程中还常用的另一种方法,就是举一反三。这里的”三“是概数,不一定就是三,可能是无穷。
比如,我看了某书上某个例子,我会想,为什么要先写一行代码再写第二行呢? 那么我会试着把两行代码倒过来,看看运行程序后会发生什么事情。或者说,为什么要写上这一行? 我把它删了会怎 样? 于是,我会把那行代码注释掉,然后运行,看看又会发生什么事。
如此一来,久而久之,你的编程思路就会明确起来,写代码也会谨慎起来,当然了,谁都会出错,至少出错的机会会减少。
再如,像下面这样的代码:
int width = 100 ;
如果我不要100,我改成700又会怎么样呢?
甚至有时候,你可以把两个示例合成一个示例,这都可以自己动手试试,失败了不要紧,失败的次数多了,就会成功了。
学会调试很重要
调试并不是只有在纠错时才用,在学习过程中也可以用的。比如
#include <.....h>
#include .......
using namespace .......
int main(...)
{
……
return 0;
}
书上会告诉你,main函数是程序的入口点,程序运行时会进入该函数,当程序执行离开该函数时,程序就会退出。
你会说:我不信。好,那你在main后的左大括号({)处打一个断点,又或者你直接单步运行,这样每执行一行代码都会停下来。这样你就能看到整个应用程序是如何经历”生生死死“的,你就能看到程序是不是从main开始执行,当退出main后是不是会退出。
所以说,在学习过程中应该多用用调试,熟练了你会发现很有用的。平常很多人在入门时总是不重视调试,一看到跟调试有关的章节就跳过。其实这是不对的,越是入门你越应该学会调试,在研究示例程序时都可以用上调试方法的,这样你才会动态地看到,整个示例是怎么运行的。
从来没写过代码,该怎么办
如果是真的0基础入门,从来没写过代码,第一次写代码时,会感到迷茫。这是必然的,也是必经的阶段,任何事情都有第一次,人家干坏事的也有第一次呢。谁天生就会的? 我当初也是这样,于是,我就拿代码来练打字,就照着书上的敲,一个字母一个字母地敲,要知道QBasic是在DOS下玩的,没有智能提示的,只能一个个敲。
权且当练习打字,输入完了,不保存,关掉,再新建,再照着书上输入一遍。我就是这样一次又一次地练”打字“,最后就找到写代码的感觉了。当然,光是练打字,背代码不是好的学习方法,但是,对于没有任何基础者来说,这不在于理解和弄清思路,目的很单纯,就是为了找感觉,找到感觉了,你就不用再练打字了。
当你知道如何写代码后,就不要不加思索地乱抄了,这时候你在写程序前先想一下:
1、这个程序做出来后能解决什么问题? (如:转换图片格式)
2、我写这个东东出来要用到什么? (如:图像API,解码器和编码器的操作)
3、先做什么,后做什么? (如:是先设计界面,还是先封装代码)
想好了再动手,如果做不出来呢? 可以查资料,这时候就可以问人,基础的东西不要乱问,但涉及实际技巧的东西可以去问。如果实在解决不了,那就放一边,不要在一棵树上吊死,吊死了以后的路就没法走了,所以说释怀也是一种修养。
学会看文档
这里的文档是指官方的参考文档,最好试着去阅读。这个我就不展开讲了。
速成是空中楼阁
现在很多培训机构,抓着了当今青少年急于求成的浮躁心理,常常弄些什么”速成“、”快速精通“之类的欺骗性宣传语。我告诉你,不单是学编程,这种浮躁什么领域都有,很多少儿书法、绘画培训班也打这种口号,其实是误人子弟。
不管你学什么,最优的捷径就是没有捷径,不要整天想着一夜成名想疯了。当然想一夜成名也行,你拿个手榴弹把银行炸了也可以一夜出名。扎扎实实地学习,对你将来的发展肯定是有好处的,特别是在校大学生,有足够的时间,足够的精力去打基础。
于是,我就常听到有些人说,买书没钱,看书没时间。借口你可以说出一万个来,你在欺骗谁? 欺骗我吗?你学不学跟老周没关系;欺骗父母吗?也算是,至少算是不孝了;欺骗老师吗?老师才不管你呢。你是在骗你自己!
以前看过一期名家专访节目,某大师的话就说很好,”耐不得寂寞,你就练不了真功夫“。人,不管身处何地何境,愿意努力,将来你总有收获的。
多写博客
不管你基础怎 么样,你是菜鸟也好,高手也罢,我建议大家都试着开个博客,把你学习过程中一些心得, 一些苦闷,一些感悟 写下来。或者总结一些技巧,都可以写出来。
不一定说要高手才能写博客,不对的,博客是任何人都可以写的。写出来,大胆地写出来,不要怕别人笑,有人笑你就当没看见就好了。
======================================
以上内容只是我的一些浅陋的论述,但愿对大家有所帮助。