程序猿(Programmer Monkey)是一种非常特殊的、可以从事程序开发、维护的动物。在行为和物种归类上我们也可称为码字猴。一般分为程序设计猿和程序编码猿,但两者的界限并不非常清楚,都可以进行开发、维护工作,特别是在中国,而且最重要的一点,二者都是一种非常悲剧的存在。
相信作为一个有追求的程序员,你一定有自己的一套学习方法,看书就是其中一种。
比如书不离身,坐公交,坐长途车,睡前床边,甚至是有遇到红灯堵车都会拿起身边的书读上一两句的。
而今天我想谈谈,我关于学习的看法。
有的观众看完导读部分就会问了,楼主是什么级别的猿,也敢来分享学习方法?
在进入正题之前,我想我有必要回答一下这个问题。
1、很久没有更新博客了,本来我也没有信心更新,因为在技术的海洋里,我总是觉得越努力,学习,越觉得自己的渺小。
但是身边有个人一直鼓励我,给我信心,告诉我其实已经做的很不错了,我十分感动。
于是我觉得不该吝啬自己的方法,因为方法不宝贵,宝贵的是行动,和坚持行动。
2、最近园子里有好多无聊而没营养的话题,我觉得对许多童鞋是一种无形的伤害。
一会在说某某技术不如某某技术,意思就是说干这个学这个没前途,不如劝大家转行。
一会在谈职场那跳与不跳之间,或者是说做技术没有做某某有前途。
这些信息在无形之中打击我们的前进动力,而我希望有一股力量能与这股怨念抗衡。
我想说的是,我们是男人,不是怨妇,我们需要发挥力量,而不是抱怨声。
3、我本觉得发出来意思不大,反正总有人误解,或者保持反对意见,也肯定会被喷。
但是有个人鼓励我,他说或许你发表的文章有人看了会有帮助呢。
也有人告诉我说,你已经蛮优秀了,就算是再优秀的人,也有人说不好,走自己的路让别人去说吧。
选择方向
选择一个方向,选择适合自己的职业,并做好职业规划。我把它放在了第一条,因为它很重要,是基础,是方向标。
也是我开始学习的第一步,在我充满动力开始买最好的书,看最好的老师的视频,选最好的教材之前做的一件事情。
那是我毕业的那阵子,正思考着大学到底学了什么?我到底该干什么?抱着这种迷茫,我在各行各业投递了简历。
在等待面试通知的一段时间里,我寻找着答案,我什么都在了解,
了解企业管理,了解企业文化,了解如何做人,了解如何做事,了解如何卖一件产品,了解经济是个什么东西,如何去追女孩子。
我曾想过我能否当一名大师级的摄影师,也想过我能否做一个成功的生意人,也有想过我能否当一名歌手进入娱乐圈。
最后只因为以前不懂事的时候说过的一句话,选择了现在的职业。——“我要当高级程序员”
说话要算话么,所以我做到了。就在我成为一名普通程序员的时候,我的一个好友在我的QQ上贴上了架构师的标签。
我觉得这个标签很合适,所以一直就放着,目的也很明显了。
有些事冥冥之中自有安排,你如果是这种人,就会走到这一步,不管是有意,还是无意,不管走了多少弯路,最终还是会走到这一步。
所以,有人说搞技术没前途,不如做管理,不如做销售,这种P话我压根就没相信过。
或者我会说,“你Y不早说,等我选好职业选好英雄了你才说有P用啊”。
所以,当你选择好一个方向时,你的抗干扰能力会提高n的倍数,心也不会在这个花花世界里到处游荡。
选择行业
又是选择,选择是一个很重要的环节,解决了这个问题,后面学习道路就舒坦多了。
程序员这个职业很特殊,因为软件应用领域很广泛。
所以软件行业按职称分又分为可以分为嵌入式工程师,软件设计师(高级程序员),系统架构师,系统分析师,项目管理规划师,网络规划师,数据库管理员。。。
按领域划分,搞教育事业的,搞科学研究的,搞企业应用的,搞互联网的,搞电子电路的,搞工业数控的。
这些领域所需要的知识结构和技术都有点差距的,选好了就不要轻易的换了,选好了就不要纠结了。
这样你会少了很多烦恼,选好了做个决定。
所谓选择比努力重要,意思不是说选了教育事业却发现人家搞互联网风生水起,就觉得选错了要重新选。
而是说选择了,再去努力,重新选择努力白费。
打个比方,我们搞ERP开发,搞了几年发现不就是CRUD,没搞头,不然搞网游去吧,然后有些那边的directx不懂,3D图形不精,会设计ERP流程但不会设计RPG剧情,PHP/JSP/ASP等WEB开发技术多少要荒废些,之前有很多努力白费。
就好像有的销售是卖药的,他的客户不是药店,就是经销商。忽然去卖车了,销售技巧和理念是相通的没错,但是之前辛苦建立的人脉就有损失了。
所以以前有人跟我说程序语言是相通的,会一种其他都会了,我问谁告诉你的,他说老师说的,我不争论我笑了。
系统学习
如果你已经做好了选择,那么恭喜你,你一定能够分辨出什么对你是重要的,你的注意力会集中在一点,然后爆发。
在爆发之前还需要强化一些综合的知识结构,不要什么资料都在网上搜索,那样太不系统,久而久之会产生一种恐惧。
那新事物的恐惧,因为你完全不知道它是从哪里冒出来的,等它冒出来了以后你会觉得怎么又一个新的名词没接触过。
我先讲个故事,以前群,群里有个大神,大神被许多小菜膜拜,直到有一天,大神有所领悟,对一群小菜说,“我现在才知道算法是多么的重要,程序到底不外乎就是些算法。”,然后抛出各种算法名词,于是一群人就跟着学算法。
各位观众,能看出一些问题吗?
程序(面向过程)=数据结构+算法;程序(面向对象)=对象+消息;
我表达的是,在这个园子里,有的人会说算法很重要,有的人会反驳.Net里面算法不太重要,到底重不重要?这个问题将搞得许多小鸟很纠结。
或许每天都有人拿出一个技术的名词是你没见过的,如果你没有对计算机软件有个大范围的系统性地了解,是很容易在技术的海洋里迷失方向的。
而跟读大学课程,能够让你对计算机有个系统性的了解。
注意一下,有的人说大学里学不到东西,有几种可能性的:
1、自身问题,没学,当然学不到东西。(每天就知道败家和泡妞,没有人生目标)
2、学校问题,师资差,教材差,氛围差。(老师混口饭吃,教材接不上,C++语法都没教,直接MFC来了谁学得会,或者干脆北大青鸟教材当大学教材)
3、是学不到,学不到太多对工作直接有帮助的。(名牌大学,其实此人技术高超,由于大学基础扎实,懂得原理,后面学Java比一般人轻松,比一般人快,但学校真没教Java)
总结,搜集好一点的学校的课程,有条件看国外的也行。懂得原理,将不再对新技术产生恐惧。
这里推荐一些大纲:C/C++语法(以后有许多著名的书籍是用这个语言描述的,比如网络编程、设计模式),C#/java(二选一,以后将会遇到许多著名的书籍用这个语言描述,学一种,另一种语法保证你看得懂),WEB开发(js,html,asp/php/jsp选一种了解一下Web开发原理和CGI的那点事),数据库和数据库原理(或许你有一天会接触到分布式事务,集群,锁的概念在其他领域也经常遇到,不太推荐用oracle来学习原理),嵌入式系统开发(被编入系统架构师大纲,了解一点没什么不好),软件工程(涉及到一些设计方法学、敏捷开发,极限编程,项目管理),计算机网络(5层协议,了解一下,以后WCF、socket等都用的是这些原理)
细化深化
经历以上三步,坚持下来的一般都是人才了,有目标,有想法,有规划,又受过高等教育。
在懂得原理的情况下,深入学习任何一方面应该都不难,但深入学习还是有方法的。
综合提升等级,比如说你要深入研究数据库,不要想一下子把数据库研究到底,除非你的工作就只是研究数据库。
因为有了前面几步做铺垫,再根据吸引力法则,你自然而然会学得很深入。比如遇到一个问题,一个报表SQL语句查询有3分钟,那肯定需要调优了,你会从各种原理入手开始优化,表设计、索引类型、外键,约束,返回结果集、关系模型和非关系模型、条件、函数索引、分区、执行计划、跟踪,经过努力,报表终于查询的速度终于可以接受了,但是在这个过程当中,你不止是用到数据库。
还考虑到网络传输,有的人说写存储过程减少网络传输开销,那又有什么所谓,根据实际情况网络环境,根据带宽计算一下网络传输的代价,内部局域网,还是英特网,局域网的话会产生多少广播风暴,考虑并发性。如果情况允许的话可以多次操作数据库。有些人还喜欢在存储过程里面写业务逻辑,把业务逻辑层该做的事情都做了,结果程序中没有业务逻辑,没有业务对象,重用性很低。然后数据库里面存储过程套存储过程再套函数,想法是很好,只可惜用的是关系型数据库,不是面向对象数据库,这么来有点过了。
为了减少数据库I/O的开销,还用了服务器缓存,缓存、数据库内存深入下去又是内存,到最后又是操作系统层面的东西了。
学了要用,书看了要做,做完要分享出来。看了书后,写点Demo,想想应用场景,再应用到实践当中,最后和朋友交流或者分享到博客。这样才是真的学到了,分享出来既锻炼语言组织能力和沟通能力,又可以保持一种状态。
结束
关于学习,就讨论到这里。
等忙过一阵子后,我打算再写点东西,一些用的到的东西。