降级论

几乎一年没有写博客了,说没时间那是借口,唯一的原因是,年纪越大越发觉自己肤浅。有些想法还没提笔,就发现很幼稚,就不敢发出来贻笑大方了。这次先给大家说个小故事:

从前有三个屌丝,聚在一起做网络,提供免费的网络服务,砸锅卖铁,通宵达旦,除了卖肾啥都做了。3年后终于做到了五百万用户,对于年轻人来说,能把五百万人玩弄于鼓掌之间,已经是很牛逼轰轰的事了,不过用户越多,成本越高,每年服务器、带宽租金、房租水电、广告运营等成本,已经达到了十七八万,屌丝们不得不面对一个终极问题:如何盈利?

屌丝们定了三盘沙县水饺,围着一箱子的冰啤酒开始计算:按照最近一月的登陆情况来看,四百万个账号已经不活跃了,真正有商业价值的只有一百万人,如?果开通xx功能,收点高级会员费,让其中1%的人升级为高级会员,每年付30块钱年费,那么每年收入就是100万x1%x30元=30万元!不错嘛,?扣除十七八万的运营成本,还剩毛利润12万,每个屌丝年底能分到4万大洋,如果按照打工者的算法,这三个人每人月薪3333元,木有奖金,木有津贴、木有任何福利,上班还得带自家的电脑。

尽管如此,屌丝们还是激动得咬了一口水饺:感谢苍天!我们终于要盈利啦!!!那一夜,人们看到三个发疯的屌丝在屋顶翩翩起舞。

韩寒说,中国人民是最有忍耐力的族群,一点好处就感激涕零。他一定不知道,IT创业界里的屌丝,才是这群傻逼中的战斗机。他们可以平静地忍受每年都持续亏钱,而且还能信心十足的对所有人说公司的状态非常好,如果有一天居然收支平衡了,他们会激动的趁夜难眠,比北朝鲜倒掉还开心。

本文开头的三个屌丝,其实是非常幸运的,至少能做到月薪3333元。大部分的屌丝在第一年做到几万用户的时候就会挂掉,原因众多,最主要要的是意志太弱,受不了最初的寂寞;意志稍微坚强点的会在第二年第三年慢慢挂掉,原因主要是资金断裂、团队分裂;能成功熬到第四年还没饿死、还没被口水淹死、还没被肠胃病颈椎病腰肌劳损折磨死的,甚至员工不减反增的,基本上属于神仙级别了。

我为什么要说三个屌丝的故事呢。首先是因为这是身边每天都在发生的故事,其次是因为感到可惜,IT界在我眼里一直是一个无比高级的职业,聚集着全球最聪明、最富有的人类精英。以IT创业界的青年们的智商,他们可以做成任何一件事情,包括改造银行制造汽车发射航天飞机?。结果这帮人却整天在蓬头垢面得为3k的月薪而挣扎,太悲催了。

为什么用悲催这个词??如果一个人生下来就在山沟沟里,一辈子都没机会去见什么好东西,这不叫悲催,这只叫苦难;而如果一个人生出来有一个奇怪的特异功能:皮肤出来的汗水会凝结成昂贵的水晶,本来只靠出汗就能赚钱,结果这傻逼居然觉得出汗这个行为太低级,做手术把自己的汗腺全给切了,而且丝毫没有意识到他做了什么傻事,这才叫真的悲催。

我们IT界中的很多人,生下来就是有这个出汗成水晶的特异功能的,正是因为这种与众不同,这群人能混入牛逼的大学,整天打网游还能写出像样的毕业论文,拿到学位,进外企,考CPA,做咨询、做证券分析,研究高分子材料,做电子商务,做云计算。。。一级一级的上升,直到有一天,发现身边的人里,已经没有一个不是CPA,不是咨询师,不是高级研究员了,身边的人全是业界精英,个个都超级强悍。在这个所谓的高级圈子里,自己并没有任何过人之处,只不过是just?another?analyst而已。在高级圈子里拼的头破血流,最后也只能混到给台湾人整理数据而已。莫然回首,发现当年的血气方刚、年少时的无限梦想,进化成了一身肥胖的赘肉。这个时候,有个旁观者说:“升级到头了,该降级了”

当一个社会疯狂鼓吹快节奏的时候,一定需要有人来宣扬慢生活;当全社会跟打了鸡血似的吹捧升级的时候,一定需要有人来说说降级论。

