程序员是一个脆弱、特殊的群体,以各种方式生存在有01的世界里。
程序员的特点:
狂躁,但是有修养
随和,但是疯癫
肯向任何人学,但是不服任何人
守约,但是不守时
感情丰富,但是单纯
……
Web程序是程序员中的一个别具特色的群体,他们有着和HTTP协议类似的无状态性、无序性、不可预测性。我这么说,是因为web程序员的出身、成分、学习途径、从业历程多种多样。Web程序员,是现今IT从业者中最具活力也最复杂的最可爱的一群人。
相比于传统的“学院派”程序员(请暂时允许我这么说),Web程序员的普遍出身都比较“贫寒”,这是行业事实,尤其是处于刚入行不久的这一大部分人中,有很多是没有上过大学,受过正常高校教育体制折磨的。高中、专科甚至初中学历的程序员比比皆是,他们通过自己的努力,掌握了一定的技能,取得了一项不错的工作。
“学院派”包括很多集团性质的大规模开发活动,外包项目,基于底层或硬件的开发,研究性的开发等等,体现在开发工具上多集中于C、C++、Ada等学院气息浓厚的语言,Java在某种程度上也可以算作其中,他们的特点是基础牢固、严谨、重视内在,又有些枯燥的味道。Web开发更倾向与灵活、开发效率和表现形式。
然而由于各种原因,很多高等学府中的学生有一种很不正确的误解,认为Web开发是低于传统开发的,没有水平的,浮躁的,实在没工作的表现,从而看不起它。相对的,很多Web从业者认为大学生毕业后去的大公司的工作是死板的,缺乏创造性的,枯燥的,没有真才实学的,更认为大学里学不到什么,从而也看不起,甚至仇视大学教育(包括一些受过高等教育的人)。这是一个非常现实的矛盾。
当然这个矛盾只是集中没有毕业的学生和从业时间不长的人群中,等到工作一段时间之后,相互接触得多了,都会觉得自己原本并没有体验到对方的真实内涵。传统开发中有很多富有创造性富有激情的内容值得互联网行业借鉴,而Web开发中千奇百怪的想法和时刻面对亿万用户的几乎无法预测的使用环境都是传统开发者觉得羡慕不已的,而两者结合更是体现了学院的严谨、知识的重要、来自用户的成败决定性,比如搜索引擎,比如企业级的B/S分布系统。
一个精熟C语言并有着丰富经验的人,转行从事Web开发是比较快的,甚至可以说是如鱼得水,但是一个做了两年PHP而又没有什么其它的语言背景的程序员,在自身发展上就会受到阻碍了。任何一门语言上升到一定高度,它所面对的问题已经不再是这门语言本身。语言只是工具,使用工具的方法才是生产效率的决定因素。熟习了语言之后,慢慢地在工作中会碰到诸如执行效率、存储方法、算法优化等更多偏向分析而不是代码艺术的内容。通常对于一个没有受过系统的计算机教育,没有受过自认为“没用”的大学培养的程序员,在这些问题面前表现都是比较盲目、无助的。很多问题需要严整的数学分析,查阅参考资料需要比较好的英文水平和数学基础,聪明一点的会马上意识到大学基础教育的重要性,多半都会后悔上课睡觉了,呵呵~~
一些人对于分析方法等抱着不以为然的态度,认识多是浮于表面,比如对于数据结构和算法的淡漠,觉得在Web开发中极少或不可能触及到这些内容。诚然,现在的Web开发脚本语言都有丰富的函数,灵巧的使用方式,多数已经不需要再像C语言一样声名变量、创建指针、计算内存地址、写排序算法。而且基于互联网的不可预知性,也很难有一个完美的算法解决所有情况下的问题,比如排序。程序员在这种情况下都是使用语言内置的各种功能在完成操作,当然我不是说什么都要从头开始自己写,那是莽夫做的傻事,但是我想,既然用了,多多少少也应该知道函数是怎么回事。自己写的function是函数,系统提供的就不是函数了么?不求看懂源码,至少也应该知道它是在做什么。每天追求执行效率和页面执行时间的程序员,更是忽略了系统函数本身的效率问题,把所有的系统函数都想象成了汇编中的NOOP这种单元操作。
Web开发中碰到的算法问题很少么?举一个小例子:iForum论坛(前年我在上海看过)中记载用户组权限的方法,是在数据表中插入一条类似11110010011100的字符串,每一位代表一种操作,1就是表示有权限进行操作,0就是没有。这种方式很简单实用,但是它受到Varchar的长度限制(虽然255种操作已经足够复杂了),而且字符串的计算效率又是低于数字,那么有没有想过这种算法的本质是什么呢?有没有想过优化它呢?
中国古代有一套数学理论叫做“盈不足术”,例如,有十只盒子,第一个盒子里放一个盘子,第二个盒子里放两只,第三个盒子里放四只,第四个盒子里放八只……第九个盒子里放256只,第十个盒子放512只,即第N只箱子里放2^(N-1)只盘子,一共1023只。那么命题如下:在1023这个数字之内,任何一个数目都可以由这十只盒子里的几只组合相加而成(大家自己算算就知道了……呵呵)。
那么1、2、4、8、16、32、64、128、256、512这个序列为什么有这么个魔力?这个数列的特点:1、每项是前一项的二倍,2、每项都比前面所有项的和大,而且大1。这个1就是关键,就因为这个