导读:这是一名“不务正业”(专业是人力资源管理)却一心投入计算机怀抱的人,他年纪轻轻却凭着浓厚的兴趣和独特的学习方法自学了诸多计算机语言,他乐于分享和解惑并因此出书,这一切是怎么做到的?他有什么认识和感悟?……为此CSDN记者对这位87后进行了专访并发表成文,希望能给那些在计算机路上彷徨、挣扎和困惑的人带来心灵鸡汤——只要决心努力,任何事都可完成,同时也希望给技术大牛们带来共鸣,因为你们也曾这么“跋山涉水”过。
有人为选用什么编程语言而发愁时,周家安形象的表示:“吃饭用筷子,刷牙用牙刷,你不要用牙刷来吃饭就行。”
周家安,2010年大学毕业,先后从事PHP版电子商务平台扩展开发、嵌入式开发、Web开发、Web服务接口开发和ERP系统外接应用程序开发,著有《Windows Phone 8开发技巧与案例精解》一书。
CSDN:你是什么时候接触到计算机?那个时候对计算机的兴趣一直持续了多久?
周家安:记得第一次接触计算机还是在2002年,那时候我正在上初中,一个偶然的巧合我与计算机结下了不解之缘。
那时候,我弟弟正在上小学,有一天,可能是学校的图书室(那时候还没有像样的图书馆)进行清理,一位老师搬着一叠书正要离开,在门口看见我弟弟,就顺手塞给他两本书。弟弟不知道是什么书,就拿回家给我看。
原来那是两本计算机程序设计竞赛的基础教程,一本是Pascal,另一本是QBasic。强大的好奇心驱使我打开这两本书,就这样,我糊里糊涂地踏上了自学编程之路。
CSDN:你自学的第一个语言或技术是什么?大概用了多久?能和我们分享下自学编程中的一些经历吗?
周家安:第一个学习的语言是QBasic,对于这个语言,我想现在很多新生的初学者朋友应该很陌生了。当时我对比了那两本书,发现QBasic比较容易接受,感觉学起来比Pascal简单,于是就从QBasic开始。那时候家里还没有买上电脑,所学到的东西都是“纸上谈兵”,只是偶尔到表哥家里“发挥”一下。
2003年国庆长假,表哥从广州大学城回来,就让他帮忙到电脑城组装了一台电脑。那时候我才真正有了可以实践的机会,心里无限欣喜。那时候还不能上网,个别邻居较为幸运就用电话线上网,于是我拿着一张软盘到学校叫老师帮我拷贝了一个QBasic,然后回家放在电脑上,等到周末不用上学,我坐在电脑前把书上的所有例子代码都实战了一遍,敲键盘敲得我手都累,对着显示屏幕坐了一整天。我说不出是什么让我这么疯狂,不过总的一句话是:每次我写完程序后都有一种很强烈的成就感,就是这种感觉让我很兴奋,就会迫不及待地接着去学习更多知识,这样我会得到更多的成就感。
有一次在书店看书的时候,看到一本书叫《Visual Basic中文版基础培训教程》(人民邮电出版社,2002年),我想都没想就买下,只要周末不用上学我就把自己宅在家里,哪里也不去,就拿着这本书看,开着电脑一边看一边把书上的例子敲一遍。书上也建议用这种方法学习,也就是我们大家都懂的,实战为主。
当把整本书看完后,书中的例子都照着练了一遍,为了向好同学、好哥们炫耀一下,我就想着做一个MP3播放器,大致与Winamp的基本功能相似,可以控制音频播放行为,可以保存和加载播放列表,一段MP3播放完了自动跳至下一段。根据书上的讲解,应该用MCI组件,但在编程过程发现,书上的例子我都练得很熟,代码也记得(我是死记硬背代码的),怎么自己做起来就好像什么都没学到一样呢?
我不甘心别人都能学会,难道我就不能?于是我下定决心,一定要通过自己的努力将这个播放器做出来。于是把书又从头到尾看了一遍,找到了原因:作为初学者,我过度关注代码的细节,从未去考虑过思路和逻辑,先做什么后做什么没有弄清楚。这是很多入门者都容易犯的错误。从那以后,我就非常注重思路,在写代码前要想好接下来要做什么,完成哪些,有哪些步骤,先做什么,再做什么,最后做什么。
CSDN:接下来你又学了哪些语言或技术?当时为什么会选择学这些?另外是什么因素驱使你不停的去学各种语言或技术?
周家安:在我上高中这几年,其实我主要使用的VB和Pascal,而C语言只是略懂一点点。由于平时能花在上面的时间真的很少,而且高三这一年,为了拼高考,我几乎连电脑都没碰过,对于VB,说真的,除了语法外,其他的都印象模糊了。
由于各种原因,大学我没能如愿地选到我想要的专业,而是选择了人力资源管理专业。刚上大学的时候,我一直在问自己:既然没能进入计算机相关专业,那还继续学习编程吗?可不久后我发现,在大学里面,空余时间实在太多了,如果不充分利用好这些时间,那岂不是在毁灭自己的青春年华?尤其是看惯了身边许多同学,有的在网游世界中越陷越深,有的陷入暧昧情感中不能自拔,有的漫无目的地熬日子……我呢,我不得不要好好想想,来大学究竟是干什么的?难道四年之后,还是一无所获地离开校园?难道真的像外面所传说的那样,大学毕业生还不如那些没受过高等教育的人吗?
从小性格十分倔强的我,下了死决心:我的大学生涯,绝对不能重蹈周围那些人的覆辙。我决定把所有空闲时间都泡在图书馆。
利用图书馆的资源,我接触到了PHP、Java、ASP、C++等内容。慢慢地,我把重点放在C++上,从《C++ Printer》中我读出了许多疑惑和神秘感。我曾问过自己:C++真的很难学吗?说它难学的都是谣言吗?还是人们习惯了定势思维,把它搞复杂了呢?
而真正让我有动力去学习更多C++的知识的,是一套讲得很优秀的视频教程,我相信很多人都看过,就是孙鑫老师的VC++教程,我真的要感谢孙老师,而且我还从图书馆借到了孙老师的书,从头到尾看了一遍,即使当时很多东西看不懂,但是我就硬撑着去看,我心里不停地暗示自己:我就不信我学不会!
大学期间,我很大一部分时间都用在学习C/C++上,不知道为什么,那时候我觉得.NET太简单了,不值得研究,显然我当时真犯了一个致命的错误,我估计现在还有不少人仍在犯着我当年的错误,那就是心态过于偏激,后来我才渐渐地明白,哪怕是写程序,也要培养自己具备良好的心理素质。
那个时候,大家都知道,C#比较热,为了彻底纠正我的错误,同时我也想亲身去体验一下.NET是什么。记得那时候书店里都有很多C#的书,这更加勾起我与生俱来的好奇心。就好比一个习武之人,对于陌生的拳法都会有着浓厚的兴趣,为了探个究竟,我便投入了.NET的学习中。
后来我想:自己完全自学编程,没有接受任何专业课程的教育,也没有参加任何培训,最大的好处就是不会受到现有理论的负面效果影响,所有东西都是凭借自己最真实,最直接的感觉去感悟,最终学到的东西是远远超过计算机专业的同学的。后来的学习经历更是证明了这一点。
后来参加工作,接触到ERP系统的开发,我才真正明白,.NET有它独有的优点。有一天公司停电了,就跑到外面跟一位朋友聊起天来,谈话中我不经意间说了一句话:“去商店买东西的时候,你会被琳琅满目,各式各样的商品弄得眼花缭乱,可是,你为什么要去商店?你去商店干吗呢?是不是别人说哪个商品好啊,你就去买呢?当然是购买你最需要的商品了。世界上哪来什么编程语言之争?争什么呢?”他用力拍了一下我的头脑,说:“来我们公司吧,你看看,我们公司论规模论实力都比你现在那个公司强。妈的,我们公司那些老程序员都说不出这么精妙的话,算你狠!”
所以,我送给那些整天为选择用什么编程语言而发愁的朋友一句话:“吃饭用筷子,刷牙用牙刷。你不要用牙刷来吃饭就行了。”
促使我不断去学习这么多语言或知识的因素,我想至少有两个:一是性格,我小时候就很喜欢拆解电器,什么电风扇、电冰箱,洗衣机,收音机,反正是没有我不敢拆的,总是想看看这些电器的外壳里面都装着什么;二是逐层深入去学习,会带来更多的成就感,我很喜欢这种感觉。
CSDN:后来你为什么又对撰写技术博客产生兴趣?据说你的新书《Windows Phone 8开发技巧与案例精解》和你的写博经历有关,能和我们分享其中的故事吗?
周家安:是的,撰写技术博客,分享编程知识是一位老同学的建议,当时他跟我说:“学编程的人我是见得多了,像你这么个学法的,我还真第一次见,看过《射雕英雄传》吧?喂,你跟那个什么黄药师很像,怪招特别多。你这种学习方法有一点很有意思,那些抽象的东西到了你那里就全变成什么下水道(他说的是多线程),什么门铃(其实是回调函数)之类的。”他说如果我把这些东西写到博客里,一定会很牛B的。就是这样我就开始写博文了。
我写了一些有关Windows Phone应用开发相关的文章,后来出版社的编辑看到我的博客,希望能与我合作,写一本IT图书。几天后,我想也好,就同意了。
CSDN:WP8、Android和iOS之间你是如何取舍的?为什么最终会选择WP8平台?
周家安:其实,Android应用我在公司做过相关项目,都是和ERP系统集成的边沿性应用,也只能是边沿性应用,说白了是送给客户玩一下的,不收取费用的,因为这些应用是无法替代ERP的核心功能。后来我也做了一个WP版本的版单查询(服装行业术语),主要得益于WP上对WCF和Web服务支持得较好,可以直接与我们的核心系统对接。
iOS应用我没有做过,也不清楚具体情况。
选择WP8主要因为用现有的知识就可以快速迁移,学习成本低,另外是它的开发工具在代码管理上的优势。
CSDN:你是怎么看待这三大平台的发展?尤其是WP8,它目前所占市场份额仍然不高。
周家安:三大平台各有长短,对我而言,其实真的没什么区别。WP8市场份额不高并不意味着开发WP应用就没有收益,我是经济管理专业出身的,如何去应对市场的风云变化,心中还是有底的。但凡有一种新技术面世,在前期阶段都会出现泡沫的过度膨胀,这也是正常现象,毕竟自发性和盲目性是市场的基本属性,可以理解。一种新的技术出现,也不能说明它会替代现有的任何技术,而更有可能的情况是与现有的各种技术进行融合。
对于移动开发,我个人是不会投入太多精力。一来移动应用的快速增长并没有在客观上说明做移动开发就有高回报率。空白市场无处不在,举个例子,有一次我写了一个程序,它可以自动扫描指定目录下的照片,并计算出照片的物理尺寸(英寸或厘米),后来我想到:把这个程序扩展一下,除了计算单张照片的面积外,还加入统计指定目录中所有照片的总面积。这程序虽然不是很复杂,但你不要忽略它的市场价值,假设我把它完善一下,加入统计价格的功能,比如一平方米多少钱,冲印这些照片需要多少长度的相纸,每平方米的冲印成本是多少,最终的理想收益是多少。然后把这个程序卖给数码冲印店。你看,这难道不是市场吗?难道非要做手机应用不可吗?
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只是拖控件而已,没什么好学的。但参加工作以后我才真正明白,纠结这些东西没有意义,思维会受到阻塞,我前面说过,写程序只不过是一个把我的思想翻译为执行逻辑的过程罢了。最根本最核心的东西还是思路,你有什么样的思路就会有什么样的程序出来。其实换一角度思考,拖控件没什么不好。缩短产品的开发周期,改善开发流程,最大程度提高生产率,难道不是现代生产管理的宗旨吗?