IT青年们喜欢打游戏,喜欢升级。他们的人生也和游戏一样,沉醉于不停的升级中,不仅喜欢升级自己手上的技术,把MySql改成MongoDB,把Apache升级为Nginx,在Mac上装Ubuntu,Ubuntu里再装个虚拟机去跑Mac?OS。。。IT青年们也喜欢升级自己的人生,从程序员升级到项目经理,再升级到技术总监或产品总监,再升级到合伙人。。。

在不断追求升级的过程中,所面临的一个很大事实是:当一个人从A刚升级到A+级的时候,其实这个人的能力层级依然只是A的层级,还未胜任A+的层级,他必须要到A+的后期,才可以胜任A+。就好像一个高中生,高考完之后,虽然理论上已经属于大学生了,但是他的实际能力依然只是高三毕业的水平,除非他全部pass了大一的期末考试。同样的道理,这个世界上有很多人的身份和称谓,都是在描述“未来的自己”,而不是现在的自己。当你从销售员升级为销售经理的时候,你自我感觉很好:“我现在是销售经理了”,但是这个时候,你并未通过公司对你作为销售经理这一年的工作成果的考核,你只是一个“未来可能是合格的销售经理”的前身。如果年终考核你失败了,那么这一年最准确的描述是:一个销售员,占了整整一年销售经理的位子,最后失败了。而且这一年一定会过的很累,因为通过考核的其他销售经理,才是真正胜任这个层级的人,跟一帮真正属于这个圈子的人厮杀,就好像拳击馆里当陪练的小角色,去和泰森比了一年的武,怎么可能不累呢?

当我07年进入互联网行业的时候,就是那个拳击馆里陪练的小角色,我被迫去跟全国各地的泰森比拼,结果累的半死。后来我开始反思最初的目标,为什么要在自己身上挂一个“拳击高手”的招牌,被那么多泰森追着打?我把这块招牌卸了,找个完全没练武的人去比拼,不是更容易赢么?于是果断照做,去找了一个没人懂拳击的小乡村,做了纯英文的Tucia.com(需翻墙),只做国外的业务。在那个地方,作为一个知名武馆的拳击小陪练,我成了村子里拳击技术最高超的人,受人仰慕,还开武馆教人拳击,活的非常滋润,而且在教人拳击的过程中,自己的拳术也比以前提高了很多,发展出一套属于自己的拳法,我虽然进不了泰森们的大圈子,但他们也进不了我的小圈子。

关于圈子,有一个很赤裸裸的现实:不会是你进入圈子,只能是圈子进入你。很多人会四处找关系,“帮我介绍给xxx吧,我想进入你们的圈子”,这样的人是永远进不去这个圈子的,因为圈子的天性是,永远追求更高一个层级的人。而我们的大部分人,其实都在以低一级的属性,占着更高一级的位子,徘徊在更高一级的圈子边缘,与更高一级的人竞争,幻想着自己可以升级到那个圈子里去。也许永远进不去,悲催的努力一辈子;也许运气好,某一天真的进入这个圈子了,但那个时候又会有下一个目标,希望进入更高级的圈子,这是一场没有终点的战斗。永远的追求升级,永远的累。

有没有想过降级呢?

如果一个来自微软的高级工程师,辞职去一个养猪场做开放平台经理,那么他的到来不仅会让养猪圈感到无比荣幸,更是意味着,利用他在IT界训练出来的高效工作方式和逻辑思维能力,他可以掀起一场养猪行业的革命,使得20年后才会出现的人性、高效、开放、协作、健康的养殖方式提前到达。在这场革命中,他会活的非常有价值。这种价值,在原先的圈子里,是完全体验不到的,因为他此前的所有工作,只是在满身疮痍的windows系统上不停的打补丁,无论打多少都逃不开产品衰落、被人鄙视的命运。

很多人的命运,都像是上面那个微软工程师。只需要降级,就能创造更大的价值,也能获得更大的满足。那为什么不呢?为什么要死死抱着那个所谓的“高级职业”不放呢?

