挨踢部落故事匯(34):全棧工程師的自我修煉
原創【51CTO.com原創稿件】 史亞風是一個全棧工程師,5年的開發經驗,積累了很多idea,這些idea從傳統的Java Web到Golang、SVM、hadoop、UI Automation都有涉及,對每一件事情,他都有自己的思考,劍走偏鋒。另外亞風是一位兼職的魔術師,在省賽國賽等魔術大賽中屢屢獲獎,工作之余也經常參加演出,也許是魔術打開了亞風的靈感,如下文中提到的FoolQQ,讓很多開發者看完源碼后大呼很神奇。
零基礎自學編程獨立建站
亞風從2013年7月參加工作開始,一晃,快五個年頭了。他初次接觸編程是在2010年的時候,大一上學期剛結束,春節,大家忙著串親戚、走朋友。在上海創業的叔叔回來過年,吃過年夜飯,照例是一次深入的家庭談話。寒暄過后,叔叔提出想建個網站,一開始亞風是拒絕的,畢竟才大一,只學過C語言,沒接觸過Web,當時連“Web”這個詞都沒聽過。但是看著叔叔焦急的樣子,亞風還是硬著頭皮答應下來。他做事是個激進派,直到現在也是這樣,別人交代的事情總想盡快落實。當時他家里沒有網,第二天就去了附近的網吧,搜搜怎樣建個網站。幸好亞風找了一套視頻,講的HTML/CSS/JS基礎。現在看來當時的路很正確,對初學者而言看視頻跟著做,很容易成功并一步一步建立信心。學了一周,依葫蘆畫瓢地把網站的幾個主要頁面做出來了,滿滿成就感。當然,后面花了一些時間磨合需求,期間也了解了繞不過去的兼容性問題。
但是下一個問題是,后臺程序怎么辦呢?很巧,視頻后面是Java Web開發的內容,從此,也讓他走上了Java工程師的道路。現在他回想起來真的很神奇,如果視頻后面是PHP他現在大概就是PHP工程師了吧。從未接觸過Java的亞風,要從Java基礎語法學到JSP,然后是SQL。周期不短,沒有之前那么順,他叔叔也在催,說實話很多東西似懂非懂,亞風也就學了20多天,還是硬生生把一個后臺程序做出來了。又過了一個學期,暑假,直接去了叔叔那兒,基于用友的ERP、CRM做一些軟件的二次開發,在這個過程中他熟悉了Java體系,學習了Spring、MyBatis、Maven,前端又系統的學了一遍,然后是jQuery等等。接下來每逢寒暑假他都會去叔叔那兒幫忙,在這個過程中不斷完善自己,也為后面的就業積累了實戰經驗。
海量大報文數據持久化
畢業,亞風來到了一家信息領域技術研究公司,接觸的第一個項目就是一個高并發下大報文數據的持久化問題。基于TT/TC做的,但是壓測性能一直上不去。客戶要求單節點18KB報文持久化達到5000TPS,他在數據庫和代碼優化后只達到單節點2100TPS,不過很快事情有了轉機,一次偶然的實驗,亞風單獨壓測TC,發現不經過TT并發寫入多個TC文件可以達到5000TPS,而之前使用TT訪問TC的方式只能基于一個TC文件,結合應用“寫多讀少”的特點,并考慮分布式架構,可以設計出如下架構:
如圖,每臺server上有一個基于socket的read server供Web讀取,而寫的部分并發寫入多個TC文件中。現在需要解決的是,你需要知道某個報文存在哪兒了,也就是在哪臺server的哪個文件中,很顯然只需要在數據庫中保存server所在的IP信息和文件的名稱就ok了,這個數據庫就像hdfs中的namenode一樣。數據表應該至少包含三個字段,分別是IP、TC文件名稱、報文的key。這個案例他還記得很清楚,畢竟當時花了很長時間做實驗,在不改變原有系統架構的情況下,這是個好辦法。另外TC真的很強勁而且穩定。
基于SVM的驗證碼識別
2014年,亞風出差北京,待了半年多。給中國電信集團做內部門戶項目,當時要做一個手機門戶,在和外圍多個系統談接口,進展緩慢。于是他自己提出用爬蟲的方式試試,短短一周完成了很多接口,積累了不少爬蟲經驗,不過很多系統都用到了驗證碼,因此這是一個繞不過去的關。亞風基于像素比較和SVM做了識別,效果不錯,在人工智能在中國火起來之前接觸了這些,還是很不錯的。為了讓讀者有個感性的認識,舉個例子,你經常看到形形色色的驗證碼,它們有不同的顏色,甚至會扭曲的很嚴重。以數字“8”為例
計算機怎么分別這是8而不是6或者7呢?
我們把“8”放大,可以看到圖像是由一個一個色塊組成的,每個色塊都有一個顏色值,再設置一個閾值,大于這個閾值的色塊設置成黑色,反之設置成白色,就得到了一個黑白的數字“8”,這叫二值化,接下來從左到右、自上而下,白色的標記為0,黑色的標記為1,得到一個二進制的數組,這就是SVM的輸入,SVM會自動根據這些數據構建多維空間,根據距離判斷數字到底是幾。這些數字組成多維空間的坐標,這個坐標可以看做一個點,通過很多張“8”圖片的訓練,會形成一個“8”組成的點群,看上去就像銀河系的星河。顯然,判斷某顆星球屬于銀河系,它必然在銀河系劃分的范圍之內,否則可能是別的星系。
基于單例對象的定制Ajax框架Fela
日子平靜的來到了2015,亞風公司各產品的UI也開始基于UED統一設計,摒棄了之前Extjs的厚重,這帶來了一個問題,使用最多的分頁表格頁面需要結合UED提供的CSS重新實現,如果放手不管,每個人都會有自己的實現,又因為樣式和網上的差別大,無法直接套用某個Ajax框架,因此只能定制。需要一個輕量級的Ajax框架,滿足分頁、查詢、各種事件支持、后臺數據解析、表單數據打包、以及盡可能的簡單,Fela應運而生。Fela基于單例對象,和傳統Ajax框架不同,單例對象的使用使得Fela更輕量級,在JavaScript中單例有很多優勢,諸如更小的內存開銷,加載即創建,方便覆蓋重寫,對象結構清晰以及易于和JSON互轉等;
但是這樣做也帶來一些問題,比如一個頁面里只有一個對象,為此,亞風使用克隆代替new來生成新的對象,避免了初始化大對象時構造方法中的耦合,也使得使用者對大對象得以按需取用,書寫結構清晰的代碼。他設計了別名和方法鏈,力求讓一個傳統的表格數據頁面、查詢框等等的開發盡可能簡單。編寫Fela只用了三天時間,不到500行的代碼小而精巧,公司的幾個產品基于此開發,基本做一個頁面前臺只需要簡單的配置,縮短了開發周期。最重要的是,Fela通過有限的API約束了代碼,使得每個人寫出來的代碼看上去都差不多。它的源碼在這>>。
搭載黑科技的表單工具——如意
2016年起,亞風開始完善自己的理論,工作之余擠出時間看了不少書籍,JVM原理、并發編程、TCP/IP原理等等,也做了一些hadoop技術棧的學習,很多東西之前知道,但大都太碎片化,不成體系,讀書讓他理順了他們的關系。在IT行業,知道的越多,就越發覺得自己還很渺小,反倒是讀書少時,更容易自滿。根據項目要求,這一年他花了四分之一的時間獨立做了一個表單平臺——如意。如意相對亞風以前的作品可謂是大制作,為此他還拍攝了一部宣傳片。如意有很多特性,全控件支持、首創可視化業務邏輯設計、多數據源、多租戶、在線JS編程等等。2017年10月份,亞風用這個項目參加了51CTO開發者大賽,很幸運,如意已經入圍了,希望后面它能取得好成績。這一年,他被任命為公司軟件實驗室的執行主任,負責創新型項目的研發、以及疑難問題的解決。
讓計算機識別自己!
亞風參與了很多新興項目,如GIS、聲紋時長識別、問答機器人等等。在GIS項目的開發過程中他提出了一個基于讓計算機通過圖像識別來操作自己的屏幕的方法論,這就好像在計算機前面擺了個鏡子,這樣它就可以看到自己,從而操作自己。這為項目節省了不少人工的工作量,主要用于自動化的批量幾何圖形繪制。后來把它應用在操作QQ上,由于目前讀寫QQ的機器人都是基于爬蟲分析SmartQQ報文來實現的,然而SmartQQ騰訊已經不再維護,其HTTP服務端經常不可用,且經常需要不定時的重啟,于是基于圖像識別,亞風開源了FoolQQ。由于計算機給自己截圖的輸出圖像是高清的,意味著開發者可以直接基于像素比對來實現圖像比對。判斷一個圖像中是否包含某個子圖像就會像下面這樣簡單:
- public static boolean isEqual(int x, int y, BufferedImage image, BufferedImage point) {
- int pointW = point.getWidth();
- int pointY = point.getHeight();
- for (int m = 0; m < pointW; m++)
- for (int n = 0; n < pointY; n++) {
- if (image.getRGB(x + m, y + n) != point.getRGB(m, n)) {
- return false;
- }
- }
- return true;
- }
很幸運,這個項目得到了一些個人開發者的捐助,也讓亞風有了維護下去的動力。
【寫在最后】
2017年很快就結束了,前面是亞風這些年一些代表性的研發,篇幅有限,還有很多例子不說了。程序員的職場很公平,你的待遇幾乎和你的知識成正比,前提是你真的掌握。最后總結一些研發的經驗:
1.架構永遠是第一位的,如果你的性能和目標差很遠,請不要嘗試細節優化;
2.不要重復造輪子,關注IT領域的動態,經常訪問51CTO這樣的網站,知識的廣度可以讓你省不少事;
3.如果非要造輪子,設計則顯得尤為重要,一定要站在用戶角度看問題,要知道你的用戶是誰;
4.個人技術提升和日常工作有時候是沖突的,找到雙贏的點很重要,優秀的員工應該是一個合作者的心態;
亞風和朋友常說,進了這個圈子就是一場看不到終點的修行,最好的結果是,你一直在前行的路上、在離終點越來越近的路上,這就夠了。
如果你也愿意分享你的故事,請加51CTO開發者QQ交流群 669593076聯系群主小官,期待你精彩的故事!
【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】