现在的位置: 首页 > 综合 > 正文

编程并不是一件太难的事之(二)

2013年09月13日 ⁄ 综合 ⁄ 共 2523字 ⁄ 字号 评论关闭

     今天与大家谈谈如何成为一个程序员。如果你没有开发过正式项目也没有在软件公司工作过。你一定想问:我们与真正的程序员有多大距离?他们懂得的是否一定比我们多?他们是怎样工作的……

   

    在回答上述问题之前,先测试一下大家是否是一个合格的程序员。大家先花一分钟看以下几句代码,看看有没有错误:

   

    (已知 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”做案例。因为网上能见到的排课程序成百上千,有些还价格不菲,但差不多都是很烂很烂的程序。我测试了市面上知名的排课程序,觉得大多数都有些玩票的特征,可有可无的功能一大堆,必须要有的功能却实现不了。有些排课软件,几十个工具按钮,以功能多为荣。有的排课还搞个口令登录框,难道课程表要防止被教师发现?“名捷排课王3.0”做案例,对过比较,很容易让大伙明白怎么构造一个有用的软件。

    大伙可能认为我是出于个人狭隘,自己写了排课软件就踩其他的。事实我对自己写的也不太满意,但至少能解决实实际际的问题。一次我去某教育部门推销自己的排课软件,被轰了出来,原因是“从来没见过一款排课软件不是害人的”。但我还是坚持回头演示了自己的排课软件,最后得到他们的认可采用,并说这是他见到的唯一一款实用的排课软件。同样,我对某些地方的交警也很有意见,也不是我个人狭隘。有一次,我要从东莞托运一台摩托车回茂名。临行前,我开摩托车到市场买菜,打算煮一顿饭吃后才回家。途中被交警拦截查证件。其时,我的证件就在离我500米不到的宿舍内。我马上回宿舍拿了证件,但交警们看也不看,坚决扣留了两天。几乎罚光了我身上的钱。因没够钱托运,我只能自己避开几乎所有的收费站,连续开了20个小时摩托车,行程770公里,才回到茂名老家……当很多类似的事件发生在你身上的时候,你才发觉,他们不是维持交通,而是维护钱袋,对一班这样的人,你能不狭隘吗?   

    昨天我曾经说过,想花点时间,用一个实实际际的例子,与大家探讨一下如何规划完成一个软件项目。今天打开网站的时候,却发现我昨日所写的文章不知何故被删去。现在很有挫折感,象在旧中国,因说了几句真话被监禁起来的地下党。 :)如有知具体原因的朋友,请转告我,免得与版引起误会,谢谢!

抱歉!评论已关闭.