编程论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

界面工厂编程视频教程广告联系qq1031180668广告位
查看: 1145|回复: 6

编程自学的方法

[复制链接]
  • ta_mind

    昨天 10:39
  • classn_01: 66 classn_02

    [LV.6]常住居民II

    826

    主题

    1539

    帖子

    2820

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2820

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2015-12-8 23:34:57 | 显示全部楼层 |阅读模式
    不管是在某些论坛上,或者在微博上,都看到过很多人提问如何自学编程。心声共鸣啊,我就是从完全自学开启编程之路的。
    要说到自学的过程、要多长时间才算学会、有什么具体方法等问题真不好回答。每个人对新鲜事物的接受能力不同,也决定了学习方法各异,难道说出一个标准的答案来。更何况这世界上本来就不存在标准答案,只不过是某些过于激进的文明,非要强调标准罢了。
    不管怎么谈,我想啊,希望通过自学走上编程之路的朋友,都必须先认清自学的优点与缺点,尤其是缺点,你必须先有所了解,有心理准备,不要到真正实践的时候又打退堂鼓。
    自学有以下缺点:
    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、先做什么,后做什么? (如:是先设计界面,还是先封装代码)
    想好了再动手,如果做不出来呢? 可以查资料,这时候就可以问人,基础的东西不要乱问,但涉及实际技巧的东西可以去问。如果实在解决不了,那就放一边,不要在一棵树上吊死,吊死了以后的路就没法走了,所以说释怀也是一种修养。
    学会看文档
    这里的文档是指官方的参考文档,最好试着去阅读。这个我就不展开讲了。

    速成是空中楼阁
    现在很多培训机构,抓着了当今青少年急于求成的浮躁心理,常常弄些什么”速成“、”快速精通“之类的欺骗性宣传语。我告诉你,不单是学编程,这种浮躁什么领域都有,很多少儿书法、绘画培训班也打这种口号,其实是误人子弟。
    不管你学什么,最优的捷径就是没有捷径,不要整天想着一夜成名想疯了。当然想一夜成名也行,你拿个手榴弹把银行炸了也可以一夜出名。扎扎实实地学习,对你将来的发展肯定是有好处的,特别是在校大学生,有足够的时间,足够的精力去打基础。
    于是,我就常听到有些人说,买书没钱,看书没时间。借口你可以说出一万个来,你在欺骗谁? 欺骗我吗?你学不学跟老周没关系;欺骗父母吗?也算是,至少算是不孝了;欺骗老师吗?老师才不管你呢。你是在骗你自己
    以前看过一期名家专访节目,某大师的话就说很好,”耐不得寂寞,你就练不了真功夫“。人,不管身处何地何境,愿意努力,将来你总有收获的。
    多写博客
    不管你基础怎 么样,你是菜鸟也好,高手也罢,我建议大家都试着开个博客,把你学习过程中一些心得, 一些苦闷,一些感悟 写下来。或者总结一些技巧,都可以写出来。
    不一定说要高手才能写博客,不对的,博客是任何人都可以写的。写出来,大胆地写出来,不要怕别人笑,有人笑你就当没看见就好了。

    ======================================
    以上内容只是我的一些浅陋的论述,但愿对大家有所帮助。




    上一篇:2015年12月8日签到记录贴
    下一篇:2015年12月10日签到记录贴
    不积跬步,无以至千里
  • ta_mind
    慵懒
    2017-4-26 02:38
  • classn_01: 11 classn_02

    [LV.3]偶尔看看II

    1

    主题

    27

    帖子

    129

    积分

    注册会员

    Rank: 2

    积分
    129
    发表于 2015-12-22 10:04:31 | 显示全部楼层
    这帖子说得好。上了一节好课!!
  • ta_mind

    昨天 10:39
  • classn_01: 66 classn_02

    [LV.6]常住居民II

    826

    主题

    1539

    帖子

    2820

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2820

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

     楼主| 发表于 2015-12-22 13:21:02 | 显示全部楼层
    king38492378 发表于 2015-12-22 10:04
    这帖子说得好。上了一节好课!!

    不积跬步,无以至千里
  • ta_mind
    奋斗
    2016-1-4 18:57
  • classn_01: 1 classn_02

    [LV.1]初来乍到

    1

    主题

    5

    帖子

    27

    积分

    新手上路

    Rank: 1

    积分
    27
    发表于 2016-1-4 19:27:59 | 显示全部楼层
    内容看起来的确不错啊。
  • ta_mind

    2016-5-16 12:07
  • classn_01: 28 classn_02

    [LV.4]偶尔看看III

    15

    主题

    82

    帖子

    164

    积分

    注册会员

    Rank: 2

    积分
    164
    发表于 2016-5-11 11:23:54 | 显示全部楼层
    嗯 说的很有道理 基础必须扎实

    classn_11

    0

    主题

    1

    帖子

    9

    积分

    新手上路

    Rank: 1

    积分
    9
    发表于 2016-6-5 07:22:23 | 显示全部楼层
    为自己加油
  • ta_mind
    开心
    2016-6-5 13:40
  • classn_01: 1 classn_02

    [LV.1]初来乍到

    0

    主题

    25

    帖子

    29

    积分

    新手上路

    Rank: 1

    积分
    29
    发表于 2016-6-5 14:16:26 | 显示全部楼层
    学习下。看看。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|Archiver|小黑屋|sitemap|编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号-2 )

    GMT+8, 2017-10-18 00:53 , Processed in 0.179701 second(s), 30 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表