個人高效編程的祕訣:本身主動化你的編程工做

個人高效編程的祕訣:本身主動化你的編程工做

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%。

寫到這裏,預計已經看的人很是累了。

還有好多好多內容可以寫,比方狀態機。工做流。

我就不羅嗦了。總之。付出總會有回報。相信本身的努力。相信本身腳踏實地一步步走出來的路。從宇宙演化的觀點看。咱們只是是整個天體本身主動化的一部分微不足道的參數。但是正因爲人類能思考,肯動手。所以我心便是宇宙!

相關文章
相關標籤/搜索