专访周家安:我的十年编程自学之路


发表于2013-02-26 11:12| 62042次阅读| 来源CSDN| 171 条评论| 作者张勇
社区之星访谈编程.NETc++程序人生Windows Phone周家安
摘要:有一群人对计算机兴致盎然,却总不得要领,所以本期社区之星的话题是:编程学习。在编程路上该如何选择和学习语言?编程学习的重点是什么?如何克服编程学习中的枯燥和无聊?社区之星第十四期采访了自学编程的周家安,相信他在编程学习路上长达十年的摸索能给诸位带来答案。


十年自学编程的认识和感悟
CSDN:你一开始都是怎么学习编程的?效果怎么样?后来又做出了什么改变?


周家安:虽然我知道以实践为重的道理,但是一开始学习都是一边看书一边上机练习,把书中的例子实践一回。这种方法我当初也认为很管用,但慢慢地我发现,这种学习方法依然不是最有效,哪怕对书中的例子练习到可以把代码背下来了,然而一旦脱离书本独立写程序,仍然摸不着头脑。


很关键的一点是,过于在乎代码细节了,完全忽略了思路的重要地位。后来我换了一种学习方法,核心仍旧是以实践为主,不过,不是照抄书上的例子,而是先把例子看完,拿出一张纸,用笔写下例子代码要实现什么功能,第一步做什么,第二步做什么,用到哪些知识,使用了哪些类哪些函数,为什么要用。然后把书合上,就根据纸上写的内容去编程。这种做法有些难度,而且容易出错,不过好处很多,一是挣脱了书本上的示例的束缚,自由发挥空间大,不容易形成定势思维;二是出错了无法通过编译,就会迫使我去主动寻找错误,不知不觉中,我不看书都学会了调试的方法。


“尽信书者则不如无书”,不应该什么都相信书本上说的,上大学二年级的时候,记得有一位老师说过:“给你这本教材,如果你没把其中的知识学会,那你将非常失败;如果你把书中的知识全部学会,勉强给你合格;如果你看完这本书之后,把书中的内容推翻,那你才是一个了不起的人。”我对这句话印象深刻,或许是因为用这句话来形容我的学习理念很贴切。


看书我仅仅是作为一种参考,为什么呢?请原谅我把话说得比较难听,很多书其实都是抄袭或翻译帮助文档,比如很多.NET相关的书都抄MSDN上的文档,如果你不相信,你不妨比对一下。


任何一门编程语言或开发平台都肯定会附带官方的参考文档的,我平时发现很多人在学习编程的时候,都没有查看帮助文档的习惯,经常会遇到让人哭笑不得的提问。每次我遇到有人提的问题如果参考文档上都有的,我是不会回答的。


现在有许多论坛、交流群等互联网平台可以分享学习经验,同时,也方便大家解决疑难问题,这是很不错的,有时候遇到比较棘手的问题,不妨考虑发个帖子,让大家来帮忙解决。但是我要批评一下那些依赖心理太强的人,很多人总是这样:想都没想就到处去问别人。如果你真的想要把编程学好,请改掉这个坏习惯。


CSDN:自学编程,你觉得该如何选择适合自己的书籍?你在各种技术学习中都选择了哪些书?


周家安:自学编程,一方面应该选择实例比较丰富的图书,这不仅仅降低理解成本,而且有助于激发学习兴趣;另一方面,应当选择内容比较全面的书,价钱较为便宜那些薄薄的书建议不要购买,比如那些带“XXX简明教程”字样的书,不推荐,那些书不仅不能帮助读者了解某项技术的精要,反而会使读者产生更多的疑惑。


建议购买那些全面且深入的图书,比较厚,价钱也相对较高。不要找借口说没钱去买,我从没见过几个穷到买不起书的人,当然也不一定说非得去买书不可,要学会热爱图书馆,多借一些书看看,有益无害。


我个人看得比较多的书是Wrox系列经典红皮书,这些书都是很著名的畅销书,具有很高的参考价值。同时,我也经常阅读帮助文档的,多角度摄取知识,融会贯通。


CSDN:大约是在什么时候开始找到对编程的感觉?你认为编程学习的重点是什么?


周家安:大约在参加工作两年后,我才慢慢地找到对编程最真实的感觉。编程其实更应该注重思想,写代码只不过是一个逻辑翻译过程,把我的思想转换成计算机指令。故写程序和文学写作是一样的,有明确的主题(目标),清楚的脉络(设计文档和构思)才能做到笔下生花;写程序和习武是相通的,很多人总有一个疑惑,什么样才叫编程高手?什么程度才叫境界?那你不妨想想,什么样的武功才是上乘的武功?什么是武林高手?如果你看过武学电影就知道了,不要以为里面是骗人的,那是真实的,任何艺术作品都是取材于客观世界,影视作品也不例外,编程更是如此。


如果你让我用一句简单明了的话来概括什么是程序,我会说:“程序无非就两个东西,一个是看得见的(UI),另一个是看不见的(逻辑)。”


