這段時間陸續(xù)把過往一兩年的工作經(jīng)歷都寫出來栖雾,今天寫曾經(jīng)對我挑戰(zhàn)比較大的一個 --- 自建網(wǎng)站分析系統(tǒng)凳厢。也是一年多前的事兒了治泥。
要說是自建,其實也不完全是准脂,畢竟利用了開源WA工具Piwik。Piwik是MySQL+PHP架構(gòu)的網(wǎng)站分析工具,類似于Google Analytics院塞,但是它的界面,功能太萧求。。。不好用了耗帕,而且有些指標(biāo)計算好像也有問題仿便。不過窑业,它從JS標(biāo)簽收集數(shù)據(jù)到把數(shù)據(jù)發(fā)送到服務(wù)器處理后寫到MySQL數(shù)據(jù)庫里的部分,還是很不錯的。
我們要做的部分,是把mysql的表先進(jìn)行處理品姓,處理成需要的數(shù)據(jù)植酥,再展現(xiàn)到界面上。
技術(shù)棧
先說下技術(shù)棧。其實這部分也糾結(jié)很久,畢竟淤毛,我連專業(yè)的開發(fā)都不是蔗蹋,更別說怎么搞技術(shù)架構(gòu)。開始想的很天真,用SQL把數(shù)據(jù)提出來,并且存成想要的表。后來就成了這樣:每段SQL長達(dá)好幾行,并且各種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就可以了础爬,整個架構(gòu)也就變成了RESTful API+mvvm。其實這部分本不需要這么糾結(jié)音诫,因為只要當(dāng)時多看看類似工具香罐,比如某io港令,就可以看到 json都寫到了html 里淋淀。袍辞。。
前后端分離
我自己開發(fā)就是前后端分開做的,寫前端的時候,數(shù)據(jù)接口都是用的 mock data隐岛,前端開發(fā)的差不多了妒牙,再把mock data拿下來摩瞎,以此作為后端需要的JSON格式上渴,開發(fā)接口次兆。最后是前后端再調(diào)試园蝠。所以大概可以想到善延,在企業(yè)內(nèi)部也是這樣進(jìn)行豆茫,前端后端各干各的,最后聯(lián)調(diào)。
功能規(guī)劃
其實功能很簡單,說是為了易用性祖很,其實我自己覺得很大一部分原因是受開發(fā)能力所累姜钳,畢竟一個新手判呕,做第一個項目,很多東西實現(xiàn)不出來的功能愧哟,就不會去做。不得不實現(xiàn)的抵代,才會去努力研究做。功能上访递,主要涉及了這些工作:
規(guī)劃一共需要多少報表,每張報表以什么樣的圖表展現(xiàn),都需要哪些字段灾炭。(這些決定了至少需要多少個API蜈出,每張報表有一個ID燕刻,當(dāng)傳這個ID給接口的時候过蹂,須返回相應(yīng)報表的數(shù)據(jù))
規(guī)劃有哪些交互的地方,因為每次交互潜的,都意味著報表數(shù)據(jù)會在前端重新渲染,需要重新調(diào)接口下硕。主要有 報表導(dǎo)航丁逝,數(shù)據(jù)導(dǎo)出,選擇日期的datepicker等梭姓,datepicker還需要注意的是霜幼,需要在前后端都做邏輯判斷:起始日期/結(jié)束日期缺失,起始日期晚于結(jié)束日期 這些情況應(yīng)該怎么處理誉尖。
還有就是一些布局上的規(guī)劃罪既。
重點和難點
后端的重點就是數(shù)據(jù)處理:Piwik存入數(shù)據(jù)庫的有十幾張表,但是真正用到的也就那么5,6張... visit(主要記錄每個訪問Session)铡恕,link visit action (主要記錄所有events和pageviews)琢感,conversion (記錄訂單),conversion items(具體的商品信息)探熔,goal(目標(biāo))驹针,action(具體的事件名稱以及page的title等),每個表都有些不同的字段祭刚,所以要使用pandas 根據(jù)需要merge起來牌捷,并且計算所需要的字段,這里面其實特別容易出錯涡驮。
前端相對好很多暗甥。主要一個登錄的user auth,不過因為vue當(dāng)時在國內(nèi)突然火起來了捉捅,所以也是參考了別人的代碼的撤防,當(dāng)然這一部分涉及了要新建個用戶數(shù)據(jù)庫(順便膜拜下vuejs的作者尤雨溪,復(fù)旦附中畢業(yè)后出國的文科生~~~在大楊浦生活了10年的人表示從小就對這所學(xué)校十分向往棒口,無奈自己是學(xué)渣~~~)寄月,另外,前端部分還用了當(dāng)時還不是那么有名的element UI无牵,也就是類似于bootstrap的一套東西(再給餓了么出品的element打個call漾肮,真的很省事,簡化了好多工作茎毁,導(dǎo)航克懊,datepicker忱辅,表格,按鈕等都是現(xiàn)成的 )谭溉,以及圖表庫chartjs(其實這類圖表庫有很多墙懂,比如hichart,echart扮念,還有比較高深的淘寶D3等)损搬。
還有一些學(xué)到的東西
其實現(xiàn)在想想,Python據(jù)說主要用于單純的數(shù)據(jù)分析柜与,以科研領(lǐng)域居多巧勤,真正的用在軟件中的,處理大批量數(shù)據(jù)的可能會需要分布式的計算引擎旅挤,比如這種架構(gòu)hadoop+java踢关。單純用python,可能數(shù)據(jù)量一上來粘茄,就不行了。
不過這一次經(jīng)歷還是很棒的秕脓,幫助我對很多東西有了更深入的理解柒瓣。比如網(wǎng)站架構(gòu),開發(fā)吠架,以及類似Google Analytics這樣的數(shù)據(jù)分析系統(tǒng)原理等芙贫。
那段時間也真的是痛并快樂著,那時候周末和平時晚上要去上JS和Java課傍药,同時研究python和vue磺平,每天早起跑步,然后又長了濕疹坐立難安~~但越是這種狀態(tài)成長的越快拐辽,并且養(yǎng)成了一種迷之自信~~~以后工作中很多東西雖然沒做過拣挪,但是知道只要研究幾小時,幾天肯定就能上手搞出來俱诸,或許這就是在創(chuàng)業(yè)公司的好處吧菠劝。