2014年,我加入南京智精靈編寫健腦小遊戲。在這以前公司已有一堆前人留下的風格迥異的小做品,咱們要參考這些做品開發一組新的風格統一的遊戲產品。這些小遊戲粗看畫面簡單,開發難度應該不大,但另外一方面,遊戲數量多,各有不一樣。一個一個的解決不是什麼好辦法。git
我從衆多的遊戲中發現,這些遊戲具有一種估值循環的邏輯,從這個認識能夠推出一套適合每一個小遊戲的程序骨架。程序員
但隨後我意識到,開發中充滿了繁瑣乏味損壞開發樂趣的事情:切圖、以及它的好夥伴測算精靈座標。github
注:遊戲裏的人物、棋子、按鈕等等都統稱爲精靈。sql
我要用cocos2d製做這些小遊戲。cocos2d 還有不少遊戲框架使用稱爲精靈圖集的東西。就像下面這樣:數據庫
精靈圖集:小圖片拼成的大圖和小圖片在大圖的位置索引 |
這些精靈圖集怎麼來呢?框架
遊戲工序能夠淺顯而不失準確的理解爲:第一步策劃,第二步美工,第三步程序,第四步玩。編輯器
美工使用 Photoshop 畫好遊戲素材:工具
以後將遊戲素材中精靈的位置尺寸一一測出,造成一個excel文件和一組小圖片:開發工具
程序員用工具程序將小圖片生成精靈圖冊,而excel轉爲程序代碼中精靈的位置:網站
我意識到,必須能從Photoshop一步到位直接產生精靈圖冊,必須從Photoshop直接生成遊戲精靈擺放位置大小的初始代碼。也就是說,從Photoshop直接生成遊戲原型。
代碼生成器什麼的對我來講得心應手,在我加入智精靈以前利用業餘時間敲敲打打,神器完成:
效果如何呢?數聽說話:在此以前一款小遊戲要開發一週左右,在我擔綱的時期,能夠作到一天出2到3個遊戲。拋開開發能力方面的因素,效率提高至少也有一倍。
一方面效率大幅提高,另外一方面美工和程序的痛苦程度大大下降。那些枯燥乏味的切圖測算精靈位置尺寸的活消失了,只剩下如何編寫遊戲邏輯,工做變得直指本質,也再也不那麼乏味了。要是不存在其餘一些因素,這個團隊將是快樂工做的典範。
回顧我是如何取得這個成就的。首先是想象力,想象力能讓人從無到有看到一個不存在的事物:從Photoshop這麼一個美術軟件直接生成遊戲骨架的工具。有了這個目標再一點一點的豐富它的細節,造成可用的產品。談想象力有點玄,除了想象力外還有一個頗有意思的能夠複製的因素髮揮着重要效用。這個因素比所謂的「偷懶是發明的原動力」、「技術顛覆管理」等等正確的廢話更能幫助咱們實現真正的創新。這也是本文所要介紹的方法論:工序主義。
剛纔咱們看到,這款遊戲生成器幹掉了切圖測位置等工序,這是否就是所謂工序主義呢?工序主義是否就是消掉一切能夠消掉工序? NO。僅止步於此那工序主義就是奧卡姆剃刀的另外一個版本而已。奧卡姆剃刀法則說,如無必要勿添實體。工序主義的內涵不止於此。
消除工序是工序主義的一項重要內容,卻不是核心內容。
直接闡述工序主義是怎麼回事是很乏味的,我但願能儘可能讓案例說話。
讓咱們繼續談談這款遊戲生成器。
這款遊戲生成器隨後帶來一種新的美術和程序的結合,幸運的是當時的美工抓住了它。
有了這個神器,美工已經不須要切圖測位置,而是直接給我Photoshop文件。我在收到Photoshop文件後,爲了生成代碼,會對Photoshop文件圖層作一步極有用的人工編組工做。例如,我把同一個精靈的圖層安排在一個圖層組,以程序的方式命名爲精靈名,這樣Photoshop文件裏就有一個事物(圖層組)和遊戲程序裏的事物(精靈)是對應的了。
按程序裏的事物從新組織Photoshop文件中的事物後,一個Photoshop文件每每變成這樣:
上面的英文命名大可能是爲程序服務的。
這不是一款單向的遊戲生成器。在設計時我要考慮一個問題:遊戲編碼完成並非工做的終點,美工隨時可能對Photoshop文件再作修改,設計中要考慮儘可能無痛的將新的美術設計更新到遊戲世界。
我在按上面的方法從新組織Photoshop文件圖層後將文件交還給美工,他就以這份Photoshop文件爲基礎作下一次調整。一般他作出新改動後我只要從新生成代碼便可。不久後,他甚至能猜到程序員會如何組織遊戲事物主動將精靈編爲圖層組。他給的命名時常符合程序員的規範。讚美這位優秀的合做夥伴。他很早就是美術總監,不喜歡我當他是美工,其實我也不僅是程序員 :)
從管理的角度看,這樣一來迭代成本大幅下降,迭代速度和質量都更有保障了。
另外還帶來一個益處:便於定位故障。例如精靈的初始大小不對,打開Photoshop文件就能夠找出它在程序裏的命名了。在工序割裂很強的模式裏,每道工序的成果自成體系,Photoshop文件只知足美工的意圖,和程序世界沒有聯繫,定位某些故障很難。
這個遊戲生成器的確是工序主義的經典案例。
注:上文援引的素材已徵得智精靈許可,特此鳴謝。
下面的案例來自純粹的軟件開發方面。
網站開發人員常常須要在數據庫語言SQL和網站自身的程序語言之間切換。切換的方式不少年前是這樣的:
06-07年,我發明了一種表述方法。
我把它稱爲SQL塊。SQL塊是d2js的一項核心技術。除了SQL塊d2js還包括很多其它工序主義的設計亮點,有興趣的同仁能夠訪問https://github.com/inshua/d2js 進行了解。
SQL塊是如何拯救乏味的工做並帶來效率提高的呢?
在開發工序中,一般遵循先SQL後程序語言(如Java)的編寫順序。SQL有SQL編寫工具,如Oracle有SQL Developer、PL/SQL Developer,PG有pgAdmin。程序員在SQL編輯器編制查詢,達到意圖後將它粘貼到程序語言開發工具中,按程序語言的要求將SQL加上雙引號、斷行、混入程序語言的變量,造成一個該語言中的字符串。就像這樣:
這裏將一段SQL賦值給了一個名爲 sql 的變量。
將SQL嵌入程序代碼後,當時的框架還要通過很多編碼步驟才能給出一個能用的頁面。不幸的是,禍根在這一步已經種下了。
咱們看到,SQL代碼已經變爲程序語言內的SQL字符串,混雜着一堆程序變量和飛舞的單引號雙引號轉義符,看上去已經與SQL代碼大相徑庭,程序可讀性變得極差。一旦出現故障很難經過閱讀代碼定位問題,即便一條簡單的查詢也要付出很多心血認讀排查。
並且一旦程序不能正常工做或者隨着業務要作調整,而原始SQL已經轉化爲程序語言裏的字符串,這種格式的文本粘貼回SQL編輯器已不是SQL,沒法在SQL編輯器識別、運行和修改。
可見,這種作法操做繁瑣,可讀性差,不適合快速迭代。
SQL塊給予SQL語言幾近獨立的地位,讓SQL步驟的成果直接體如今程序中。正向來講,將SQL代碼從SQL編輯器複製到程序語言中便可使用。逆向來講,將SQL代碼從SQL塊複製回SQL編輯器便可修改調整。
在程序語言給SQL塊獨立地位的同時,SQL塊中也能夠套入程序塊。SQL塊和程序塊互相穿插,你中有我我中有你,造成遞歸的嵌套結構。這種設計讓上一工序能夠反過來混入下一工序。
SQL塊提高了代碼可讀性,提高了迭代效率,定位問題也更容易了,甚至原來的作法帶來的SQL注入問題也一道解決了。而這一切不只沒必要付出額外勞動,反而減小了原來乏味的工做。
這裏我透露一個心願。若是我有精力改造IDE,我會在開發工具SQL塊上顯示一個Run SQL按鈕,直接運行SQL代碼。
從這兩個案例我想咱們能夠觸摸到結論了,工序主義是這樣一種方法論:
1. 消除可消除的工序,讓它消失或自動化。
2. 工序貫穿。
a) 上一步工序在下一步工序中獲得充分尊重。
b) 上一步工序除告終果也將必要的針頭線腦傳遞到下一步工序。
c) 在下一步工序給出的做品中簡單的包裝着上一步工序的做品,只要進行簡單的拆箱就能夠退化出上一步工序做品——甚至能夠直接嵌入。
d) 上一步工序新的調整很容易再傳播到下一步。
e) 下一步工序在上一步工序中也獲得充分尊重。下一步工序爲上一步工序準備好切入點。
f) 綜上,工序貫穿讓工序間信息共享、深層咬合,工序貫穿能有效的支撐快速迭代。
3. 工序貫穿致使最終成果淺顯直接的暴露出各個主要工序。用哲學一點的說法,在共時性的產品中能看出歷時性的工序。用比喻性的說法,就像樹的橫截面,樹的年輪暴露了它的生長經歷。
a) 暴露工序對於構建可維護的產品來講怎麼強調都不過度。
b) 經過想象工序暴露後的最終產品形態,能夠得出你求之不得的設計。實際上本文介紹的這兩個設計都是這樣出發的。這也是一種結果導向思惟。
回顧一下上面兩個案例是怎麼圍繞這三點進行的。
消除工序:遊戲生成器消除了切圖定點的工序,SQL塊消除了粘貼SQL語句套雙引號斷行置入程序代碼、將程序代碼中的SQL字符串複製回SQL編輯器的工序。
工序貫穿:遊戲生成器將遊戲世界的精靈知識轉爲程序員和美工所共同持有的知識,程序步驟的知識甚至回饋到了美工步驟。d2js中SQL成果原本來本的轉移到了第二步工序的程序代碼中。
工序暴露:d2js的SQL塊在最終代碼中清晰的暴露了SQL 代碼。遊戲生成器在Photoshop文件中充分暴露了美術設計中的知識,在遊戲代碼中充分暴露了Photoshop文件中的知識。
除了d2js和前面的Ps2Game遊戲生成器,molecule框架是一款工序主義的精緻小巧的HTML組件框架。這個框架基於DOM-Prototype思想,在純HTML基礎上實現了HTML組件。其中工序主義是貫穿整個設計的方法論,使用molecule框架的人會發現包裝爲組件和拆箱回樸素HTML代碼都極爲簡單。molecule的地址https://github.com/inshua/molecule 。
這套方法論特別適合迭代頻繁的軟件領域,除此以外在其它行業有沒有用呢?至少就智力行業而言,如寫書需引用知識庫,畫模型需引用其它模型等等,涉及到工序的,均可以從工序貫穿的角度進行思考。
除了用於設計,工序主義還能夠用於評價技術框架、工具組合。這個話題留待往後鋪陳。
讓咱們隨着這個機械的運轉領悟如何將時間序列轉化爲共時的空間組織: