0%

科研方法论, 以网包分类为例

在整理自己以前杂七杂八的东西时, 发现自己之前写过Research method的一些内容, 杂乱在md文件、OneNote、Pocket和Youdao Note中, 这里做一个简单整理(自己的个人知识管理能力确实有待提高, 需要维护changelog和所有文件归档到一起)。

做科研就是在解决问题,是学习用逻辑和科学方法论去解决问题。当然,逻辑或者说理性是不能解决所有问题,宗教信仰自有其存在的必要(这一点也是《战争论》中提到的: 交战绝不仅是双方力量的对比、意志在其中会发挥作用)。但这一套方法不得不说能够解决绝大多数的问题,是优秀世界观的一个重要组成部分。所谓的科学的方法,抽象来说就是大家说的唯物辩证法,我觉得更加实用的是”7W”准则: What, When, Who, Why, Where, How, For Whom。当我们用着7W准则去思考一个问题时, 就会出现如下结果。

对问题的思考

  1. What: 从辩证角度来看,问题是什么。具体来说, 问题的内涵和外延分别是什么。如, 网包分类问题。一般性的定义/内涵可以描述为, “给定一组规则和一个报文, 对该报文找到适配的最高优先级的规则”, 这里的一些关键形容词发生变化后就会对应不同的问题。如: “一个规则”启发我们设计BCAM硬件类型, “一组报文”启发我们去设计新的batch算法, “所有匹配规则”启发我们做遍历算法或对规则进行交集操作, “某一个匹配规则”启发我们对规则做并集操作。修改定义得到不同的问题,其实也能启发我们更加深入地思考问题。比如: 基于“所有匹配规则”设计出的算法肯定存在优化空间的,因为我们只需要最高优先级的匹配规则,所以Bit Vector类型的算法可以优化;比如: 基于“某一个匹配规则”设计出的算法其实可以作为“最高优先级的规则”问题的一个“预过滤”。当然,这些启发式信息最后能不能得到好的结果,就要因地制宜和进行相应的实验验证了。问题的外延就需要我们举例来理解问题,典型的“5元组”规则(src/dst*ip/port+protocol)的定义是什么样子的,是prefix和range,那它们是不是存在什么特殊性质?我们是不是可以用一些特殊方法?现在的规则还存在OpenFlow类型的11元组的规则,甚至是自定义包头的规则。挖掘问题的外延,我们就会把问题做的不断精细化。
  2. When: 从时间维度来看,问题处在什么位置。我特别喜欢Gartner的Hyper技术曲线,也就是技术发展存在“起步”-“泡沫”-“幻灭”-“理性发展”,也就是事情存在高估期、低估期然后进入理性期(插一句,本朝对于太祖的看法也是如此,哈哈)。这一点在Research中尤其重要,因为你要创新就要尽量去做很少人考虑过/做成的事情。当一个所谓的“新领域”出现的时候,我们就能发现很多“很少人考虑过”的事情,比如:把ML泛滥到其他领域(笑)。至于“很少人做成”的事情,就要考虑两种情况:一是大概率做不成,比如“永动机”、NP问题等;一是比较困难,比如“更新与分类都性能良好的网包分类算法”。想要知道问题处在什么时间维度,就要知道该事物的过去、同时找到历史上的参照物以预测未来。以网包分类算法为例,做一下survey就知道,该问题在2000年左右的时候比较Hot,提出了各种各样的solution;在2005年已经出现了非常好的综述。当然,一项技术总是可以持续发展的(比如,发动机持续研究了好几个世纪),网包分类问题也可以持续研究下去,但该问题已经不属于“新领域”,不是那种很好挖的矿了(当问题的内涵、外延都比较清晰的时候,该问题也就常常到了平稳发展的时候了)。
  3. Where: 从空间维度来看,问题处在什么位置。我们需要知道问题是在哪个位置、哪个领域,周围可利用的资源是什么。网包分类问题虽然可以泛化来思考,但一般就是用在网络中间设备上: 路由器、防火墙等;所以我们需要去了解路由器的架构、性能指标(特别是网络带宽的迅速增长)、供应链(整个产品从最上游到最下游是哪些公司一起造出来的)。很自然地我们就发现存在NPU(多核网络处理器)、TCAM、ASIC、MIPS指令集这种专业化硬件,自然就想基于这些硬件设计算法;扩展来想,我们就会思考FPGA、GPU能不能用上(能够发文章,但工业应用大概率不是很有用)。继续延伸发现Open vSwitch上面需要网包分类,自然就考虑到CPU平台(网络功能虚拟化领域等)上算法优化是很重要的。
  4. Why: 从逻辑角度来看,问题处在什么位置;也就是为什么有这个问题。这一部分的问题就可能需要我们深入到数理基础部分了,比如:网包分类问题,从数理层面上和计算几何(1978年Shamos的博士论文而兴起的科学)中的点定位、数据库的查询等都有关系,然后需要返回到拓扑理论、算法设计上。更典型的问题,比如:网包调度问题,本质上和流量调度、工业工程里的调度都有相似之处,需要返回到诸如,网络微积分的数学基础上。当然,浅显地来看,trade-off在计算机领域到处存在,在网包分类问题中,内存空间占用和网包分类所需要的时间存在Trade-off、快速规则更新和快速网包分类之间也存在Trade-off。
  5. How: 调研清楚问题已有的各种解决方案。这方面需要大量的专业知识和广泛的了解,读survey、读专业性期刊、参加讲座、读教材、工业实践,当然最最靠谱的方法是找到可靠的专业人士做咨询或委托。直接搜索Packet Classification,然后就能看到很多papers,根据citation数量就能分辨出那些文章好。根据经典的survey来说,网包分类问题的常见解决思路有四种:线性查找、决策树、哈希(TSS)和比特串(BitVector),其实从本质上来讲,后三种(树、哈希、比特串)基本就是高性能中常用的数据结构了(因为涉及到非线性,队列类型的数据结构并不适合)。
  6. Who: 向谁去了解。这里推荐使用“微软学术”和“Aminer”、能够借助知识图谱自动帮助分析,免去手动查找的苦恼;初入领域的人也可以使用HistCite工具来分析。比如,我就发现了Washington University的PhD, David E. Taylor, 他博士期间研究高性能Router和Switch(刚好是那个时期的Hot研究);当然还有我导(毕竟我导带着实验室在PC领域呆了10年)。不过有趣的是Taylor博士毕业后短暂在学术界呆了9个月(做Visiting Assistant Professor),就投身了工业界了(笑),在Exegy公司做到现在(15年多,现任CTO,可以在Linked上看到他的简历)。Exegy这家公司也挺有趣,用FPGA加速为金融领域的人提供real-time data;果然是金融和信息不分家。
  7. For Whom: 为了什么。这一点并不在传统的6W框架内,但做research很容易犯的一个错误是:漫无目的。纯粹从学术追求出发、为了满足自己的好奇心,四处查看无可厚非、只要记得多总结积累就好。但是如果是“为了他人”做项目或者“为了自己”发文章,都要适当功利一点,去思考、去聚焦在要做什么上面。

