1. 程式人生 > >VC++程式設計師如何做好介面

VC++程式設計師如何做好介面

        本屌絲在新春放假期間閒來無事,在各大程式設計論壇溜達了一圈。發現年前的帖子中,有VC++程式設計師在介面開發方面遇到了很多苦惱,有抱怨介面工作不好做的,有抱怨用錯了介面庫的,也有緊急求得技術問題幫助的。看到這些,想起了五年前的我。我那時正好在一家網際網路公司擔任技術總監一職,手下有三個人。那是一家剛創辦的公司,老闆是我初中同學,他在美國呆了幾年拿到EMBA後到國內創業。在一次同學聚會上了解到彼此工作方向。後面憑藉對未來的嚮往一起創業,他負責營銷和資金,我負責技術研發。我們的目標是開發一款企業用的即時聊天軟體(IM),那時還沒有企業QQ和IMO。我們感覺市場是空白的,而企業需求則是非常剛性的。於是我們開始了美好的夢想之旅!

        我之前一直是做伺服器後臺底層編碼的,弄過阿里巴巴的阿里旺旺的後臺,所以後臺部分基本都是現成的技術和框架,不需要佔用我太多的時間。老闆讓我招幾個技術人員以輔助我的工作。我在老闆的眼裡是技術牛人一個(也許我在他面前把自己吹的太高了),他經常以“大師”稱呼我。(雖然我表現的很謙虛,不過心理還是感覺良好,被別人認可的感覺真好!)。於是我就招了三個懂點MFC的程式設計師進來一起做IM的客戶端部分。

        說實在的,那時我對VC++開發介面真沒有什麼經驗,這三位小弟好像與我挺投緣的,都一致認為做介面嘛MFC就足夠了。當時,我關注過QT,雖然QT做出來的效果真不錯,但有兩個問題直接導致我放棄了它。


        第一、釋出出來的程式居然要帶上十幾兆的QT支援庫(QTCore.dll,QTGUI.dll等);第二、QT的呼叫真是奇怪,和MFC完全不一樣的,特別是事件響應,再加上三個小弟對QT也不太熟。所以最終大家都毫不猶豫地拋棄了它。

        MFC做介面很容易,在視窗資源上擺上一個一個控制元件是所見即所得的,很直觀的。大概做了三個月,登入介面、主介面、聊天介面和設定介面都相繼問世了。灰灰的視窗背景,雖然有點醜,但不影響功能的展示。我拿著這個版本向老闆彙報了。老闆看後感覺很滿意,他很高興地告訴我,再弄一個月,把體積搞小點,介面效果做到QQ的樣子就可以上線了。我信心百倍地表示,一定按時完成任務。我們立即開始了體積的縮小工作。發現WTL在介面和體積上都比MFC要有優勢的多。於是我們邊學邊改程式碼。花了一週時間,把WTL都換上了。體積確實如期所願縮小了很多,依賴庫也少了幾個MFC*.dll。不過要把介面做成QQ那樣子,我們幾個不知道從何下手。從網路上查了查有很多,有破解的,有免費的,有收費的。說實在的,老闆剛創業也沒有錢,有免費的肯定不會選擇收費的了(除非腦子“進水”了!!!)。看到網路上的評價BCGControlBar挺不錯的,於是Down了一個9.0的版本,還帶原始碼,太令我激動了!


        研究了它的Demo和程式碼,發現與我們聊天軟體不太一樣,也找不到用它做IM介面的例子。有個手下提醒我了,他說BCGControlBar是做管理型軟體比較適合,比如Office之類的軟體。現在想來他說的還真是對的。繼續Google上找,發現有一款SkinMagic的換膚軟體,還帶視覺化的面板設計工具。


        不過小激動了幾下後發現,這個設計工具只能編輯同一型別的控制元件外觀,用這個工具換膚出來效果是:所有同類型的控制元件都長成一個樣子。對聊天軟體來說,有很多控制元件都需要長不同的樣子。後來終於搞明白它是換膚類介面庫,而我們需要的是開發介面的工具。換膚類介面庫的意思是我們把介面用MFC先做好了,然後用它去換膚,相當於把軟體換層皮,但對自定義的控制元件和控制元件的各種佈局都無法支援。經過這麼一段時間的摸索後,感覺網路上介面庫初看上去還不錯,但真正用起來會發現很多問題。一晃一個月過去了,老闆來問我開發進度了,心中頓生很大的壓力,開始感覺到介面沒有我之前想象的那麼簡單!在介面上沒有大的進展,我讓老闆再給我一個月時間。雖說我之前沒有太多的介面開發經驗,但我感覺自己的技術功底是比較紮實的,加上這幾周對介面庫的調研後發現,介面庫的東西其實也蠻好理解的,而且也不存在什麼特別高深的東西,不就是繪製圖片嘛,我心中有一種莫名的衝動:我也開發個介面庫出來,把這些網路上的無能之輩統統“打倒”!想當年我參加全國計算機程式設計競賽還得過名次滴,我還不信搞不定它了!

        在Windows上做介面,說白了就是做控制元件自繪。我安排手下三個人各做5個標準控制元件的自繪工作,我負責視窗標題欄、選單欄和工具欄的自繪。剛接手做的時候,真的還挺麻煩的,看了不少的資料。


        幸好在CodeProject上面找到了很多控制元件的自繪的類,還找到了很多的文章,比如滾動條如何自繪等等。這些文章寫的都是非常有技術含量,後面用在程式中發現還比較穩定的。我們4個人經過1個月的奮鬥終於出了一個草稿版,視窗、控制元件都實現出了QQ的樣子,不過在某些程式互動操作上還存在一些瑕疵,但我們4個人看看還說的過去。老闆如期而至,用了一下我們的類QQ版IM。他體驗完後給我的評價是如果不操作介面感覺還行,但一操作就感覺有很多問題:介面卡、閃爍厲害、控制元件很彆扭、位置錯亂…… 我向老闆解釋了其中的緣由,不過他好像並沒有聽進去。從一開始對我那麼高的期望,現在一下子有點失落的感覺。說實在的有種對不住老闆發的工資,還有種辜負他期望的感覺。回到家裡連續幾夜都沒有睡踏實。之前的豪言壯語都已經煙消雲散了。如果繼續沿著我們自己開發的這個介面庫,在短時間內解決掉這些問題是不太可能的,因為裡面有很多的介面細節,而且Windows控制元件自繪方式的介面要做到完全不閃爍是很難的。知道前路艱險,所以向老闆提出了離開的想法,老闆在幾次挽留後同意了我的請求。

        之前的失敗教訓告訴我:第一、不做自己不擅長的,讓專業的人做專業的事;第二、不搞個人英雄主義,成也“英雄”,敗也“英雄”。

        前兩年又找了一家網際網路公司,他們家之前就用了開源庫Duilib,效果要比我之前做的介面要好很多。


        不過他們也是遇到了介面升級難的問題。公司想要做自動化測試這塊,但是DUILib是DirectUI介面庫的一種,視窗上沒有控制元件的控制代碼,大家都不知道如何讓自動化測試工具找到視窗上的控制元件和他們的函式。另外Duilib在多主題、多語種和多色調上面都不支援,我們團隊沒有時間去開發這樣的新功能,我第一時間想到的就是找開源庫作者來增加這樣的功能。但是最後的結果是那個作者不願意配合我們做這項工作,不過後來想想也是,他沒有收我們的費用憑什麼為我們服務。但是公司的計劃不容拖延,我必須迎頭趕上。團隊有人提出我們自己修改Duilib的程式碼,我否定了這個方案,因為介面的複雜度很高,弄不好又要重蹈覆轍,對公司對團隊都非常不好,而且我們自己的團隊更應該關注自己業務的開發,不能分散精力,讓專業的事情讓專業的人來做才對。後面我又瞭解到迅雷有一款Bolt的介面庫,效果真心地不錯,也讓我們迷戀了一段時間。


        最後放棄Bolt介面庫的原因有四個:

        第一、Bolt介面庫沒有現成的控制元件,如果我們要做一個自定義的Listview則需要好多天的程式碼編寫;

        第二、Bolt的學習時間長,成本太高,還需要學習Lua指令碼;

        第三、Bolt不提供原始碼,對網際網路公司來說,如果用在軟體裡的介面庫沒有原始碼很容易被別人控制,雖然迅雷公司一再地聲稱信譽和商業道德。但對更多企業來說,這點沒有真正的約束作用;

        第四、免費的方案,我們之前已經吃到DUILib庫的苦頭了,免費的東西別人就可以坐視不管,而Bolt在迅雷內部只是一個部門工具而已,並不是一款獨立運營的產品,如果我們以後發現哪裡功能不滿足如何找到負責的人修改和維護呢?這點仔細想想是很可怕的:如果我們的產品已經發布使用,突然有一天介面庫發生崩潰了,找誰去?哭也沒用了。這個風險太大!

        後面通過百度搜索找到了幾家收費的介面庫,UIEasy的DSkinLite,UIPower的DirectUI,Bodsoft DirectUI Library。初步的映像是UIPower的價格是最貴的。


        其他兩家的價格優勢是很明顯的。幾千到一萬之間。後來瞭解到UIEasy的DSkinLite與SkinMagic是差不多的,所以它被放棄了。


        UIEasy也有DirectUI,但試用下來感覺是個半成品,所以也不去考慮它了。和老闆商量後,最後採購了Bodsoft的DirectUI,最終以9700元拿到了產品和所有的原始碼。


        本以為找到了介面的孃家了,可惜後面的事情令我不堪回首。之前答應我的服務後面幾乎沒有怎麼兌現。介面庫中Bug非常多,每次找他們修改還找理由說是我們使用上的問題。我當初非常氣憤,決心要訴諸法律,但我轉念一想,如果這個事情鬧大了,對我自己也不好,至少也有失察之責,弄不好我又得離職,所以我後面就忍了下來。真想不到搞個介面這麼麻煩啊。我當時心裡在琢磨,Bodsoft應該是個小公司,否則不會這麼輕易地幹出如此拙劣的服務。我想以後有機會要過去看看,會會這些不講信用的人。這次的採購經歷又讓我知道了購買重要東西的時候必須上門視察一下,否則吃了苦頭只能往自己肚子裡咽。

        選擇Bodsoft有我對價格的考慮,現在發現不能因為價格而草率決定誰適合。作為使用者來說,說實在的,要從網站上去對比真的很難比出誰好誰壞,只有來真格才行。能選擇的也只有UIPower了,它當初因為價格太高第一個被我們排除出去的,現在又要重現拉回來重新評估,矛盾複雜的心情難以言說。


        這次老闆和我們開了一個會議,反省了幾點:

第一、在介面開發上進度延誤的太嚴重了,必須以最短的時間追上來,市場不等人;

第二、採購東西要講究價效比,而不是一味地追求便宜;

第三、介面方面之前的預算重新弄,根據市場行情來,不再自己搞一套心理預期。有了老闆這個底子,我心理有譜了。

正所謂吃一塹長一智,要讓我相信網路上的誰現在都是不可能的了,必須通過技術和法律手段來確保合作的結果,我不想再失誤一次,這次必須成功!我讓手下把介面中遇到的問題和未來需要的功能都列了一張表,作為我們與UIPower溝通的主要內容了。我們自己制定了幾個合作原則:

第一、UIPower必須針對我們關係的問題提供可以執行的Demo;

第二、涉及到定製這塊的,必須有詳細的報價單;

第三、把所有的要求列入合同並確定具體的懲罰措施;

第四、必須拿到DirectUI的所有原始碼。

第五、必須到UIPower辦公現場實地考察一下,耳聽為虛,眼見為實。

       以上的原則從技術和法律兩個層面上進行了未來結果的保證;

我們根據以上幾個原則與UIPower進行了接觸,最後達成了合作。合作過程還算順利,但也暴露出了一些問題,比如他們在客戶分配時間上有些令人不太滿意,但反過來想,人家客戶數量多忙不過來也很正常。我們希望他們能第一時間處理我們的問題,但很多時候不能如我們所願。不過他們承諾的三天時間解決問題,一般都能按時交付給我們。

