數(shù)據(jù)探索平臺設(shè)計——“CheckStyle”
數(shù)據(jù)工具產(chǎn)品很重要,但是這方面的人才卻很稀缺。本篇文章作者結(jié)合自己的數(shù)據(jù)產(chǎn)品經(jīng)驗,介紹了數(shù)據(jù)探索平臺設(shè)計——“CheckStyle”。
在產(chǎn)品的龐大家族中,有一類很重要的產(chǎn)品,他就是工具產(chǎn)品,工具產(chǎn)品具備強服務(wù)性,并且使用場景時效性極強,高效便捷的工具極大的方便了我們的生活。
隨著大數(shù)據(jù)時代的帶來,在工具產(chǎn)品中又衍生出了數(shù)據(jù)工具產(chǎn)品,隨著數(shù)據(jù)的增長,數(shù)據(jù)的價值也亟待我們?nèi)ネ诰?,各大公司正在積極挖掘數(shù)據(jù)價值,并組建自己的數(shù)據(jù)團(tuán)隊,包括數(shù)據(jù)分析師、數(shù)據(jù)科學(xué)家、數(shù)據(jù)產(chǎn)品經(jīng)理、數(shù)據(jù)工程師等等。
在這樣的契機(jī)下,數(shù)據(jù)探索平臺應(yīng)運而生,作為一款數(shù)據(jù)工具產(chǎn)品,數(shù)據(jù)探索平臺核心功能便是數(shù)據(jù)開放和探索,支持?jǐn)?shù)據(jù)分析師、數(shù)據(jù)科學(xué)家和數(shù)據(jù)工程師等數(shù)據(jù)團(tuán)隊成員和咨詢、BD等業(yè)務(wù)團(tuán)隊成員,用他們習(xí)慣和擅長的工具,協(xié)同進(jìn)行數(shù)據(jù)科學(xué)項目。
數(shù)據(jù)工具產(chǎn)品很重要,與此同時,這方面的人才卻很稀缺。
數(shù)據(jù)工具產(chǎn)品經(jīng)理不僅僅要求傳統(tǒng)產(chǎn)品經(jīng)理的基本能力,還對技術(shù)背景和大數(shù)據(jù)架構(gòu)有一定要求,這里我們不妨看一下業(yè)界領(lǐng)先數(shù)據(jù)產(chǎn)品阿里云對數(shù)據(jù)產(chǎn)品經(jīng)理的要求:
阿里云-高級數(shù)據(jù)產(chǎn)品經(jīng)理
級別:P7\P8
地點:北京、杭州均可負(fù)責(zé)ApsaraDB數(shù)據(jù)庫產(chǎn)品設(shè)計,ApsaraDB數(shù)據(jù)庫服務(wù)是阿里云核心的數(shù)據(jù)類的產(chǎn)品,是阿里云最為重要的PASS平臺之一。
工作內(nèi)容:
1. 完成市場調(diào)研與競爭對手分析,準(zhǔn)確定義數(shù)據(jù)庫/大數(shù)據(jù)具有市場競爭力的產(chǎn)品
2. 規(guī)劃產(chǎn)品的生命周期和交付形態(tài),對項目結(jié)果負(fù)責(zé)
3. 關(guān)注用戶體驗負(fù)責(zé),產(chǎn)出安全、穩(wěn)定、易用的產(chǎn)品
4. 組織研發(fā)、測試、運維、運營的高效溝通
5. 支持業(yè)務(wù)團(tuán)隊完成營收目標(biāo)要求:
1. 計算機(jī)科學(xué)領(lǐng)域(CS)學(xué)士或碩士學(xué)位
2. 對大數(shù)據(jù)架構(gòu)基本了解,有一定的大數(shù)據(jù)架構(gòu)經(jīng)驗
3. 了解以下Hadoop\Spark\HBase\MongoDB\Redis優(yōu)先
4. 了解數(shù)據(jù)庫基本理論、大數(shù)據(jù)基本理論、云計算
5. 程序員/DBA出身優(yōu)先
6. 了解大數(shù)據(jù)方案優(yōu)先
在我們平時閱讀的文章中,也會看大數(shù)據(jù)技術(shù)相關(guān)文章:
類似于《Hadoop架構(gòu)原理》以便于了解我們數(shù)據(jù)探索平臺底層數(shù)據(jù)存儲架構(gòu),從而更好的做數(shù)據(jù)開放和探索。
類似于《為什么Jupyter是數(shù)據(jù)科學(xué)家們實戰(zhàn)工具的首選?》以便于了解我們數(shù)據(jù)探索平臺用戶的日常工作,以更好的迭代產(chǎn)品,讓科學(xué)家們用起來更順暢。
數(shù)據(jù)工具產(chǎn)品很重要,數(shù)據(jù)工具產(chǎn)品人才很稀缺,自然,數(shù)據(jù)工具產(chǎn)品文章也很少。
基于此,結(jié)合自己的數(shù)據(jù)產(chǎn)品經(jīng)驗,簡單談一下數(shù)據(jù)探索平臺設(shè)計中的一個Feature,“CheckStyle”,和大家探討,希望起到拋磚引玉的效果。
本文核心觀點:
因為用戶編寫的代碼可能存在質(zhì)量差、性能低、不規(guī)范、語法錯誤等問題。CheckStyle將使用我們TD的規(guī)則庫,通過平臺和流程來保障代碼質(zhì)量,希望能盡早、盡快、無感解決故障隱患,以節(jié)約時間,提高效率,降低出錯率。
短期內(nèi)會通過代碼樣例,API半自動化實現(xiàn),結(jié)合實踐不斷完善規(guī)則庫形成閉環(huán),最終實現(xiàn)自動優(yōu)化。
同時在一定程度也可以提升用戶的技能,這也是平臺“自動化”的重要一步。
設(shè)計前的小故事
為什么想到設(shè)計“CheckStyle”這個Feature呢?
主要是昨天和一位數(shù)據(jù)分析師同學(xué)閑聊,聽到她隨口吐槽一件工作中的小事,見微知著,聊一下數(shù)據(jù)探索中的“CheckStyle”需求,和大家一起探討哈。
對話大意:
“最近咋樣?。俊笔÷訬個字。
進(jìn)入正題:
分析師:“實習(xí)生寫的SQL真是令人痛心,一堆錯。”
權(quán):“一堆錯?規(guī)范問題?語法問題?業(yè)務(wù)問題?性能問題?或者,都有?”
分析師:“都有,畢竟是實習(xí)生。”
果斷先diss她幾句,招人時咋不想清楚,有經(jīng)驗的好一點,沒經(jīng)驗的就要做好培養(yǎng)的準(zhǔn)備,而且必然是一段時間細(xì)致的培養(yǎng),答復(fù),雖然她也做了準(zhǔn)備,但確實需要時間。
權(quán):“那你現(xiàn)在咋辦?”
分析師:“能咋辦,遇到問題解決問題,一個個看唄!”
權(quán):“那個人力量有限啊,你時間有限,而且我們也只能說熟練使用SQL,不能說精通,大多數(shù)場景能搞定,遇到一些問題也需要查,這種事最好交給機(jī)器做,產(chǎn)品化?!?/p>
分析師:“有意思,說說看?!?/p>
權(quán):“我想想,寫篇文章總結(jié)一下,大家一起探討吧!”
對話基本結(jié)束。
一段簡短的對話,一件工作中的常見的小事,但可以挖掘的點很多。
下面說一下我的想法,“CheckStyle”。
一、“CheckStyle”是什么?
1. 背景
工作中類似的問題太多了,用戶編寫的代碼可能存在質(zhì)量差、性能低、不規(guī)范、語法錯誤等問題。
這里的用戶包括:咨詢、分析師、工程師、科學(xué)家等。
這里的代碼包括:SQL、Python、Scala、R等。(SQL、Python、Scala、R皆為編程語言)
2. 具體場景
這么一說大家感受可能不深。
我們再來看幾個鮮活的例子,看一線中的具體場景:
1. 前段時間一位數(shù)據(jù)科學(xué)家同學(xué)因為輸出數(shù)據(jù)集目錄命名不規(guī)范,導(dǎo)致和DSS的時間分區(qū)功能沖突。
數(shù)據(jù)科學(xué)家在我們印象中已經(jīng)比較專業(yè)了,但依然有可能發(fā)生偏差。
其實“是人就可能會出錯”,因此需要相應(yīng)的規(guī)則和流程來約束,減少出錯率。
2. 前天看到一篇Python性能提升的文章,大意如下:
Python 是機(jī)器學(xué)習(xí)領(lǐng)域內(nèi)的首選編程語言,它易于使用,也有很多出色的庫來幫助你更快處理數(shù)據(jù)。但當(dāng)我們面臨大量數(shù)據(jù)時,一些問題就會顯現(xiàn),因為在這樣的量級上,工作進(jìn)程中加入任何額外的計算都需要時刻注意保持效率。
在默認(rèn)情況下,Python程序是單個進(jìn)程,使用單 CPU 核心執(zhí)行。而大多數(shù)當(dāng)代機(jī)器學(xué)習(xí)硬件都至少搭載了雙核處理器。
這意味著如果沒有進(jìn)行優(yōu)化,在數(shù)據(jù)預(yù)處理的時候會出現(xiàn)「一核有難九核圍觀」的情況,超過 50% 的算力都會被浪費。在當(dāng)前四核處理器(英特爾酷睿i5)和6核處理器(英特爾酷睿i7)大行其道的時候,這種情況會變得更加明顯。
幸運的是,Python庫中內(nèi)建了一些隱藏的特性,可以讓我們充分利用所有CPU核心的能力。通過使用Python的concurrent.futures模塊,我們只需要3行代碼就可以讓一個普通的程序轉(zhuǎn)換成適用于多核處理器并行處理的程序。
測例是將1000張圖片被傳遞到深度神經(jīng)網(wǎng)絡(luò)之前將其調(diào)整為600×600像素分辨率的形式。
優(yōu)化前在酷睿 i7-8700k 6核CPU上,運行時間為7.9864秒,在這樣高端CPU上,這種速度讓人難以接受,優(yōu)化后運行時間降到1.14265秒,速度提升了近6倍!
看完之后確實是拍手稱快,又get了一項新技能,使用Python的concurrent.futures模塊做性能優(yōu)化,節(jié)約時間,提升效率。
同時想到之前我想落地線下消費標(biāo)簽使用的一份poiid數(shù)據(jù)集,代碼早早的寫好,然而排隊等待集群資源運行就等了1天。
查了一下原因,也沒有大任務(wù)阻塞集群,確實是大家的任務(wù)很多,一個接一個。
3. 解決問題
想要解決,從供需兩端考慮:
- 供給端,擴(kuò)展集群資源,這個我們正在做,升級到新集群。
- 需求端,大家任務(wù)多,集群資源有限,必然存在矛盾,這時可以評估任務(wù)的優(yōu)先級,保證緊急任務(wù)優(yōu)先處理,另一方面,總體任務(wù)數(shù)量和順序優(yōu)化后,我們也可以對單個任務(wù)的運行時間和效率進(jìn)行優(yōu)化,優(yōu)化代碼,做性能提升,從而提升整體運行效率。
要想優(yōu)化代碼,做性能提升:
- 會對用戶有更高的技能要求,督促用戶自我提高,在這方面TDU有也相關(guān)技能課幫助提高,但畢竟術(shù)業(yè)有專攻,是不是應(yīng)該降低用戶的技術(shù)門檻,讓其更專注于在具體業(yè)務(wù)和場景中探索數(shù)據(jù)價值。
- 學(xué)習(xí)需要時間,且學(xué)無止境,不建議讓用戶承載過多的負(fù)擔(dān)。
因此,代碼性能提升我可能更傾向于平臺側(cè)智能管理,平臺自動優(yōu)化提升性能,并info給用戶相關(guān)建議,感興趣的用戶可以參考info自我提升,進(jìn)一步學(xué)習(xí)并反饋規(guī)則給TD規(guī)則庫,形成閉環(huán)不斷優(yōu)化。
不感興趣的用戶可以直接忽略優(yōu)化info專注業(yè)務(wù),平臺自動優(yōu)化運行,做到無感體驗,不知不覺中提升整個集群任務(wù)的運行效率。
4. 未來趨勢
未來趨勢也應(yīng)該是朝“自動化”方向走。
現(xiàn)在我們Data ATM數(shù)據(jù)提取平臺的運行機(jī)制類似,前端展示極簡的界面,用戶拖過簡單拖拽完成任務(wù)的輸入輸出,后端是將用戶選擇的模塊轉(zhuǎn)化為SQL在提交到GP網(wǎng)關(guān)(Greenplum數(shù)據(jù)庫)。
即降低用戶的技術(shù)門檻,讓其更專注于在具體業(yè)務(wù)和場景中探索數(shù)據(jù)價值。
以計算2018年9月APP活躍設(shè)備數(shù)統(tǒng)計為例:
在用戶操作層面,用戶可以感知的就是簡單拖拽活躍設(shè)備和篩選設(shè)備統(tǒng)計兩個功能模塊,然后選擇時間2018-09,僅此而已,完成數(shù)據(jù)提取。
大大降低用戶的操作門檻,這也是我們數(shù)據(jù)提取平臺的初衷,讓業(yè)務(wù)人員(銷售、咨詢等)在不懂SQL等語言時也能通過簡單拖拽完成數(shù)據(jù)提取,讓其更專注于在具體業(yè)務(wù)和場景中探索數(shù)據(jù)價值。
數(shù)據(jù)提取平臺,作為一款數(shù)據(jù)產(chǎn)品,簡單易用的背后是什么?
還是看這個例子:
作業(yè)轉(zhuǎn)化為SQL語句,然后提交到GP網(wǎng)關(guān),SQL語句大致如下:
我們做了什么?
- 模塊的封裝,對應(yīng)底層數(shù)據(jù)集,如活躍設(shè)備模塊對應(yīng)device_app_active系列數(shù)據(jù)集;
- 選項的封裝,對應(yīng)底層數(shù)據(jù)集相應(yīng)字段,如2018-09時間對應(yīng)數(shù)據(jù)集的monthid;
- 作業(yè)的封裝,將作業(yè)所有條件轉(zhuǎn)化為SQL語句;
- UDF(User Defined Function,用戶自定義函數(shù))的定義,復(fù)雜操作通過UDF實現(xiàn)并優(yōu)化;
- 數(shù)據(jù)結(jié)構(gòu)的定義,使用Bitmap,大大提升計算效率;
- 數(shù)據(jù)庫選型,使用GP,提升整體效率。
- ……
好的工具,真正讓用戶易用,易用背后的邏輯我們沉淀,我們做的多,用戶想的少。用戶專注于數(shù)據(jù)業(yè)務(wù),讓業(yè)務(wù)方和工具平臺都發(fā)揮最大的價值。
發(fā)生上述這些問題,有些可能是初出茅廬不諳世事的實習(xí)生,無經(jīng)驗,技能上的短板、未養(yǎng)成好的規(guī)范,也可能是現(xiàn)在玩轉(zhuǎn)業(yè)務(wù),熟練SQL的高級數(shù)據(jù)分析師,畢竟學(xué)海無涯,技能上的盲點永遠(yuǎn)存在。
還可能是用戶有相關(guān)經(jīng)驗,但就是百密一疏,或者寫代碼一時隨意, 最終結(jié)果將會因為一人疏忽造成整個集群任務(wù)隊列效率低下,或者之后運用時出現(xiàn)意想不到的錯誤。
相關(guān)問題還是需要嚴(yán)格的約束,從平臺和流程層面管控。
將數(shù)據(jù)探索任務(wù)中遇到的各種問題整理后,結(jié)合開源規(guī)范,一起作為我們TD的規(guī)則庫。
綜上在此嚴(yán)格定義一下CheckStyle:
CheckStyle將使用我們TD的規(guī)則庫,通過平臺和流程來保障代碼質(zhì)量,希望能盡早、盡快、無感解決故障隱患,以節(jié)約時間,提高效率,降低出錯率。
短期內(nèi)會通過代碼樣例,API半自動化實現(xiàn),結(jié)合實踐不斷完善規(guī)則庫形成閉環(huán),最終實現(xiàn)自動優(yōu)化。
二、為什么要做“CheckStyle”?
在說完什么是CheckStyle后,再來說為什么要做CheckStyle就很清晰了。
1. 動力
因為用戶編寫的代碼可能存在質(zhì)量差、性能低、不規(guī)范、語法錯誤等問題,通過CheckStyle可以盡早、盡快、無感解決故障隱患,以節(jié)約時間,提高效率,降低出錯率。
同時在一定程度也可以提升用戶的技能,完善我們TD規(guī)則庫。
這也是平臺“自動化”的重要一步。
2. 阻力
代碼樣例的梳理和準(zhǔn)備。
規(guī)則庫的制定,包括常見問題和開源規(guī)范的梳理。
產(chǎn)品研發(fā)側(cè)的設(shè)計和研發(fā),DataCloud已經(jīng)停止迭代,綜合考慮DSS需求池和研發(fā)資源的現(xiàn)狀,現(xiàn)在有支持新集群等緊急需求在做,本需求相對而言優(yōu)先級低一些,可以后續(xù)排期考慮。具體研發(fā)細(xì)節(jié)可以一起討論。
三、怎么做“CheckStyle”?
我們不妨參考借鑒一下同行,挑選國內(nèi)外的兩款優(yōu)秀競品,這里選擇國外的Dataiku DSS和國內(nèi)的阿里云數(shù)加:
1. Dataiku DSS 實踐
Dataiku DSS還處于一個相對早期的狀態(tài),在“CheckStyle”這一塊的實踐主要是Validate和code samples:
- Validate功能會檢查查詢語法錯誤和Schema的一致性問題。
- code samples功能則是插入代碼樣例,供用戶參考編輯。
2. 阿里云數(shù)加 實踐
我和阿里云的同學(xué)們溝通過,確實是踩過了很多坑,在推廣過程中碰到大量的SQL優(yōu)化問題,我們的結(jié)論也一致,無論是通過培訓(xùn)還是其他方式,其實都遠(yuǎn)沒有系統(tǒng)固化規(guī)則更好,用系統(tǒng)流程化的方式解決問題是平臺能夠規(guī)?;暮诵囊?。
數(shù)加也確實走在行業(yè)的前列,基于IntelliJ IDEA開發(fā)插件MaxCompute Studio,MaxCompute 編譯器是新一代的SQL引擎,顯著提升了SQL語言編譯過程的易用性與語言的表達(dá)能力。
定制化開發(fā),更加靈活,功能強大。
本篇主要介紹以下兩點:
(a)MaxCompute Studio會對代碼進(jìn)行靜態(tài)編譯檢查并給出修改建議,同時有計算健康分體系,提交有錯誤的腳本會被扣計算健康分,導(dǎo)致以后提交任務(wù)的優(yōu)先級被下調(diào)。
(b)使用MaxCompute SQL,規(guī)范代碼,預(yù)防預(yù)期外的錯誤,并對代碼運算效率進(jìn)行優(yōu)化。
2.1 MaxCompute Studio
如上圖,靜態(tài)編譯發(fā)現(xiàn)第一個 insert 語句中的UDF wm_concat函數(shù)參數(shù)錯誤。
如上圖,鼠標(biāo)停止在錯誤或者警告上,會直接提示具體錯誤或者警告信息。如果不修改錯誤,直接提交,會被 MaxCompute Studio 阻攔。
修改完畢后,再次提交,便可以順暢運行。
2.2 MaxCompute SQL
基于SQL,使用MaxCompute SQL,規(guī)范代碼,預(yù)防預(yù)期外的錯誤,并對代碼運算效率進(jìn)行優(yōu)化:
(a)代碼規(guī)范,如別名,即子查詢必須要有別名。建議查詢都帶別名。
(b)預(yù)防預(yù)期外的錯誤,如精度問題,Double 類型因為存在精度問題,不建議在關(guān)聯(lián)時候進(jìn)行直接等號關(guān)聯(lián)兩個 Double 字段。一個比較推薦的做法是把兩個數(shù)做下減法,如果差距小于一個預(yù)設(shè)的值就認(rèn)為是相同,比如 abs(a1- a2) < 0.000000001。
(c)代碼優(yōu)化,如分區(qū)裁剪,對分區(qū)列指定過濾條件,使得 SQL 執(zhí)行時只用讀取表的部分分區(qū)數(shù)據(jù),避免全表掃描引起的數(shù)據(jù)錯誤及資源浪費。
3. TD 實踐
具體落地可以先從SQL語言及相關(guān)用戶入手,后期視情況慢慢推廣:
1. 代碼樣例的準(zhǔn)備,結(jié)合日常工作中的常見作業(yè),總結(jié)提煉幾套常見的代碼樣例和常用語法。
2. 規(guī)則庫的制定,包括常見問題和開源規(guī)范的梳理,目前規(guī)則可以分為以下幾類:
(1)語法類規(guī)則,如類方法的歸屬問題,主要由編譯器處理;
(2)規(guī)范類規(guī)則,如表、目錄的命名規(guī)范,注釋等,不斷總結(jié)+借鑒開源規(guī)范;
(3)質(zhì)量類規(guī)則,如參數(shù)檢查、分母0、NULL值等,不斷總結(jié)+借鑒開源規(guī)范;
(4)性能類規(guī)則,如并行計算、分區(qū)、重復(fù)計算、大表裁剪等,不斷總結(jié)+借鑒開源規(guī)范;
(5)其他規(guī)則。
3. 產(chǎn)品研發(fā)側(cè)的設(shè)計和研發(fā),整體流程:
(1)平臺側(cè)配置好規(guī)則庫;
(2)用戶提交代碼后,結(jié)合規(guī)則庫進(jìn)行校驗;
(2.1)平臺可以自動化處理重要缺陷,顯示相關(guān)info,任務(wù)提交運行;
(2.1.1)感興趣的用戶可以參考info自我提升,進(jìn)一步學(xué)習(xí)并反饋規(guī)則給TD規(guī)則庫,形成閉環(huán)不斷優(yōu)化;
(2.1.2)不感興趣的用戶可以直接忽略優(yōu)化info,專注業(yè)務(wù),做到無感體驗,相關(guān)info記錄留存,供資深分析師總結(jié)規(guī)則并反饋規(guī)則給TD規(guī)則庫,形成閉環(huán)不斷優(yōu)化;
(2.2)平臺無法自動化處理重要缺陷,顯示更改tip,任務(wù)被阻斷,用戶可以結(jié)合更改tip,并可請教資深的分析師一起協(xié)助修改,修復(fù)代碼后才可提交,并在此檢驗規(guī)則,同時將規(guī)則反饋給TD規(guī)則庫,形成閉環(huán)不斷優(yōu)化;
(3)完成任務(wù)提交,不知不覺中提升整個集群任務(wù)的運行效率,最終實現(xiàn)盡早、盡快、無感解決故障隱患,以節(jié)約時間,提高效率,降低出錯率。從長遠(yuǎn)考慮,將自研和借鑒市場上的SQL Studio,定制化開發(fā),更加靈活。
綜合考慮DSS需求池和研發(fā)資源的現(xiàn)狀,短期內(nèi)可能還是:
- 準(zhǔn)備代碼樣例;
- 在實戰(zhàn)中總結(jié)規(guī)則,結(jié)合開源規(guī)范不斷完善規(guī)則庫;
- 對用戶進(jìn)行規(guī)則庫和代碼樣例的相關(guān)培訓(xùn),并結(jié)合TDU的優(yōu)質(zhì)教育資源,進(jìn)行專項技能提升(備注:相關(guān)培訓(xùn)可以視用戶的興趣和時間酌情參與,但最好有幾位資深分析師全程深入學(xué)習(xí),以備在關(guān)鍵時刻提供相關(guān)指導(dǎo));
- 同時根據(jù)規(guī)則在平臺側(cè)封裝相關(guān)API供用戶使用,結(jié)合實踐不斷完善規(guī)則庫形成閉環(huán),最終實現(xiàn)自動優(yōu)化。
最后,引用曾鳴老師的一段話:
“未來創(chuàng)業(yè)很重要的一個方向就是把傳統(tǒng)上大家認(rèn)為必須由人來做的服務(wù),把它中間越來越多的環(huán)節(jié)拆解,變成可以在線化、機(jī)器化、智能化完成的任務(wù)?!?/p>
個人認(rèn)為,這也是數(shù)據(jù)工具產(chǎn)品的發(fā)展方向,復(fù)雜工作簡單化,簡單工作智能化。
以上便是我關(guān)于“CheckStyle”的初步想法,歡迎大家一起探討。
作者:楚權(quán)(MR.Quan),東北大學(xué)2016屆畢業(yè)生,TalkingData高級數(shù)據(jù)產(chǎn)品經(jīng)理,熱愛數(shù)據(jù)&產(chǎn)品&技術(shù),不斷挑戰(zhàn)自我。
本文由 @楚權(quán)?原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
真的好厲害!
看到這篇文章,直感嘆自己,真的是老了。
哈哈,此話怎講。
這么年輕,就已經(jīng)做到這樣了,我們80后快玩不動了。。。
向前輩學(xué)習(xí)~