当你计划要做一个程序的时候,无论是小程序还是大项目,不妨先想一下:


我干吗要写这个程序?
这个程序完成了什么?
程序所完成的任务真的比人们手动操作更有效率吗?更准确可靠吗?
如果我成功完成这个程序,解决了哪些实际问题?
我在写这个程序的时候,可能遇到哪些困难?如果某个难点解决不了,能有可替代方案吗?
使用我编写的程序的人会快乐吗?
我做好这个程序之后会高兴吗?
CSDN:编程的实战很重要,你平时都是如何进行实战提高自己能力的?


周家安:我是坚持每天都要写代码,不是很多,可能20到50行,也可能100到200行,都是一些很基本很简单的程序,但我会重复写,不断写,写完之后不保存,直接从硬盘上删除。我不会刻意去记代码,所以,每天我写完就删,我希望把这些代码像潜意识一样植入我的脑细胞中。


但要做到这样很难,而且很多人都会虎头蛇尾,坚持几天就没有下文了。我刚开始的时候也是很不习惯,也有好几次想着要取消这个行为。后来我强迫自己坚持下去,谁叫我天生就是这么个倔性子。


CSDN:能分享些对你所学过的技术或语言的学习小窍门吗?比如有人觉得C/C++指针比较难,你当时是怎么越过这道坎的?等等……


周家安:我个人觉得刚接触编程的时候,不应该对一些抽象难懂的概念或理论过于深入地研究,建议把重点放在“怎么用”这一层面上,其实大家不妨想想,我们学习编程是为了什么?是为了学习而学习,还是最终要应用到实际任务中?


技术最终还是要面向实用的,但也不意味着要放弃继续深入地学习。不过,我们不能老卡在一个坎上过不去,适当地放一放,说不定将来某一刻你回过头来再想一想,会豁然开朗。


不同编程语言之间可以相互渗透,有些时候,在C++里面不理解的东西,可能会在学习C#后反而变得理解了;在C#里面不懂的东西,但学习了Delphi和C++后反倒懂了。我就有过这样的经历,C++的函数指针,当初我是不太懂它是怎么用的,不过,就是在学习了.NET中的委托之后,我不知不觉地学会了在C++中使用函数指针,这就是知识迁移。


有一点我印象比较深刻,是关于多线程的,当时我记得是一位学弟问我多线程用来干吗?很难理解。我反问了一个问题:在农村看过鱼塘是怎么抽水的吗?那你想想,一台抽水机抽水可能要抽一个月才能把水抽干,那如果我找来十台抽水机同时工作,你说呢?懂了吗?


我的一位堂弟刚刚上大一,学的是计算机专业,第一学期就开了C++的课,寒假回来他告诉我,老师给我们讲指针这个东西就讲了近两个月,搞得大家一头雾水,当然他也知道指针里面存的是地址,他说想知道指针是咋工作的。我听完了他一连串的话,我说:“假设你现在不知道我住在哪里,但我给你一张名片,上面有我的固定电话和具体地址,你要是想来找我喝喝茶,那你拿着这张名片就能找到我了;在书店找书的时候,如果没有看到某本书,你可以先找到服务人员,然后通过服务人员间接帮你找到某本书,这就指向指针的指针了。”


在学习.NET过程中,事件和委托(或者回调)自然是少不了的,其实不管是事件还是委托,并不难理解的。首先,事件其实就是通过一个委托来定义的,什么是事件呢?不小心被蚊子叮了一口,很痒,就是因为被蚊子叮了这一事件发生了,你的身体就会作出响应了,你会觉得痒。下课铃一响,你是不是要急着往教室外面跑了。当下课铃响了这事件一发生,你马上知道该放学了,肚子饿了,准备好向饭堂进发。


在调用异步操作时,通过会传递一个CallBack参数,在C++中可能是函数指针,在.NET中,也许是委托。为什么要回调呢?今年春节期间,表妹说想换手机,于是她叫我帮她在淘宝网上拍下了一款手机,当天下午卖家发货了,不过由于春节期间可能货物积压过多,等待手机快递过来也许会比往常要迟,于是,我告诉她,不用天天问我手机到了没有,你可以做你要做的其他事情,等手机收到了,验货完成了我就通知你过来拿。调用异步操作时,传递一个回调方法,而这个操作可能要等一段时间才完成,调用异步操作的代码不必等待任务完成,可以继续往下执行,做其他的事情,一旦异步任务执行完成了,就自动调用回调函数,以指示操作完成。


CSDN:自学编程之路已有十年,十年了在自学中你最大的感悟和收获是什么?另外很多人都觉得编程非常枯燥无味,你认为自学编程该如何坚持下去?


周家安:学习编程的人分为三种类型:


狂热爱好者,把编程当作事业,当作一种境界。
纯粹为了应付工作需要,浅尝辄止,能满足日常工作即可,不再深入。
业余爱好者,或者仅仅是对写编程感到好奇,只是想泛泛了解一下罢了。
如果你想学编程,不妨看看上面三点,对号入座,知道你自己要追求什么。


在自学编程这些年里,我最大的感悟就是:你要真正地喜欢上编程。当一个人真正喜欢做一件事情后,就不会觉得无聊和枯燥了。很多人觉得学习编程很枯燥,甚至学了没几天就想放弃,我曾经做过总结,原因有以下几点:


1.懒:这是一个决定性因素,许多你本想去做而最终又没有做的事,多数原因就是你懒惰,什么事情就喜欢推到明天再说,明日复明日,明日何其多。


对编程本来就不感兴趣,只是出于某些原因如工作需要才去学习的,这样一来,你的动力就显然不足了,要把一件事做好首先你就必须喜欢上这件事,不然你的注意力无法集中,效果自然要差很多。


2.性格:性格的因素是不能忽略的,编程这活儿需要有耐心,而且要沉得住气的,可以静下心来干活。这就是许多编程高手性格都比较内向的原因。并不是说性格外向就好,内向就不好。性格内向的人,会愿意花时间在编程上,而性格较为外向的人,就未必做得到,刚没写几行代码,电话响了,老兄,今晚到哪儿喝酒?哥们,今晚去哪里吃宵夜?放下电话后,你的注意力已经分散了30%;接着一个类还没写完又电话响了,大哥,X月X日某某说搞生日Party,你有何高见?这么一来,你的注意力又分散了50%,仅剩下20%,你这个程序估计无法写下去了。


3.心态:我说过,现在的人最可怕的就是浮躁,不踏实。如果你真想把编程学好,就不要把它当成游戏,而要视为你的事业。


4.方法:有些朋友是真的热爱编程的,而且也下了大决心要学好的,但由于学习方法的错误,导致效率低下,久而久之,信心开始动摇。


5.心理素质:别以为写程序和心理素质无关,其实不然,在编程过程,会经常遇到错误,甚至有时候会让整个程序要重写。有时候我们总认为想法是对的,可是当代码执行时就老是报错,反正就达不到你预期的结果。或者说有时候写一段代码,接连调试了好久,居然还找不到错误。这些情况正是在考验你的心理素质,我见过很多人学编程,开始的时候,信心十足,过不了多久,就放弃了,经受不起打击。


如果真的觉得编程很无聊,很枯燥,那不妨试试下面的做法:


我会经常写一些小工具,要么自己用,要么给别人用,或者在网上以免费软件发布。而这些小程序,一般会解决一些生活中可能遇到的问题。如改变图片分辨率,为图片添加水印等。


也可以做一些有趣的玩意儿,比如,我曾经做过人品测试器。这样既可以实践,又能带来一些乐趣。


编写小工具的目的,一来你不会花费过高的时间成本,二来可以练习练习,多实践。不要认为写小程序“不务正业”,再复杂,再庞大的程序都是可以分解为许多小程序小功能,“一屋不扫何以扫天下”,你连小程序都写不了的话,你觉得你能写大程序的概率是多少?再者,编写小程序可以积累许多开发技巧,原本你不知道XXX方法可以这么用的,但通过编写小程序,你就掌握了它的用法了,以后你再次遇到相似情况,你就可以快速作出反应了。


当然也可以做一些整人程序,娱乐一下。不过要注意掌握好分寸,不能太过分,不要侵犯他人合法权益,不要伤害他人尊严。


CSDN:在众多语言或技术中,你现在主要使用的是哪个语言?为什么?


周家安:现在主要用的是C#和C++。能够充分发挥.NET的优点,主要还是开发效率较高,开发工具用起来也比较舒适。在参加工作之前,我也是跟现在一些朋友一样,过分地纠结于平台和语言之间的对比,认为.NET只是拖控件而已,没什么好学的。但参加工作以后我才真正明白,纠结这些东西没有意义,思维会受到阻塞,我前面说过,写程序只不过是一个把我的思想翻译为执行逻辑的过程罢了。最根本最核心的东西还是思路,你有什么样的思路就会有什么样的程序出来。其实换一角度思考,拖控件没什么不好。缩短产品的开发周期,改善开发流程,最大程度提高生产率,难道不是现代生产管理的宗旨吗?


通常做项目的时候,我不会把时间花在写代码上,而是把更多的精力放在整体思路上,确定思路没有问题了,才会编写代码。就算别人已经为我设计好思路,我还是要去自己分析一下,哪些东西是多余的,不必要的,可以删掉,哪些地方可以换一种想法去做,哪些地方可以变得更简单。化繁为简,用最少的代码实现最多的功能。选用C#是因为我平常写的程序需要它。不过,我始终会坚持使用C++,因为使用C++能让我学到更多的东西,可以说我掌握的绝大部分编程知识都是在学习C++的过程中学到的。应该可以说,C++学会了,其他语言就没有难度了。

你可能感兴趣的:(专访周家安:我的十年编程自学之路)