retweet

记五一过后

五一过后,事实上五一之前就知道了,项目组大调整,开始转型做别的了。一个对整个组来说的全新领域。我面对又一次一个全新的转型—从python到java。所以最近很忙,而且看起来还会忙很长一段时间。

首先需要声明的是,编程语言的选择实在是没什么好说的,编程的能力基本上和语言毫无关系,此文只是记录下游走于各个语言,以及各种经历的一些感触。

从大学说起,大学的课程基本上是Java的,因为面向对象。C++是一门选修课,学得认真,加上有点基础,最后成绩不错。但是回头来看,SSD,傻傻的。

大学的时候不喜欢Java,一个是写个Hello World真心有点复杂,另一个是,当时的笔记本跑eclipse实在吃力。但是不得不说的是我还是很喜欢eclipse的强大,那会在集训队打酱油的时候回寝室都是用eclipse配的C++环境做题的,虽然有点慢,但是字体和代码看起来都很漂亮。

到了大三结束的暑期实习,嵌入式,java,c++三个方向,也毫不犹豫的选择C++,C++班只有19个人,Java班和嵌入式估计都有100人吧~ ,完成的媒体播放器的代码现在我这儿也没有,估计就算有,也不敢看,应该是到处都是坏味道的代码吧。

不禁想起C++班的侯老师,确实指点了不少C++的陷阱,可惜当时不以为然,没有记录,现在多半都还了。

在大四的9月份的金山训练营时,各自完成3个小项目,大体就是指导我们MVC框架下的程序设计,其中第二个项目自认为做得很不错,层次清晰,耦合低,所以还在集体评审的时候,踊跃的冲上去展示,求董老师现场指导,指正。不得不说的是,我当时就深深的崇拜上了董老师,拜服于他总能轻易的嗅到我们代码中的坏味道,还有可能存在的bug。当时对写项目又有了点新的体会。仍然可惜的是,代码居然找不到了,我记得当时打包带走了的。。。

而在找工作的时候,也认准C++的职位,最后在10月中旬这个相当早的时候,被金山收编。转眼就到了2月份,来实习,首先主要工作就是考察linux下多语言的实现方案,和linux下unicode是4字节(windows是2字节unicode,linux下不同发行版还有不同。)带来的问题处理。而后就是windows only的代码移植到linux下,各种VS2008和GCC的语法差异就出来了。还有当时的代码,有个模块的静态初始化存在顺序依赖,在windows下N年没有出过问题,在gcc下暴露了,老大一直找不到问题,最后还是我先发现的,当时那个兴奋~ 但是也没有做记录,我现在也没法还原当时的场景了,构造一个类似的情况倒是可以,但是触发这bug还真不容易。但是始终记得,模块的静态初始化一定不能有顺序依赖,编译器不保证,尽量在一个地方初始化。说实话,那些模块的老代码中的静态初始化的东西太多了,到处都是,感觉前人经常随手就一个全局静态类对象叫dummy的,实在很无厘头。这段时间也算是从代码的编译,链接的层次上,有了一些收获。感谢路总的书《程序员的自我修养》,给我和老大很多启示和帮助。

而后回学校酱油,再来的时候,还是继续移植了一部分代码。然后项目功能精简,没有继续追加功能了,所以不需要再移植新功能进来。也将工作重心放到了调度,我也随之开始了python的项目实践了。

大学室友之一是个python fan,多少也有点耳濡目染。而到了项目实践,着实还需要很多学习。一个多月的时间,熟悉了不少python的web框架还有相关的东西,项目中也用上了各种新潮的东西,kv数据库啦,zookeeper分布式同步,Google的protobuf啊,高并发异步webserver tornado等等。然而没过多久,由于zookeeper的某个bug导致不稳定,老大要求重构,数据库也换成mysql,protobuf和tornado依赖较多,暂时不换,但是迟早也去掉的。

当时不是很理解老大的想法,只是奉命替换。现在想来,还是有些道理了。虽然新东西很虎,但是也着实可能不稳定,而且在没有用户量的时候,kv数据库,确实也是浪费。初期阶段还是稳定为主,性能上的考虑,量力而行。

这一路下来,就基本上再没碰过指针了。。。甚至认定要好好搞python了。。。直到最近,才缓过这股子劲来。

写着写着发现跑题很远了,赶紧总结一下截止到目前为止对python,java,c++的体会:

java:对java的爱始终停留在其面向对象的设计上和对eclipse的强大的膜拜上,其他也没什么感觉了。

python:着实是一门简洁,表现力很强的语言,也有着庞大的类库支撑。java鲜明的对比是,python没有一个可以说得上业内人士都很认同的强大的IDE环境,因为本身语法上的设计,导致就算拿记事本也能方便的写出好看,高效的代码来。表现能力之强大,可以说C++1000行的代码,python可能十几行就解决了。但是也隐藏了太多的底层细节。如果不深入了解,收获甚微。不禁又让我想起大学老师常自问自答的一个问题:你们知道你们和北大青鸟的区别在哪儿么?你们学得更系统,更了解底层。他们只懂上层,一旦有变化他们就没戏了。虽然并不完全认同这个,但是有一点能明确的就是,对底层的了解,着实影响着你能走多远,飞多高。若让我回到大学,有2门课一定好好学习:《操作系统》《编译原理》。真学好这两门,数据结构早就精通了,其他更是不在话下。

C/C++:很危险也很接近底层也很繁琐的编程语言,各种诡异的语法,诡异的指针,引用。但是在良好的编程习惯下,这些问题也不会太是问题。

所以现在工作用java,偶尔有点小工具要写,用python迅速,若自己有想法,小项目,还是C/C++自己尽量实现,虽然很可能是造轮子,在初级阶段,我想很难有比造轮子收获更大的方式了。

其实问题的本质仍然不在是用什么语言编程,而是在于对底层的了解不够,对问题的理解也不够深入,不肯,或者没有能力,或者没有想法去深入了解一个问题的本质。


--EOF--