奔跑吧,Deepiner

不記得是哪位名人說過,當一個人開始頻頻回顧往日時光的時候,就表示這個人開始變老了。所以出於怕死充嫩的本能,我一直不願回憶過去,以避免暴露出油膩中年危機程序員的本質。但在《deepin集結》編輯大人堅忍不拔、孜孜不倦地追稿下,拖延症晚期患者的我也不得不把自己的瑣事從這幾年的歲月中整理出來,以饗大家。

不過,其實我更想說的是關於我們這個團隊的事,而不僅僅是我個人。因為只有在和團隊一起合作的過程中,一個人才會發現自己的短板、無力、以及爬上樹後暴露出來的紅屁股,也才會明白和一個緊密合作、充滿活力的團隊在一起奮鬥,能創造出多少最初誰都難以想象的奇蹟,並且能夠對自己的成長帶來多大的幫助。

說實話,在最開始接觸計算機的時候,我就是一個蒟蒻。在那個古老的年代,我們使用的還是傳說中的Apple II,開機進去以後就是用Basic語言來編程。時到今日,我唯一記得的就是每行代碼都必須有標號,還有PRINT、GOTO、RUN等指令。但我當時對程序究竟是怎麼跑起來的特別迷惑,導致編起程序來簡直是一頭霧水。

我至今還記得最後的考試題目是要打印一個楊輝三角形,要不是當時dwd同學的熱心幫助,說不定就會打破本人中學生涯中的零掛科記錄了。這是我第一次在編程上體會到團隊的好處。

至於首次接觸Linux,那已經是在清華26號樓的時候了。

一次在走廊盡頭的寢室裡,某哥們正在噼裡啪啦地敲鍵盤,屏幕上顯示的不是熟悉的Windows窗口,而是一片黑乎乎的背景,上面綠色的字符在不停地刷屏。我好奇地看著這個當時還比較小眾的系統,真的蠻有傳說中黑客的感覺的。不過看上去用起來挺麻煩,都是手工輸入命令,那我要是真用起來還不得要了老命了。

奔跑吧,Deepiner

ATM遷移

工作以後,東奔西走,不知不覺又轉回到Linux都已經是好些年以後的事情了。在公司剛開始商業化不久的2015年,正好迎來了ATM機轉用Linux操作系統的機會。

在這裡我先介紹下背景,平時我們存取款的ATM機,使用Windows操作系統的佔了90%以上,而其中一大半仍在運行Windows XP。其實從技術層面上來說,Windows與Linux都可以完美支撐ATM業務,但在實踐中,要更換操作系統首先需要通過實例給用戶以信心。

在ATM機系統中,前端系統可以大致劃分為SP與AP兩部分,其中SP主要負責進行設備管理(如出鈔機芯、存款機芯、密碼鍵盤等);AP則負責提供前臺的用戶界面與控制。因為在可行性驗證階段無法改動現有的代碼,因此在此期間,深度團隊決定使用deepin-wine技術對AP進行遷移,但同時因為技術的限制,無法對設備驅動進行遷移,因此暫時只對部分設備,例如密碼鍵盤(PIN)、讀卡器(IDC)、打印機(PTR)等設備進行遷移。

整個遷移過程斷斷續續持續了約4個月的時間,我一直奔波在北京和杭州之間,其他負責開發的同事則是在武漢和杭州之間奔波,加班熬夜更是家常便飯。在這個期間,深度團隊首先需要熟悉ATM系統現有結構與各部分的接口,其次需要適配完全沒有接觸過的外設,同時還要負責給前端界面使用到的IE各模塊填坑,最後更要熟悉業務流程,以通過系統測試。

終於,在以ch同學為首的deepin團隊的努力下,各設備都在深度操作系統上正常運行了起來,與此同時,讀卡、查詢等業務流程也都一一通過了測試驗收。

我們的團隊用短短几個月的時間,實實在在地證明了ATM機上操作系統遷移的初步可行性。

