今天与大家谈谈如何成为一个程序员。如果你没有开发过正式项目也没有在软件公司工作过。你一定想问:我们与真正的程序员有多大距离?他们懂得的是否一定比我们多?他们是怎样工作的……
    
    在回答上述问题之前,先测试一下大家是否是一个合格的程序员。大家先花一分钟看以下几句代码,看看有没有错误:
    
    (已知 a、b、c均为整数)
    if( a != 0 )
        {
            c = b-10;
            b = b/a;
        }
    
    如果编程是为了玩玩,应付一些Excel表格计算,上面程序问题不大。如果应用在真正的编程项目中,上面的程序可能会令你的系统崩溃一百次。
    如果你现在还崇拜着那些病毒或恶意代码制造者,那么你编程的方向一定走错了。这并不是道德的问题。发现别人程序漏洞并攻击它不难,这是比写一个没有漏洞的程序容易一千倍事。有一次我在某移动通讯公司测试一个短号集群网之类的系统。发现稍微升格一下权限、做一些小手脚就可以查看别的用户档案及所发信息。如果这被居心不良的人利用,是非常危险的。我想为此问题找个解决方法。然而想来想去,就是没有合适的。因为解决了旧问题,又会引发新的问题……
    好,现在回到上面的程序,大家可能会说出很多模棱两可的错误,比a,b,c有可能超出取值有范围啦,或者多线程运行时会怎么怎么样啦……很遗憾告诉你,这不是一个程序员的判断!我并不是说你说错了,只是想说你很混乱。因为严格来说,没有一句代码是可证明绝对安全的,我们经常是在安全与现实情况中取舍。初级程序员的特点是思路很不清晰,反应常常书上曾经告诉过我什么,书上要我怎么做,只求运行通过。这有点象政府人员写年度考核,上交也不知道到底谁看了,有没有看,但是不敢不写。程序员特点是象会计师,必须要思路清晰、理性,因为他要对程序负责。
    
    程序员对除0的操作很敏感,他会觉得上面程序编写代码的风格不对。分析结果如下。
    虽然已知 a、b、c均为整数,但还不知它是怎样定义的,如果定义成如下这样,错误就来了。
    
    int a,b;
    int& c = a;  // c是a的引用,即a与c总是同一个值
    b = 10;
    
    if( a != 0 )   //虽然在此a不等于零
        {
            c = b-10;        //但因执行了此一句
            b = b/a;        //a变为了0,程序崩溃
        }
    真正编程的时候,就不会象上面那么容易找到错误了。面对数万行的代码,每一行都可能有错误,程序员应该怎么做,大家心中应有数了。
    
    我有个准程序员朋友,或者说是个想成为程序员的朋友。一天到晚看书,坚持了很长时间。我开玩笑地说帮他接个项目,他回答说:“不行,还有很多书未看呢?……唉,这么多书,究竟何时才算完?”坚持是一个伟大的品质,但要正确的坚持才会成功。也许我的朋友有一天侥幸进入软件公司才发觉,所做的事情,与看多少书是无关的。公司一般有很多现在代码、库、架构等等。初进公司,你可能面对的是一个全新的培训,学习一个全新编程方式。
    很多准备步入编程界的朋友,总自以为是地认为编程界是这样或那样子,以为进入软件公司就是埋头写代码、写代码……其实不然,我所认识的几个“程序员”,一直做的都只是测试和搜索资料的工作。
    编程并不是一件太难的事,因为我们和真正的程序员距离不大。
那么,我们应该如何学习,为成为正式程序员做准备呢?
    我觉得是在关键的知识点,原理性的问题上要有高层面和理性的认识。
    所谓高层面,就是在纷繁复杂的应用中找到共通,比如去某个地方旅游,我们不是记住坐什么车,走哪一条路,转多少个弯,而是学会看地图。这样,日后我们要去更多地方,也胸有成竹。
    所谓理性,就是对问题有一个明明白白的认识。比如大家争论先有编译器还是先有操作系统的时候,你要的结论不是查探第一个编译器比第一个操作系统迟或早;也不是鸡生蛋、蛋生鸡的问题没法讨论。你要的结论是没有操作系统也可以有编译器,同样没有编译器也可以有操作系统。虽然他们相辅相成,但不能归为父子关系,理论上它们最终都只是一段程序代码。
    当然,更好的方法,就是看一个项目从立项到完成的全过程。你就会发觉什么东西是主要的,什么东西是次了。什么错误可以犯,什么错误绝对不能犯……
    为什么我想用最近编写“名捷排课王3.0”做案例。因为网上能见到的排课程序成百上千,有些还价格不菲,但差不多都是很烂很烂的程序。我测试了市面上知名的排课程序,觉得大多数都有些玩票的特征,可有可无的功能一大堆,必须要有的功能却实现不了。有些排课软件,几十个工具按钮,以功能多为荣。有的排课还搞个口令登录框,难道课程表要防止被教师发现? 
    大伙可能认为我是出于个人狭隘,自己写了排课软件就踩其他的。事实我对自己写的也不太满意,但至少能解决实实际际的问题。一次我去某教育部门推销自己的排课软件,被轰了出来,原因是“从来没见过一款排课软件不是害人的”。但我还是坚持回头演示了自己的排课软件,最后得到他们的认可采用,并说这是他见到的唯一一款实用的排课软件。同样,我对某些地方的交警也很有意见,也不是我个人狭隘。有一次,我要从东莞托运一台摩托车回茂名。临行前,我开摩托车到市场买菜,打算煮一顿饭吃后才回家。途中被交警拦截查证件。其时,我的证件就在离我500米不到的宿舍内。我马上回宿舍拿了证件,但交警们看也不看,坚决扣留了两天。几乎罚光了我身上的钱。因没够钱托运,我只能自己避开几乎所有的收费站,连续开了20个小时摩托车,行程770公里,才回到茂名老家……当很多类似的事件发生在你身上的时候,你才发觉,他们不是维持交通,而是维护钱袋……