作为一个程序员
从大学到现在,毕业2年多了,一直都是程序员,年头不多,但是接触到的技术和项目确是越来越多,有幸目前负责几个项目
对于写软件,有了很多自己的想法和经验,希望跟大家分享一下。
以前的我也是个微软fans,也是个java fans,更是设计模式的fans,什么SOA,什么cpp template真的是玩了个遍。
是个彻头彻尾的新技术迷,最开始我作为一个下面的开发人员,参与开发了一个扫描仪驱动的设计开发(小日本的东西,功能很多很强大),项目是用C++写的,我疯狂的重构着原来项目的代码,引入boost,甚至引入loki库,尝试像java的思路封装代码,还利用C++的feature写了一点基于template的静态多态。
刚毕业的我不懂世事,很可爱。那时的我不懂思考。
后来我自己可以负责项目了
我开始决定不用C++了,不是说这个语言不好,项目质量高不高好不好完全是靠人的,人是主导因素。
C++太复杂了,只是用好语言本身需要掌握很多的知识和技巧,而参与到项目的人员呢?
大家水平参差不齐,写成什么样的都有,半生不熟的oo代码。很多程序员很可爱(我也干过),设计了一个接口,恩,这很好,然后include上依赖了它封装的东西,物理上的依赖让代码只是看起来很OO。C++是有很多习惯用法和技巧的,一个人用好它很容易,一个团队都用好就太难了。
所以,我想,应该用C,C的抽象能力并不弱,只是以前用它和设计C程序的习惯导致它看起来很落后。
C还有更大的好处是超强的编译速度,这个C++是无可比拟的,我的经验告诉我,如果一个东西用起来很费劲,那么程序员往往都避免用它。
一个简单的例子,如果你的开发团队在被分割到多个屋子里,那么他们肯定做更少的交流。
一个又一个项目开始了,用java写服务,用.net写界面,用C写多媒体解码
更是用WCF来让我的项目SOA,用ClickOnce来部署应用,用Ext尝试做one application one page……
我的天
我从没想过原来写java也是这么费功夫的事情,java的世界是纯洁的,哪怕很简单的应用也要让代码看起来很java
为了界面漂亮用了的第三方.net界面控件,麻烦来了,我控制不了它的问题,很烦
而用ClickOnce的时候更是头晕目眩,部署的地方的IIS跟我们测试的版本完全不一样,ms可爱的安全策略把我折磨了个够
那时我只关心软件,没有考虑过网络上这些交换机路由器的问题,客户那边没人给动交换机,可怜的服务器和用户的机器被分割到两个网段了,tcp根本建立不起来。
后来可算弄好了,那给代码带来无限优雅的WCF也让我无语了,我在想,我为什么用这么麻烦的东西。
还有很多很多……
这就是经验吧
经过折磨,运气好,拼了命,那些问题都通过各种各样的手段解决了。
这些经验让我懂了很多,单说开发方面,对于软件的整体项目的架构,设计,技术的选择有了更多认识。
要想做一个大的系统,需要秉承一个原则,那就是简单,简单到什么程度呢?或许超过这几年大公司灌输给我们的常识。
对于网络或者分布式的应用来说,简单才能给项目带来一个好的基础,才能让软件遇到问题或者功能改变的时候能够有更好的方案处理。
apache,IIS,几年前看起来都是唯一的选择,而近期呢?
lighttpd,ngnix这种轻量级的产品真的让http服务器震颤了
基于event的方式另服务器做到了超越传统多线程或者多进程服务器处理能力的几十倍
传统上我们认为IO是系统的瓶颈,然而对于单个web服务器来讲,系统真正的瓶颈在于CPU和内存,高度并发的时候可怜的CPU和内存呈线性增长趋势被无情的吞噬掉,swap分区被塞满,CPU忙着为给每个进程运行时间而进行切换……
所以如果您有自己的服务器,推荐轻量级的解决方案,看看豆瓣,无数个轻量级的项目组合起来,带来飞一般的速度。
SOA
我是对他从崇拜到现在一点好感也没有,明摆着是大公司拿出概念忽悠人玩呢, SOAP,ws-* 。
天啊,真的有程序员看过这些东西么!?
在我的项目中互相通信的都是自己写的进程,何必为了SOA搞那么复杂,tcp或者udp不好用么? 在我看来非常好用,非常透明,自己封装的协议更是有无限的扩充可能。同时也不用为了SOA搞一大堆库进项目里了。
好了,或许有的人会会想人家库里封装了好多东西呢,什么session啊,什么事务啊,加密啊,更能够保证可靠连接。
我想说的是我们每天用的是什么协议呢? HTTP,FTP,Pop3等等,难道可以说这些协议本身不够可靠么?
我更相信对于通信部分的简单和透明,例如在用wcf,如果session出问题了,如果事务总是失败,如果连接建立不起来…… 我想您和我都是一样的做法,先靠经验看一看,然后把错误信息贴到google上,按照大家的说法尝试尝试…… 这是项目的风险,恐怖的风险。
对于真的需要SOA进行数据交换的应用来说,我推荐XMLRPC,一般的应用足够了。
关于python,最近关注的人好像少了,对于脚本类的语言以前接触得比较少,只是玩玩php这种,php是一个专门为了写web的语言,没有普遍性。而python是一个被设计为通用目的的动态语言,代码风格统一,而且往往用超少的代码量来实现相同的目的。
较少的代码量有什么意义呢?
在我看来越少的代码量系统就越稳定,越容易扩展。用python的时候不用再想写得多么OO,只要完成任务就好。
正是因为代码量少而且功能强大python被很多人认为是小团队语言或者创业语言。
关于Windows和Linux,*nix
我想我会渐渐和win平台疏远,跟着ms很累,虽然很可惜花在winapi,MFC,.net framework这些上面花费的时间和精力
回过头来想想往往学习新的技术往往都是解决同样的问题(当然解决问题的方法在改进,在进步,用winform做UI肯定比用mfc更有效率),如今又有了WPF,恩,很酷,很先进。
在项目中对于windows的依赖主要在图形界面上,需要承认,在windows上跑的GUI程序用户才认可,况且微软在这方面的功力确实强大,这些技术养活着无数跟我一样草根的开发人员。
远离ms只是我更欣赏unix的理念,不再是ms fans后发现身边好多东西都不是windows,似乎win不是那么具有统治力的,而且发现开发一些软件时在windows下反而更麻烦。
web 开发
现在的web开发真是发展太快了,火药味十足的framework大战,似乎每种能在服务器上跑的语言都有n多framework在一起PK。Php是网站开发占有量最大的了,symphony,zend等等无数重量级的框架越来越成熟了,也让php的简单渐渐离开发人员远去了,Codeigniter作为一个很普通的框架却在国外取得了成功,我认为,就是因为它足够简单,如果CI功能和复杂度扩大几倍后我想CI著名的文档恐怕就不会写得那么好了。 python我接触时间比较短,py的理念是不造轮子,很不理解在py领域最有影响力的确是专门造轮子的django,什么都做就什么都做不精,我更喜欢webpy,精巧到极致,提供基本的功能,可以随心所欲的去按自己的方式写。zope这种产品没敢看,没有时间。
WebUI方面js,css是每个web工程师基本功,谈谈挺火的Ext吧,第一次看ext真的有点惊讶,觉得有了它一切都搞定。
确是,ext几乎能搞定所有需要的ui控件。
这个想法一直到我看了一些有关网页设计方面的书籍,比如简单之美
丰富的控件似的开发方式对于程序员是个好东西,但是对于提高用户体验变成了麻烦事
网页本应该简单,清晰,在最令浏览者留意的地方放上他想看的内容,在需要跟浏览者交互的时候提供流畅的交互体验
这才是好的网站,让用户感觉不到它的存在,而不是关注与内容之外的东西,做到这点并不难,我想用jquery这种lib刚刚好,更多的精力放在用户体验上吧。
最近正在写一个音频的decoder,无意间发现写代码的功力真的提高了不少,无时无刻不在做细小的重构,保持代码的简单,有了linux下C的经验,无意间注意了兼容性,有了对面向对象的经验,发现C也可以比面向对象做得更好。无时无刻都留意着保持代码的简单,每天下班时候浏览一遍,很享受简单之美。
最后
简单的生活吧,简单的设计吧,简单的架构吧
浮躁下的清醒会让我们有自己的思考、自己的方法
另外,我想说,我们是软件工程师,不是专门学SDK的!!!