我们在做产品&办公室里的木匠

这不是木匠的儿子吗?他母亲不是叫马利亚吗?他弟兄们不是叫雅各、约西、西门、犹大吗? 《马太福音》 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年