去年我曾犯贱去趟了移动互联网的浑水,做了个手机app,刚开始的时候感觉很高级,但很快,铺天盖地的竞争对手就出现了,我又发现自己陷入了07年一样的场景:作为一个小小陪练,我他妈的又被一帮泰森们给围住了。当泰森中的战斗机—微信,变得无比牛逼之后,我就知道,战胜这群泰森是绝对不可能的事情了。于是我再次投靠了“降级论”,把自己从牛逼哄哄的移动互联网行业,降级到了一个被人不齿的低级项目:Tucia?Baby

这个项目虽然是传统行业,但是我们基本上是按照互联网产品的思路去做的,除了拍摄需要来店里以外,其他一切,包括营销、预约、客服、后期、选片、取片、客户关系等,所有环节都放在网络上,尤其是微博(@tuciababy官网)。当然,最重要的是,作为一个脑残的果粉,我按照iPhone的做工去要求每一张作品,必须达到我们能力可以做到的最好水准,不计成本的最好水准,才允许送给客户。正式接客不到两个月时间,虽然还远未达到成功,但目前已做到每天都有客户订单,财务上已实现盈利,未来相信一定会比大部分app开发者更光明。(ps:我们没有请公务员吃饭喝酒泡桑拿,也没有塞钱给任何政府机关。当你的产品真的用心做到很好的时候,其实你不需要讨好任何人的。)

这个项目让我沉思了很久:07年我曾把一个纯纯的web2.0网站做到了alexa中国区前1000名(如有质疑,请查询2010年附近的tucia.com排名),结果一路亏损,到最后只剩下一个员工;11年我把那个纯纯的app做到苹果官方推荐免费榜第一位(如有质疑,请看点此看截图),那段时间每天四五千iPhone安装量,结果一路烧钱,到最后濒临关闭;而如今,我只需把自己从纯纯的互联网降级下来,做一些看起来有些“低级”的项目,居然就能立即实现收支平衡。

除此以外,我还发现一个现象,中国消费者在与奸商们的长期斗争中,已经培养出了一种非常苦B的品质:只要不被坑,他就谢天谢地。如果商家严格做到了承诺的每一件事情,客户就会感动的泪如泉涌。如果商家不仅做到了所有承诺的事情,还很贴心的提供了一些额外的服务(比如我们给每位客户赠送非常好吃的樱桃和进口巧克力作为甜点),那么客户就会激动的哭天喊地、奔走相告,推荐给他认识的每一个人。

其实这片肮脏的国土,就是上天赐予IT青年们的最好机会。

在一个不会练武的村子里,只要你会打两拳,你就是拳术最厉害的人;在一个没有服务意识、忽视产品质量的土地上,只要你用心做服务,用最高的标准去要求自己,你就会成为这块土地上最出色的商家;在一个没有现代管理意识,不懂网络、不懂微博、不懂用户体验、不懂口碑传播的粗犷社会里,你只需要把之前花在IT产品上的心思的10%拿过来用,就可以秒杀一切天朝对手。

所以,

IT青年们,当你在为网站的转化率苦苦思索的时候,当你在为app的活跃度辗转反侧的时候,当你在为融资计划苦苦哀求各界大佬引荐的时候,也许犯了一个错误,也许你们的脑子最值得闪光的地方,不是去悲催的IT界当炮灰,而应该是去按摩界、餐饮界、烧烤界、早餐界、理发界、送花界、纺织界、成人用品界、现代化养殖界、有机蔬果界、个人护理界、汽车修理界。。。。与IT界相比,这些行业的确无比低级,他们的老板连qq都会发音成“抠抠”,他们的员工一辈子都没用过Email;跟他们解释什么是SEO,什么是用户体验,什么是数据挖掘,他们会在听你说完之前就开枪自杀掉。正是因为如此,这些行业才是如此的不堪一击。正是因为如此,当智商高达147的IT青年还在为3k薪水拼命、而智商不到50的烧烤店老板正坐在porsche里玩着前面那位青年开发的app的时候,我就忍不住仰望星空。

这些原始而纯粹的行业,正在等待IT精英们的降级,如同蒲公英一般的伞兵,在黑夜里从天而降,长驱直入,用最智慧的产品、最优质的服务拯救这些早就该死的行业,屌丝的生命将会绽放出银色的羽翼,无比丰满,无比性感。

最后注意,请珍惜生命,远离我的微博:@meditic

 

Oracle DBA大牛的自述

