數(shù)據(jù)探索平臺設(shè)計——“CheckStyle”

5 評論 3165 瀏覽 16 收藏 25 分鐘

數(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語句大致如下:

我們做了什么?

  1. 模塊的封裝,對應(yīng)底層數(shù)據(jù)集,如活躍設(shè)備模塊對應(yīng)device_app_active系列數(shù)據(jù)集;
  2. 選項的封裝,對應(yīng)底層數(shù)據(jù)集相應(yīng)字段,如2018-09時間對應(yīng)數(shù)據(jù)集的monthid;
  3. 作業(yè)的封裝,將作業(yè)所有條件轉(zhuǎn)化為SQL語句;
  4. UDF(User Defined Function,用戶自定義函數(shù))的定義,復(fù)雜操作通過UDF實現(xiàn)并優(yōu)化;
  5. 數(shù)據(jù)結(jié)構(gòu)的定義,使用Bitmap,大大提升計算效率;
  6. 數(shù)據(jù)庫選型,使用GP,提升整體效率。
  7. ……

好的工具,真正讓用戶易用,易用背后的邏輯我們沉淀,我們做的多,用戶想的少。用戶專注于數(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:

  1. Validate功能會檢查查詢語法錯誤和Schema的一致性問題。
  2. 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)可能還是:

  1. 準(zhǔn)備代碼樣例;
  2. 在實戰(zhàn)中總結(jié)規(guī)則,結(jié)合開源規(guī)范不斷完善規(guī)則庫;
  3. 對用戶進(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));
  4. 同時根據(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)載。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 真的好厲害!

    回復(fù)
  2. 看到這篇文章,直感嘆自己,真的是老了。

    來自福建 回復(fù)
    1. 哈哈,此話怎講。

      來自北京 回復(fù)
    2. 這么年輕,就已經(jīng)做到這樣了,我們80后快玩不動了。。。

      來自福建 回復(fù)
    3. 向前輩學(xué)習(xí)~

      來自北京 回復(fù)