在计算机学习问题排行版上,有一个问题绝对是稳居榜首,每次提出都能在各大论坛掀起一股顶帖风暴,而各大网站的每个网络大牛,都会收到无数学院小弟发来弱弱的提问,这个排行榜第一的问题就是:
“我是一名XXXX学院的学生,我们学校……(此处省去一百字),有同学去参加了Java的培训,现在可以编写很多Java程序。但是我特别喜欢C++语言,希望可以深入学习C++。不过又有几个毕业的学长说,懂“.net”更容易找工作,……(此处省去二十字),请问X老师,我该怎么办?”
是不是觉得特熟悉,是不是都曾有过类似的疑问,作为一个所谓的网络大牛,木鸿飞就曾无数次的接收到如此的邮件,请看他的回答。
答:对大学生而言,不要纠结于学习哪一门语言好,也不要去思考哪一门语言容易找工作。计算机语言是相通的,学习若干门排名靠前的流行语言,然后选择其中一个或两个最感兴趣的深入编程即可。
如果木鸿飞将以上内容发为帖子,各位同学的回信作为应答,那么这个帖子可能是这样的:
一楼:沙发!
二楼:好东西,可以围观!
三楼:谢谢,老师真给力!
…….
N楼:老师,学习若干门排名靠前的流行语言,不就是全部都学习吗?哪里有时间啊!
N+1楼:还是只学习一门语言,专一比较好吧。
……
M楼:严重同意N楼的意见,如果全部都学我们还来问楼猪干什么!
M+1楼:9494,难道楼猪会那么多语言吗?
M+2楼:楼上的,老师好厉害的,你嫉妒羡慕恨吧。
……
看来很多同学还是不明白,总结大家的观点,无外乎两个极端:
极端一:弱水三千,只取一瓢。持该观点的同学认为,学习语言就如同娶老婆,都需要细细品味。因为计算机语言博大精深,究其人的一生,能精通一门语言就很不错了,至于痴心妄想者妄图左拥右抱,脚踏两只船,其下场必定是鸡飞蛋打,铩羽而归。
极端二:遍地开花,蜻蜓点水。此该观点的同学认为,为了将来找工作方便,必须了解所有的最新最流行的以及将来可能流行的语言,总之必须保证在计算机软件业界永葆时髦,才能在日新月异的技术更新和激烈的职场竞争中立于不败之地。
由此极端想法不是同学们错,而是语言惹得祸,谁让现在的语言太多太强大,网络攻势太猛太热烈,就算心如钢铁也会眼花缭乱从而不知如何是好。
相对而言,木鸿飞那个时代就要幸运的多,没有多如牛毛的语言供选择,也没有所谓新颖的概念利用互联网地毯式的轰炸,学校只开设了Pascal语言课程,数据结构使用的也是Pascal版本,同学们只能乖乖的使用Pascal编写各种课程设计。但在当时的IT业界,这门语言几乎毫无立锥之地,几乎没有公司使用其作为编程工具。按照世俗的眼光,只开设了Pascal语言的学校培养的必将是一群老古董,必定一毕业就失业。
不过事实并非如此,木鸿飞清楚的记得,那年夏天,除去考研的、转行的和真的不学习的,同学们几乎都找到了与计算机软件开发相关的工作,而工作涉及的开发语言或工具则五花八门,VC、VB、Unix、Delphi、C++Builder、ASP、PHP、Java等等应有尽有。曾几何时,同学们居然学会了这么多种类的语言,学校根本没有开设这些课程,他们是怎么做到的?
其实并不神秘,“一门通,门门通”而已。由于环境的限制,同学们在大一大二只能老老实实的使用Pascal编写各种课程设计,表面上看起来很落后,很OUT。但实际上长期使用同一个简单的编程工具设计程序,免去了编程工具本身使用方法的学习,可以集中一切力量投入到程序本身的设计上去,在一个、两个、若干个课程设计的完成过程中,逐渐熟练的掌握了编程思想与技巧,牢固了编程基础知识。待到大三或者大四之时,编程能力有了相当水准。同时外界网络趋于发达,见识逐渐扩大,发现外面的事件如此精彩,外面的编程语言和工具如此争鸣。于是纷纷选择自习喜欢的或者传说中最强大的语言。学习之初,大家也曾高唱神曲忐忑,毕竟没有老师教,咱不专业啊。但是过程却出人意料的简单,结局却出人意料的美好,新的语法似曾相识,编程方法大同小异,即使有所不明白,回想Pascal编程,从熟悉到未知,大家如有神助般迅速掌握了新的语言和工具。
木鸿飞的历程正是如此,从QBasic到Pascal,再到C、VB、C++、ASP、Java……,一步步走来,木鸿飞掌握了如此之多的编程语言和工具,但并非每一个都是从头开始,并非每一个都是真正意义上的深入精通。其中有的,木鸿飞扎扎实实的学习了、使用了、理解了一年、两年、若干年;有的,木鸿飞只是快速一瞥,匆匆而过,但也能谈论的头头是道,不惧设计程序;有的,虽然是第一次接触,还未熟练掌握,却也能够开发、设计程序,甚至修改别人的代码。
语言是相通的,“一门通,门门通”,精通一门编程语言后,很容易掌握其他的编程语言。这并不是天方夜谭,它没有想象中的那么神秘,让我们拨开其神秘的面纱,见见其庐山真面目。
成功开发软件,抛开外在因素不算,其核心有五要素,一曰分析,二曰语法,三曰系统,四曰设计,五曰工具。
分析者,系统分析也。开发项目伊始,总要分析该项目的前前后后左左右右,收集需求,区分对象,划分模块,建立最适合的模型,选择最合适的设计方法,这一切与语言无关,其分析能力却又能在多次项目设计中累计和增长。
语法者,具体编程语言的用法也。比如赋值语句,在C语言中为“=”,而在Pascal中为“:=”;比如选择语句,在某些语言中是“if …….else……”,而在另外一些语言中却为“if … then begin ……end else begin ….. end”;再比如一个完整的语句,在某些语言中以“;”结尾,而在另外一些语言中无需添加任何符号。再比如访问数据库,普通情况下将sql语句存储为字符串后再执行,但在嵌入式数据库编程中却直接在程序中执行,而无论C/C++程序、Java程序、delphi程序还是asp/php程序,其操作数据库的sql语句都是一样的。所以说,不同的语言,其语法描述虽然有所不同,但其逻辑结构却大致相同。大家都有分支语句、都有赋值语句、都有表达式等等,不同的仅仅是具体的描述而已。而即使这为数不多的特性描述,也逐渐大同小异起开。君不见赋值语句中都有等号,表达式都有加减乘除和括号,分支语句都有“if”,类都叫“class”,公有都是“public”。同学们,当大家学习一门新的语言时,却发现其语法逻辑结构相似,还有很多的老朋友各司其职,怎能不迅速上手呢。
系统者,操作系统或者设计平台也。比如在Unix下常常使用消息队列、共享内存,而在Windows下则可直接调用Win32 API,这些都是操作系统的异同导致,与语言也无关。
设计者,编程代码之技巧也。采用什么数据结构,使用何种遍历方式,调用哪些函数过程,惯用何种编码习惯,这些都是在编写代码时需要具体考虑的问题,在不同的语言中虽然它们的具体表达有所不同,但不同点也仅限于此而已,体现在代码下的思想和逻辑不会随着语言的更改而更改,最多不过改个命名,换汤不换药。
工具者,编程软件也,包括集成开发环境、提供的独特设计类库以及多如牛毛的第三方控件和API接口等。这部分内容才是使用一门新语言真正的拦路虎。理由三:
其一,一般来说,每一种语言都有一种或者若干种由不同公司生产的集成开发环境,而不同语言之间很少有相同的集成开发环境,这就导致学习语言时必须花费大量时间去熟悉集成开发环境上。最可气的是,当你换一种开发工具时,又需要重新熟悉新的内容,比如VC、C++Builder与DEV C++的IDE界面就大相径庭,这也导致很多同学误解,常常将VC、CB还有C++相提并论,误称为三种C++语言。
其二,每个公司在提供习惯完全不同的开发工具的同时,也会提供独特的设计(类)库。比如微软公司提供了MFC库,宝兰公司则开发VCL与其抗衡,这两个产品本身就是一个宏大而复杂的类库结构,估计程序员中少有如庖丁解牛般全量精通每一个细节者。
其三,软件系统的开放性使第三方控件成为可能,于是这些控件如雨后春笋般冒出头来。本来,控件多是好事,可以降低开发强度和避免重复性开发。但不同的控件由不同的公司开发,实现着不同的功能,所以其使用方法大不相同,程序员要牢记每一个控件的用法确属不易。而且一些软件开发公司还会针对其特有的领域提供专门的函数库,当你进入这些公司时,除了学习新的语言和新的编程工具外,还得学习这些独特的库函数,这在无形之中也增加学习新语言的难度。
综上所述,编程开发语言的五要素中,语法、分析、系统和设计皆不足为惧,唯独工具最难,很多人学习新语言不顺就败在工具上,所以产生怯意,不愿学习新的语言。
其实大错特错,语法、分析、系统和设计这些才是编程设计的内涵,而工具只是工具,它终究应为人所用,不可奴御人们。那么怎样才能笑傲工具,其实也是有方法的,今天就一并奉上。
笑傲工具第一招,三十六计,走为上计。惹不起还躲不起吗。大学生在学习一门新语言时,要尽量避免使用哪些花俏的、时髦的但是却相当复杂的东东。比如用VC学习C或C++时,就不要陷入MFC的复杂类库中,尽量使用SDK编程。习作习作,学习才是核心,没有人会去关心皮肤界面的。
笑傲工具第二招,好读书,不求甚解。某些功能或界面,虽然尽量避免但有时真的需要,比如编写一个带各种控件的Windows界面程序,还使用SDK就真属不智,不如大胆的使用各种可视化编程工具,比如VC、VB等。但是切记,仅仅使用即可,千万别刨根问底。例如拖曳了一个按钮控件,双击之,然后窗口会自动跳转至该控件的单击响应函数,直接在里面填写代码即可,别自找烦恼,去思考为什么这个函数能够在单击按钮控件后执行之类的问题。
笑傲工具第三招,慧眼识珠,重点突破。在前两招中,第一招用于初学阶段,第二招适合与学有小成阶段,但是它们都有一个共同的缺点,就是逃避,逃避困难的东西,当然也可以称之为战略性撤退,聚集力量准备攻击。但无论是逃避也好,撤退也罢,有一个事实却无法回避,那就是总会有与这些回避的东西正面交锋的时候,毕竟出来混总是要还的。尤其是大家进入公司,开发生产软件时,不可避免的需要使用开发工具所提供的类库、第三方控件、甚至公司独有的类库,此时必须正面应对!
但正面应对不是全面应对,切忌不可胡子眉毛一把抓,力图把所有的东西烂熟于心。可以在眼花缭乱的世界中分清敌我,找出本次应用所需要的东西,然后予以重点突破。打个比方,假设某项目使用VC编程,需要操作数据库,于是捧来了若干本诸如“VC++编程从入门到精通”之类的大部头书籍,翻开第一本书的第一页,开始没日没夜的加班,没日没夜的苦读,……,打住,打住!这样子做是不会有好下场的!恐怕你的书还没有读完,老板就已经炒你鱿鱼了。其实完全可以这样做:翻开某本书籍的目录,一般会有二、三十章,抛开其他内容,只查询数据库相关章节,一般为ODBC、ADO和OLE三章,于是这三章就是你学习的目标,再也不必从头到尾每页纸都一一啃完。更进一步,还可以确定本次使用ODBC编程,于是抛弃ADO和OLE,这样厚厚的一本书就退化为一章了,此时集中所有火力,全力攻击此章内容,就能迅速突破了。
相同的道理,具体学习时也应切记,务必需要从洋洋洒洒的内容中选择并钻研与ODBC相关的知识,至于其它程序设计所必须但与数据库编程相关不大的内容囫囵吞枣即可。比如配置数据源、重载数据库类、配置数据库连接语句、准备SQL语句、执行SQL的函数、游标控制方法等等内容需要细细研磨,而其它诸如为了显示表格内容而对ListView控件进行设置之类的代码,一笔带过,真有需要,直接拷贝即可。
再举一个例子,应项目需要,木鸿飞曾经要求一个学生设计sybase数据库中的存储过程。该生毕业已有1年,平时木鸿飞朋友的公司里做一些数据库查询工作,所以SQL语句还是比较熟悉的。木鸿飞拿了一本《sybase数据库大全》给该学生自学。一周后,木鸿飞查看结果,才知道该生尚未开始设计。木鸿飞怒之,该生却翻开《大全》,一脸兴奋的说道:“这本书真的是太好了!讲述的相当详细,有创建数据库,有BCP的用法,还讲述了在C语言程序中访问数据库!当然我的水平有限,看的比较慢,现在只看了不到50页,不过我都做了笔记,等我看完就可以编程存储过程了!”
木鸿飞默不吭声的拿起《大全》,翻到最后一页,指着页码,故意大声的念到:“总共562页。”又接过该生的笔记本,翻开看看,密密麻麻记满了内容,很详细很认真,不由叹口气说道:“唉!首先承认,你这几天学习真的很认真,很辛苦,学习态度值得表扬。不过你要记住,现在你是公司的员工,不再是学生,首要任务是工作,而不是学习!我安排你编写存储过程,你本身就很熟练SQL语言,所以你只需要看书的这一章,设计存储过程即可。至于创建数据库、BCP操作、乃至数据库调优、嵌入式程序设计等等,这些内容的确很重要,但你必须在完成安排的任务之后再却主动学习。”
讲到这里,可能有人会提出疑义:“老师是过来人,自然可以慧眼识珠,知道哪些内容是学习的关键,但一般学生或者刚毕业者,在从未接触某项知识时,根本没有相关概念,除了从头到尾全面学习一遍外,没有任何可行方案。
诚然,学习陌生的知识,尤其是快速的掌握陌生的知识是一种能力,一种高素质的能力。但不可否认,要想在当今社会立足就必须具备这种能力!公司不会给员工一年甚至是几年的时间去熟悉某项业务,老板也不会有耐心花费一年或者几年的时间送员工学习,竞争对手更不会放弃这个难得的机遇。记住,在IT行业,不是大鱼吃小鱼,而是快鱼吃慢鱼。所有你必须具备这些能力,才能在未来的竞争中立于不败之地。
值得兴庆的是,能力是可以培养的,要具备快速学习的能力,需要从两个方面着手:
其一:基础、基础、又见基础。道理不多说,当把笑傲工具前两招运用的炉火纯青时,再使用第三招,会如有神助。
其二:练习、练习、还是练习。平时刻意多做此方面的练习,自然而然会达到慧眼识珠的效果。比如学习某某编程实例或者编程技巧书籍时,不要总是想着要把书全部拿下,你可以翻开目录,直指目的地,少走弯路。最后,给大家提供几个练习的实例:
练习一:设计中文输入法。
现在的输入法满天飞,什么清华紫光输入法、搜狗输入法等等,貌似一个比一个漂亮,一个比一个更支持模糊拼音,是不是很心动,也想设计属于自己的输入法,那么现在就开始吧。其实所谓输入法就是一个动态链接库程序,里面必须提供某种符合规则的API函数而已。到网上搜索“输入法设计”或者“IME”就可以得到丰富的内容。我们不需要多少漂亮的界面,也不需要高级的算法,能够输入汉字就行。
练习二:设计代理服务器软件。
所谓代理,其实就是具备若干套接字的软件,把这边接收到的信息转发到那边而已。但是转发的信息必须要具备某种格式,标准文件RFC1928定义了SOCK5代理的转发格式,标准文件RFC1945和RFC2616则定义HTTP的协议格式,其中包含HTTP代理的转发格式,仔细阅读这几个文件,就可以设计出自己的代理服务器软件。
练习三:设计本机网络通信窃听程序。
偷窥别人貌似是种不道德的行为,但是偷窥自己的计算机与外界交换的数据貌似毫无道德问题,但问题是,你有能力偷窥吗?获取你的计算机与外界的交流信息,你能吗?能,太能,太阳能!这是必须的。这里介绍一种简单的方法,到谷歌上搜索“API钩子”,你就能得到想要的答案。届时你还可以将此程序专业化,设计其升级版本,比如设计程序监听网络斗地主游戏的出牌记录等。
以上练习所需知识均比较偏僻,完全可确保其陌生性,又均可以在网络上搜索获得,多做此类练习可以极大的提高自学陌生知识能力。但在练习时切记“不求完美”,只是练习而已,培养的是自学能力,而不真的是要在该个项目上深入发展或者开发生产软件,所以程序点到为止,时间以一周为限,过期不做。最后,特别特别要声明的是:以上实例难度很大,只建议基础牢固,课程设计优异,力图更进一步的读者练习,否则会动摇某些人好不容易才积累起来的信心,打击其弱小的心灵。对于不听劝告而造成的后果,本书不予负责!
上一篇 目录 下一篇
本文出自 “编程浪子朱云翔” 博客,转载请与作者联系!