大家好,我是落落http://blog.csdn.net/robinson1988/QQ692162374,其实我选择Oracle是一件很神奇的事情,但是现在回想起来又觉得是命中注定。我2006年就读于西南大学软件工程专业,我之所以选择软件工程是因受了电影黑客帝国的影响,依稀还记得某个工程师对着一个黑屏幕,敲击一串代码,然后控制了某个机器,当时觉得好酷。

大一,学校开设VB.NET,全英文授课,还好哥英文很好,当时高中全年级前5名,对于全英文上课自然是无压力,大一上半期结束的时候,我还是会用VB.NET简单的编写一些小程序,比如说复杂功能的计算器之类的。大一下,学校开设了C专业课,因为有了VB.NET的底子,学习C也是相当轻松的,而且当时并没有涉及到一些复杂算法,这样大一我就稀里糊涂的过去了,大一下的暑假,我还勾引了一个安徽妹子,用现在网络流行语,可以说天然呆,自然萌,卡哇伊,她是外国语学院的,哥是计算机学院,简称妓院。至于怎么勾引妹子就不说了,有兴趣私聊我啊。

到了大二,学校开设了C++这门课,他奶奶的,C++是面向对象的,VB.NET,C是面向过程的编程语言,因为一时思想没转换那么快,加上女朋友的关系,没怎么把心思放在学习上,所以C++这门课学得非常差,学了2个月的C++,我就只会写一个类,并且就只会?Hello?World其他的什么继承,封装,多态,乱七八糟的完全是搞不懂,然后我发现,其实我不喜欢写代码。大二上期要结束的时候,系主任上了一门课,课程名字我忘了,系主任在讲课中偶然的提到了?ORACLE这个关键字,我当时就在想,ORACLE不是先知的意思吗?因为黑客帝国里面有个ORACLE(先知),所以我对ORACLE这个单词很有印象,然后系主任就说?ORACLE是数据库,当时我们还没开设数据库这门课程,所以对它还不是很了解,下课之后我就百度了一下ORACLE,结果他妈的,冒出一个广告,考OCM,考过之后年薪30W+,并且也知道了一个职位—DBA,网上都说DBA是越老越吃香,越老工资越高,程序员是吃青春饭,而且程序员最苦逼的是要写代码。当年才07年,30W确实是非常吸引人,于是就全方面的搜索ORACLE,关注ORACLE,加QQ群,上ORACLE论坛,大二上快要结束的时候,我去请教了系主任,问关于ORACLE的事情,系主任回答我,你去考ORACLE认证,考OCP。?请注意,现在别去考什么OCM了,都烂大街了。你想浪费钱随便你。考个OCP还可以的。

大二上期结束的时候,女朋友在学校留校两周,学习选修课,我也自然是留了下来,这期间我每天到图书馆阅读ORACLE书籍,很郁闷,我看了1周ORACLE书,妈的上面讲什么啊,感觉是天书,比C++感觉都难。后来选了一本ORACLE10g宝典,这本书在以windows为基础讲解ORACLE,于是跟着书做实验,安装ORACLE,用SQLPLUS查询?SCOTT.EMP。?这期间因为没有其他课程干扰,还有书中内容比较简单,就很快上手了,回到家之后,依然阅读这本书,整个寒假,我把这本书看完了,当然了,当时只理解了其中20–30%内容。

到了大二下,女朋友与我分手了,让我很郁闷的是她居然被人挖墙脚了,艹,现在想起来老子就郁闷,哥还是处男呢,真是郁闷当时为啥没把她骗到学校的桂园宾馆。失恋让哥意志消沉了一个星期,大二下我们又开设了JAVA,C#,数据结构与算法,以及一大堆的专业课。JAVA,C#这两本课非常坑爹,我根本就不喜欢,学校开了就得上,数据结构与算法更坑爹,太他妈难了。这个时候,我发现班上有个寝室,有个人自学JAVAEE,并且都自己写了个小系统了,有个人一直研究C与算法,自己编了个小病毒,另外一个在学C++,他妈的,这个寝室的人怎么这么厉害,都能写小病毒了,还能写小系统了,事实上也证明,他们确实厉害,大四他们有2个人去阿里巴巴了,有个人去金山了,可能是他们寝室气氛好吧,一个人学往往能带动一堆人学。我们寝室就不一样了,一个人天天下毛片,另外一个人天天玩游戏,还有个人更奇葩,喜欢看小说,神马极品家丁啊,很纯很暧昧啊,艹,而且每天晚上自己偷偷在那里淫笑,我没什么不良嗜好,虽然我也喜欢看毛片,但是就是不知道哪里下载,从来不玩游戏,我觉得玩游戏头痛,我只喜欢看电影。大学的时候,我可以这样说,所有的经典电影我全看过,无论鬼片,禁片,庸俗片,科幻片,动作片啥都看过,基本上唯一爱好就是看电影,学校的BT资源太丰富了,想看什么电影求各种,立马有人发。

