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