我的高效编程的秘诀:自动化你的编程工作

2015-08-05

cheungmine, all rights reserved.

软件工业的目标就是把人类的生产活动流程化,自动化和智能化。作为一个程序开发人员,我们没有什么理由不把自己的工作自动化和流程化。虽然这个过程不是一日之功,也不一定会达到尽善尽美,但是各种开发类库、框架、工具的出现,是以这个为终极目标的。例如java web开发,SSO,Spring,WebFlow,Struts,iBatis,Hibernate,jQuery...,各种框架都是为了减少重复劳动,提高效率,提高安全可用为目标。

这方面例子不胜枚举:例如做html,javascript前端开发,采用jslint等工具对css,js脚本自动分析检查压缩打包等。部署hadoop及相关apache产品,采用一套自动化的脚本来自动化配置和部署集群。自动创建KVM虚拟机,用于软件部署运维的测试。

如果你将重复地面临同一项工作,那就完全有必要将之自动化。阻碍自动化的目标实现的客观原因有很多,以结果为导向的管理模式,只重视你产出了什么,而忽视整个过程是多数项目经理经常采用的习惯性思维。这是一种只顾眼前,不管将来的,只考虑自己KPI的自私的行为。作为程序员,其最大乐趣来自于设计一个流程,然后可以预见性地观察整个流程正确无误地自动运行,其根源来自于人类的控制欲。自动化的最终结果不是降低了生产率,而是大大提升了生产效率。然而自动化的过程是艰辛的,是经常得不到别人的理解甚至被误解。如何在结果和过程中折衷?

我相信敏捷开发方法论的观点,无论做什么,首先就是产生一个结果,然后在这个结果上持续迭代。其实这就是爱因斯坦的小板凳的故事。有就比没有进步,有了再去完善它,而不是上来就搞一个大而全的设计,投入一堆人开发。甚至设计都是不必要的,不需要产品说明书,不需要需求文档。公司搞一堆产品经理是相当无意义的。开发人员本身就应该负责设计和产品。

有了想法,立即付诸行动。当然这个想法并不等于异想天开,不等于胡思乱想。几个志趣相投的程序在一起最容易开发出产品。实际中我们经常看到,产品先设计,然后UIUE,最后开发拼命加班赶工,产品闲着上网玩游戏。然后就是产品不符合预期,继续改产品,继续赶工。逐步陷入类似程序死循环的怪圈。最后就是完全没有自动化,脱离流程,只剩下一群天天加班的人。编程工作本来应该是美好的生活的一部分,最后搞成了一锅粥里的死苍蝇。

高效编程的核心就是最大限度减少重复编码的工作。使用类库,框架,语法检查,构建工具等等,还仅仅是高效编程里最低端的方法论。有没有想过,所有的电商平台都具有同质化?所有的在hadoop平台上的大数据处理,做法基本雷同。不同的地方在于参数。一类的事情,最后的差异仅仅在于参数的不同。例如当当网和卓越亚马逊都卖书,从程序的观点有什么区别吗?京东和苏宁有区别吗?大家都是在做同样的事情而已。为什么这些地方不能自动化?

现在这个世界,只要你能想到的,只要存在合理内核的,就一定有人已经做了,做的好坏是另一方面。我不但想了,而且也在做了。可能有些东西有重复建车轮子的嫌疑,但是总有我的收获。例如我采用自动化的脚本创建基于KVM的虚拟机,包括虚拟机网络配置,监控等动作,那么使我了解了OpenStack的原理。创建一个虚拟机并不是从头开始的工作,而是通过模板——事先建好的各种类型的虚拟机——复制来的。再包括自动化安装一些软件:python,java,slatstack,daemontools等,把这些过程固定化,把安装过程脚本化。把脚本框架化。又例如python程序通常都是要读输入参数,彩色输出,异常处理,循环日志,那么这些过程都可以规范和定型。例如安装CDH版本的hadoop集群和其他apache的开源软件(kafka,storm等),就完全可以通过脚本配置之后自动安装。由于hadoop及其周边产品太多,没有一个工具去安装和运维,肯定是受不了的繁琐和疲惫,因此可以采用一个二维表去直观配置主机和软件,例如我采用yaml来做配置,每一列代表一直软件名称,每一行代表主机名。如下 hacl-config.yaml(部分):