因为失恋的关系,加上我跟不上JAVA/C#,加上我确实不喜欢编程,加上那个OCM广告,以及我在大二的寒假我有了点ORACLE基础,我毅然决定选择ORACLE这条道路。这个期间,老师上课讲JAVA,我就学ORACLE,老师讲C#我也学ORACLE,当然了,数据结构与算法还是必须听的,其他无价值的课程我全都没学,只学ORACLE了。这样一直持续到大三下。在08年9月份,考了一个OCA,没看题库,直接过的OCA。本来想考OCP的,但是当时觉得自己是学生,就没考了,当然了也觉得OCP题目太简单了,有个证书顶毛用。大二到大三的一年内,我几乎阅读了市面上能买到的所有ORACLE书籍,图书馆能看到的所有ORACLE书籍,知识面广度已经够了,只是欠缺深度,但是对于一个大学生来说,我需要的是广度,而不是深度。

大三下,上海HP重庆分公司来学校做校园招聘,当时班里成绩排名高的,全没面上,恰好我寝室的面试上了2个,另外还有一部分女生。面试用了5分钟做了个简短的英文对话,然后谈了一下ORACLE的体系结构,看了一下我的OCA证书,从他那微笑的眼神中,我就知道,我通过了面试。恰好班里的有些同学,拿奖学金的,成绩非常突出的反而没面试上,后来才知道,企业要的是有独立思维的人,有能力有魄力的人,成绩好的人恰好他们不愿意招,因为这种人没创造性思维,属于按部就班的,当然了,企业也需要进去之后能真正干活的人,
因为我已经有相当好的ORACLE基础,而企业也缺乏这方面的人才,所以正好就去了。

大四的时候,进入HP实习了1年,最开始在微软产品与ORACLE产品部门,因为是实习生,无法进入真正的项目,我只能作为一个旁观者,在这期间我阅读了大量的ORACLE官方文档,之前学习看的是市面上的书籍,在这之后因为HP是外企的原因,他们提倡看英文文档,全英文环境办公,所以我也开始看ORACLE官方文档,这个期间,我对ORACLE非常多的知识又得以进一步深入,我的技术成长期就是在这段时间内。要想成为ORACLE大牛,你必须阅读ORACLE官方文档!!!而且要彻底的理解。

大四即将毕业的时候,在HP内部我转到了BI/DW部门,这个部门专门做数据挖掘与数据仓库,BI用了Oracle的OBIEE/SAPBO报表,还有一些其他报表技术,这些SQL都是自动生成的,而且很多都是几百行,经常一个报表跑几十分钟甚至几个小时不出结果。在数据仓库方面,有大量的ETL跑得非常慢,经常几个小时甚至1天都跑不完。中国HP内部当时没人解决这些问题,很多人都是工作8年以上,有些还是OCM,都无法解决这些问题。这些问题最终交给了老外,老外也无法彻底解决,而且老外解决一个SQL起码耗时1周。我曾经试图请教当时HP内部的一个DBA,问他如何优化这个SQL,他直接给我说太难了,做不了,不久之后,他跳槽去IBM了。我当时真的很鄙视他。

