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


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

    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的自私的行为。

    作为程序猿,其最大乐趣来自于设计一个流程,然后能够预见性地观察整个流程正确无误地自己主动执行,其根源来自于人类的控制欲。

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


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

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

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

    甚至设计都是不必要的。不须要产品说明书,不须要需求文档。公司搞一堆产品经理是相当无意义的。开发者本身就应该负责设计和产品。


    有了想法,马上付诸行动。当然这个想法并不等于异想天开。不等于胡思乱想。几个志趣相投的程序在一起最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%。

    写到这里,预计已经看的人非常累了。

    还有好多好多内容能够写,比方状态机。工作流。

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

  • 相关阅读:
    DBF数据库资料
    服务器更改IP(公网)地址后,Program Neighborhood客户端无法连接服务器
    windows server 2003 无法搜索到自己的解决方法
    windows server 2008系统(sp1) 出现MMC无法创建管理单元的解决方法
    Web方式登录出现如下提示The system was not able to acquire a citrix product license...的原因
    Dell2950服务器windows server 2003安装手记
    配置终端用户的输入法
    DELPHI高精度计时方法,取毫秒级时间精度
    金蝶KIS10专业版客户端打开'91'错误:未设置对象变量或 With block 变量的解决方法
    [转载]用三张图片详解Asp.Net 全生命周期
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6999385.html
Copyright © 2020-2023  润新知