這段時間陸續(xù)把過往一兩年的工作經(jīng)歷都寫出來,今天寫曾經(jīng)對我挑戰(zhàn)比較大的一個 --- 自建網(wǎng)站分析系統(tǒng)。也是一年多前的事兒了。
要說是自建,其實也不完全是,畢竟利用了開源WA工具Piwik。Piwik是MySQL+PHP架構的網(wǎng)站分析工具,類似于Google Analytics,但是它的界面,功能太。。。不好用了,而且有些指標計算好像也有問題。不過,它從JS標簽收集數(shù)據(jù)到把數(shù)據(jù)發(fā)送到服務器處理后寫到MySQL數(shù)據(jù)庫里的部分,還是很不錯的。
我們要做的部分,是把mysql的表先進行處理,處理成需要的數(shù)據(jù),再展現(xiàn)到界面上。
技術棧
先說下技術棧。其實這部分也糾結很久,畢竟,我連專業(yè)的開發(fā)都不是,更別說怎么搞技術架構。開始想的很天真,用SQL把數(shù)據(jù)提出來,并且存成想要的表。后來就成了這樣:每段SQL長達好幾行,并且各種join,各種concat,各種group by,還有字段的各種運算,這也就算了,問題是,SQL數(shù)據(jù)運算的效率和支持量級都不行,于是最后改成了這樣:后端部分: 先用python把數(shù)據(jù)提出來,pandas處理后,形成幾張大表,以mongoDB的形式存入,再用pandas取出mongodb的表,處理成需要展現(xiàn)的數(shù)據(jù)的API。這樣的好處是,以后提取數(shù)據(jù)都可以只從mongoDB中來,從而不會動到原始的mysql數(shù)據(jù)源。
想著后端用了python,界面也用python吧,畢竟python有數(shù)據(jù)可視化庫,并且?guī)讉€web框架也不錯,可以有自帶的登錄,比如django,flask等。這樣,這套網(wǎng)站分析系統(tǒng)又成了MVC模式。。。后來,界面部分改用了VueJS,也就是說,無論是數(shù)據(jù)改變,用戶交互,渲染都在前端,而后端的python,只需要做到JSON API就可以了,整個架構也就變成了RESTful API+mvvm。其實這部分本不需要這么糾結,因為只要當時多看看類似工具,比如某io,就可以看到 json都寫到了html 里。。。
前后端分離
我自己開發(fā)就是前后端分開做的,寫前端的時候,數(shù)據(jù)接口都是用的 mock data,前端開發(fā)的差不多了,再把mock data拿下來,以此作為后端需要的JSON格式,開發(fā)接口。最后是前后端再調(diào)試。所以大概可以想到,在企業(yè)內(nèi)部也是這樣進行,前端后端各干各的,最后聯(lián)調(diào)。
功能規(guī)劃
其實功能很簡單,說是為了易用性,其實我自己覺得很大一部分原因是受開發(fā)能力所累,畢竟一個新手,做第一個項目,很多東西實現(xiàn)不出來的功能,就不會去做。不得不實現(xiàn)的,才會去努力研究做。功能上,主要涉及了這些工作:
規(guī)劃一共需要多少報表,每張報表以什么樣的圖表展現(xiàn),都需要哪些字段。(這些決定了至少需要多少個API,每張報表有一個ID,當傳這個ID給接口的時候,須返回相應報表的數(shù)據(jù))
規(guī)劃有哪些交互的地方,因為每次交互,都意味著報表數(shù)據(jù)會在前端重新渲染,需要重新調(diào)接口。主要有 報表導航,數(shù)據(jù)導出,選擇日期的datepicker等,datepicker還需要注意的是,需要在前后端都做邏輯判斷:起始日期/結束日期缺失,起始日期晚于結束日期 這些情況應該怎么處理。
還有就是一些布局上的規(guī)劃。
重點和難點
后端的重點就是數(shù)據(jù)處理:Piwik存入數(shù)據(jù)庫的有十幾張表,但是真正用到的也就那么5,6張... visit(主要記錄每個訪問Session),link visit action (主要記錄所有events和pageviews),conversion (記錄訂單),conversion items(具體的商品信息),goal(目標),action(具體的事件名稱以及page的title等),每個表都有些不同的字段,所以要使用pandas 根據(jù)需要merge起來,并且計算所需要的字段,這里面其實特別容易出錯。
前端相對好很多。主要一個登錄的user auth,不過因為vue當時在國內(nèi)突然火起來了,所以也是參考了別人的代碼的,當然這一部分涉及了要新建個用戶數(shù)據(jù)庫(順便膜拜下vuejs的作者尤雨溪,復旦附中畢業(yè)后出國的文科生~~~在大楊浦生活了10年的人表示從小就對這所學校十分向往,無奈自己是學渣~~~),另外,前端部分還用了當時還不是那么有名的element UI,也就是類似于bootstrap的一套東西(再給餓了么出品的element打個call,真的很省事,簡化了好多工作,導航,datepicker,表格,按鈕等都是現(xiàn)成的 ),以及圖表庫chartjs(其實這類圖表庫有很多,比如hichart,echart,還有比較高深的淘寶D3等)。
還有一些學到的東西
其實現(xiàn)在想想,Python據(jù)說主要用于單純的數(shù)據(jù)分析,以科研領域居多,真正的用在軟件中的,處理大批量數(shù)據(jù)的可能會需要分布式的計算引擎,比如這種架構hadoop+java。單純用python,可能數(shù)據(jù)量一上來,就不行了。
不過這一次經(jīng)歷還是很棒的,幫助我對很多東西有了更深入的理解。比如網(wǎng)站架構,開發(fā),以及類似Google Analytics這樣的數(shù)據(jù)分析系統(tǒng)原理等。
那段時間也真的是痛并快樂著,那時候周末和平時晚上要去上JS和Java課,同時研究python和vue,每天早起跑步,然后又長了濕疹坐立難安~~但越是這種狀態(tài)成長的越快,并且養(yǎng)成了一種迷之自信~~~以后工作中很多東西雖然沒做過,但是知道只要研究幾小時,幾天肯定就能上手搞出來,或許這就是在創(chuàng)業(yè)公司的好處吧。