第二期周总结
第二期的周總結(jié),這次學(xué)習(xí)的內(nèi)容可能沒有上次那么廣泛,主要是因?yàn)檫@周我負(fù)責(zé)的模塊需要測(cè)試并進(jìn)行上線,所以主要學(xué)習(xí)了解的就是工程開發(fā)方面的內(nèi)容,準(zhǔn)確說(shuō)是部署上線的內(nèi)容,所以本周主要簡(jiǎn)單總結(jié)這次上線過(guò)程的一些內(nèi)容,包括如何精確評(píng)估開發(fā)時(shí)間、一般項(xiàng)目部署上線的過(guò)程等;
本文目錄:
如何精確評(píng)估開發(fā)時(shí)間
項(xiàng)目的部署上線
機(jī)器學(xué)習(xí)
閱讀
效率方法
如何精確評(píng)估開發(fā)時(shí)間
最近一個(gè)月其實(shí)都在忙著自己負(fù)責(zé)的推薦方面的項(xiàng)目上線的事情,但是從一開始說(shuō)出可以交付接口給后端開發(fā)同事測(cè)試的時(shí)候,我就犯下了一個(gè)大錯(cuò)誤--高估自己開發(fā)效率,低估自己寫bug的能力了。。。這直接導(dǎo)致那一周不得不周末都加班來(lái)彌補(bǔ)我的錯(cuò)誤。
另外,這算是自己獨(dú)立上線自己的模塊,所以其實(shí)對(duì)于上線的經(jīng)驗(yàn)還是非常缺乏,所以其實(shí)也導(dǎo)致需要付出更多時(shí)間來(lái)進(jìn)行工程上的優(yōu)化,以滿足線上的性能要求。
然后這周一剛好看到一篇如何精確評(píng)估開發(fā)時(shí)間的文章,我覺得寫得也是非常好,也受益匪淺,這里就結(jié)合文章以及自己這次上線的經(jīng)歷來(lái)簡(jiǎn)單說(shuō)說(shuō)如何精確評(píng)估開發(fā)時(shí)間。
1. 明確任務(wù)目標(biāo)
首先應(yīng)該是好好熟讀產(chǎn)品經(jīng)理寫的產(chǎn)品需求評(píng)審,要知道自己需要負(fù)責(zé)完成的工作任務(wù)有哪些,然后判斷功能能否實(shí)現(xiàn),有哪些存在的問題,這都需要和產(chǎn)品經(jīng)理好好溝通,必須非常明確需求,否則開發(fā)到一半才發(fā)現(xiàn)理解錯(cuò)誤,那就非常糟糕了;
除了和產(chǎn)品經(jīng)理好好溝通,還需要好好溝通的當(dāng)然就是同個(gè)項(xiàng)目的開發(fā)同事,特別是相互之間的工作有依賴關(guān)系的,比如你需要調(diào)用另一個(gè)同事的接口,獲取數(shù)據(jù),那么就需要了解下這個(gè)接口的請(qǐng)求和返回結(jié)果,接口的性能,也就是調(diào)用一次所需要的時(shí)間等,并且要確認(rèn)同事不會(huì)隨便修改這個(gè)接口,因?yàn)榭赡芡轮皇切薷姆祷亟Y(jié)果的一個(gè)數(shù)據(jù)名稱,你的代碼就有很多地方需要進(jìn)行修改了。
2. 更精細(xì)的任務(wù)排期
我們每次經(jīng)過(guò)產(chǎn)品需求評(píng)審后,確認(rèn)本次迭代需要完成的工作后,都需要各自給出自己的任務(wù)排期,之前我們都是按照天為單位將工作任務(wù)進(jìn)行拆分,不過(guò)按照天來(lái)劃分可能還是不夠精細(xì),對(duì)于工作任務(wù)的拆分還不夠細(xì),
文章作者給出是應(yīng)該按照小時(shí)來(lái)拆分任務(wù),目標(biāo)當(dāng)然就是讓拆分后的工作任務(wù)更加的具體,而且這種拆分方法,我認(rèn)為也是有助于自己對(duì)任務(wù)的更加全面的認(rèn)識(shí)和了解,更容易去發(fā)現(xiàn)自己可能會(huì)疏忽的地方,比如某個(gè)功能的實(shí)現(xiàn),需要得到同事的幫助,那么就要提前和同事進(jìn)行溝通;或者某個(gè)功能的實(shí)現(xiàn)可能會(huì)高于自己的預(yù)估時(shí)間等等。
另外,按照小時(shí)為單位安排工作,也需要你知道自己每天實(shí)際開發(fā)的時(shí)間有多少,畢竟很難做到可以長(zhǎng)時(shí)間專注的寫代碼,會(huì)有很多其他因素影響自己的工作效率,自己的專注力、同事的咨詢、固定的周會(huì)等等。
因此,需要給自己預(yù)留一定的緩沖時(shí)間,可能自己覺得需要1天就可以完成的功能,但可以再多留1天左右來(lái)防止可能的意外狀況,畢竟 bug 總是很難避免的,這還需要你有快速解決 bug 的能力,否則可能調(diào)試一個(gè) bug 就會(huì)花費(fèi)你半天甚至一天的時(shí)間。
3. 記錄和復(fù)盤
第一次項(xiàng)目上線,可能多少都會(huì)出現(xiàn)不少問題,因此這個(gè)過(guò)程出現(xiàn)了問題,最好就是可以及時(shí)記錄問題,然后項(xiàng)目順利上線后,自然需要復(fù)盤,復(fù)盤的問題,可以是:
任務(wù)排期預(yù)估的開發(fā)時(shí)間和實(shí)際所用時(shí)間是否一致?相差較多的有哪些任務(wù),原因是什么。
開發(fā)過(guò)程中出現(xiàn)的未預(yù)料到的事情有哪些
開發(fā)過(guò)程中出現(xiàn)的bug,怎么解決等
新學(xué)習(xí)到的知識(shí)點(diǎn),需要加強(qiáng)鞏固的知識(shí)點(diǎn)等
項(xiàng)目的部署上線
這部分只是根據(jù)我這次的經(jīng)歷所總結(jié)的,可能有些地方不太準(zhǔn)確或者有些遺漏,僅供參考。
關(guān)于一個(gè)項(xiàng)目的部署上線,也可以說(shuō)是如何開發(fā)一個(gè)項(xiàng)目,特別是機(jī)器學(xué)習(xí)項(xiàng)目,很久之前其實(shí)我也寫過(guò)這樣一個(gè)系列,所以非常相似,那個(gè)系列的文章:
如何構(gòu)建一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目
這篇文章也介紹了構(gòu)建一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目包括好幾方面的內(nèi)容,結(jié)合我這次的項(xiàng)目上線過(guò)程,那就是這樣的:
1. 明確項(xiàng)目的目標(biāo)
這次的項(xiàng)目,準(zhǔn)確來(lái)說(shuō)只是項(xiàng)目中的一個(gè)模塊,是推薦方面的內(nèi)容,目標(biāo)就是提升收藏率了。
2. 獲取數(shù)據(jù)
數(shù)據(jù)的獲取其實(shí)就很簡(jiǎn)單,來(lái)自同事的提供,無(wú)論是線上的用戶數(shù)據(jù)、用戶行為數(shù)據(jù),還是需要推薦的內(nèi)容,不過(guò)因?yàn)樽鐾扑]這個(gè)模塊并不是項(xiàng)目創(chuàng)立之時(shí)就有計(jì)劃做這個(gè)模塊的,所以這個(gè)過(guò)程中其實(shí)有不少數(shù)據(jù),特別是用戶行為的數(shù)據(jù)是缺少了很多,也算是我的困難之一了。
3. 特征工程
這部分應(yīng)該是包括分析數(shù)據(jù)和預(yù)處理數(shù)據(jù)了,之前做圖像的時(shí)候,其實(shí)更多的是對(duì)數(shù)據(jù)的處理,比如篩選過(guò)濾不合格的圖片,給圖片打標(biāo)簽(劃分到對(duì)應(yīng)類別)等,特征工程就真的是基本很少使用。
而推薦系統(tǒng)對(duì)特征工程的要求還是很高的,特別是我一開始選擇的是傳統(tǒng)的機(jī)器學(xué)習(xí)算法,就更加需要好好做特征工程,當(dāng)然這部分就需要有一些業(yè)務(wù)知識(shí),知道哪些特征有助于完成任務(wù)目標(biāo)。
4. 模型訓(xùn)練和驗(yàn)證
在吳恩達(dá)老師的機(jī)器學(xué)習(xí)課程中,對(duì)于模型訓(xùn)練,給出的建議是先建立一個(gè) baseline,也就是可以完成所需功能,但是性能方面并不一定很好,這也是為了快速迭代。
因此,在這方面,我選擇的自然是 lr 和 gbdt 算法,并且最終選擇速度更快的 lr 算法,可以先完成推薦的功能即可,后續(xù)再逐漸優(yōu)化算法
5. 部署上線
當(dāng)確認(rèn)模型的性能可以基本滿足目標(biāo)需求,那么就需要開始部署上線了,簡(jiǎn)單說(shuō)就是需要編寫一個(gè)服務(wù)接口。這里,我主要是用 python 的 tornado 框架,簡(jiǎn)單介紹下tornadao 框架,來(lái)自中文官方文檔的介紹:https://tornado-zh.readthedocs.io/zh/latest/
Tornado 是一個(gè)Python web框架和異步網(wǎng)絡(luò)庫(kù),起初由 FriendFeed 開發(fā). 通過(guò)使用非阻塞網(wǎng)絡(luò)I/O, Tornado可以支撐上萬(wàn)級(jí)的連接,處理 長(zhǎng)連接, WebSockets ,和其他需要與每個(gè)用戶保持長(zhǎng)久連接的應(yīng)用.
安裝方法很簡(jiǎn)單:
pip install tornado簡(jiǎn)單的使用例子如下所示:
import tornado.ioloop import tornado.webclass MainHandler(tornado.web.RequestHandler):def get(self):self.write("Hello, world")def make_app():return tornado.web.Application([(r"/", MainHandler),])if __name__ == "__main__":app = make_app()app.listen(8888)tornado.ioloop.IOLoop.current().start()這應(yīng)該是我唯一用過(guò)的 python 的 web 框架,然后應(yīng)該還可以使用如 flask 來(lái)實(shí)現(xiàn)同樣的功能。
在需要上線的這個(gè)環(huán)節(jié),除了模型的性能,還需要考慮服務(wù)接口的耗時(shí)、內(nèi)存使用等問題。
接口耗時(shí)
主要看的指標(biāo)應(yīng)該是兩個(gè),單次請(qǐng)求的平均耗時(shí)以及 RPS。
前者自然就是整個(gè)接口的調(diào)用速度,越快自然是越好的;
RPS 也就是 Request per second,也就是吞吐率,服務(wù)接口每秒可以處理的請(qǐng)求,主要是衡量接口處理并發(fā)請(qǐng)求的能力
第一個(gè)指標(biāo)的優(yōu)化可能就需要查看代碼中哪塊耗時(shí)嚴(yán)重,然后去優(yōu)化,比如模型是否耗時(shí)太久,或者是否可以通過(guò)緩存來(lái)縮減時(shí)間等;
第二個(gè)指標(biāo)就是并發(fā)處理能力,比較簡(jiǎn)單的就是多開進(jìn)程,多部署幾臺(tái)服務(wù)器,另外就是嘗試實(shí)現(xiàn)異步處理消息,避免消息阻塞。
測(cè)試接口的吞吐率可以采用 apache 的測(cè)試工具,官網(wǎng)下載地址:http://httpd.apache.org/download.cgi
使用例子如下:
ab -c 10 -n 100 -p req.txt http://posturl這里 -c 表示并發(fā)的數(shù)量,即同時(shí)請(qǐng)求的數(shù)量,-n 是總的請(qǐng)求數(shù)量,-p 是請(qǐng)求參數(shù)文件路徑,最后就是接口路徑了。
具體使用例子可以查看 https://www.cnblogs.com/taiyonghai/p/5810150.html
內(nèi)存使用
內(nèi)存的使用也很關(guān)鍵,這主要是看服務(wù)器的內(nèi)存多大,然后會(huì)決定可以加載到內(nèi)存的數(shù)據(jù)量。
負(fù)載均衡
當(dāng)配置了多臺(tái)服務(wù)器后,就需要考慮負(fù)載均衡問題,更好發(fā)揮多臺(tái)服務(wù)器的性能,避免大部分請(qǐng)求都分發(fā)到某臺(tái)服務(wù)器上了,對(duì)于實(shí)現(xiàn)負(fù)載均衡的可以考慮采用 Nginx 這個(gè)框架,剛好昨天發(fā)表了一篇對(duì)這個(gè)框架的安裝配置和基本使用的總結(jié)文章,感興趣的可以看看。
Nginx快速搭建和基本使用
監(jiān)控&維護(hù)服務(wù)
服務(wù)上線后,并不是結(jié)束,還需要維護(hù)服務(wù),對(duì)服務(wù)進(jìn)行監(jiān)控,防止服務(wù)因?yàn)榱髁窟^(guò)大掛掉或者其他原因掛掉,另外監(jiān)控也是可以了解服務(wù)的調(diào)用量,運(yùn)行是否正常,通常主要監(jiān)控的三個(gè)指標(biāo):
性能:主要是平均耗時(shí),TP50、TP90等,也就是50%的請(qǐng)求耗時(shí)、90%的請(qǐng)求耗時(shí)等
調(diào)用次數(shù)
可用率
所以也是需要在服務(wù)代碼中添加日志,隨時(shí)查看,一個(gè)不錯(cuò)的日志第三方庫(kù)--loguru,github 地址:
https://github.com/Delgan/loguru
而怎么保證你的服務(wù)可以在掛掉后自動(dòng)重啟呢,可以考慮采用 supervisor ,它是 Linux/Unix 下的一個(gè)進(jìn)程管理工具,可以監(jiān)聽、啟動(dòng)、停止或者重啟一個(gè)或者多個(gè)進(jìn)程。使用它來(lái)管理服務(wù),可以在服務(wù)進(jìn)程意外被殺死后,自動(dòng)重新拉起服務(wù)進(jìn)程。
具體安裝配置和使用介紹可以查看文章--https://blog.csdn.net/xyang81/article/details/51555473
機(jī)器學(xué)習(xí)
這周是完成了對(duì)激活函數(shù)的筆記總結(jié),在下周會(huì)更新對(duì)激活函數(shù)部分的總結(jié),這也是打算開啟的一個(gè)新系列文章--AIK,AI Knowledge,AI 知識(shí)點(diǎn),目前計(jì)劃是先對(duì)深度學(xué)習(xí)基礎(chǔ)的知識(shí)點(diǎn),比如剛完成的激活函數(shù),接著應(yīng)該會(huì)是梯度下降、優(yōu)化方法、正則化、卷積層等不同網(wǎng)絡(luò)層的介紹,不同的網(wǎng)絡(luò)模型的論文閱讀和介紹等等,希望借這系列文章可以好好系統(tǒng)的學(xué)習(xí)和復(fù)習(xí)鞏固機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的知識(shí)點(diǎn)。
閱讀
這周的閱讀應(yīng)該說(shuō)是做筆記,上周說(shuō)的《軟技能》的閱讀筆記,重新對(duì)職業(yè)這部分的內(nèi)容進(jìn)行閱讀和總結(jié)筆記,雖然還沒總結(jié)完這部分內(nèi)容,不過(guò)可以先給出自己對(duì)這部分的閱讀筆記。
第一篇是職業(yè),從第一章開始就是告訴你,需要轉(zhuǎn)變自己的心態(tài),要做自己職業(yè)生涯的主人翁,工作可以是公司的,但職業(yè)生涯是你自己的;
我們需要像企業(yè)一樣思考自己,想想自己可以有什么產(chǎn)品或者提供的服務(wù),然后需要不斷去改進(jìn)和完善,并且學(xué)會(huì)營(yíng)銷你的產(chǎn)品或者提供的服務(wù);
需要制訂一個(gè)清晰的可以指明方向的目標(biāo),可以不需要很具體,但需要好好想想未來(lái)你希望過(guò)上什么樣的生活,從這出發(fā)來(lái)制訂你的終極大目標(biāo),接著就是根據(jù)大目標(biāo)制定小目標(biāo),并且定期追蹤和更新自己的目標(biāo),定期可以是每周、每月、每季度以及每年;
人際交往能力也是非常重要的,對(duì)于程序員來(lái)說(shuō)也是很重要,因?yàn)椴皇菃未颡?dú)斗,都是一個(gè)團(tuán)隊(duì)進(jìn)行合作完成一個(gè)項(xiàng)目。在和別人溝通的時(shí)候,都需要記住一點(diǎn),每個(gè)人都希望自己很重要;所以不要輕易否定他人的想法,學(xué)會(huì)換位思考,以及避免爭(zhēng)吵,而是要解決問題。
最好的通過(guò)面試的方法是讓面試官對(duì)你懷有好感,大部分實(shí)現(xiàn)的方法都是在面試之前完成,比如提高自己的影響力,這可以是寫博客,做開源項(xiàng)目,有star數(shù)量很高的github項(xiàng)目;作者提供了他曾經(jīng)用過(guò)的方法,那就是調(diào)研想去的公司,去公司的開發(fā)人員的博客下方進(jìn)行評(píng)論留言,引起他們的關(guān)注,從而讓他們來(lái)查看你的博客,當(dāng)然這需要你寫的博客文章質(zhì)量很好。
效率方法
這一周嘗試將每天做三件事也用到工作上,每周一根據(jù)上周的進(jìn)度和問題,計(jì)劃這一周需要完成的工作內(nèi)容,然后每天先計(jì)劃當(dāng)天要完成的 3 件事情,實(shí)踐的結(jié)果可能還是比較一般,主要是開完周會(huì)后,可能會(huì)增加新的緊急又重要的工作任務(wù),還是會(huì)打亂計(jì)劃的,但可以隨時(shí)更新這三件事情,對(duì)工作的效率提升感覺還可以,更加專注,以及不會(huì)突然不知道需要做什么。
歡迎關(guān)注我的微信公眾號(hào)--算法猿的成長(zhǎng),或者掃描下方的二維碼,大家一起交流,學(xué)習(xí)和進(jìn)步!
如果覺得不錯(cuò),在看、轉(zhuǎn)發(fā)就是對(duì)小編的一個(gè)支持!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 计算机图标制作教程,电脑主题ICO图标制
- 下一篇: 为啥你用@JsonFormat注解反序列