今天就要开始正式好好学习python了,原因很简单,我们自己做的项目需要python,而我又是唯一的后台开发人员,终于可以给自己一个理由,花时间去学习他。
三年前,来深圳的第一份工作是在一家证券软件公司做.Net程序员,主要的开发语言是C#。
第一个程序是一个服务器间数据库同步的工具,当时没什么经验,现在想想也挺乐的,用触发器把新的数据都纪录下来,然后转发到其他服务器,效率低自然不用说了,bug也是很多。
接着又开发了一些公司行情数据的包装程序,用C#写了一个类库供公司的其他程序调用,封装了和C++开发的服务器通信过程,因为这个组件不仅可以在.Net环境下调用,所以封装成了COM组件。其实现在对COM也是一知半解的。在小公司干活的缺点就是,你要是万能的,什么都要能做,优点就是,你可以接触到各种东西,但是都不会太深入。
然后写了一个Web行情数据分析页面,还记得使用了extjs和mschart这两个库,虽然代码写的差,效率也不高,但是出现在页面上的效果还是挺酷。
后面陆陆续续做了不少web的项目,有前端的网站,也有后台和管理系统,走马观花的做着各种东西,但是没有一个是非常精通的,直到今天,我仍然不能写出好的css来。对于后台开发的厌恶,是从后面的一个大项目开始的,这是个模拟证券交易的平台。我负责数据库设计,系统与行情服务器通信,模拟交易登陆下单,后台查询管理等功能。最蛋疼的是,我们的业务逻辑全部封装在存储过程里面,后端程序里面基本没写什么业务逻辑,只是对客户端发来的请求进行中转调用。逻辑写在存储过程里面,调试是很困难的。因为业务逻辑太多,这一写就是两个月。还没来得及好好学习怎么写出高效的sql,就被赶鸭子上架的做完了这个项目。那时候心想,妈的,再也不想跟sql server打交道了。
随着移动互联网的兴起,这个传统软件公司也不淡定了,咱们也要做移动产品了。老板拍板开会那天,叫了开发部的几十号人到大会议室开始,会议室挤得满满的。一个个的领导讲话跟放卫星没啥区别。散会前,老板说,咱们移动开发,就由xx,xx你们两个来做,因为你们是我们公司唯一有Java经验的人(公司20多个C++,10多个C#)。这时候,我鬼使神差的说了句“我也会Java,我要做Android开发”,老板听到了,大笑一声说道,“哈哈,好好好,省得招人了”。其实,我一句Java代码都还没写过呢。就这样,稀里糊涂得,开始了我得Android生涯。
我是Google的脑残粉,也是热爱编程的,但是我却无比的讨厌Java的语法。直到使用Java两年后,这感觉没变过。C#确实比Java优美不少。属性,事件,委托,扩展方法,lambda表达式,linq to sql, 而Java,你不得不看到一堆的get set函数,各种冗长的写法。虽然没写过Java,但是Java和C#两个太暧昧了,自然是没压力的过渡了。
我的第一个Android应用,还算比较成功,几乎所有的界面和业务逻辑都是我写的,行情列表,各种行情分析视图,新闻资讯的。这个程序获得了公司老板到下面同事的很多赞同。不过传统软件公司,再怎么伪装,也不会有互联网公司的基因,这个程序根本不为广大的互联网用户而做,而是为其他厂商定制而开发的,这就是老板的思维!无奈啊,我开始想离开了。那时候,我已经由一个小兵,变成了一个最小的头头,下面有4,5个队员了,或者说,哥们了。因为我知道我想要的是什么,所以我顶住了糖衣炮弹,离开了。
面试的时候,面试官见了这个Android程序,连说了不错不错,我没悬念的就得到了offer,到了新的公司,我重构了之前的一些模块,也开发了一些新功能,忙过一次封闭开发后,我慢慢的闲了下来,开始学习其他语言,也有了下面的体会。
我是热爱Google的,所以我学习了Go语言,我只想说,这语言,太他妈的赞了,我第一次可以不用ide写几千行的代码,并轻松的编译通过。以至于我再也不想看Java一眼。
期间,我买了mac mini,正好可以学学Objc是怎么回事,对于GC程序员来说,学习非GC语言(Objc的ARC可以让程序员不手工管理内存了)最重要的工作,就是搞清楚什么时候分配内存什么时候释放内存。Objc提供的引用计数功能能够更轻松的管理内存。掌握retain release 和 autorelease 后,也能象写Java一样写Objc了。
前面说到像写Java一样写Objc,不就是当初像写C#一样写Java么。最近思考了下各种语言的关联,真的是万变不离其宗啊。
C#和Java就不说了,ObjC和Java也是那么的像,因为都是OOP,类,接口,继承,多态这些东西在各种语言里都体现的淋漓尽致,哪怕各自的实现思路不一样,比如ObjC把所有的函数调用都叫做发消息。ObjC的Category不就是C#的扩展方法么?ObjC的selector不就是C#的委托么也就是C的函数指针,Java只能一边凉快去了,Java偷笑说”我有接口“。ObjC的属性和C#的属性基本一样,C#更为精简 public string XX{get;set;}。 其实我总会想,每个函数前面都加个public真的累不累啊,ObjC默认就是public了,这点Go语言更绝,函数名首字母大写就是public,小写就是package可见。ObjC的接口@protocol更是体贴,提供了@optional的功能,Java和C#就需要全部实现了,哪怕你的实现只是个空,这点上Go的做法也是绝,只要你的类包含了接口所需的所有函数,这个类就算实现了接口,对于这些,不同的人,有不同的理解,当然不必没有长时间使用就说脑残或者不好。
综上,时代再进步,编程语言也在进步。不同的语言体现的是不同的设计哲学,有的会考虑到程序员的感受而让效率放第二位,如Python,Ruby等,有的会考虑到大型架构并集成一些成熟的模型到语言中,如Go,Erlang等。有些语言甚至为特定的应用环境所开发,Matlab等。存在即合理,Google为啥选Java做为Android的应用开发语言,还费那么大神开发dvm,又抄了一遍Java标准库,你说这不扯淡么。但是使用Java语言进行Android开发,带来的是一大批的程序员,因为门槛太低了,也让Android平台的程序以数量级的姿态增长。虽然我心里愤愤的不爽Java,但是却不得不说,使用Java开发Android真好,真省心。
我深刻的知道,一个程序员的优秀与否,不是靠能写几门语言的hello world来定义,也不是把某一门语言搞的滚瓜烂熟。优秀的程序员有过硬的基本素质,精通常用算法和数据结构,不是死记硬背的,而是能够理解并应用和扩展。优秀的程序员能够设计出健壮,易扩展的程序架构。优秀程序员能用Python写出比别人用汇编还效率的代码(编程能力)。优秀的程序员,或许不一定能开发出一个牛逼的编程语言,但是他却能积极的思考,发散思维,把现有的东西做的极致。比如说,看了JQuery等才知道我靠js还可以这么写。就像这个jekyll博客引擎,我大呼,我靠,markdown也能这么用。这种例子太多太多了,是太多聪明的程序员把这个世界变的无比美好。@老赵(JeffZ)是我从开始编程就关注的程序员,我相信他不擅长于用js写出牛逼的前端界面,但是他却用js写了牛逼的windjs出来,改变了js异步代码的风格,方便了广大程序员。而他们能做到这些,在于的,就是思考,再思考。优秀的程序员还有超强的学习能力,不会停留再过去的辉煌中。Go语言的开发者Rob Pike,Ken Thompson等都几乎是大老爷们了。
我想补充的是,优秀的程序员,一定人品也不错,就像@老赵所说,先做人,然后才是程序员,不装逼,装逼遭雷劈,对行业充满热情和期待,善于利用各种工具提高自己的效率!
虽然我还是个菜鸟,但是我相信我会努力的飞起来,哪怕我达不到想到达的高度,我会努力的做下去。能看清楚自己要的是什么很重要,这样也不会迷茫。我不要做一个门门懂,样样差的人,所以我应该更多的去思考,而不是coding很多垃圾出来。现在我又面临了一个抉择,所以Python,我来了,我要搞定你,再苦再累,开心就成,不要去在乎那些不必要的人和事。