金山这几年--program in project(一)

不知不觉在金山已经呆了近五年,这段时间里犯过很多错误,同时也学到了很多东西,既然已经离开,那也该为这段时间好好的做个回顾。今天就先来谈谈在编程技术这块吧。 首先声明,我谈到的技术相关的东西都是指在项目中的经验,那些纯粹的追求技术的人和在学术上追求的人,这些东西可能对你们来说毫无意义。 ^_^

独上高楼,望尽天涯路

刚进金山,带着一腔热血和梦想,我开始了学生向职业人士的转变。开始第一次参与大规模的软件工程,在过程中学会了如何与人协作,知道按照规范写出与大家风格一致的代码。这个时候第一次开始读开源代码--CEGUI,因为这个是当时我们项目在用的一个开源项目,觉得它的设计确实很巧妙,我也由此开始接触各式各样的编程思想,阅读并模仿着写出类似的代码。这个时候的我总是以能用最短的时间完成自己份内的工作为目标,比如leader给我预计3天我就会想方设法的用2天甚至1.5天来解决它,不是通过加班,而是多去学习相关的背景知识,努力提高效率,因此需要逼着自己去不断的去接触新的东西并且努力的去消化它们,并将它们以最快的速度运用起来。

衣带渐宽终不悔,为伊消得人憔悴

随着对工作的越来越熟悉,负责的代码量也随之增多,于是一系列的问题就开始接踵而来。比如由于以前的工作基本属于在别人已经搭好的框架上进行修改和增添,而现在可能需要自己开始重新从零开始来编写某个模块。于是开始遇到很多设计上的问题,比如以前经常用复制粘贴的方式去重用代码,结果会造成大量代码冗余,在面对下一个需求变更时很容易出现顾此失彼等等。也是这个时候开始真正明白为什么会有设计模式,COM,软件工程等这些东西的出现,于是开始拼命的去学习这些东西来打造自己的软件王国,营造出自己的编程风格,开始不断的加班重构自己的代码,因为项目可是不会给你时间让你悠闲的重构已有的功能的,项目在乎的是进度和质量。

众里寻她千百度,那人却在,灯火阑珊处

就在孜孜不倦的追求着这些高大上的技术的时候,有一个问题却从未引起过我的重视——虽然写了好几年代码了,但是从来没写出过让自己有底气的代码,即在交付成品给QA时我可以说这些代码可以很稳定的运行,不会出任何重大问题。 花3天时间编写代码,花1周甚至是2周时间来修复bug使之目前看起来可以工作的良好,并通过QA的测试。但是后续如果一旦修改了其中的某些内容,很可能就会导致其他某个隐患爆发,这个真的经常是当时的写照,也似乎变成了很多人潜意识里的一种常态,“程序不可能没有bug,只要能修复就好”,也许很多人都和我想法类似。 这个时候,一个对我职业生涯来说非常重要的事情发生了--CTO陈飞舟举办的西山居程序员培训,它几乎改变了我整个这几年以来积累的做事习惯和方法——开始不再贪图快速的完成任务,而是让自己的编码速度慢下来。不再追求那些酷炫的技巧设计,转而写一些笨到让刚毕业的大学生都能很容易看懂并上手的代码。不再迷信面向对象,开始重新审视C风格代码。 听起来貌似就是跑了很多年,最终却又回到了原点。但其实这一切的一切他们的目的都是一样的——如何让代码变得更加优秀。而这段经历也恰恰是我最希望与大家分享的东西。在这里我首先推荐在这个过程中很重要的一本书——《编程精粹》,这本书可能第一遍看没有什么感觉,我也是这样。但在反复研读之后,真的会很有收获。虽然书里的知识比较老旧了,毕竟是90年代的书,但是它其中赋予的思想才是真正要去体会的。 要回答为什么会有这些转变,首先要拷问自己一个问题,在你心中怎样的代码算是优秀的代码? 在我的三个阶段,这个问题的答案都不一样。 第一阶段:运用各种精妙的技术和方案来轻松解决各式各样问题的代码。这个时候的我的看重代码解决问题的高效性。 第二阶段:结构清晰,层次分明,可重用性良好的架构型代码。这个时候的我更看重代码的可重用性和灵活性。 第三阶段:代码简单易读,复杂度低方便编写单元测试,函数正交从而尽量通过组合来实现更高级功能的代码。这个时候的时候的我看重代码的正确性,易读性和可测试性。 曾经飞舟跟我们说过一段话,我印象深刻。大概意思是这样的: “如果一个项目需要用到一种软件,现在有两个软件在你面前需要你来选择,一个有很多酷炫功能的,且速度也较快,但是可能时不时就会崩溃或者出点小bug。另外一个可能只有一些很基本的功能,但是非常稳定基本不会出问题。那么你们会选择用哪一个?” “如果你们项目现在需要一个程序员,现在有两个程序员供你选择,一个人写代码的速度很快,而且对代码可能还经常会做优化保证性能,但是他之前写过的功能经常需要很长一段时间甚至需要不停的维护来保证代码的稳定,而且基本只有他自己能维护。而另一个人写代码可能比较慢,而且运行效率可能也不是特别高,但是他之前做过的功能基本上不太需要维护,即使维护只需要找一个稍微了解这块的程序员就可以胜任,你们会选择谁呢?” 所以很多时候,我们在追逐技术的路上,有时候恰恰忘记了本质,技术是要用来解决实际问题的,而不是一味的去追求那飘渺的空中楼阁。所以,无论何时代码的正确性和稳定性永远是第一位的。至于如何去保证代码的正确性和稳定性的心得,就留到下次有时间的时候再跟大家分享吧。 ———————————— 欢迎关注我的微信订阅号:yestein,或者扫描下面的二维码: qrcode_for_gh_561cc76cad25_258