現在回過頭來總結一下:

如果你對介面真的非常感興趣,並且有充足的時間,那麼我建議你多看一些開源庫,然後開發屬於“自己”的介面庫,這樣做的好處是,你對自己的介面庫瞭然於胸,最好不要拿免費的開源庫直接使用,因為免費的東西一般不會有完善的後期維護和及時的程式碼更新,這樣的話一旦出現Bug,你就不知道如何迅速修改它。自己開發的介面庫畢竟是經過精心設計和思考的,所以每行程式碼都是非常清晰的。這種方式的前提是你得對介面開發很在行,技術功底也不錯,有足夠的時間和非常平靜的內心,一般需要堅持1-2年。

如果你只是使用介面庫的話,免費的東西首先我不建議你選擇,主要原因就是你沒有付費就得不到相應的技術服務,一旦出了問題(出問題的概率在90%以上)你會感受到孤立無助,徹底“崩潰”。至於收費的東西,也要擦亮眼睛仔細看看他們做過的成功客戶,最好實地考察現場拜訪,參觀一下現場的辦公環境。做介面庫的“皮包公司”特多(其實不光是介面庫方面,做軟體工具的很多都是這樣的,我之前接觸一個報表工具公司的也是如此。),在網路上實在無法搞清楚公司實力如何。公司越大,售後服務相對會好些,公司太小或沒有公司,售後服務如何保證?這是吃到苦頭以後總結出來,希望能幫到與我差不多的屌絲們。