程序员:办公室里的木匠

来源:互联网 发布:森林鸟淘宝店叫什么 编辑:程序博客网 时间:2024/04/29 07:29

 这不是木匠的儿子吗?他母亲不是叫马利亚吗?他弟兄们不是叫雅各、约西、西门、犹大吗?

        《马太福音》 13:55

  

     科学是什么?不少人对科学抱着一种敬畏,乃至神圣的态度。不尽其然,正如有人解释,所谓的科学就是一门一门的学问。一门一门的学问加起来,就是科学。软件开发是门学问。以此理推之,那软件开发也隶属于科学范畴之一。那这到底是一门什么样的科学呢?难道真的如常人所想象的那样神秘,甚至有如科学世界神圣而不可侵犯吗?抑或,如牛顿所说的,科学在上帝眼中不过是儿戏?

作为平凡的程序员,我们自然难以像伟大的科学家牛顿那样把科学看得那么透彻,可同时身为这个行业的从业人员,我们又定然不会向隔行如隔山的外人一样,把软件世界看得过于神秘,深不可测。那么,程序员本身到底该如何审视自己的所从事的行业呢?

“诗人对宇宙人生,须入乎其内,又须出乎其外。入乎其内,故能写之。出乎其外,故能观之。入乎其内,故有生气。出乎其外,故有高致。” 我国近、现代相交时期的著名学者王国维在<<人间词话>>里有对诗歌有这样精辟的评说。事不同而理同。同样的,要思考软件开发的本质,最好的方法莫过于即“入乎其内”,又“出乎其外”。“入乎其内”时,观察其内在规律和外在趋势。“出乎其外”时,时尔审视其细微之处,时尔纵观其整体脉络,品察其微妙。正如<<道德经>>所说的,“常无欲,以观其妙;常有欲,以观其徼。”

    当这样如此反反复复的观察、审视之后,或许不难发现其实软件开发跟其他实体行业差不多,都是在做一些具体的产品。<<圣经>>上记着耶稣的父亲约瑟是个木匠。照着古时一般“父承子业”的传统,耶稣本人也应会木工。或许比较巧,我的父亲也是个木匠,可是我没有走子承父业的道路,去做个木匠,而选择了软件开发。去过几次父亲工作的地方,观察过他们的工作。静而想之,其实自己从事的是软件开发,但性质跟做家具仍是一样。只是工作环境不同,使用的行业工具不一样罢了。工作环境,有些脏乱、吵闹的大车间换成了整齐的、安静的现代化办公室。使用的行业工具,从笨重的机器换成了轻巧的笔记本。此外,就是工作最终的结果不同,他们产出的是家具,我们产出的是软件系统。

 

程序语言翻译 

    科技时代,家具厂里基本已经见不到最初的斧头和锯了。相对来说,在农村却依然可以看见不少斧头和锯了。在若干年前,锯、斧头和尺子等就是木匠吃饭的家伙,他们靠着这些,凭着自己的手艺,把一堆堆笨重的木料就摆弄成了平整的、结实的家具。

 

代码清单1:Carpenter类源代码

---------------------------------------------------------------------

/**
 * 家具厂里的故事
 */
package furnitureFactory;

/**
 * 木匠
 */
public class Carpenter {

    /**
     * 做家具的工具:锯
     */
    private String saw;

     /**
     * 做家具的工具:斧头
     */
    private String axe;

    /**
     * 做家具的工具:尺子
     */
    private String ruler;

    /**
     * 做家具的材料:木料
     */
    private String wood;

  
    /**
     * 要做的家具
     */
    private String furniture;

    /**
     * 木匠拿出锯锯木材
     * @return 锯
     */
    public String getSaw() {
       return saw;
    }

    /**
     * 给木匠一把锯
     * @param saw
     */
    public void setSaw(String saw) {
       this.saw = saw;
    }

    /**
     * 木匠拿出斧头劈木材
     * @return 斧头
     */
    public String getAxe() {
       return axe;
    }

    /**
     * 给木匠一把斧头
     * @param axe
     */
    public void setAxe(String axe) {
       this.axe = axe;
    }
    
     /**
     * 木匠拿尺子画图,量木材尺寸
     * @return 尺子
     */
    public String getRuler() {
       return ruler;
    }


    /**
     * 给木匠一把尺子
     * @param ruler
     */
    public void setRuler(String ruler) {
       this.ruler = ruler;
    }


    /**
     * 木匠拿到木料
     * @return 木料
     */
    public String getWood() {
       return wood;
    }

    /**
     * 给木匠做家具所要的木料
     * @param wood
     */

    public void setWood(String wood) {
       this.wood = wood;
    }

 

    /**
     * 木匠做好的家具
     * @return 做好的家具
     */
    public String getFurniture() {
       return furniture;
    }

 
    /**
     * 告诉要木匠做什么样的家具
     * @param furniture
     */
    public void setFurniture(String furniture) {
       this.furniture = furniture;
    }

 
    /**
     * 找来木匠时,首先要做的家具和提供的木料
     * @param wood 提供的木料
     * @param furniture 要做的家具
     */
    public Carpenter(String wood,String furniture ){
       this.wood = wood;
       this.furniture = furniture;
    }

   
    /**
     * 木匠开始做家具
     */
    public String work(){

       //以做书桌为例
       //1、用尺子,按着书桌外观要求,画出设计图纸。
       //设计图纸上标名书桌各个部分长宽高,如书桌的四个脚长多少、高多少、宽多少等;
       //2、把家具拆分成几个部分,如桌脚、抽屉、桌面等,再用斧头和锯分别做好这几个部分
       //3、组装。把桌脚、抽屉、桌面等,组装到一起,就成了一张书桌
       //把做好的书桌交给客户
       return  this.furniture;

    }

    public static void main(String[] args){

       //找来木匠师傅(这里用木匠祖师:鲁班),给他提供一些松树木料,要他做一个办公桌
       Carpenter luBan = new Carpenter("松树木料","书桌");
       //木匠祖师开始工作
       String furniture =  luBan.work();
    }

 }
----------------------------------------------------------------

 

    就像木匠一样,有着他们业内特有的行业家伙。同样的,软件从业人员也有属于自己行业特有的作业工具。电脑、开发语言、集成开发环境等,程序员就是靠着摆弄这些,折腾出一个有实际意义、有商业价值的软件系统来的。电脑是工作中最基本的硬件平台。集成开发环境,诸如一些工具Eclipse、Office、数据库,以及画图的工具等等是程序员行业道具。其中,开发语言是比较重要的工具之一。根据这个可以分出些不同的领域、不同的岗位、不同的称呼来,如Java程序员、C++程序员、PHP程序员等等。但究其本质来看,不管是集成开发环境也好,还是任何一门编程语言也罢,都是程序员开发软件系统时的工具。

 

代码清单2:Developer类源代码

---------------------------------------------------------------------

/**
 * 软件公司里的故事
 */
package softCompany;


/**
* 程序员
*/
public class Developer {

  /**
   * 集成开发环境:Integrated Development Environment
   */
    private String IDE;

    /**
     * 使用的开发语言
     */
    private String developLanguage;

    /**
     * 电脑
     */
    private String computer;

  
    /**
     * 系统需求
     */
    private String systemRequirement;

 

    /**
     * 做好的系统软件
     */
    private String software;

    /**
     * 得到程序员搭建的集成开发环境信息
     * @return
     */

    public String getIDE() {
       return IDE;
    }

 
    /**
     * 程序员搭建集成开发环境
     * @param iDE
     */
    public void setIDE(String iDE) {
       IDE = iDE;
    }

    /**
     * 得到程序员用的开发语言
     * @return
     */
    public String getDevelopLanguage() {
       return developLanguage;
    }

 
    /**
     * 指定程序员用什么开发语言
     * @param developLanguage
     */
    public void setDevelopLanguage(String developLanguage) {
       this.developLanguage = developLanguage;
    }


    /**
     * 得到程序员使用的电脑相关信息
     * @return
     */
    public String getComputer() {
       return computer;
    }

    /**
     * 给程序员一台电脑
     * @param computer
     */
    public void setComputer(String computer) {
       this.computer = computer;
    }

 

 

    /**
     * 得到程序员所理解的系统需求
     * @return
     */

    public String getSystemRequirement() {
       return systemRequirement;
    }

 

    /**
     * 给程序员指定系统需求
     * @param systemRequirement
     */
    public void setSystemRequirement(String systemRequirement) {
       this.systemRequirement = systemRequirement;
    }


    /**
     * 得到程序员开发好的系统软件
     * @return
     */
    public String getSoftware() {
       return software;
    }

    /**
     * 指定程序员要做一个什么类型的软件
     * @param software
     */
    public void setSoftware(String software) {
       this.software = software;
    }

 
    /**
     * 给开发人员指定系统需求
     * @param systemRequirement 提供的系统需求
     */
    public Developer(String systemRequirement){
       this.systemRequirement = systemRequirement;
    }

    /**
     * 根据需求,开发系统
     * @return  开发好的系统软件
     */
    public String developer(){

       //以进销存系统为例
       //1、分析客户提供的需求
       //2、根据需求做出设计。
       //一般先是大体的系统框架设计,然后再细化到模块设计,诸如库存管理、销售管理的具体设计等。
       //3、根据设计编写诸如库存管理、销售管理等各个功能模块的代码
       //4、把做好的各个模块组织起来,连在一起构成整体,就是要做的系统软件
       //把开发好的系统软件提交给客户
       return software;
    }

   
    public static void main(String[] args){

       //找来开发人员,要其开发一个进销存系统
       Developer developer = new Developer("进销存系统");
 //开发人员开始开发。开发完成后,并把做好的进销存系统提交给客户。
       String software = developer.developer();
 }

}

---------------------------------------------------------------------

 

小结

    木匠把从自然界的树木拿来做成为人所用的家具,让人的生活变得更舒适,体现了人类管理、享受自然界的万物的义务和权利。程序员开发出软件系统来,目的在于更高效、更便捷的管理我们人类所拥有的资源。透过现象看本质,软件开发究其本质还是在于管理自然界的资源,只是中间人类利用自己的聪明智慧发明了些工具,以便管理起来更便捷、更高效。

    在此,不禁想起在做系统设计时,为了代码条理分明、结构清晰、拓展方便等,常常要分层。跟数据库交互的,单独隔出来分为一层,叫做DAO层。跟业务交互,也单独隔开来分为一层,叫做Service层。页面展现的再次单独分为一层,叫做展现层。类似的,在没有计算机之前,人类通过笔来写,通过算盘来计算,再用账本来记录。有了计算机,软件走进了公司,走进了人们的生活,键盘和鼠标就代替了笔,CPU就代替了算盘,硬盘就代替了账本。于是,人们似乎不再面对面的直接跟实体物质交互,而是简单的对着电脑、对着应用系统去管理远处或近处的物质。这样一来,在人和物质的中间单独隔出了一层,叫做信息化。因为社会需要、时代需要,如今信息化不仅已经成为一个产业,甚至已经成为一个产业链。可不管是发展成产业,还是延伸到了产业链的地步,究其本质仍然逃脱不了“管理海里的鱼、空中的鸟、地上的牲畜和全地,并地上所爬行的一切昆虫。”即<<圣经>>所说的,“神说:‘我们要照着我们的形像,按着我们的样式造人,使他们管理海里的鱼、空中的鸟、地上的牲畜和全地,并地上所爬的一切昆虫。’(《创世记》 1:26)”

 

 想起一首诗(呵呵,好像有点不搭边)

 

一个老木匠

       穆旦

 

我见到那么一个老木匠

从街上一条破板门。

那老人,迅速地工作着,

全然弯曲而苍老了;

看他挥动沉重的板斧

像是不胜其疲劳。

 

孤独的,寂寞的

老人只是一个老人。

伴着木头,铁钉,和板斧

春,夏,秋,冬……一年地,两年地,

老人的一生过去了;

牛马般的饥劳与苦辛,

像是没有教给他怎样去表情。

也会见:老人偶而吸着一支旱烟,

对着漆黑的屋角,默默地想

那是在感伤吧?但有谁

知道。也许这就是老人最舒适的一刹那

看着喷着的青烟缕缕往上飘。

 

沉夜,摆出一条漆黑的街

振出老人的工作声音更为洪响。

从街头处吹过一阵严肃的夜风

卷起沙土。但却不曾摇曳过

那门板隙中透出来的微弱的烛影。

 

9月,29日,1934年

 

原创粉丝点击