pkgids: ' hadn | hahis | hajn | halib | halibd | halzo | hamr | hanm | hann | hares | hazk | hbma | hbreg | hbrst | hbthr | hvbas | hvhb | hvms | hvsvr | imcat | imsh | imss | imsvr | kbc | kbs | sphis | spma | spwkr | zkbas | zksvr |'
config: n1: ' +    | +     | +    | -     | -      | +     | +    | +    | +    | +     | +    | +    | +     | -     | -     | -     | -    | +    | +     | +     | +    | +    | +     | -   | -   | -     | -    | -     | +     | -     |'n2: ' +    | -     | +    | -     | -      | +     | +    | +    | +    | +     | +    | +    | +     | -     | -     | -     | -    | -    | -     | -     | -    | -    | +     | -   | -   | -     | -    | -     | -     | -     |'n3: ' +    | -     | +    | -     | -      | +     | +    | +    | -    | -     | -    | -    | +     | -     | -     | -     | -    | -    | -     | -     | -    | -    | +     | -   | -   | -     | -    | -     | -     | +     |'n4: ' +    | -     | -    | -     | -      | +     | +    | +    | -    | -     | -    | -    | +     | -     | -     | -     | -    | -    | -     | -     | -    | -    | +     | -   | -   | -     | -    | -     | -     | +     |'n5: ' +    | -     | -    | -     | -      | +     | +    | +    | -    | -     | -    | -    | +     | -     | -     | -     | -    | -    | -     | -     | -    | -    | +     | -   | -   | -     | -    | -     | -     | +     |'n6: ' +    | -     | -    | -     | -      | +     | +    | +    | -    | -     | -    | -    | +     | -     | -     | -     | -    | -    | -     | -     | -    | -    | +     | -   | -   | -     | -    | -     | -     | -     |'

例注:hadn表示hadoop datanode。n1: 表示主机集群中的某台主机ID。

而这个配置文件hacl-config.yaml也不需要手写,利用一个web前端和数据库,就自动生成了这种配置文件。然后后台python脚本就按照这个配置文件去自动配置、部署、启动和关闭主机集群上面的各种服务。

尽管我做的大部分工作是服务端开发,但是也要写web前端脚本。一个自我感觉很受用的经验就是,写javascript也要像写java一样来写,接口,类,库这些概念和方法完全适用于js。而利用闭包的特性和json,可以构建出类库,类库之间存在包含关系,例如通过下面的一个调用,就可以解决js文件之间的引用问题:

Utils.importScripts("website/lib/encode.js","website/lib/security.js","website/lib/client.js"
);$(function () {... ...
});

web前端开发也要秉承code behind的观点,例如:index.html---->index.html.js---->someone.js---->corelib.js。层层包装,层层递进。例如我们经常要在脚本里抛出错误信息,那么把错误信息包装成一个class,如下面的代码:

/*** error.js*/
var ErrorClass = function (message, source, sourceFile, sourceLineNo) {this.init(message, source, sourceFile, sourceLineNo);
};ErrorClass.inherits(Error);ErrorClass.prototype.init = function (message, source, sourceFile, sourceLineNo) {// error messagethis.message = message;// source class namethis.source = source;// source filenamethis.sourceFile = sourceFile;// line no in source filenamethis.sourceLineNo = sourceLineNo;
};ErrorClass.prototype.toString = function () {return "[javascript ErrorClass]";
};ErrorClass.prototype.print = function () {var msg;if (__not_null(this.source)) {msg = this.source + " Error";} else {msg = "Error";}if (__not_null(this.message)) {msg += ": " + this.message + ".";} else {msg += ".";}if (__not_null(this.sourceFile)) {msg += " ( " + this.sourceFile;if (__not_null(this.sourceLineNo)) {msg += " : line " + this.sourceLineNo;}msg += " )";}return msg;
};

使用的时候:

if (! _container) {throw new ErrorClass("canvas must have a DIV container", "CanvasClass", "__FILE__", "__LINE__");
}

当然,__FILE__和__LINE__是我设置的占位符,在打包这些js文件的时候,会用真实的文件名和行号替换。这样当脚本报错,就很容易定位到错误的位置。我使用Makefile来做打包的工作,因此赋予了极大的灵活性。js还需要混淆和压缩,尽管各种工具很多,没有哪个比哪个更完美,适合自己的就行了。我使用JSA来压缩(可以参考我的其他文章)。整个过程采用ant来构建,因此一个典型地使用JSA的build.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project name="jsa" basedir="." default="jscompress"><taskdef resource="jst-task.properties" classpath="bin/jsa/JSA-20071021.jar" /><property name="src.dir" value="./dist/script/out" /><property name="dist.dir" value="./dist/script/jsacompress" /><target name="jscompress" ><jscompress destDir="${dist.dir}" charset="utf-8"allInOneFileName="client.min.js"syntaxcompression="true"textcompression="true"compatible="true"><fileset dir="${src.dir}"><include name="client.js" /></fileset></jscompress><jscompress destDir="${dist.dir}" charset="utf-8"allInOneFileName="prerequisite.min.js"syntaxcompression="true"textcompression="true"compatible="true"><fileset dir="${src.dir}"><include name="prerequisite.js" /></fileset></jscompress>... ...</target>
</project>

web前端开发,一直以来是html/css/js和美工的领域。从早期的frontpage,dreamweaver,photoshop,这些可视化工具更大的存在意义是降低开发的门槛,并没有显著提高生产力。前端开发,现在也引入了后端语言的包装逻辑和生产力工具。一个核心目的就是流程化。而可视化工具是流程化的天敌。比如采用sass替代css。sass/scss 完全兼容个版本的 CSS 语法,无数前端框架由 Sass 构建: Compass, Bourbon, 和 Susy 等等。参考:http://sass.bootcss.com/

工欲善其事,必先利其器。多数程序的开发工作还是在windows上进行。近几年用ios电脑的越来越多了。我平时使用的是Ubuntu电脑,它给我带来太多的好处。免费的各种软件工具就不用说了,稳定,安全,速度快。开发者如果恐惧命令行,可以用eclipse,虽然它的效率要大打折扣。Ubuntu上的各种小游戏让我的业余时间很轻松。openoffice比微软的office更好用。使用Ubuntu,你不用到处找下载软件,还安装什么杀病毒的工具,永远不用做磁盘整理,不会蓝屏。我的体会是,使用Ubuntu的工作效率至少提升30%。

写到这里,估计已经看的人很累了。还有好多好多内容可以写,比如状态机,工作流。我就不罗嗦了。总之,付出总会有回报。相信自己的努力,相信自己脚踏实地一步步走出来的路。从宇宙演化的观点看,我们不过是整个天体自动化的一部分微不足道的参数。但是正因为人类能思考,肯动手,因此我心即是宇宙!