接下來我們需要和更多的干係方討論,這將不再僅僅是技術的問題了,還需要對ATM行業現有的XFS標準進行相應的改造,在儘量保持兼容性的同時,我們需要將XFS標準與Windows解綁,這將涉及到多個廠商共計上萬臺ATM機的遷移改造規劃。將近十個公司的人整整開會討論了一週,終於得到了一個初步的標準草案和技術框架,涉及到API、SPI、以及多個設備標準的改寫。

其中深度團隊負責API/SPI接口規範的修改,並承擔開發對應的管理器系統,需要對下接口SP,對上承接AP。在其後的一個半月內我們發佈了第一版,並在隨後的兩個月內使用增量迭代的方式快速開發,發佈了八個版本更新,穩定了上下接口、功能與性能,修復了多個軟件缺陷,並提供了多個演示程序與開發指導文檔,給其他廠商後續的開發遷移打下了堅實的基礎。要是沒有Iceleaf和其它同事加上的數千行QML代碼,還有不斷騷擾sonald學來的Qt開發知識,我一個人肯定累趴下了也搞不定的。

當然,後期的系統定製、內核panic問題的修復、涉及多個廠商的開發培訓等工作的工作量更大。記得有一個問題是某個設備驅動會導致偶發的系統死機,但是驅動廠商又不願意提供源碼,ch硬是把驅動強行反彙編出來,再將彙編代碼手工轉譯最終查出的bug,並給出了相應的解決方案。其他問題還有例如SP/AP不當耦合導致系統掛起、dbus-daemon內存溢出、I卡驅動導致屏幕撕裂等,zx帶領的深度開發和支持團隊真可說是逢山開路,遇水搭橋,搞定了所有技術問題,這才終於修成了正果。

雲打印

說到系統遷移,那真的是一個大坑。我們在建設生態上首先基於包最多的Debian來做,讓大家可用的軟件基數更大,其次自己也在不停地造輪子,開發了DDE等一系列軟件,此外還主動聯繫搜狗、網易等大廠,向他們要授權,由我們來把對應的Windows軟件重新開發,做出Linux版給大家做貢獻,再就是把Windows、Android、H5等應用遷移過來了。但在Linux下有一個眾所周知的問題,那就是外設驅動比Windows少太多,不說被Linus大爺樹中指的N卡,就說打印機等辦公設備,其實驅動也少很多。

在某個月黑風高的夜晚,deepin同學突然有了個通過網絡來解決打印機問題的想法,然後andrew、zml、synh、wmd、我、葉子等同學開始蓋樓灌水,分析cups、ppd、postscript、samba等一系列技術,果然是互相激發容易有想法,於是我一邊陪著小朋友上奧數課,一邊寫原型,一晚上就用shell+golang做了一個特別粗糙的可用版本,成為了後來深度雲打印的雛形,iceyer小組則在短短兩三個月之內就做出了雲打印產品,不僅功能豐滿了許多,還順手修了好多bug,著實厲害,當然zx和ch團隊後來推出的普適打印棧技術,那就更強了。

可以完全脫離網絡支持原生打印,已經大大超出了我們最初最好的設想。

驅動優化

當然,做操作系統也免不了和內核、處理器打交道。其中,龍芯是國產領域的主要處理器之一。在去年的某個項目裡剛好接觸到了龍芯3a1000,該系統有個關鍵的指標就是數據處理的吞吐量。

在之前的系統上,數據處理的吞吐量是每秒500Mbps,由於剛開始無法接觸到驅動程序源碼,只能根據系統表現與測試程序的代碼對可能產生影響的系統參數進行調整,包括編譯參數例如:CONFIG_HZ、CONFIG_NO_HZ、CONFIG_IRQ_TIME_ACCOUNTING,運行參數例如sched.下的各參數,測試程序使用的內核函數如msleep、schedule、usleep_range等,而內核代碼更是從2.6.32一直追蹤到3.10……

