我算是靠坑蒙拐骗进了程序员的门,然后一路狂奔。26 岁之前几乎没有任何写代码的经验,研究生毕业却意外选择了一家不可能提供培训的初创公司,在每日担忧公司倒闭、害怕被炒鱿鱼以及同事冷落白眼的三重压力下逆流而上,一年半后离职,已是拥有 500 万用户产品的后台主程。从前我对计算机技术心怀畏惧,认定技术高人一定有佛光笼罩,昼夜不息运键如飞日吐代码上万行。现在也算见过一些世面了,回首那段忐忑不安宛如初夜的过程,我却不发觉有任何的励志意味,而是视为一种理所当然。理想的程序员,和理想的建筑师、理想的财务师、理想的按摩师没有任何的差别,他们本质上都是一群手艺人。我相信理想的程序员人人皆可成为。
近三年总在互联网圈厮混,我认识过一些程序员,共事过一些程序员,领导过一些程序员,又面试过一些程序员。他们学历不同,有的来自北大,有的来自北大青鸟,有的是博士,有的是高中肄业;资历也不同,有的来自 BAT,有的来自某破产基金公司(还是一个销售);年限也从 0 到 15 年不等。但我认为程序员只需分三类:天才的程序员、理想的程序员、平庸的程序员。天才的程序员我只敢说接触过 3 个,这是天命。7 分由你是颗精子的时候就已决定,拥有绝佳的数学天赋、冷静致密的逻辑、为解决难题宁愿不眠不休而深以为乐的技术热情;3 分来自起步要早早早,恨不得同龄人玩泥巴的时候就得开始玩电脑,大学毕业前就突破一万小时法则,后面的已是游戏人生。
天才的程序员可遇不可求,更不能长有,我看到的 90% 仍是平庸的程序员。IT 时代的膨胀,已让程序员如同文艺复兴时的印刷匠一样的普通,多数投入祖师爷门下的人,仅是为了更大的饭碗,更高的待遇,更好的生计。平庸的程序员编写腐烂的代码,没有规范和一致性,固守旧世界的语言,还好谈论大的架构和性能,说的比做的漂亮。而毫无例外的,他们认定技术没有出路,做产品、营销和管理的是更高大上的手艺,而他们当中的 99%,又会自然的流露出自己恰巧具备了那方面的天赋,至于进程为什么会崩溃这样的小问题是不屑于去了解的。
而我最喜欢和理想的程序员相处,恨不得与他们同吃同住,如果允许,我希望我的队伍能插满他们的旗帜。理想的程序员心眼儿不坏(他们从来都不是办公室政治的宠儿,是一群单纯明亮快乐的手艺人),有天真烂漫的好奇心(他们的眼睛里经常闪着「哇,这个是怎么做到的!」),永远精益求精(他们的口头禅是「我再研究一下」),还乐于分享(他们活跃于 GitHub、各大问答社区和你的身边,舍得将宝贵时间用于帮助新手)。是的,他们不需要被管理,只需要给一个大的方向,总能回报以意想不到的结果。
理想的程序员与平庸的程序员只有一墙之隔。两者的差距只有 6 个一点点,而人与人的差距,正是在这日积月累的一点点中,被永远拉开了。有意思的是,我发现这 6 个一点点都和意识有关,也就是程序员和其他一切新兴产业的工种一样,只需要意识加上时间的锤炼,人人皆可达到理想的阶段。理想的程序员必然也是一个优秀的 problem-solver。
第 1 个一点点:专注眼下
见过太多心猿意马的程序员,我不得不把「专注眼下」作为天字第一条。他们往往有各式各样的小梦想,比如做个小茶农、做个小鹅贩、做产品、做销售、做投资,却被程序员的高薪或是没有转行的魄力「耽误」了,而因为不专注,他们不在意做好自己的本分,不在意锤炼自己的技能,不在意学习新兴的技术。不可否认,这世界上存在着伟大的产品(像乔老爷)、伟大的销售(像埃里森)、伟大的投资客(像彼得菲),而他们毫无例外都是程序员出身。可你听说过巴菲特评价盖茨的话么,比尔盖茨如果转行去卖狗,那他一定是全世界最大的狗贩。我坚信除了少数的天才外,冥冥众生均可以在多个领域取得成功,只要保持足够的专注。而哪怕你下一年就想卖狗去,程序员的经验仍然能训练你强大的逻辑、谨慎和耐心,放在哪个行业都是相当可观的竞争力。
第 2 个一点点:思考力与推动力
我认为处理 bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。当面对一个未知的问题时,如何定位复杂条件下的核心问题、如何抽丝剥茧地分析问题的潜在原因、如何排除干扰还原一个最小的可验证场景、如何抓住关键数据验证自己的猜测与实验,都是体现程序员思考力的最好场景。是的,在衡量理想程序员的标准上,思考力比经验更加重要。
有时候小伙伴跑过来,问我「提交了一个任务被卡住了,怎么办」的时候,我总觉得他可以做得更好。比如,可以检查试验别的任务,以排除代码自身的原因;可以通过 Web UI 检查异常(如果没有账号,可以让我提供);可以排查主机日志或删除缓存,再不济,总应该提供任务 ID 和控制台日志给我。理想的程序员永远不会等事情前进,他们会用尽一切方法让事情前进。
第 3 个一点点:Never Say No
记得从前厂离职之前,找老板谈话,他说我最大的优点就是从来不和他说这个做不到。后来我发现在很多团队里,都存在一种技术和产品的对立,程序员往往以「技术上无法实现」来挡产品的需求,而产品也往往以「Facebook 可以为什么我们做不到」来奚落程序员。这两句话应该属于禁语,从根本上都不利于程序猿和产品狗的相亲相爱。
一句「技术上无法实现」是容易出口,可有多少人在说出这句话的时候,心里是 100% 肯定的?如果不肯定,为什么不能回去谷歌一下再回答?原本我以为程序员是充满想象力,因为有想象力,才能诞生那么多改变我们生活的软件和互联网产品。见识多了,才了解大部分程序员已经在与 bug 的对抗中变得保守而不愿担当风险,与此同时许多团队也不愿意宽容失败。于是「Say No」变成一种习惯性的抵触,还记得曾国藩为什么解散湘军么?他说那支军队已「暮气渐深」,不能打仗了。要做理想的程序员,就不能给自己滋生暮气的机会,如果面对不合理的需求,可以把时间成本摆出来,把曲线救国方案亮出来,简单粗暴「Say No」是不可取的。
第 4 个一点点:投资未来
程序员是一个非常残忍的职业。你所学所用的语言、框架、模式,很可能在数年内就成昨日黄花了;你现在嘲笑的另一群程序员,可能马上就能转身来嘲笑你了。所以理想的程序员除了做好自己的本分,还要花费时间来投资未来。什么是「投资」?投资就是你现在投入的时间,在未来会以更多的时间或者金钱(看看早几年学习 iOS 的程序员现在的薪酬!)回报你。举我自己的领域 — 数据挖掘为例,2008 年左右 Hadoop 开始兴起,一时「大数据」概念火热,Hadoop 工程师万金难求,各互联网公司纷纷把数据统计、数据分析和数据挖掘的业务切换到分布式平台上。这几年眼看 Hadoop 还在不断迭代,Spark 又异军突起,一举刷新了 Hadoop 保持的排序记录,以内存存储中间数据带来的性能优势和丰富的数据结构让人爱个不停,各种奇异的小 bug 和陡峭的学习曲线又让人打退堂鼓。那么,明眼人都知道 Spark 是未来的趋势(内存会越来越便宜),在主业务放在 Hadoop 的条件下,就可以适当把一些小模块切换到 Spark 上,同时留意 Spark 社区的发展。很快从 Spark 获得的性能收益就能把之前投入的学习时间挣回来。
第 5 个一点点:善用工具
善用工具可以分为 4 个层面:
搜索引擎
不相信重复
代码片段
自动化
我刚入行那会,一个计算机专业却当了公务员的朋友问我,你一点都没学过编程,平时怎么写代码?我说,谷歌,于是遭到无情的耻笑,以至于我在哪里的账号都叫 2shou,告诫自己是一个无耻的二手程序员。这是一个笑话,但如果现在问我,我还是要回答谷歌。程序员的成长就像膨胀的圆饼,外面是无边无际的大海,圆饼越大,与大海接触的面也越大,懂的越多,不懂的越多,而计算机科学又是一门更新换代异常迅速的学科,同时也是知识互联网化最好的学科,很难利用传统的科班式有教有学的方法,相反通过搜索引擎则很容易获取到最新的知识。
不相信重复,大师的话叫 DRY 原则(Dont repeat yourself),代码写多了,会有人为的直觉判断好的和烂的代码,我的标准是简洁和规范,简洁并不是美感上的标准,重复越少,给自己出错的机会也越少,后期维护的成本也越少。
如果你不幸丢了三周前的代码,也许你能凭着过人的记忆力把脑子里残余的片段复写出来,但如果丢的是三个月前的代码,恐怕就没有那么好的运气了。理想的程序员会着力找寻有效的资料保存方式,把工作里灵光闪现写下的代码、脚本、配置、经验等短的片段保存起来,以便任何时候都能复查。
理想的程序员必须懒惰。对他们来说,重复的步骤和重复的代码一样丑陋,如果意识到一项工作有可能长期要重复,那么自动化的时间总是越早越好。
第 6 个一点点:管理时间
之所以管理时间会对程序员这个行当特别重要,是因为在完成任务时你必须像荒野里的狼一样,「独行」。没有外界约束的情况下还能稳定控制自己,保证能高效率地工作和学习,那么日积月累你肯定会变得比一般人厉害。
程序员干的是高强度的脑力活,一般每天集中 4-5 个小时应对本职工作就足够了,但工作之外,一定要安排时间用于学习。除了学习,留点时间放空自己也是必要的,利用泡茶或者喝咖啡的间隙,把弥足珍贵的时间留给自己,往前想往后想,事半功倍。
说了这么多,想必有人会问,费劲心思成为一个理想的程序员,又有什么用处?会有高薪吗?不。能升职吗?也不见得。迎娶白富美呢?不如去卖狗。
稻盛和夫曾经说过一个故事,明治时期的手艺人被天皇召见,虽然都是不读书的乡下人,但一辈子兢兢业业地做一件事情,自然有一股高贵的气质。理想的程序员,应该就是循着这种高贵的气质而去的吧。
Master,也叫大师,接近于master's degree。通常指在某一领域,某一行业,相应圈子里有较高的知名度,人气很旺;对其所从事的业种了如指掌,炉火纯青,已然达到出神入化的境地,可谓近乎道矣!
在继续本文之前,声明以下所描述的大师主要是数据库领域,而且更多地是以Oracle为中心展开。其次,本人也并非大师,只不过比大家稍微早一些进入到该领域而已。于是乎,特撰以此文奉献给大家,同时答谢那些曾经帮助和支持我的前辈们。自己也曾承蒙众多亲们尊称为大师,而实不敢以大师自居。因为在数据库领域,在Oracle领域其广度和深度浩瀚如海,深不可测。本人不过是在海边拾到几个贝壳的小童鞋而已。更多地则是有待给位亲们去探索,去发现。下面列出本人认为在通往大师之路的几个观点,供各位亲们参考,指点。
一、兴趣是第一生产力
在欧美的国度里,总有着难以数计的发明与创造,专利与革新。而在国内更多的则是翻版与复制。其根源源于缺乏兴趣。也在于任何一项创新、发明都需要巨大的人力、物力与财力的投入,尤其是政府、财团以及民间资本的投入,信息革命更是一场烧钱的革命。而国内呢,人力有限、物力财力样样有限。其次欧美社会有着完善的福利制度与保障体系,衣食住行让人没有后顾之忧。因此我们经常可以看到研究生物、动物、自然界物种的更多的是欧美人,冒险家的后代,国人则是寥寥无几。为什么?因为衣食住行依旧是国人亟待解决,需要面对的问题。诚然,尽管受制制度国情的不同,无论你从哪一个行业,哪一个领域,兴趣永远是第一生产力,是永恒的创造力!同样对于DBA领域,无论你是否慕薪而来,还是真正是数据库的铁杆粉丝,都希望你有一颗热忱的心爱上它,拥抱它!干一行爱一行,培养兴趣,从中找到乐趣。
记得战国有个叫梓庆的工匠,专为诸侯和朝廷做支放大钟的木架。众人见其做的支架之后无不感叹其鬼斧神工之妙!鲁候得知此后问其故。梓庆谦虚地说,”自己是个做工匠的人,也没啥大本事。不过我还有一个特殊的本领那就是每次做钟架之前需要斋戒七日。用三天的时间,不再心存该差事的赏赐、爵位、俸禄等等;在用二天的时间除去非议、夸誉、技巧和笨拙的杂念;直到斋戒最后二天,已然物我两忘,气定神闲,再入山林选择外形与体态呈鬼兽且最与钟架相合的木料,手起刀落,一气呵成,以我木工的技巧再融合木料的自然天性,就做出了疑为神鬼功夫的钟架了“。这个故事告诉我们,除了热爱,兴趣于自己所从事的行业,还得有着忘利,忘名,忘我这三忘精神!如果你也是这样,成就属于全世界,而不仅仅是你!
二、由点到线,由线到面,循序渐进的方法论
点线面是中学的几何知识。由点构成线段,由线段构成平面。这实际上也是我们学习任何知识的方法论。从某一知识点着手,慢慢展开。比如简单的SQL查询是一个知识点,而SQL子查询则是由SQL语句形成的线,包含了相关子查询,嵌套子查询等。而整个DML操作数据,表连接查询,事务等等则形成了整个SQL知识的面。对于数据库领域而言,往大的方面来看,数据库原理,SQL,PL/SQL,数据体系结构这些个面则是构成了庞大而又完整的数据库体系。事实上,无论在哪一个领域,无不如此。因此,对于把握点、线、面非常重要。
其次,如果数据库在你的工作领域中只是偶尔用到,比如一个知识点,你可以浅尝则止;而如果你想从事这一领域,或是在这个领域有所建树,非得深耕不可,做到循序渐进,有始有终。切不可好高骛远,眼高手低。见过很多网友连Oracle的体系结构都不懂,就操练起了RAC,DG。诚然,有些人的智商的确是相当的高,但循序渐进的方法往往会让你事办工倍。因为事间万事万物,都有其本身的运行规律。因此把握其原理,其本体,又何愁与之对应的用呢?用离不开体,没有体也就无所谓用。数据库的原理,Oracle体系结构这些就是体,数据库架构、备份恢复、优化则是它的用。有体有用,体用一如,万变不离其宗。
三、勤于思考,举一反三
子曰,学而不思则罔,思而不学则殆。可见无论学习哪一门学科,哪一个方面的知识都应当勤于思考,反复推敲,不耻下问。因为思考是通向目标,达到成功不可或缺的一个中间过程。现如今,更多的人看重的是结果,而非过程,非达到目标途中的所思,所想,所做。碰到很多同仁一碰到问题或难题,就到论坛提问,到群里提问,并没有经过自己的分析与推敲。久而久之的话,很难形成或提高自己分析问题,定位问题与解决问题的能力。事实上,很多时候原因已经很明显。因为任何故障返回的错误信息就是我们解决问题的着眼点。只要顺藤摸瓜,问题通常会迎刃而解。简言之,思则变,变则通,通则久。
理论与实践相辅相成,相互作用。理论来源于自然,生活,工作,社会实践,是人类不断认识自然,改造自然,不断总结,抽象提炼出来的原理和精华,正确地反映了客观事物的本质及其规律。因此实践是形成理论的基础。反过来,理论指导实践。正确的理论对实践具有积极的辅导作用,错误的理论则产生阻碍作用。因此坚持理论和实践相结合,把它运用到我们的工作当中,生活当中,运用到我们对数据库的学习之中。如前面的描述所说,数据库原理,SQL原理等这些都是必须要掌握的原理。整个数据库领域无不是依次而展开。当然现今的NoSQL是另外一个分支。比如我们认识数据库事务的ACID特性,即是原子性,一致性,隔离性,可持续性。这是关系数据库事务必须满足的几个特性。只有满足了这四个特性才能保证数据的正确性与准确性,才称得上是一个事务。同时由于并发的需要,多个会话共享数据的过程中则可能会出现更新丢失,脏读,不可重复读,序列化等问题。对此可以设定不同的隔离级别来应对这些异常。对于这个数据库事务的理论以及不同的隔离级别是否正真的会出现上述所述的这几个问题呢?去实践它,去验证它。要想知道梨子的滋味,你得亲口尝一尝。总之,只有通过不断反复的实践,才能发现问题,形成真理,通过实践证实真理和发展真理。不畏权威,不教条主义,勤于思考,勇于实践,才能推成出新。因为实践是检验真理的唯一标准。
五、积极豁达,锲而不舍
老骥伏枥,志在千里;烈士暮年,壮心不已。总难以忘怀魏武帝这脍炙人口的千古绝唱。诗人自比是一匹形衰体老的千里马,尽管屈居枥下,胸中依然梦怀着驰骋千里的豪迈之情;尽管人到晚年,一颗勃勃雄心,对宏伟理想目标的追求永不停息。倘使我们也能持此心态和精神,朝着心中的梦想迈进,事业必定成功了一半。那另一半呢?另一半就是持之以恒,锲而不舍,十年磨一剑。无论哪一行业,那一领域,没得个三年五载的不懈努力难以深入其行道;没得个十年八载难以见到真金,难以成为大师。现在的任一学科,交叉性强,其深度和广度都不容小觑。即便是搞懂了前面描述的数据库领域以及Oracle相关的原理,备份恢复,性能优化,RAC,DG,GoldenDate,等等如此之多。而且对数据库性能有较大影响的诸如相关的OS,网络,存储等等这些个又是一堆堆庞大的体系。因此想要精通的确非一朝一夕之事,非得不系统,全面,持久的学习,实战,运用不可。一言以蔽之曰:有为者,譬若掘井,掘井九仞,而不及泉,尤为弃井也。
六、善于总结,乐于分享
这一点其实是前面几点的补充。学习知识,学习理论,运用于实践,循环往复,才能化为自己的观点和思想,才能形成自己的人生观,世界观与价值观。互联网的时代,什么资源的获取几乎不费吹灰之力,同时也难免鱼龙混杂。因此,即便是参照别人的文章,论述也同时应该结合自己的实践来得出自己的结论。尤其是数据库是一门要求动手性极强的学科。
乐于分享这个精神总在大师们身边围绕。在优快云论坛上,如果你搜索SQL Server 2000的相关主题,一定可以找到多如牛毛的被大神邹建修理过的帖子。其中关于问题的讨论,分析,所思所想,通过实验举例进行验证说明。不过年代久远,这些帖子应该被归档了,当前可能无法查询得到。他总结的各种字符处理,分页算法处理,树形数据结构调度算法等等被无数网友们借鉴、参考和使用。迄今无人能及,其功力之深厚,研究之入理透彻,全部被收录在最早的SQL Server 2000开发管理与应用实例一书,自己当年也是跟这本书一路走来。再看看Oracle数据库的泰斗Tom大师,整个asktom网站全部是以网友问答的形式收集整理而成。无论是浅到相关概念还是深到数据库的内部结构,大师总能以浅显易懂的例子来逐一阐述。这就是大师,是大牛。为什么呢?因为一个人不可能亲自碰到难以穷尽的故障与难题。借助于互联网时代的信息共享,结合他们乐于帮助、无私奉献的精神,不断的分析与总结,形成了自己独特的思维。帮助别人,快乐别人,成就自己!
据此以上几点,假以时日,我想大师之路定然不远!
近三年总在互联网圈厮混,我认识过一些程序员,共事过一些程序员,领导过一些程序员,又面试过一些程序员。他们学历不同,有的来自北大,有的来自北大青鸟,有的是博士,有的是高中肄业;资历也不同,有的来自 BAT,有的来自某破产基金公司(还是一个销售);年限也从 0 到 15 年不等。但我认为程序员只需分三类:天才的程序员、理想的程序员、平庸的程序员。天才的程序员我只敢说接触过 3 个,这是天命。7 分由你是颗精子的时候就已决定,拥有绝佳的数学天赋、冷静致密的逻辑、为解决难题宁愿不眠不休而深以为乐的技术热情;3 分来自起步要早早早,恨不得同龄人玩泥巴的时候就得开始玩电脑,大学毕业前就突破一万小时法则,后面的已是游戏人生。
天才的程序员可遇不可求,更不能长有,我看到的 90% 仍是平庸的程序员。IT 时代的膨胀,已让程序员如同文艺复兴时的印刷匠一样的普通,多数投入祖师爷门下的人,仅是为了更大的饭碗,更高的待遇,更好的生计。平庸的程序员编写腐烂的代码,没有规范和一致性,固守旧世界的语言,还好谈论大的架构和性能,说的比做的漂亮。而毫无例外的,他们认定技术没有出路,做产品、营销和管理的是更高大上的手艺,而他们当中的 99%,又会自然的流露出自己恰巧具备了那方面的天赋,至于进程为什么会崩溃这样的小问题是不屑于去了解的。
而我最喜欢和理想的程序员相处,恨不得与他们同吃同住,如果允许,我希望我的队伍能插满他们的旗帜。理想的程序员心眼儿不坏(他们从来都不是办公室政治的宠儿,是一群单纯明亮快乐的手艺人),有天真烂漫的好奇心(他们的眼睛里经常闪着「哇,这个是怎么做到的!」),永远精益求精(他们的口头禅是「我再研究一下」),还乐于分享(他们活跃于 GitHub、各大问答社区和你的身边,舍得将宝贵时间用于帮助新手)。是的,他们不需要被管理,只需要给一个大的方向,总能回报以意想不到的结果。
理想的程序员与平庸的程序员只有一墙之隔。两者的差距只有 6 个一点点,而人与人的差距,正是在这日积月累的一点点中,被永远拉开了。有意思的是,我发现这 6 个一点点都和意识有关,也就是程序员和其他一切新兴产业的工种一样,只需要意识加上时间的锤炼,人人皆可达到理想的阶段。理想的程序员必然也是一个优秀的 problem-solver。
第 1 个一点点:专注眼下
见过太多心猿意马的程序员,我不得不把「专注眼下」作为天字第一条。他们往往有各式各样的小梦想,比如做个小茶农、做个小鹅贩、做产品、做销售、做投资,却被程序员的高薪或是没有转行的魄力「耽误」了,而因为不专注,他们不在意做好自己的本分,不在意锤炼自己的技能,不在意学习新兴的技术。不可否认,这世界上存在着伟大的产品(像乔老爷)、伟大的销售(像埃里森)、伟大的投资客(像彼得菲),而他们毫无例外都是程序员出身。可你听说过巴菲特评价盖茨的话么,比尔盖茨如果转行去卖狗,那他一定是全世界最大的狗贩。我坚信除了少数的天才外,冥冥众生均可以在多个领域取得成功,只要保持足够的专注。而哪怕你下一年就想卖狗去,程序员的经验仍然能训练你强大的逻辑、谨慎和耐心,放在哪个行业都是相当可观的竞争力。
第 2 个一点点:思考力与推动力
我认为处理 bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。当面对一个未知的问题时,如何定位复杂条件下的核心问题、如何抽丝剥茧地分析问题的潜在原因、如何排除干扰还原一个最小的可验证场景、如何抓住关键数据验证自己的猜测与实验,都是体现程序员思考力的最好场景。是的,在衡量理想程序员的标准上,思考力比经验更加重要。
有时候小伙伴跑过来,问我「提交了一个任务被卡住了,怎么办」的时候,我总觉得他可以做得更好。比如,可以检查试验别的任务,以排除代码自身的原因;可以通过 Web UI 检查异常(如果没有账号,可以让我提供);可以排查主机日志或删除缓存,再不济,总应该提供任务 ID 和控制台日志给我。理想的程序员永远不会等事情前进,他们会用尽一切方法让事情前进。
第 3 个一点点:Never Say No
记得从前厂离职之前,找老板谈话,他说我最大的优点就是从来不和他说这个做不到。后来我发现在很多团队里,都存在一种技术和产品的对立,程序员往往以「技术上无法实现」来挡产品的需求,而产品也往往以「Facebook 可以为什么我们做不到」来奚落程序员。这两句话应该属于禁语,从根本上都不利于程序猿和产品狗的相亲相爱。
一句「技术上无法实现」是容易出口,可有多少人在说出这句话的时候,心里是 100% 肯定的?如果不肯定,为什么不能回去谷歌一下再回答?原本我以为程序员是充满想象力,因为有想象力,才能诞生那么多改变我们生活的软件和互联网产品。见识多了,才了解大部分程序员已经在与 bug 的对抗中变得保守而不愿担当风险,与此同时许多团队也不愿意宽容失败。于是「Say No」变成一种习惯性的抵触,还记得曾国藩为什么解散湘军么?他说那支军队已「暮气渐深」,不能打仗了。要做理想的程序员,就不能给自己滋生暮气的机会,如果面对不合理的需求,可以把时间成本摆出来,把曲线救国方案亮出来,简单粗暴「Say No」是不可取的。
第 4 个一点点:投资未来
程序员是一个非常残忍的职业。你所学所用的语言、框架、模式,很可能在数年内就成昨日黄花了;你现在嘲笑的另一群程序员,可能马上就能转身来嘲笑你了。所以理想的程序员除了做好自己的本分,还要花费时间来投资未来。什么是「投资」?投资就是你现在投入的时间,在未来会以更多的时间或者金钱(看看早几年学习 iOS 的程序员现在的薪酬!)回报你。举我自己的领域 — 数据挖掘为例,2008 年左右 Hadoop 开始兴起,一时「大数据」概念火热,Hadoop 工程师万金难求,各互联网公司纷纷把数据统计、数据分析和数据挖掘的业务切换到分布式平台上。这几年眼看 Hadoop 还在不断迭代,Spark 又异军突起,一举刷新了 Hadoop 保持的排序记录,以内存存储中间数据带来的性能优势和丰富的数据结构让人爱个不停,各种奇异的小 bug 和陡峭的学习曲线又让人打退堂鼓。那么,明眼人都知道 Spark 是未来的趋势(内存会越来越便宜),在主业务放在 Hadoop 的条件下,就可以适当把一些小模块切换到 Spark 上,同时留意 Spark 社区的发展。很快从 Spark 获得的性能收益就能把之前投入的学习时间挣回来。
第 5 个一点点:善用工具
善用工具可以分为 4 个层面:
搜索引擎
不相信重复
代码片段
自动化
我刚入行那会,一个计算机专业却当了公务员的朋友问我,你一点都没学过编程,平时怎么写代码?我说,谷歌,于是遭到无情的耻笑,以至于我在哪里的账号都叫 2shou,告诫自己是一个无耻的二手程序员。这是一个笑话,但如果现在问我,我还是要回答谷歌。程序员的成长就像膨胀的圆饼,外面是无边无际的大海,圆饼越大,与大海接触的面也越大,懂的越多,不懂的越多,而计算机科学又是一门更新换代异常迅速的学科,同时也是知识互联网化最好的学科,很难利用传统的科班式有教有学的方法,相反通过搜索引擎则很容易获取到最新的知识。
不相信重复,大师的话叫 DRY 原则(Dont repeat yourself),代码写多了,会有人为的直觉判断好的和烂的代码,我的标准是简洁和规范,简洁并不是美感上的标准,重复越少,给自己出错的机会也越少,后期维护的成本也越少。
如果你不幸丢了三周前的代码,也许你能凭着过人的记忆力把脑子里残余的片段复写出来,但如果丢的是三个月前的代码,恐怕就没有那么好的运气了。理想的程序员会着力找寻有效的资料保存方式,把工作里灵光闪现写下的代码、脚本、配置、经验等短的片段保存起来,以便任何时候都能复查。
理想的程序员必须懒惰。对他们来说,重复的步骤和重复的代码一样丑陋,如果意识到一项工作有可能长期要重复,那么自动化的时间总是越早越好。
第 6 个一点点:管理时间
之所以管理时间会对程序员这个行当特别重要,是因为在完成任务时你必须像荒野里的狼一样,「独行」。没有外界约束的情况下还能稳定控制自己,保证能高效率地工作和学习,那么日积月累你肯定会变得比一般人厉害。
程序员干的是高强度的脑力活,一般每天集中 4-5 个小时应对本职工作就足够了,但工作之外,一定要安排时间用于学习。除了学习,留点时间放空自己也是必要的,利用泡茶或者喝咖啡的间隙,把弥足珍贵的时间留给自己,往前想往后想,事半功倍。
说了这么多,想必有人会问,费劲心思成为一个理想的程序员,又有什么用处?会有高薪吗?不。能升职吗?也不见得。迎娶白富美呢?不如去卖狗。
稻盛和夫曾经说过一个故事,明治时期的手艺人被天皇召见,虽然都是不读书的乡下人,但一辈子兢兢业业地做一件事情,自然有一股高贵的气质。理想的程序员,应该就是循着这种高贵的气质而去的吧。
Master,也叫大师,接近于master's degree。通常指在某一领域,某一行业,相应圈子里有较高的知名度,人气很旺;对其所从事的业种了如指掌,炉火纯青,已然达到出神入化的境地,可谓近乎道矣!
在继续本文之前,声明以下所描述的大师主要是数据库领域,而且更多地是以Oracle为中心展开。其次,本人也并非大师,只不过比大家稍微早一些进入到该领域而已。于是乎,特撰以此文奉献给大家,同时答谢那些曾经帮助和支持我的前辈们。自己也曾承蒙众多亲们尊称为大师,而实不敢以大师自居。因为在数据库领域,在Oracle领域其广度和深度浩瀚如海,深不可测。本人不过是在海边拾到几个贝壳的小童鞋而已。更多地则是有待给位亲们去探索,去发现。下面列出本人认为在通往大师之路的几个观点,供各位亲们参考,指点。
一、兴趣是第一生产力
在欧美的国度里,总有着难以数计的发明与创造,专利与革新。而在国内更多的则是翻版与复制。其根源源于缺乏兴趣。也在于任何一项创新、发明都需要巨大的人力、物力与财力的投入,尤其是政府、财团以及民间资本的投入,信息革命更是一场烧钱的革命。而国内呢,人力有限、物力财力样样有限。其次欧美社会有着完善的福利制度与保障体系,衣食住行让人没有后顾之忧。因此我们经常可以看到研究生物、动物、自然界物种的更多的是欧美人,冒险家的后代,国人则是寥寥无几。为什么?因为衣食住行依旧是国人亟待解决,需要面对的问题。诚然,尽管受制制度国情的不同,无论你从哪一个行业,哪一个领域,兴趣永远是第一生产力,是永恒的创造力!同样对于DBA领域,无论你是否慕薪而来,还是真正是数据库的铁杆粉丝,都希望你有一颗热忱的心爱上它,拥抱它!干一行爱一行,培养兴趣,从中找到乐趣。
记得战国有个叫梓庆的工匠,专为诸侯和朝廷做支放大钟的木架。众人见其做的支架之后无不感叹其鬼斧神工之妙!鲁候得知此后问其故。梓庆谦虚地说,”自己是个做工匠的人,也没啥大本事。不过我还有一个特殊的本领那就是每次做钟架之前需要斋戒七日。用三天的时间,不再心存该差事的赏赐、爵位、俸禄等等;在用二天的时间除去非议、夸誉、技巧和笨拙的杂念;直到斋戒最后二天,已然物我两忘,气定神闲,再入山林选择外形与体态呈鬼兽且最与钟架相合的木料,手起刀落,一气呵成,以我木工的技巧再融合木料的自然天性,就做出了疑为神鬼功夫的钟架了“。这个故事告诉我们,除了热爱,兴趣于自己所从事的行业,还得有着忘利,忘名,忘我这三忘精神!如果你也是这样,成就属于全世界,而不仅仅是你!
二、由点到线,由线到面,循序渐进的方法论
点线面是中学的几何知识。由点构成线段,由线段构成平面。这实际上也是我们学习任何知识的方法论。从某一知识点着手,慢慢展开。比如简单的SQL查询是一个知识点,而SQL子查询则是由SQL语句形成的线,包含了相关子查询,嵌套子查询等。而整个DML操作数据,表连接查询,事务等等则形成了整个SQL知识的面。对于数据库领域而言,往大的方面来看,数据库原理,SQL,PL/SQL,数据体系结构这些个面则是构成了庞大而又完整的数据库体系。事实上,无论在哪一个领域,无不如此。因此,对于把握点、线、面非常重要。
其次,如果数据库在你的工作领域中只是偶尔用到,比如一个知识点,你可以浅尝则止;而如果你想从事这一领域,或是在这个领域有所建树,非得深耕不可,做到循序渐进,有始有终。切不可好高骛远,眼高手低。见过很多网友连Oracle的体系结构都不懂,就操练起了RAC,DG。诚然,有些人的智商的确是相当的高,但循序渐进的方法往往会让你事办工倍。因为事间万事万物,都有其本身的运行规律。因此把握其原理,其本体,又何愁与之对应的用呢?用离不开体,没有体也就无所谓用。数据库的原理,Oracle体系结构这些就是体,数据库架构、备份恢复、优化则是它的用。有体有用,体用一如,万变不离其宗。
三、勤于思考,举一反三
子曰,学而不思则罔,思而不学则殆。可见无论学习哪一门学科,哪一个方面的知识都应当勤于思考,反复推敲,不耻下问。因为思考是通向目标,达到成功不可或缺的一个中间过程。现如今,更多的人看重的是结果,而非过程,非达到目标途中的所思,所想,所做。碰到很多同仁一碰到问题或难题,就到论坛提问,到群里提问,并没有经过自己的分析与推敲。久而久之的话,很难形成或提高自己分析问题,定位问题与解决问题的能力。事实上,很多时候原因已经很明显。因为任何故障返回的错误信息就是我们解决问题的着眼点。只要顺藤摸瓜,问题通常会迎刃而解。简言之,思则变,变则通,通则久。
其次要学会举一反三。举一隅,不以三隅反。这是夫子的又一学习方法。其意思是通过列举事物的一个方面,应该能够灵活地类推到另外的几个方面,也就是由此及彼,举一反三。举一是共性,反三是个性。从共性中寻找个性。从不同的共性中反推个性,这又是举三反一的作用。比如,我们学会了通常情况下表空间在热备模式下的恢复方法,触类旁推的是在热备的情况下,系统表空间,临时表空间,只读表空间,以及数据文件在热备模式下该如何恢复。他们各自有什么样的特点,有什么需要注意的,以及是否需要采取不同的处理方法。通过对上面提到的这些表空间的操作,反推及论证他们的共性,以及共性中的个性。在勤于思考的基础之上,举一反三,反复实践就可以做到由此及彼,触类旁通。
(以下是几个程序员开发比较成功的站点:http://www.90kobifen.net/;http://www.90ko90ko.net/;http://www.90ko90ko90ko.com/;http://www.zqtz800.com/;http://www.500wantz.com/;http://www.80zuqiu.com/;http://www.117qiutan.com/;http://www.888dddfff.com/;http://www.daaa888.com/)
四、理论指导实践,实践回归理论理论与实践相辅相成,相互作用。理论来源于自然,生活,工作,社会实践,是人类不断认识自然,改造自然,不断总结,抽象提炼出来的原理和精华,正确地反映了客观事物的本质及其规律。因此实践是形成理论的基础。反过来,理论指导实践。正确的理论对实践具有积极的辅导作用,错误的理论则产生阻碍作用。因此坚持理论和实践相结合,把它运用到我们的工作当中,生活当中,运用到我们对数据库的学习之中。如前面的描述所说,数据库原理,SQL原理等这些都是必须要掌握的原理。整个数据库领域无不是依次而展开。当然现今的NoSQL是另外一个分支。比如我们认识数据库事务的ACID特性,即是原子性,一致性,隔离性,可持续性。这是关系数据库事务必须满足的几个特性。只有满足了这四个特性才能保证数据的正确性与准确性,才称得上是一个事务。同时由于并发的需要,多个会话共享数据的过程中则可能会出现更新丢失,脏读,不可重复读,序列化等问题。对此可以设定不同的隔离级别来应对这些异常。对于这个数据库事务的理论以及不同的隔离级别是否正真的会出现上述所述的这几个问题呢?去实践它,去验证它。要想知道梨子的滋味,你得亲口尝一尝。总之,只有通过不断反复的实践,才能发现问题,形成真理,通过实践证实真理和发展真理。不畏权威,不教条主义,勤于思考,勇于实践,才能推成出新。因为实践是检验真理的唯一标准。
五、积极豁达,锲而不舍
老骥伏枥,志在千里;烈士暮年,壮心不已。总难以忘怀魏武帝这脍炙人口的千古绝唱。诗人自比是一匹形衰体老的千里马,尽管屈居枥下,胸中依然梦怀着驰骋千里的豪迈之情;尽管人到晚年,一颗勃勃雄心,对宏伟理想目标的追求永不停息。倘使我们也能持此心态和精神,朝着心中的梦想迈进,事业必定成功了一半。那另一半呢?另一半就是持之以恒,锲而不舍,十年磨一剑。无论哪一行业,那一领域,没得个三年五载的不懈努力难以深入其行道;没得个十年八载难以见到真金,难以成为大师。现在的任一学科,交叉性强,其深度和广度都不容小觑。即便是搞懂了前面描述的数据库领域以及Oracle相关的原理,备份恢复,性能优化,RAC,DG,GoldenDate,等等如此之多。而且对数据库性能有较大影响的诸如相关的OS,网络,存储等等这些个又是一堆堆庞大的体系。因此想要精通的确非一朝一夕之事,非得不系统,全面,持久的学习,实战,运用不可。一言以蔽之曰:有为者,譬若掘井,掘井九仞,而不及泉,尤为弃井也。
六、善于总结,乐于分享
这一点其实是前面几点的补充。学习知识,学习理论,运用于实践,循环往复,才能化为自己的观点和思想,才能形成自己的人生观,世界观与价值观。互联网的时代,什么资源的获取几乎不费吹灰之力,同时也难免鱼龙混杂。因此,即便是参照别人的文章,论述也同时应该结合自己的实践来得出自己的结论。尤其是数据库是一门要求动手性极强的学科。
乐于分享这个精神总在大师们身边围绕。在优快云论坛上,如果你搜索SQL Server 2000的相关主题,一定可以找到多如牛毛的被大神邹建修理过的帖子。其中关于问题的讨论,分析,所思所想,通过实验举例进行验证说明。不过年代久远,这些帖子应该被归档了,当前可能无法查询得到。他总结的各种字符处理,分页算法处理,树形数据结构调度算法等等被无数网友们借鉴、参考和使用。迄今无人能及,其功力之深厚,研究之入理透彻,全部被收录在最早的SQL Server 2000开发管理与应用实例一书,自己当年也是跟这本书一路走来。再看看Oracle数据库的泰斗Tom大师,整个asktom网站全部是以网友问答的形式收集整理而成。无论是浅到相关概念还是深到数据库的内部结构,大师总能以浅显易懂的例子来逐一阐述。这就是大师,是大牛。为什么呢?因为一个人不可能亲自碰到难以穷尽的故障与难题。借助于互联网时代的信息共享,结合他们乐于帮助、无私奉献的精神,不断的分析与总结,形成了自己独特的思维。帮助别人,快乐别人,成就自己!
据此以上几点,假以时日,我想大师之路定然不远!