我的程序员之路——谋一时?谋一世?
自毕业到现在已经快 4 年了。当程序员也快 4 年了。
在 cnblog 看到很多这样那样类似的文章。虽深有同感,但与其说不知如何评论,倒不如说懒着评。这些文章,多多少少包含点抱怨、无奈……因为辛苦;因为辛苦,却得不到相应的回报……不跳槽,似乎没出路……
可是,
现实情况,是工资与职位挂钩。作为一个程序员,加班也好,累也罢,年薪 1W 到头。如果自己不能进步,也就这样了。而从一个程序员成长到架构师的道路,不是一件容易的事。若是没人带你,难上加难。很多东西,自己怎么都想不明白,可别人的一个提点,就会让你豁然开朗。举几个我职业之处的例子:
- 当程序按三成架构设计后,我常常迷茫于:一个方法应该写在哪层?哪个类?似乎写在哪里都可以接受。
- 接下来,方法的参数如何检查?每次,当回头再看自己的程序时,发现有很多重复的参数检查,或是参数检测的过于细致。
- 当我想好方法应该在哪层后,客户端程序(The Client)应该如何调用?也就是把握客户端程序的代码量。是否容易调用?是否容易扩展?是否容易让别人理解?
- 当我已经会用 switch…case 利用工厂模式、工厂方法,在运行时,动态创建类的实例后,我就在想,switch…case 似乎也麻烦了点,case 可能很多啊,难道就这个吗?
- 之后,看到一个同事,在一个基础类(不是基类,程序底层结构的一个类)用 Clone() 方法,复制该类的一个实例时,一直不理解,有啥用啊?但直觉告诉我一定有某个说法。
- 我自己练习画用例图、静态结构图、时序图,怎么画也画不明白……
- ……当时疑问很,那个纠结啊。头一天写的代码,第二天我就改主意了。就这么改来改去……
另一方面,实践表明,不是编码能力强,将来必定会成为架构师。而架构师的编码能力往往都不弱。
说说我的经历,自我感觉,比较幸运。
- 08 年研究生毕业后,在北京一家为政府开发软件的公司。面试很顺利,简单谈下,连笔试都没有。我算是班里找到工作较晚的。因为,我虽是学计算机专业的,但本科基础不太好。读研时,除了专业书,其他相关计算机书压根没看,知识面很窄,倒是看了很多经济、政治、历史、哲学等书籍。所以,毕业时,笔试和面试都不顺。
- 后来,干脆群发简历。论文预答辩后,去北京三天,每天面试两家,最后定下这家小公司。我不喜欢拘束,喜欢自由自在的环境,最讨厌大公司的繁文缛节、规章制度。
- 来这家公司后,就开始出差,一去三年。后来我知道,公司招人有两个原因,一是有个新的政府项目,的确需要人;二是客户是科研机构,学历至少是个硕士。公司连本科学历都很少,出于面子,就招个研究生,其他的无所谓——总之是成全我了,呵呵。其实,那个公司就是个“软件小作坊”,从老总到部门经理,到项目经理(往往部门经理和项目经理是一个人,这不扯嘛),都不在乎程序和程序员,有钱赚就行。没有架构师,没有搞设计的,也就没人关心如何写好软件。所有人都在拍老总的马屁,想从中捞点好处。事实也是如此,公司几十万的小项目,都直接给几个头头理私下去做。有次,我跟项目经理 PK 时,说:“公司就是骗钱的……”
- 一个做了三年的、注定失败的数据仓库项目(我跳槽时,还没结束呢),对我来说,是个很重要的经历。项目真的很大……光数据量就按 TB 计……单张表起点就导入了一亿多条……很逗的是,那时,我用程序一个 select * from table t where t.id=’…’ 检索将近 5 分钟。抽根烟回来,还没检索出来。领导不管,我直接给学校的导师打电话,问他如何优化数据库。后来,项目经理说程序慢,让我改,我早不爽了,跟项目经理 PK,就说:“我们公司根本没能力做这个项目……”。项目很大,好几期。我们公司是二期,一起开发的还有好几家大公司。我们公司主要是建库,包括基础数据库、元数据库、GIS 库,其他公司来用。
- 到第二年,公司招了一个项目经理(其实,他是架构师,但那个公司没有这个职位),虽然他只待了一年,也是鄙视公司的层次太低、领导太官僚……但这个人对我的影响和帮助很大,让我明白如何做一个软件项目——需求、设计,编码,给我指明了“前进”的方向。我一直跟他学,没事时,就向他请教各种问题,我心中的疑惑……
- 印象最深的一次是,部门经理交代了一个任务。他建了程序集,定义了所有类和类的所有属性、字段以及方法,但方法全是空的,只有简单的 "return false;" 或 "return string.Empty;" 这样的语句,Build 成功后,就给我讲他的设计思路,让我自己写(我当时心想,靠,完全没底啊)……整整一个星期,我连 Web 程序都没运行过,一直在写程序集。而他看了一个星期小说,累了就睡觉。一个星期后,我让他看,我估计,连他自己都有点模糊了,呵呵!他先看接口,再看类,最后看类与类之间的交互,我写的方法参数都是什么,类的内部方法几乎没看……边看边说:“恩,这里对……”、“恩,这里不对,不是这个意思……”不对的话,他就帮我改……大概改了30分钟……
- 还有一次,我没事的时候,就把自己的程序画了用例图、静态结构图和时序图。画了好久……我让他帮我看看如何,静态结构图他没说什么,结果看了我画的用例图和时序图后,尤其是用例图,笑了,说:“这画的啥啊”,说我这画得也太复杂,屁用没有啊……就开始给我讲,用例图怎么画,一边讲,一边改我画的用例。唉,我猛然明白……
- 他没来之前,我已经自学了很多东西,不学不行啊。当时我已经意识到,如果不好好组织代码,将来要改的东西实在太多了,代码可能会完全失控。那时,我偏重后台——设计模式、代码重构,不关心前台 JavaScript 脚本,甚至有点排斥(认为,那东西没用。当然,现在想来是错的)。但问题的关键,我知道的这些东西,根本没形成一个体系,在实际项目中,无法运用。我们公司三个人开发,每个人负责一个系统。我跳槽的时候,三年大概写了 2.4 万行代码。其他两个人各自写了将近 10 万。两年前的代码,我的程序中还能看见,结构几乎没变化;他们一年前的代码都没影了。
- 出差开发的人少,部门经理(Oracle 数据库很厉害,但软件设计完全不懂)没来,数据库有问题,客户或是其他公司来找,我只能硬着头皮,现学现卖。除了软件开发,我还得学数据库,不光是 Oracle,还有 Arc SDE。有次把 100W 的 IBM 数据库服务器玩“坏”了,呵呵……
- 也许你问,你难道不加班吗?要是加班,哪有时间自学东西?时间都是挤出来的嘛……而且,我们出差,大领导不在,我几乎“不干活”,全是在写代码,验证自己的想法,只是在最后时间把工作干了,即便干,也不是仅仅为了工作。很多时候,一个功能,我写好几遍,用不同方式实现,看看如何……领导交给工作,问我“多长时间能弄好”,我面露“难”色,一个小时,我说一天弄好;一天说,我一个星期……你是不是觉得奇怪?其实,很正常,看看我们是给谁开发软件,呵呵……所以我的业余时间太多了,跟在学校时差不多,我有更多的时间,在实践中,不断体会“代码”……
- 所以,每次看到网上,有人说,自己成天加班;领导交给工作,要求马上弄好;每天的工作就是复制、粘贴;就是个写,都不知道自己写什么;不会了,百度一下别人代码,粘到自己这里……要是这样的话,真的耽误自己了……最终,也只能当个“盖房子的人”,而不会成为一个“设计房子的人”,这两者有本质的区别。
- 后来,这个对我至关重要的人,离开公司了……而在他走之后,我的注意力已经转移到了前端——JavaScript 和 Ajax 上……
- 我又干了一年,期间,一直在找机会跳槽。直到 2010 年,别人找我这个同事做架构师,他让我跳槽,我想都没想,就答应了,连工资都没问多少(不用想也知道,少不了,反正工资也不他发嘛,呵呵)。我利用一个星期时间,交代了工作,给部门经理发了封邮件,就走了。其实,这是违反规定的——跑得太快了。领导还抽空过来,找我谈了两个小时,让我留下,我又跟他 PK 两个小时,把公司骂了一顿“把程序员当狗用啊……不舍得花钱请架构师,就得花更多的钱……”
- 现在,我跟这个同事一起搞一个软件,说真的,我自己都看到了我的进步。我的这个同事,搞软件十二年,经验丰富,编程能力很强,那种对代码的直觉很敏锐,悟性和动手能力很强。跟他比,我嫩了很多(我开发 3 年多)。但是,他的长项是软件设计,而前端 UI 设计,特别是 JavaScript 和 Ajax(框架),以及数据库方面,特别是管理数据库,相对薄弱。当这些都不影响他成为一个架构师。可是,在这三年多时间,我在各个方面都有接触,并认真思考。所以,跟他合作时,往往,他有一个想法后,都会问我,是否能实现,如何实现……这算是一种互补吧。
谋一时,还是谋一世?
知其然,知其所以然。
网络的发达,想实现一个功能,困难吗?
淡忘功能,形成知识体系,这才是王道。