第二期的周总结,这次学习的内容可能没有上次那么广泛,主要是因为这周我负责的模块需要测试并进行上线,所以主要学习了解的就是工程开发方面的内容,准确说是部署上线的内容,所以本周主要简单总结这次上线过程的一些内容,包括如何精确评估开发时间、一般项目部署上线的过程等;
本文目录:
如何精确评估开发时间
项目的部署上线
机器学习
阅读
效率方法
如何精确评估开发时间
最近一个月其实都在忙着自己负责的推荐方面的项目上线的事情,但是从一开始说出可以交付接口给后端开发同事测试的时候,我就犯下了一个大错误--高估自己开发效率,低估自己写bug的能力了。。。这直接导致那一周不得不周末都加班来弥补我的错误。
另外,这算是自己独立上线自己的模块,所以其实对于上线的经验还是非常缺乏,所以其实也导致需要付出更多时间来进行工程上的优化,以满足线上的性能要求。
然后这周一刚好看到一篇如何精确评估开发时间的文章,我觉得写得也是非常好,也受益匪浅,这里就结合文章以及自己这次上线的经历来简单说说如何精确评估开发时间。
1. 明确任务目标
首先应该是好好熟读产品经理写的产品需求评审,要知道自己需要负责完成的工作任务有哪些,然后判断功能能否实现,有哪些存在的问题,这都需要和产品经理好好沟通,必须非常明确需求,否则开发到一半才发现理解错误,那就非常糟糕了;
除了和产品经理好好沟通,还需要好好沟通的当然就是同个项目的开发同事,特别是相互之间的工作有依赖关系的,比如你需要调用另一个同事的接口,获取数据,那么就需要了解下这个接口的请求和返回结果,接口的性能,也就是调用一次所需要的时间等,并且要确认同事不会随便修改这个接口,因为可能同事只是修改返回结果的一个数据名称,你的代码就有很多地方需要进行修改了。
2. 更精细的任务排期
我们每次经过产品需求评审后,确认本次迭代需要完成的工作后,都需要各自给出自己的任务排期,之前我们都是按照天为单位将工作任务进行拆分,不过按照天来划分可能还是不够精细,对于工作任务的拆分还不够细,
文章作者给出是应该按照小时来拆分任务,目标当然就是让拆分后的工作任务更加的具体,而且这种拆分方法,我认为也是有助于自己对任务的更加全面的认识和了解,更容易去发现自己可能会疏忽的地方,比如某个功能的实现,需要得到同事的帮助,那么就要提前和同事进行沟通;或者某个功能的实现可能会高于自己的预估时间等等。
另外,按照小时为单位安排工作,也需要你知道自己每天实际开发的时间有多少,毕竟很难做到可以长时间专注的写代码,会有很多其他因素影响自己的工作效率,自己的专注力、同事的咨询、固定的周会等等。
因此,需要给自己预留一定的缓冲时间,可能自己觉得需要1天就可以完成的功能,但可以再多留1天左右来防止可能的意外状况,毕竟 bug 总是很难避免的,这还需要你有快速解决 bug 的能力,否则可能调试一个 bug 就会花费你半天甚至一天的时间。
3. 记录和复盘
第一次项目上线,可能多少都会出现不少问题,因此这个过程出现了问题,最好就是可以及时记录问题,然后项目顺利上线后,自然需要复盘,复盘的问题,可以是:
任务排期预估的开发时间和实际所用时间是否一致?相差较多的有哪些任务,原因是什么。
开发过程中出现的未预料到的事情有哪些
开发过程中出现的bug,怎么解决等
新学习到的知识点,需要加强巩固的知识点等
项目的部署上线
这部分只是根据我这次的经历所总结的,可能有些地方不太准确或者有些遗漏,仅供参考。
关于一个项目的部署上线,也可以说是如何开发一个项目,特别是机器学习项目,很久之前其实我也写过这样一个系列,所以非常相似,那个系列的文章:
如何构建一个完整的机器学习项目
这篇文章也介绍了构建一个完整的机器学习项目包括好几方面的内容,结合我这次的项目上线过程,那就是这样的:
1. 明确项目的目标
这次的项目,准确来说只是项目中的一个模块,是推荐方面的内容,目标就是提升收藏率了。
2. 获取数据
数据的获取其实就很简单,来自同事的提供,无论是线上的用户数据、用户行为数据,还是需要推荐的内容,不过因为做推荐这个模块并不是项目创立之时就有计划做这个模块的,所以这个过程中其实有不少数据,特别是用户行为的数据是缺少了很多,也算是我的困难之一了。
3. 特征工程
这部分应该是包括分析数据和预处理数据了,之前做图像的时候,其实更多的是对数据的处理,比如筛选过滤不合格的图片,给图片打标签(划分到对应类别)等,特征工程就真的是基本很少使用。
而推荐系统对特征工程的要求还是很高的,特别是我一开始选择的是传统的机器学习算法,就更加需要好好做特征工程,当然这部分就需要有一些业务知识,知道哪些特征有助于完成任务目标。
4. 模型训练和验证
在吴恩达老师的机器学习课程中,对于模型训练,给出的建议是先建立一个 baseline,也就是可以完成所需功能,但是性能方面并不一定很好,这也是为了快速迭代。
因此,在这方面,我选择的自然是 lr 和 gbdt 算法,并且最终选择速度更快的 lr 算法,可以先完成推荐的功能即可,后续再逐渐优化算法
5. 部署上线
当确认模型的性能可以基本满足目标需求,那么就需要开始部署上线了,简单说就是需要编写一个服务接口。这里,我主要是用 python 的 tornado
框架,简单介绍下tornadao
框架,来自中文官方文档的介绍:https://tornado-zh.readthedocs.io/zh/latest/
Tornado 是一个Python web框架和异步网络库,起初由 FriendFeed 开发. 通过使用非阻塞网络I/O, Tornado可以支撑上万级的连接,处理 长连接, WebSockets ,和其他需要与每个用户保持长久连接的应用.
安装方法很简单:
pip install tornado
简单的使用例子如下所示:
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()
这应该是我唯一用过的 python 的 web 框架,然后应该还可以使用如 flask
来实现同样的功能。
在需要上线的这个环节,除了模型的性能,还需要考虑服务接口的耗时、内存使用等问题。
接口耗时
主要看的指标应该是两个,单次请求的平均耗时以及 RPS。
前者自然就是整个接口的调用速度,越快自然是越好的;
RPS 也就是 Request per second,也就是吞吐率,服务接口每秒可以处理的请求,主要是衡量接口处理并发请求的能力
第一个指标的优化可能就需要查看代码中哪块耗时严重,然后去优化,比如模型是否耗时太久,或者是否可以通过缓存来缩减时间等;
第二个指标就是并发处理能力,比较简单的就是多开进程,多部署几台服务器,另外就是尝试实现异步处理消息,避免消息阻塞。
测试接口的吞吐率可以采用 apache 的测试工具,官网下载地址:http://httpd.apache.org/download.cgi
使用例子如下:
ab -c 10 -n 100 -p req.txt http://posturl
这里 -c
表示并发的数量,即同时请求的数量,-n
是总的请求数量,-p
是请求参数文件路径,最后就是接口路径了。
具体使用例子可以查看 https://www.cnblogs.com/taiyonghai/p/5810150.html
内存使用
内存的使用也很关键,这主要是看服务器的内存多大,然后会决定可以加载到内存的数据量。
负载均衡
当配置了多台服务器后,就需要考虑负载均衡问题,更好发挥多台服务器的性能,避免大部分请求都分发到某台服务器上了,对于实现负载均衡的可以考虑采用 Nginx
这个框架,刚好昨天发表了一篇对这个框架的安装配置和基本使用的总结文章,感兴趣的可以看看。
Nginx快速搭建和基本使用
监控&维护服务
服务上线后,并不是结束,还需要维护服务,对服务进行监控,防止服务因为流量过大挂掉或者其他原因挂掉,另外监控也是可以了解服务的调用量,运行是否正常,通常主要监控的三个指标:
性能:主要是平均耗时,TP50、TP90等,也就是50%的请求耗时、90%的请求耗时等
调用次数
可用率
所以也是需要在服务代码中添加日志,随时查看,一个不错的日志第三方库--loguru
,github 地址:
https://github.com/Delgan/loguru
而怎么保证你的服务可以在挂掉后自动重启呢,可以考虑采用 supervisor
,它是 Linux/Unix 下的一个进程管理工具,可以监听、启动、停止或者重启一个或者多个进程。使用它来管理服务,可以在服务进程意外被杀死后,自动重新拉起服务进程。
具体安装配置和使用介绍可以查看文章--https://blog.csdn.net/xyang81/article/details/51555473
机器学习
这周是完成了对激活函数的笔记总结,在下周会更新对激活函数部分的总结,这也是打算开启的一个新系列文章--AIK,AI Knowledge,AI 知识点,目前计划是先对深度学习基础的知识点,比如刚完成的激活函数,接着应该会是梯度下降、优化方法、正则化、卷积层等不同网络层的介绍,不同的网络模型的论文阅读和介绍等等,希望借这系列文章可以好好系统的学习和复习巩固机器学习和深度学习的知识点。
阅读
这周的阅读应该说是做笔记,上周说的《软技能》的阅读笔记,重新对职业这部分的内容进行阅读和总结笔记,虽然还没总结完这部分内容,不过可以先给出自己对这部分的阅读笔记。
第一篇是职业,从第一章开始就是告诉你,需要转变自己的心态,要做自己职业生涯的主人翁,工作可以是公司的,但职业生涯是你自己的;
我们需要像企业一样思考自己,想想自己可以有什么产品或者提供的服务,然后需要不断去改进和完善,并且学会营销你的产品或者提供的服务;
需要制订一个清晰的可以指明方向的目标,可以不需要很具体,但需要好好想想未来你希望过上什么样的生活,从这出发来制订你的终极大目标,接着就是根据大目标制定小目标,并且定期追踪和更新自己的目标,定期可以是每周、每月、每季度以及每年;
人际交往能力也是非常重要的,对于程序员来说也是很重要,因为不是单打独斗,都是一个团队进行合作完成一个项目。在和别人沟通的时候,都需要记住一点,每个人都希望自己很重要;所以不要轻易否定他人的想法,学会换位思考,以及避免争吵,而是要解决问题。
最好的通过面试的方法是让面试官对你怀有好感,大部分实现的方法都是在面试之前完成,比如提高自己的影响力,这可以是写博客,做开源项目,有star数量很高的github项目;作者提供了他曾经用过的方法,那就是调研想去的公司,去公司的开发人员的博客下方进行评论留言,引起他们的关注,从而让他们来查看你的博客,当然这需要你写的博客文章质量很好。
效率方法
这一周尝试将每天做三件事也用到工作上,每周一根据上周的进度和问题,计划这一周需要完成的工作内容,然后每天先计划当天要完成的 3 件事情,实践的结果可能还是比较一般,主要是开完周会后,可能会增加新的紧急又重要的工作任务,还是会打乱计划的,但可以随时更新这三件事情,对工作的效率提升感觉还可以,更加专注,以及不会突然不知道需要做什么。
欢迎关注我的微信公众号--算法猿的成长,或者扫描下方的二维码,大家一起交流,学习和进步!
如果觉得不错,在看、转发就是对小编的一个支持!