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 () { ... ... });
/** * 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%。
寫到這裏,預計已經看的人很是累了。
還有好多好多內容可以寫,比方狀態機。工做流。
我就不羅嗦了。總之。付出總會有回報。相信本身的努力。相信本身腳踏實地一步步走出來的路。從宇宙演化的觀點看。咱們只是是整個天體本身主動化的一部分微不足道的參數。但是正因爲人類能思考,肯動手。所以我心便是宇宙!