极客时间已完结课程限时免费阅读

42 | 细数技术研发的注意事项

42 | 细数技术研发的注意事项-极客时间

42 | 细数技术研发的注意事项

讲述:冯永吉

时长07:39大小7.01M

你好,我是景霄。
技术研发一直以来都是各大公司的核心部分之一,其质量的好坏直接影响到了产品的质量以及用户对产品的体验。如何建立一套规范、健全的开发体系,就显得尤为重要。今天我就和你聊聊技术研发的注意事项。

选择合适的编程语言

比如我们正在开发一个系统,首先,根据具体的需求,我们需要对系统的各个部分选择合适的编程语言。一般来说,infra 这层我们更偏向于使用 C++,而纯的服务器端则是以 Python、Java、PHP 等等为主。以搜索引擎为例,下面我画了一个它的简略架构图:
你可以看到,大概的工作流程是:用户在客户端(client)输入一个查询(query),发送请求(request)到达服务器端(server-side);服务器端首先向 NLP service 发请求,并对请求进行分析,等到拿到各项信号(signal)后,再向后端(backend)发送请求;后端会做特征抽取(feature extraction),利用 ML 模型进行结果的检索(candidate retrieval)、排序,最后再把结果返回给服务器端和客户端。
这里的 NLP Service 和后端,我们都会使用 C++。因为这部分的处理最为复杂和耗时,都涉及到了特征抽取和 model serving,对延迟(latency)的要求极高,只有 C/C++ 这类语言才能满足需求。
而服务器端或者叫中间层(middle tier),我们则会使用 Python、Java、PHP 等语言。因为这部分并没有特别复杂的处理和对延迟的高需求,主要是以一些业务逻辑为主;并且,对程序员来说,使用这种高级语言也更容易上手和调试。

合理使用缓存

缓存(cache)在实际工程中十分重要,可以想像,如果没了缓存,我们今天所用的绝大多数产品估计都会崩溃。缓存为我们节约了大量的 CPU 容量(capacity)和延迟。
还是以刚刚的搜索引擎系统为例,我们在客户端、服务器端和后端都会设置缓存。在客户端,我们一般会缓存用户的搜索记录,比如当你点击搜索框时,自动弹出的建议关键词的前几个,就可以是缓存的结果。这不需要向服务器端发请求,可以直接从客户端下载。
而在服务器端,我们也会设置缓存来存储一些搜索结果。这样,如果同一个用户多次发送相同的请求,就不需要再向后端请求,直接从缓存里面拿结果就可以了,快速又高效。
同样的,后端也需要缓存。比如在 model serving 这块儿,我们通常会有几个小时的缓存,不然每次提供实时的在线服务时,对 CPU 的负荷很大,延迟也会很高。
总而言之,如果没了缓存,容易造成很多问题。
服务器负荷迅速飙升,崩溃的几率大大增加。
端对端的延迟迅速飙升,请求超时的概率大大增加。
但是不是缓存越多就越好呢?显然也不是。
第一,通常来说,缓存比较昂贵,所以在使用上,我们都会有一个限度,不能无限制索取。
第二,缓存不是万能的,过度增加缓存,也会损害用户的产品体验。比如搜索结果的 retrieval 和排序这两块,理想状况下,肯定是做实时的 model serving 最好,因为这样对用户的个性化推荐更准确和实时。之所以会对 model 有几个小时的缓存,更多的是出于性能的考虑,但如果把缓存从几小时改为几天,显然不合适,无疑会对用户的产品体验造成极大的负面影响。
因此,缓存到底取多久、取多少,往往是用户对产品参与度和性能的一个权衡,需要根据一些具体的分析以及 A/B 测试做出决定。

健全的日志记录系统

健全的日志记录系统也是尤其关键的一点。大型公司的系统,往往由成千十万个小系统组合而来,如果发生故障,比如 Google、Facebook 的某项服务突然宕机了,我们就需要以最快的速度找出原因并做出修复。这靠的是什么呢?靠的正是健全的日志记录系统,使得我们能够方便地分解错误原因,一层一层追溯,直到找到根源。
一般来说,在线上环境中,我们需要两种类型的日志记录模式。
一种是实时 logging,考虑到服务器的压力,通常会做降采样(downsampling),比如 log 实际流量的 1%。这样的好处是,可以及时跟踪各项指标,如果有情况,立即触发警报(alert)。
比如,某天的中午 12 点,一位工程师 push 了一段会造成服务器奔溃的代码进入产品,实时 logging 检测到异常,发出警报,这时有关人员便会进行排查。如果发现这个代码的 push 时间和警报触发时间一致,就能够最快地恢复(revert),最小化其带来的负面影响。
同时,实时 logging 也有利于我们进行各种线上实验。比如,ML 组的 A/B 测试常常需要调参,我们的通常做法,就是每隔几小时查看实时 logging 的 table,根据各项指标,适度调整参数。
第二种是每天更新一次也就是 daily 的 full logging,有助于我们统计一些信息,进行分析,比如做成仪表板(dashboard),方便查看每天的各项指标,来跟踪进度。此外,full logging 的 table,也常常用于 ML 组的训练数据(training data)。

Profiling 必不可少

关于 profile,之前我们也提到过,在实际开发中是非常重要的一项功能,能够帮助开发人员详细了解系统每个部分的效率,并加以提高。
在线上环境中,我们通常会在许多必要的地方加上 profile 的代码,这样我们就能够知道这段代码的延迟是多少,哪个部分的延迟特别严重等等,然后对症下药。
如果没有 profile,很容易导致开发人员随意增加功能而不进行优化,这样以来,随着时间的推移,系统越来越冗余,延迟也会越来越高。因此,一个成熟的系统,一定会有 profile 的代码,帮助开发人员随时监控内部的各项指标变化。

test、test、test

这一点,我也已经在前面的文章中强调过了,测试(test)一定不能少。无论是单元测试(unit test)、集成测试(integration test)还是其他,都是保证代码质量、减小 bug 发生概率的一个有效手段。
在真正规范的公司或是小组里,开发人员如果新增或改变了一个功能而不写测试,是过不了代码评审的。因此,测试一定要写,尤其是系统复杂了以后,很多工程师都要在上面开发各种不同的新功能,很难保证各个部分不受影响,测试便是一种很好的解决方法。
除了日常开发中所写的测试外,在代码 push 到线上之前,最好还要加一层测试。还是以刚刚的搜索引擎系统为例,我所知道的,Google 或者 Facebook 的代码在 push 的过程中,都会有专门的 service,去模拟不同的用户发送请求,然后看返回的响应是不是符合要求。如果出错,就会阻止代码的 push,这也就告诉了开发人员,他们所写的代码可能存在问题,需要再次检查。

写在最后

关于技术研发的注意事项,我主要强调这些内容。事实上,日常开发工作中,很多的细节都值得特别关注,而对于易错的地方,用系统化的流程解决不失为一个高效的方案。那么,在你的日常工作中,有哪些特别留心的地方值得分享,或者有哪些疑惑的地方想要交流吗?欢迎在留言区写下你的想法。
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 15

提建议

上一篇
41 | 硅谷一线互联网公司的工作体验
下一篇
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
unpreview
 写留言

精选留言(16)

  • 許敲敲
    2019-08-14
    非科班,入职做web开发,发现真的好多东西要学,除了老师说的技术流程,还经常要和不同team沟通,自己team 的Screw meeting daily report。也希望有一天能像老师一样,做个懂AI的full stack。 不过现在发现真的好累,需要学的太多了…… 老师能不能说说,怎么规划自己的职业发展,怎么选择有价值的新技术学习?感谢🙏

    作者回复: 主要看你的兴趣和目的。你是想go broad还是go deep,如果go broad,那么你就得尽量接触多的方向,如果go deep,那么就得深耕于此。

    11
  • 安排
    2019-08-14
    profile和profiling有具体的中文解释吗,经常见到这个词,但是没有正真理解。还有online profiling.
    共 4 条评论
    9
  • 咯噔咯噔_Gordon
    2019-08-14
    老师能否分享一下成长的经历 每天除了工作时间,在休息的时候学习多久?我很向往去国外工作,但是自己也深知前方道路漫长,我目前就职于一家美企,怎么样能有机会去硅谷工作

    作者回复: 以前上学的时候很拼啊,每天学习到凌晨是经常的事,现在主要更关注一些high level的事和一些技术细节。至于去硅谷工作,去那读个书比较容易

    6
  • fy
    2019-08-14
    老师,看你更新完了,我才开始学,不然一周三篇太慢了。看到你写的代码就是舒服。认识到自己的差距。特别好,通过场景讲解代码!我做了笔记在自己的博客上,有你的代码哈,会转载是你的。毕竟通过留言记笔记不好.
    共 1 条评论
    4
  • haoxu .W
    2019-08-14
    有没有关于flask的相关教程推荐
    4
  • 人间乐园
    2020-09-26
    还要容错,断路,限流,鉴权。这些不是最基本的,但是也很重要。
    2
  • 技术修行者
    2019-12-14
    日志和profile对于产品环境来说,是不可或缺的!
    2
  • 栾~龟虽寿!
    2019-08-18
    如何知道想要实现的功能,属于哪个模块,比如海龟模块,能画图,据说有13万以上的模块,在哪里有他们的列表,和介绍?谢谢老师,着急
    2
  • 2019-08-15
    大佬,我想问下,我自己买的百度云服务器,安装完anaconda之后,配置好jupyter notebook后,一直包后台连接不上,内核也是无法可用的,但是通过浏览器缺可以远程登录上去,就是无法写代码,我在windows上本地安装后是可以切换内核的,为什么在服务器上就不可以呢,跟服务器的配置有关下吗?我的云服务器是1核1G的带宽是1M。
    共 1 条评论
    2
  • 夜声
    2019-08-15
    听老师授课,受益匪浅,还是让人意犹未尽啊。。。
    1
  • 许童童
    2019-08-14
    跟着老师一起精进。
    1
  • 未来已来
    2019-08-14
    基础真的太重要了,特别是当一个人想往高处走的时候,经常会遇到这种情况:为何我的代码写出来没什么问题,但是怎么跑的那么慢呢?很多时候都是基础不扎实导致的。

    作者回复: 这种基本都是多写,多练,多看。日积月累自然会提高

    1
  • haoxu .W
    2019-08-14
    有没有关于flask的相关教程推荐
    1
  • 张鑫
    2019-08-14
    缓存,日志和模拟测试要多了解了!
    1
  • William Ning
    2022-07-12
    FYI candidate retrieval feature extraction model serving ranking 候选检索 特征提取 模型服务 排名
    展开
  • άλφα
    2022-06-30
    老师,多个语言集成的项目是使用grpc来通信吗?