年轻人总是有着一颗争强好斗的心,因为当时有大量SQL跑得慢,并且全都是数据仓库的超大型SQL,都几百行的,而且很多是工具自动生成的,所以我有了环境学习SQL优化,之前我也是什么ORACLE技术都学,RMAN,BBED,DUMP,DSI….各种INTERNAL文档,但是学了之后发现没多大作用,遇到真正的CASE还是无法处理,所以我毅然决定,我专门研究SQL优化,研究ORACLE性能优化,其他技术我暂时放弃。于是我每天从上班到晚上1点钟,就只研究SQL优化,因为HP可以在家办公,我晚上研究晚了,第二天可以在家上班,这样我起床之后,没洗漱又开始研究SQL优化。我的SQL优化技术,终于从最开始完全找不到如何下手,到我能3天优化一个SQL,到之后1天优化一个,然后几个小时优化一个,到最终几乎能达到看一眼就能知道SQL性能瓶颈出现在哪里。我的SQL优化技术在HP慢慢就出名了,老外也慢慢知道中国有这么一个DBA,比他们本国的DBA优化SQL速度快N倍,这样我在HP毕业半年就破例涨了一次工资,翻了一番,年底又涨了2K,并且获得了60股的股票(当时40美元一股)。毕业第二年(也就是在HP第三年),我又想涨工资,老板给我说,我涨了2次了,而且对于刚毕业的小伙子来说,这个价格在重庆很不错了,他说很多工作几年的都没我工资高,那意思就很明显了,不给我涨呗。搞IT的人要明白一个事情,工资是跳槽跳出来滴。正好北京用友某个技术负责人寻找性能优化工程师,他和我接触了半年,一直邀请我去北京发展,在这之后,我决定离开我的家乡重庆,去北京用友,当时薪水也不高,年薪20W左右,对于一个才毕业1年多的人来说,20W已经相当高了,并且那边有安排住宿,有餐补,有交通补贴,通宵补贴,基本上一个月不怎么花钱。工作非常轻松,每天就优化SQL,然后研究一下中间件,以及JAVA虚拟机内存泄露,以及研究一些业务。SQL优化不用说了,基本上瞄一眼搞定,中间件优化,JAVA虚拟机因为之前没怎么接触过,所以时间放在了这边,同时也学习了业务。但是因为北京空气原因,环境太恶劣了,加上自己一个人在北京,觉得很孤独,就在重庆找了一个DBA工作,待遇比北京低点,但是也没低太多,就回重庆发展了。重庆这边的工作基本上也是做优化相关,在这家公司我进一步的接触到了SYBASE?IQ,GREENPLUM,进一步的学习了EXADATA(2010年就开始接触了,HP最开始用第一代EXADATA),以及国产的GBASE,甚至HADOOP,还接触了各种存储,这个期间对我知识面又是更进一步的提升。在那个公司呆了大概1年之后我来到了现在的公司,主要负责数据库设计,数据库设计优化,SQL优化,系统架构优化,等等。我之所以离开之前的公司,是因为要写一些很无聊的技术架构文档,妈的哥最讨厌写文档。
从2010年以来,本人一直专注于SQL优化,SQL改写,ORACLE系统优化,表设计优化,累计优化过超过10000个以上SQL,是的,你没看错,是一万个以上SQL。帮人优化SQL收过3000元一个,也收过50元一个,当然了更多的是免费的。同时也优化过接近60套系统,当然了系统的优化是一个整体项目,并不是我一个人完成的,但是我扮演了绝对不可替代的作用。曾经改造过某个系统的表设计,使得磁盘IO经常100%降低为60-70%,CPU从60降低到30–40%,该系统数据量每天产生接近5TB。

大家如果有什么SQL需要优化的,有系统需要优化的,请直接发QQ邮件692162374@qq.com完全免费,如果超级复杂,比如几百行的,我可以远程帮助,同样的免费。如果有SQL需要改写的,我会亲自指导你手把手改写。

写到这里,我想告诉大家,学习技术一定要有恒心,要抱着必胜的心态去征服它,当然了,掌握好的学习方法同样重要,我之前是阅读了大量ORACLE书籍(绝大部分是英文),以及官方文档,有了知识广度,再根据工作需要,特立独行研究某一个领域,把某一项做精通之后,再研究其他技术,比如再去研究特殊恢复,或者研究NOSQL,或者研究架构等等。如果你一直什么都学,什么都看,最终的结果是,你什么都懂,但是不精通,那么你就是一个打杂的,你觉得自己和牛吧,与别人比差太远了,你觉得自己菜吧,但是ORACLE的玩意儿啥都玩过,就是不精通。我相信很多人都有这样的感觉,So,找个方向深入研究吧!!!
对于ORACLE初学者,建议先增加ORACLE知识广度,再根据自己喜好,选个方向深入研究。祝各位生活愉快,工作愉快,事业有成。

原文地址:http://blog.csdn.net/robinson1988/article/details/12747113

 

Java开发者需坚守的十条基本原则

有许多标准和实践准则可适用于Java开发者,但此处要说的,是每个Java开发者需坚守的基本原则。

