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

        《马太福音》 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年

程序员:办公室里的木匠相关推荐

  1. 有哪些适合放在程序员办公桌上的高逼格物件?哈哈哈哈哈哈哈!

    收集整理 | 猪哥 来源公众号 | 裸睡的猪 10月24日 正是广大的程序员们 所以今天 以下内容来源 知乎问答: 有哪些适合放在程序员办公桌上的高逼格物件? 如有侵权,请联系删除 01 有了这个杯垫 ...

  2. 一些能够提高程序员办公效率的办公桌

    优秀的程序员和普通的程序员之间的生产力差距在10倍到100倍之间.窥视高手的办公桌看看能不能找到高手生产力的秘密,没有高手的智慧和经验但至少不要让自己输在工具上,好的工具真的可以提高生产力,飞机真的比 ...

  3. 有哪些适合放在程序员办公桌上的高逼格物件?

    <神秘的程序员 什么塑造了今天的编程世界>周历算不算? 简单.实用 .大气 还有200年间的计算机发展史漫画. <神秘的程序员 什么塑造了今天的编程世界> * 精妙" ...

  4. 趣文:如果像招聘程序员那样招聘木匠

    原文:http://developer.51cto.com/art/201306/397296.htm 一个面试官和木匠的面试对话,用招聘程序员的方式招聘木匠会出现什么样的效果呢?详细请看内容. 面试 ...

  5. 程序员在这些地方敲代码,普通笔记本根本扛不住

    各位程序员兄弟姐妹,你都在什么环境下工作? 不都是在办公室么?你可能下意识会反问,但只能说你是幸运的,程序员并不都是像你一样总是窝在办公室啊,你再闭眼想想? 一幕幕的景象从你脑海中略过,从办公室里格子 ...

  6. 程序员鄙视链python_哈哈哈,程序员之间的鄙视链,总结全了!

    阅读本文大概需要 4 分钟. 来自:程序员最幽默整编 素材参考自:网络 鄙视像条食物链,是个绕不开的怪圈.在这个怪圈中,每一个人,都在链条的最末端. 朋友圈有鄙视链,相亲有鄙视链,程序员圈也有鄙视链看 ...

  7. 福州python招聘_【Python程序员招聘|Python程序员最新招聘信息】-看准网

    立即投递 职位薪资:6000-10000 经验:不限 学历:不限 类型:全职 linux下python编程 对接ai平台做应用 立即投递 职位薪资:8000-13000 经验:不限 学历:本科 类型: ...

  8. 【程序员思维进阶】(8)

    SE System Engineer(系统工程师) 将技术组合起来构建而成的计算机系统,以及负责构 建计算机系统的SE(System Engineer,系统工程师). 在计算机系统的开发过程中,SE ...

  9. 记一次程序员在办公室里的“撕逼”经历

    有人的地方就有江湖,有江湖的地方就有"撕逼".程序员也不例外. 上次说到公司来了个名校毕业生小李,在公司表现非常勤奋抢眼.老板趁机逼走不爱加班的陈工,杀一儆百,效果非常明显.大家开 ...

  10. 程序员在家办公没显示屏,我被领导鄙视了

     一套升级的硬核办公装备是程序员提升生产力的保证. 前一段时间,因为疫情影响,我在家办公,不过家里的办公硬件实在不给力,桌椅不匹配就算了,电脑小屏幕看得我天天两眼昏花,写代码很不得劲. 甚为想念公司给 ...

最新文章

  1. Windows Server 2012 r2 显示计算机图标
  2. 【微信开发】微信公众号开发 之 编辑模式使用
  3. Oralce 数据库 - 查询数据库所有的表和视图实例演示,查询指定用户下所有表和视图方法
  4. mysql explain 分析中select_type列解释
  5. 1.Python基础----认识环境
  6. python模拟浏览器下载文件_模拟浏览器下载文件?
  7. xampp的安装和配置
  8. C# 正则表达式验证数据类型
  9. python编程设计圆柱_《学习PYTHON—做个有编程能力的设计师》怎么样_目录_pdf在线阅读 - 课课家教育...
  10. 软考网络工程师好考吗?怎么备考?
  11. CSB专享实例部署操作手册
  12. html 6位数支付密码,支付宝支付密码怎么设置长密码 支付宝支付密码取消6位数字密码设置长密码的方法...
  13. 如何将Word文档导入Google文档
  14. 笔记本应用电视机屏幕看电影
  15. i.MX6ULL系统移植 | 移植NXP官方linux4.1.15内核
  16. 京剧《赤壁》舌战群儒
  17. 单倍型基因组组装方法
  18. 关于MIDI键盘的服务对接
  19. WeakHashMap相关
  20. 两位数合并成一个四位数

热门文章

  1. 提高系统可靠性的措施
  2. 多角度SAR图像匹配
  3. js对加法计算、减法计算、乘法计算、除法计算的精度处理
  4. 锦鱼课堂:跪着赚快钱,一年20W你愿意吗?
  5. python多图合并成一张图_python合并PDF文件、图片(先转化为A4纸大小PDF)
  6. windows下如何创建bat文件
  7. 机电一体化柔性生产线加工实训系统(5站)
  8. CSS 如何完美地去除表格的 “双线”
  9. 一篇文章带你了解国企程序员(超详细)
  10. 动态树专题 WC 2006 Tube 还有范浩强的“动态树好题”