看材料、讀代碼、插樁、測試,中間haitao負責構建系統和集成各方補丁,我則負責寫片段代碼,兩個人一起跑客戶、調設備和熬夜加班,終於在一個多月後,把問題定位到了。原來,設備驅動程序在從外設到內部數據處理之間的數據轉換環節使用了一個低效的C語言實現,但實際上在內核中有更高效的指令集實現,僅需要修改一行代碼,就能把系統吞吐性能從500Mbps提高到了740Mbps,當我們告訴設備廠商和用戶問題原因和解決方案的時候,大家真感覺神了,原來只需要這麼小的改動就能提高50%的性能。當時我的心裡確實是挺高興的,不僅是因為解決了一個懸疑已久的技術問題,還因為真的是幫到了所有人,而不是技術自嗨。

奔跑吧,Deepiner

文件快搜

在寫程序方面,我應該算是一個oldschool,如果硬要在程序漂亮的界面和更高的運行性能之間做一個選擇的話,十有八九我會選擇後者。這導致在深度內部曾經流傳過一個段子,說是我喜歡用Windows記事本編程,天地良心,那玩意兒連語法高亮都沒有,也忒挫了吧,我最多也就是用vim或者nodepad++來寫程序而已……

去年剛好在某項目期間有個空隙,終於有時間可以琢磨下怎麼提高Linux下文件名搜索的速度了,由於之前就瞭解過Windows下類似的軟件everything和Linux下的rlocate,又抽時間寫了幾個kprobes的demo程序熱身,我就這樣開始寫anything了。

由於幾年前就搞過搜索引擎,所以一上手就直接用上了一個簡單的切詞,然後是基於哈希鏈表的倒排索引,加上用kprobes勾住了VFS的相關內核函數監聽文件系統的變更,再設計一個線性樹保存文件樹,經過hualet和synh對代碼與文檔的測試與review,三週內我就出了一個anything的原型。

在cli界面下測試,和find比起來,簡直跑得飛快,兩者的時間比大概是10s : 0.1ms,相差4~5個數量級。接下來我又在deepin同學的催命下,把倒排索引改成了直接基於線性樹的搜索,仍然能保持3個數量級的性能優勢,匆忙結束了原型開發後,我轉過頭來又要繼續接著趕項目。

當然,這個原型確實也挺粗糙的,zccrs和肥貓修復了包括內核版本兼容、緩存區越界、緩存區動態擴展導致地址錯誤等好幾個bug,anything才達到了產品質量,能真正融合進文件管理器中,也終於在今年和大家見面了。

其實我自己心裡不免有點小得意,不過反過頭來看,還是有蠻多東西要繼續完善的,比如要把kprobes改成ftrace減少對於內核不可睡眠的要求,把內核模塊改成eBPF減少對內核的依賴,或者把索引全落盤提高軟件的伸縮性……就像千年前的湖北人屈原說的,路漫漫其修遠兮,吾將上下而求索。

軟件的優化與重構是永不停歇,永遠可以做的更好的。

尾聲

有一位偉人曾說,你的知識邊界就像一個圓,隨著知識的增長,你接觸到未知疆域的邊界也在不斷增長,從而使得你謹記保持謙遜。其實何止知識如此,在深度,接觸到了這麼多高手,sonald、synh、ch、肥貓、hualet、iceyer、zccrs、zx……

平時低調的他們讓你感覺不出什麼來,只有遇到問題一籌莫展,並在他們的幫助和激勵下解決了問題的時候才會恍然大悟,果然是“低調為王”、“高手在身邊”,要不然,是善戰者無赫赫之功?

很慶幸能和這些戰友為伍,一個人單獨可以跑得很快,多個人一起則可以跑得更遠。那麼,就讓我們一起奔跑吧,deepiner。


分享到:


相關文章: