个人高效编程的秘诀:本身主动化你的编程工做

个人高效编程的秘诀:本身主动化你的编程工做

2015-08-05javascript

cheungmine, all rights reserved.css


软件工业的目标就是把人类的生产活动流程化。本身主动化和智能化。html

做为一个程序开发者,咱们没有什么理由不把本身的工做本身主动化和流程化。前端

虽然这个过程不是一日之功,也不必定会达到尽善尽美,但是各类开发类库、框架、工具的出现。是以这个为终极目标的。java

好比java web开发。SSO,Spring,WebFlow,Struts,iBatis。Hibernate,jQuery...。各类框架都是为了下降反复劳动,提升效率。提升安全可用为目标。node


这方面样例不胜枚举:好比作html。javascript前端开发。採用jslint等工具对css,js脚本本身主动分析检查压缩打包等。部署hadoop及相关apache产品,採用一套本身主动化的脚原本本身主动化配置和部署集群。python

本身主动建立KVM虚拟机。用于软件部署运维的測试。ios


假设你将反复地面临同一项工做,那就全然有必要将之本身主动化。阻碍本身主动化的目标实现的客观缘由有很是多。以结果为导向的管理模式。仅仅重视你产出了什么。而忽视整个过程是多数项目经理经常採用的习惯性思惟。这是一种仅仅顾眼前。无论未来的。仅仅考虑本身KPI的自私的行为。web

做为程序猿,其最大乐趣来自于设计一个流程,而后可以预见性地观察整个流程正确无误地本身主动执行,其根源来自于人类的控制欲。数据库

本身主动化的终于结果不是下降了生产率,而是大大提高了生产效率。然而本身主动化的过程是艰辛的,是经常得不到别人的理解甚至被误解。怎样在结果和过程当中折衷?


我相信敏捷开发方法论的观点,无论作什么,首先就是产生一个结果。而后在这个结果上持续迭代。

事实上这就是爱因斯坦的小板凳的故事。

有就比没有进步,有了再去无缺它。而不是上来就搞一个大而全的设计,投入一堆人开发。

甚至设计都是没必要要的。不需要产品说明书,不需要需求文档。公司搞一堆产品经理是至关无心义的。开发者自己就应该负责设计和产品。


有了想法,立刻付诸行动。固然这个想法并不等于异想天开。不等于胡思乱想。几个志趣相投的程序在一块儿最easy开发出产品。实际中咱们经常看到,产品先设计,而后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 message
    this.message = message;

    // source class name
    this.source = source;

    // source filename
    this.sourceFile = sourceFile;

    // line no in source filename
    this.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文件的时候,会用真实的文件名称和行号替换。这样当脚本报错。就很是easy定位到错误的位置。

我使用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%。

写到这里,预计已经看的人很是累了。

还有好多好多内容可以写,比方状态机。工做流。

我就不罗嗦了。总之。付出总会有回报。相信本身的努力。相信本身脚踏实地一步步走出来的路。从宇宙演化的观点看。咱们只是是整个天体本身主动化的一部分微不足道的參数。但是正因为人类能思考,肯动手。所以我心便是宇宙!

相关文章
相关标签/搜索