对领域的思考

  1. What: 什么是热点?什么是学术领域内的关键问题?什么是工业领域的关键问题?未来2年、5年乃至10年什么东西会发展起来?(当然,未来10年谁也看不清,但这不妨碍去思考这个问题)
  2. When: 领域的发展历史是什么。比如: 计算机网络在从underlay走向overlay,云原生场景是网络的重要场景;而underlay的物理网络的管理从单机配置往SDN、IBN发展(华为、思科公司),应用从有线往无线延伸,从Internet向着IoT前进。
  3. Who: 领域的大牛是谁。怼着中美的科学院、工程院的院士名单和研究领域的介绍去匹配就行。计算机网络领域就怼着Sigcomm Award的获得者去看就行: George Varghese(这位大佬是真的NB, 他在Sigcom’14获奖时的Slides对于做Research非常有价值), Nick McKeown, Sally Floyd, Scott Shenker, Van Jacobson, Raj Jain(大佬的主页对于Network新人非常友好)。哈,从这个角度来看,多路径传输(Multi-path TCP)很有前途啊,毕竟提出者Mark Handley 刚拿了奖(笑)。
  4. Why: 领域内的principals有什么?一些经典设计的原理是什么?
  5. Where: 略。
  6. How: 学习一些常用的技能。如: CS领域内的编程、一些工具、写作、英语等。

补充

还有一个特别好用的是六顶思考帽。

  1. 陈述问题事实(白帽)
  2. 提出如何解决问题的建议, 头脑风暴(绿帽)
  3. 评估建议的优缺点:列举优点(黄帽);列举缺点(黑帽)
  4. 对各项选择方案进行直觉判断(红帽)
  5. 总结陈述,得出方案(蓝帽)

参考

  1. 6W1H原则
  2. 六顶思考帽(中科大·文献管理与信息分析·罗昭锋)
If my article helps you, I will be very happy.