fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
对许鹏的第一印象来源于其Bolg的粗读,最早时候更准确说应该是博文的粗略统计——1年零6个月完成55篇以上的博文,基本每篇都附有代码,其中更有多篇源码解读博文。而在浏览完大量的Storm和Spark源码阅读后,笔者更认定了这是位Hadoop、Spark、Storm等相关技术从业人员。然而在与许鹏本人沟通之后才发现,其实最贴近他本人的描述正是其Blog简介——“富贵有定数,学问则无定数——求一分,便得一分。”之所以说是贴近,因为其中还少了乐于分享的部分。
关于许鹏:花名@徽沪一郎,2000年毕业于南京邮电学院,现就业于爱立信上海,在UDM部门从事相关产品研发,个人关注于Linux内核及实时计算框架如Storm、Spark等。
正如简介中的描述,许鹏当下从事基于Linux的C&C++开发,正如他所说的“老套、漂亮的不突出的技术”。言归正传,在对许鹏有了简单的了解之后,我们一起走进本次的主题——C程序员的修养、大型项目的源码学习,以及Spark和Storm的源码走读。
以下是采访原文:
CSDN:请介绍一下目前您正在从事的研究和工作内容?
许鹏: 目前在公司UDM(User Data Management)部门,从事AAA相关的东西,用于用户Wi-Fi接入认证。由于产品需要迁移到Linux Cluster,所以对IP Load Balance及OpenSAF都有比较深入的研究和理解。
开发是Linux平台上的C&C++编程,常常遇到进程Crash和内存泄露之类的问题,于是就对GDB和Linux内核中的Memory Management有了比较深入的学习。
OpenSAF主要解决高可用和扩展问题。Linux内核显然难度很大,加上实际项目中并没有需求,所以理解起来特别吃力。经过相当长的时间消化理解之后,终于弄明白了内核自举,Memory Management和Network Stack这几个模块。Linux内核是我从实际工作到业余研究的一个关键连结点。内核代码阅读尽管让个人在考虑问题的时候有了一定的长进,但毕竟无法与实际工作相关联,所以热度渐渐降低,其实就是没能因为懂内核而找一份高薪工作啦。然而,Linux内核源码阅读却给我带来了一个非常大的收获——学会了“自我设问,自我解答”。
于是开始搜寻新的热点,从2013年初开始,发觉实时数据分析很热门,看到许多网络大拿在吹捧Storm,于是就开始看Storm的源码。Storm源码的学习过程中主要难点是Clojure语言,这个过程得到了Clojure Programming一书中文译者徐明明的大力帮助,所以渐渐理解了Storm的框架和实现机理,Storm学习的时间持续了大概半年的时间。之所以转到Spark的研究上来,是因为听说Apache Spark也支持Streaming的处理,我很好奇,于是就开始了Spark的源码研究,这中间一方面是看网上的资料,另一方面是自己看源码和做小型的实验来验证猜测,可以说网络让自己的学习大大的缩短。Spark的学习中大量借鉴了酆晓杰(fxjwind)和张包峰的博客,目前,我和他们都建立了良好的互动。
CSDN:多年C和C++项目开发及管理,有什么经验可以分享给这个领域的工作者?在程序员修养方面,他们又应该注意什么,多学些什么,多看些什么?
许鹏:尽管从事C和C++开发多年,我还是不敢说自己非常精通。有的只是一点点的感悟和体会,如果是进行Linux平台下的C语言开发,最好还是就下面几个问题多做一些试验,多读一些相关的书。
1. 程序的运行和加载,推荐程序员的自我修养一书。
2. 内存分配,推荐阅读Ptmalloc源码分析,无论是C还是C++程序员,这一部分是最容易踩雷的,多读一点基础的东西,会在解决实际问题的时候,不至于手足无措。以这些为基础,再结合Valgrind或Purify,相信效果会更好。
3. 多读一点C和C++开发的成功产品,如Apache Http Server和Nginx,这样就容易搞清楚在设计一个系统的时候需要有哪些关注点。
- 是单进程还是多进程,是单进程多线程还是多线程单进程
- 进程间通信采用什么方式
- 消息的encoding/decoding以及message passing,每次都要自己写一次,不累吗,有没有好的开源实现,如Protobuffer、Thrift
- 对于一个Network Server来说,基本构架大体上还是相同的,acceptor→dispatcher→worker
4. 《深入理解计算机系统》真的是一本非常不错的书,为什么要这么说,软件的设计还是要以物理设备支持的特性为基础的,这本书让我们在CPU的级别来进一步思考程序设计。
若干年前,金庸群侠传这个游戏很流行,里头有一种武功初练稀松平常,但只要练到第10级,那就比降龙十八掌还厉害。学用C和C++也是如此吧,无它,唯勤而已。
CSDN: 您谈到了因为产品迁移到Linux Cluster所以深入的研究了IP Load Balance及OpenSAF,在这两个方面有可分享给读者的么?
许鹏: IP Load Balance这一块主要是对ipvs和nat的升级协议rsip作了一些研究。有关这方面的资料网上很多,也不敢乱加评论,如果想作细致深入学习的话,以lvs ipvs作为关键字搜一下就可以了。熟悉ipvs最好的方式还是试验加源码阅读,其源码已经在Linux内核之中,在network目录下。
OpenSAF是SAF的开源实现,主要目的是为了解决HA和Scalability的问题,对于电信产品来说,高可靠性始终是一个硬性的指标。SAF制定了一套齐备的标准,在开源实现方面情况变得有意思起来。OpenSAF基本上跟随了SAF标准,而其它一些则认为标准过于庞杂,而只选取其中一部分加以深化实施,如corosync和pacemaker。
CSDN:您花了大量的时间阅读Spark和Storm源码,并进行测试,对这两个计算框架您有做过比较吗?有什么结论可以为大家分享?
许鹏: 这是一个经常会被提及的问题,之所以如此就是因为两个产品都很优秀。Storm是专注于实时流计算的框架,在Twitter有大量成功的应用,其整体架构是非常易于理解的。Spark则更为通用一些,不仅支持实时流计算,也支持批处理,图及机器学习方面的应用。所以要对两者进行比较的话,我们还是将目标缩小到流处理这一块。
- 从应用的广泛程度上来说,Storm可能拥有更多的用户基础。
- 从处理速度上而言,似乎Spark更胜一筹。
- 从当前整个项目的活跃度而言,Spark更为活跃。
- Spark可以与Hadoop的新一代资源管理框架Yarn更为紧密的结合。
- Spark有Cloudera的大力支撑,而Hortonwork则是Storm的最大推手,两家都是大数据处理领域的翘楚,一场龙争虎斗很值得期待。
- Spark目前还缺少Storm所支持rebalance功能,不能动态利用新增加的节点。
- Spark和Storm在支持“exactly-once”的处理上,有不同的实现,Spark是依赖于Spark,而Storm则是利用Trident来解决,TridentTopology对storm中基础的bolt和spout做了封装,让上层应用的开发更加关注于业务本身。
- 二者有一个共同的缺点或毛病,就是对资源在较细粒度的调配方面,支持得还不够
CSDN:大量开源项目使用和学习经验,您对开源运动怎么看?如何才能更好的学习一个开源项目?开源项目使用时又该注意些什么?
许鹏: 开源项目离不开大家的广泛参与和支持,要让一个开源项目取得成功,有多个方面的因素。
- 产品本身的创新功能
- 在实际项目中的应用和推广,业界大佬企业的积极参与
- 教育培训市场的积极跟进,也是一个开源项目最终能够长久生存下来的必备因素
CSDN:能否分享一些您对当下大数据的看法?
许鹏: 大数据要解决的两大基本问题是“数据存储”和“数据分析”,在数据存储领域,开源实现方面似乎大家都已经首肯HDFS的方式,不再怀疑。
而在数据分析的计算框架方面,目前还有大量的竞争或博弈出现。Spark就是一例,分析领域除了基于传统关系型数据库的分析方式,还有图计算相关和机器学习为代表的数据挖掘。显然机器学习是一个大热门,这一方面个人所知甚少,不敢胡说八道,但门槛似乎很高,数学底子一定要好,决不是简简单单的调用几个API就完事了的。
云计算是大数据的支撑,虽然脱胎于虚拟化,不乏商业宣传的味道,但是大量机器的安装部署,如果全部使用物理机一台台去装,肯定会让人发疯,云计算让大规模部署和产品迁移变的更为简单。
CSDN:对于阅读源码您有着丰富的经验,对想阅读源码又不知道如何下手的同学可否做一些分享?
许鹏: 源码阅读其实是一个逆向的工程,这期间必须会遇到种种问题。一般来说,我会遵循这样一个思维范式——Problem domain→model→architecture&implementation→improvement→best practice。
1. 首先搞清楚要分析的产品解决的问题是什么,这个问题在哪个大的范畴里,也就是要搞清楚problem domain。一个著名的开源产品必定在Wikipedia上有相应的条目,所以一开始去看wikipedia是破题的一种极好方式。
2. 清楚要分析产品的大体框架和关键性的概念,也就是理解清楚architecture和key concept。
3. 将分析的产品实实在在的运行起来,我一般选择debian或archlinux作为工作平台,它们提供了丰富的软件包,可以很快的将东西安装并运行。熟悉Linux本身对于开源项目的源码阅读还是大有裨益的。
4. 修改日志级别,得到丰富的日志信息。有了这个为基础,再来开始真正的源码阅读和分析。
5. 源码分析的时候,要始终问这几个问题。
- 进程以及线程的启动顺序
- 搞清楚调用关系call flow
- 这一部分代码是在同一个进程中么,同一个线程中么,运行在同一台机器中么
- 每一个线程都要问清楚,什么时候启动的,什么时候停止的
- 消息传递的路径,针对每一个函数,搞清楚,input是谁传给我的,output要传给谁,由哪个来传
- 搞清楚上述的问题之后,就将最开始提到的对architecture的了解做到具体而微了。有了这个基础之后,再继续往下问
- 当前实现的性能如何,比如i/o, cpu, network 这个需要做相应的测试方面的试验
- 当前的解决方案还有优化空间吗,比如针对spark中的scheduling问题,就有sparrow的优化机制提出
6. 碰到具体的问题一时解决不了怎么办
- 用好google,用好stackoverflow
- 将碰到的问题模型化,写一些验证性的代码,或者是写一个小的demo来验证,我在解决许多很妖的bug,也是采用类似的思路
- 找到相应的用户论坛,发帖虚心请教
- 如果还是不行,就先搁一搁,去看能看懂的地方
7. 编程语言选择
- 源码阅读中可能遇到的一个问题就是这个语言是新近出来的,我根本没学过,我需要系统去掌握该语言之后,才能来看源码么。我的看法是可以边看边学,在掌握语言的过程中,牢牢把握住这几个问题
- 基本语法:数据类型、控制语句、函数定义
- 是否支持FP
- 多态和继承
- 现代编程语言基本上都混合了面向过程,面向对象和函数式编程的特点,即便是C++或新近的java8都如此。
- Storm用Clojure来编写,而Spark使用Scala,就语言的偏好来说,我更喜欢Clojure一些。
稍微总结一下,我想源码分析心中要有两幅大图,将整体与局部很好的结合起来思考
- 一是太极图,要有整体性的思维,要对architecture有掌握,对其在整个生态系统中的定位要清楚,东方式的思维强调整体性
- 二是数学中常见的笛卡尔坐标体系,将大的问题拆分之后一一研究,做到具体而微,西方式的思维强调个性
CSDN:有什么可以补充给读者的?
许鹏: 选择自己感兴趣的东西,坚持做下去,一定会有回报,诚如《一代宗师》中所说的那样,“念念不忘,必有回响”。
编码到底是一件技术活,还是一项艺术活,这是一个令人纠结的话题。
最后,感谢CSDN的采访,谢谢那些为开源项目耗费大量精力的开发者。由于本人代码阅读时间比较仓促,错误在所难免,有不对的地方,敬请指出,学无先后,能者为师。
Storm&Spark源码走读
读源码是开源项目最好的学习方式,然而当项目规模达到一定程度时,就像许鹏所说,源码阅读其实是一个逆向的工程,这期间必须会遇到种种问题。这里我们为大家分享许鹏的Spark和Storm源码走读,方便大家学习。
Spark
- 许鹏:从零开始学习,Apache Spark源码走读1和2
- Apache Spark源码走读之3 -- Task运行期之函数调用关系分析
- Apache Spark源码走读之4 -- DStream实时流数据处理
- Apache Spark源码走读之5 -- DStream处理的容错性分析
- Apache Spark源码走读之6 -- 存储子系统分析
- Apache Spark源码走读之7 -- Standalone部署方式分析
- Apache Spark源码走读之8 -- Spark on Yarn
- Apache Spark源码走读之9 -- Spark源码编译
- Apache Spark源码走读之10 -- 在YARN上运行SparkPi
- Apache Spark源码走读之11 -- sql的解析与执行
- Apache Spark源码走读之12 -- Hive on Spark运行环境搭建
- Apache Spark源码走读之13 -- hiveql on spark实现详解
Storm
fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习的更多相关文章
- C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )
你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 ) 一个家庭 相当于 一个空间,这个空间里 有 很多元素,比如 爱,爱这个抽象事物,可能有很多动作,接吻.交流,对于一 ...
- ASP.NET程序读取二代身份证(附源码)
原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...
- 【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...
- 教程视频、项目源码、全部干货【微信小程序、React Native、Java、iOS、数据结构】
把我收藏多年的教学视频.项目源码分享给大家,大神就可以忽略了,很多东西都是基础性的,都是期初学习阶段收集的东西. 微信小程序(入门级,有web前端基础的人群): 链接: https://pan.bai ...
- 如何准备阿里社招面试,顺谈 Java 程序员学习中各阶段的建议
引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...
- 转:10年程序员谈.Net程序员的职业规划
从事Dotnet程序开发工作近10年了,从开始的月薪3k的小程序员菜鸟,到现在年薪60w的项目总经理,从战战兢兢的去各个公司应聘,到现在开始面试那些战战兢兢的小程序员,回想起这近十年来的经验,看着还是 ...
- 10年程序员谈.Net程序员的职业规划(图/文)
原文地址:http://bbs.csdn.net/topics/390736769 从事Dotnet程序开发工作近10年了,从开始的月薪3k的小程序员菜鸟,到现在年薪60w的项目总经理,从战战兢兢的去 ...
- 分享大牛开发经验,浅谈java程序员职业规划
在中国有很多人都认为IT行为是吃青春饭的,如果过了30岁就很难有机会再发展下去!其实现实并不是这样子的,在下从事.NET及JAVA方面的开发的也有8年的时间了,在这...... 在中国有很多人都认为I ...
- 程序员/PM怎么让项目预估的时间更加准确
项目时间的估算对项目的成败至关重要.项目时间管理包括了项目按时完成所需的各个过程.但是,在实际项目中,经常出现项目延期,估算严重不准确的现象. 一个我曾经共事过的很有经验的项目经理曾宣称说,他会拿程序 ...
随机推荐
- 09、RNA降解图的计算过程
RNA降解是影响芯片质量的一个很重要的因素,因为RNA是从5’开始降解的,所以理论5’的荧光强度要低于3’.RNA降解曲线可以表现这种趋势. 以样品GSM286756.CEL和GSM286757.CE ...
- kafka复习(1)
一:flume复习 0.JMS(java message service )java消息服务 ----------------------------------------------------- ...
- 在 sessionStorage存储json对象
目的:A页面存的东西要从B页面拿到 因为sessionStorage.setItem("key","value")内存储的都是字符串,所以,如果以对象的形式存到 ...
- HB-打包
一.文件打包 1.上传文件到根目录下 2.修更改启动文件 3.更改启动图标 四.启动图 https://www.yasuotu.com/size 480*762 720*1242 1080*1882
- ThinkCMF5.1虚拟机下安装的问题,已成功
官方的解决方案:https://www.kancloud.cn/thinkcmf/faq/1197179 按它的提示,发现阿里云的虚拟主机htdoc同级的目录没有上传权限. 只能把“ThinkCMF文 ...
- Xunsearch入门
Xunsearch入门 简介: 开源免费.高性能.多功能.简单易用的专业全文检索技术方案. 1.Xunsearch安装: (1)官网(http://xunsearch.com)下载 wget http ...
- Java并发编程实战 第10章 避免活跃性危险
死锁 经典的死锁:哲学家进餐问题.5个哲学家 5个筷子 如果没有哲学家都占了一个筷子 互相等待筷子 陷入死锁 数据库设计系统中一般有死锁检测,通过在表示等待关系的有向图中搜索循环来实现. JVM没有死 ...
- 基于python的知乎开源爬虫 zhihu
今天在无意之中发现了一个知乎的开源爬虫,是基于Python的,名字叫zhihu_oauth,看了一下在github上面star数还挺多的,貌似文档也挺详细的,于是就稍微研究了一下.发现果然很好用啊.就 ...
- selenium操作下拉选和网页提示框
import time from selenium import webdriver from selenium.webdriver.support.select import Select#处理下拉 ...
- requests 模块例题示范
requests 模块 re模块和requests模块结合示范实例 .*? 不加圆括号表示在要匹配里面的内容不要: (.*?)表示在要匹配的两者之间的内容都要: import requests imp ...