我的高效编程的秘诀:自动化你的编程工作相关推荐

  1. python编程快速上手自动化_《Python编程快速上手 让繁琐工作自动化》完整版PDF...

    image.png <Python编程快速上手 让繁琐工作自动化>完整版PDF 提取码:7qm4 3.jpg 有关本书 累计销售超过10万册 零基础编程者的不二之选 基于Python3编写 ...

  2. 恩施机器人编程_恩施州自动化焊接机器人专业厂家

    恩施州自动化焊接机器人专业厂家 走马塘岛跨海线路又长又陡.可实现一个变位机机器人焊接.因此大家就见到数十台乃至几百台焊接机器人另外工作中在同一生产流水线的壮阔场景.具行业更是进一步推动了国外喷涂机器人 ...

  3. 风变编程python网址_风变编程Python:如何打造职场差异化竞争优势

    吴军在<浪潮之巅>里指出,21世界最终会是人工智能的世纪,我们要么成为他们的奴隶,要么成为他们的神.每次开学我都会问学生们一个问题:如何才能比别人更优秀?更好的学历?更丰富的工作经验?事实 ...

  4. python编程做什么工作-学习Python编程后在成都可以做哪些工作?

    原标题:学习Python编程后在成都可以做哪些工作? Python被称为编程语言中的万能胶水,比如可以用来做爬虫,做网页,运维还有现在很火的人工智能Al都可以用上Python.一是Python有很多数 ...

  5. python编程 迷你世界_迷你编程电脑版|迷你世界迷你编程下载 v1.0官方版 - 绿点软件站...

    迷你世界迷你编程是一款简单易学图形化编程软件,软件采用图形化的编程方式,过程就像组合积木一样简单,不但可以帮助青少年学习基础的编程知识,也提高了数学逻辑思维能力,还可以让孩子们感受到创造三维立体世界的 ...

  6. 青少年软件编程python考试-青岛全国青少年软件编程等级考试—Python

    卓优特机器简介 卓优特机器人是集教育机器人设备研发.生产.销售及课程研发.教育机器人课程教育及竞赛技术服务.机器人实验室方案策划及配置.智能技术支持的高新技术集成服务商, 公司由多所知名大学的多位智能 ...

  7. python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  8. arcgis下的python编程-面向ArcGIS的Python脚本编程

    面向arcgis的python脚本编程是一本指导ArcGIS for Desktop专业用户进行Python开发的指南,本书将教会您如何通过编写Python代码处理空间数据并在ArcGIS中自动化实现 ...

  9. 深入理解python异步编程_深入理解Python异步编程

    1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...

最新文章

  1. maven打包war,导入本地jar包
  2. 部署vs 2008 Report View
  3. 功能表单之树形选择字段类型的高级使用——JEPLUS软件快速开发平台
  4. Unreal4 IOS上使用第三方库和C++11 特性问题解决
  5. 东师2016年秋季计算机基础,东师2016年秋季《计算机基础》期末考核答案(1).doc
  6. 分享一个一分钟就学会的vue小技巧(真的一看就会~~)
  7. 设p他主修计算机科学,华南农业大学 离散数学 期末考试2013试卷及答案
  8. Ubuntu18.04安装RealsenseD435驱动
  9. linux 不识别ar9380,用Linux做wifi熱點/無線路由
  10. SPSS——非参数检验——1-Sample K-S 单个样本(Kolmogorov-Smirnov)柯尔莫哥洛夫-斯米诺夫检验
  11. 黑马JAVA P136 斗地主游戏
  12. 基于阿里天池的淘宝用户行为分析
  13. 马克思《数学手稿》是“民科”作品吗?
  14. 内核手动释放内存方法
  15. 2183440-33-5,Methyltetrazine-PEG8-acid在存在活化剂(如EDC或HATU)的情况下,它可用于与含胺分子共轭
  16. 基于STC89C52RC的小车黑线钝角、锐角、迷宫、虚线循迹模块化代码
  17. 装修服务转战线上,VR全景为您解决装修行业痛点!
  18. 工业协议分析1——攻防世界
  19. emqx速度_MQTT研究之EMQ:【EMQX使用中的一些问题记录(1)】
  20. 这是初次的感觉 好象天空般晴朗

热门文章

  1. 沉痛悼念恩师程开甲院士“改革子先锋”
  2. aspen infoplus.21 实时数据库安装
  3. ubuntu 怎么去除拷贝文件的绿色底色
  4. 微信小程序数组push报错
  5. 门面模式php,门面模式 php
  6. ceilometer + gnocchi 获取数据
  7. 单片机串口分析起始位停止位奇偶校验位
  8. 金赢客政策!详解模式2.0现代金控
  9. dracut 基本介绍
  10. php一小时入门(笔记)