一、为代码加注释。虽然每个人都知道这点,但有时却不自觉忘了履行,今天你“忘了”加注释了吗?虽然注释对程序的功能没什么“贡献”,但过一段时间,比如说两星期之后或者更长,回过头来看看自己的代码,说不定已经记不住它是干什么的了。如果这些代码是你个人的,那还算是走运了,不幸的是,当然了,大多数时候都是别人的不幸,很多时候大家都是在为公司写代码,写代码的人也许早已经离开了公司,但别忘了一句古话,有来有往嘛,为他人,也为我们自己,请为你的代码加上注释。

二、不要让事情复杂化。程序员有时候总是对简单问题想出复杂的解决方案,比如说,在只有五个用户的程序中引入EJB、对程序实现了并不需要的框架(framework),之类的还有属性文件、面向对象解决方案、多线程等等。为什么要这样做呢?也许我们并不知道是否这样会更好,但这样做也许可以学到一些新东西,或者让自己更感兴趣一些。如果是不知道为什么这样做,建议多请教经验丰富的程序员,如果是为了个人的目的,麻烦让自己更专业一点。
三、始终牢记——“少即是好(Less?ismore)并不总是对的代码效率虽然很重要,但在许多解决方案中,编写更少的代码并不能改善这些代码的效率,请看下面这个简单的例子:

if(newStatusCode.equals(“SD”)?&&(sellOffDate?==?null?||
todayDate.compareTo(sellOffDate)<0?||?(lastUsedDate?!=?null?&&
todayDate.compareTo(lastUsedDate)>0))?||
(newStatusCode.equals(“OBS”)&&?(OBSDate?==?null?||
todayDate.compareTo(OBSDate)<0))){
newStatusCode?=?”NYP”;
}
能看明白if条件语句是干什么的吗?能想出来是谁写的这段代码吗?如果把它分成两段独立的if语句,是不是更容易理解呢,下面是修改后的代码:

if(newStatusCode.equals(“SD”)?&&(sellOffDate?==?null?||
todayDate.compareTo(sellOffDate)<0?||?(lastUsedDate?!=?null?&&
todayDate.compareTo(lastUsedDate)>0))){
newStatusCode?=?”NYP”;
}elseif(newStatusCode.equals(“OBS”)?&&(OBSDate?==?null?||
todayDate.compareTo(OBSDate)<0))
{
newStatusCode?=?”NYP”;
}
是不是读起来容易多了呢,在此只是多加了一个if和两个花括号,但代码的可读性与可理解性就一下子提高了一大截。

四、请不要硬编码。开发者经常有意“忘记”或忽略掉这点,因为有些时候开发日程逼得实在太紧。其实,多写一行定义静态变量的代码能花多少时间呢?

public?class?A?{
public?static?final?String?S_CONSTANT_ABC?=?”ABC”;
public?boolean?methodA(String?sParam1){
if?(A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
return?true;
}
return?false;
}
}

现在,每次需要将“ABC”与其他变量进行比较时,不必记住实际代码,直接引用A.S_CONSTANT_ABC就行了,而且在今后需要进行修改时,也可在一处修改,不会翻遍整个源代码逐个修改了。

五、不要“创造”自己的框架(framework)。确切来说,有数以千计的各种框架存在,而且大多数是开源的,这些框架都是优秀的解决方案,可用于日常程序开发中,我们只需使用这些框架的最新版本就行了,至少表面上要跟上形势吧。被大家广为接受的最为明显的一个例子就是Struts了,这个开源web框架非常适合用在基于web的应用程序中。是不是想开发出自己的Struts呢,还是省点力气吧,回头看看第二条——不要让事情复杂化。另外,如果正在开发的程序只有3个窗口,就不要使用Struts了,对这种程序来说,不需要那么多的“控制”。

六、不要使用println及字符串连接。通常为了调试方便,开发者喜欢在可能的所有地方都加上System.out.println,也许还会提醒自己回过头来再来删除,但有些时候,经常会忘了删除或者不愿意删除它们。既然使用System.out.println是为了测试,那么测试完之后,为什么还要留着它们呢,因为在删除时,很可能会删除掉真正有用的代码,所以不能低估System.out.println危害啊,请看下面的代码:

public?class?BadCode?{
public?static?void?calculationWithPrint(){
double?someValue?=?0D;
for?(int?i?=?0;?i?<10000;?i++)?{
System.out.println(someValue?=?someValue?+i);
}
}
public?static?void?calculationWithOutPrint(){
double?someValue?=?0D;
for?(int?i?=?0;?i?<?10000;?i++)?{
someValue?=?someValue?+?i;
}
}
public?static?void?main(String?[]?n)?{
BadCode.calculationWithPrint();
BadCode.calculationWithOutPrint();
}
}

从测试中可以发现,方法calculationWithOutPrint()执行用了0.001204秒,作为对比,方法calculationWithPrint()执行可是用了10.52秒。

要避免浪费CPU时间,最好的方法是引入像如下的包装方法:

public?class?BadCode?{
public?static?final?int?DEBUG_MODE?=?1;
public?static?final?int?PRODUCTION_MODE?=?2;
public?static?void?calculationWithPrint(int?logMode){
double?someValue?=?0D;
for?(int?i?=?0;?i?<?10000;?i++)?{
someValue?=?someValue?+?i;
myPrintMethod(logMode,?someValue);
}
}
public?static?void?myPrintMethod(int?logMode,?double?value)?{
if?(logMode?>?BadCode.DEBUG_MODE)?{?return;?}
System.out.println(value);
}
public?static?void?main(String?[]?n)?{
BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
}
}

另外,字符串连接也是浪费CPU时间的一个大头,请看下面的示例代码:

public?static?void?concatenateStrings(StringstartingString)?{
for?(int?i?=?0;?i?<?20;?i++)?{
startingString?=?startingString?+startingString;
}
}
public?static?voidconcatenateStringsUsingStringBuffer(String?startingString)?{
StringBuffer?sb?=?new?StringBuffer();
sb.append(startingString);
for?(int?i?=?0;?i?<?20;?i++)?{
sb.append(sb.toString());
}
}

在测试中可发现,使用StringBuffer的方法只用了0.01秒执行完毕,而使用连接的方法则用了0.08秒,选择显而易见了。

七、多关注GUI(用户界面)。再三强调,GUI对商业客户来说,与程序的功能及效率同等重要,GUI是一个成功程序的最基本部分,而很多IT经理往往都没注意到GUI的重要性。在现实生活中,许多公司可能为了节省开支,没有雇用那些有着设计“用户友好”界面丰富经验的网页设计者,此时Java开发者只能依赖他们自身的HTML基本功及在此领域有限的知识,结果,很多开发出来的程序都是“计算机友好”甚于“用户友好”。很少有开发者同时精通软件开发及GUI设计,如果你在公司“不幸”被分配负责程序界面,就应该遵守下面三条原则:

1?不要再发明一次轮子,即不做无用功。现有的程序可能会有类似的界面需求。
2?先创建一个原型。这是非常重要一步,用户一般想看到他们将使用的东西,而且可以先利用这个原型征求用户的意见,再慢慢修改成用户想要的样子。
3?学会换位思考。换句话来说,就是从用户的角度来审查程序的需求。举例来讲,一个汇总的窗口可以跨页或者不跨页,作为一个软件开发者,可能会倾向于不跨页,因为这样简单一些。但是,从用户的角度来看,可能不希望看到上百行数据都挤在同一页上。

八、文档需求不放松。每个商业需求都必须记录在案,这可能听上去像童话,似乎在现实生活中很难实现。而我们要做的是,不管开发时间多紧迫,不管最终期限多临近,对每个商业需求都必须记录在案。

九、单元测试、单元测试、单元测试。关于什么是单元测试的最好方法,在此不便细说,只是强调,单元测试一定要完成,这也是编程中最基本的原则。当然了,如果有人帮你做单元测试自然是最好,如果没有,就自己来做吧,当创建一个单元测试计划时,请遵守以下三条最基本的原则:

1?先于编写类代码之前编写单元测试。
2?记录单元测试中的代码注释。
3?测试所有执行关键功能的公有方法,这里不是指setget方法,除非它们是以自己独特方式执行setget方法。?

十、质量,而不是数量。有些时候因为产品问题、期限紧迫、或一些预料之外的事情,导致常常不能按时下班,但一般而言,公司不会因为雇员经常加班而对之表扬和奖励,公司只看重高质量的工作。如果遵守了前九条原则,你会发现自己写出的代码bug少且可维护性高,无形中质量提高了一大步。