专访许鹏:谈C程序员修养及大型项目源码阅读与学习
摘要:阅读源码是开源项目最好的学习方式,然而真正的执行起来却并不容易。这里我们为大家分享许鹏的源码阅读经验、C程序员的修养以及Spark和Storm源码走读博文。
对许鹏的第一印象来源于其Bolg的粗读,最早时候更准确说应该是博文的粗略统计——1年零6个月完成55篇以上的博文,基本每篇都附有代码,其中更有多篇源码解读博文。而在浏览完大量的Storm和Spark源码阅读后,笔者更认定了这是位Hadoop、Spark、Storm等相关技术从业人员。然而在与许鹏本人沟通之后才发现,其实最贴近他本人的描述正是其Blog简介——“富贵有定数,学问则无定数——求一分,便得一分。”之所以说是贴近,因为其中还少了乐于分享的部分。
关于许鹏:花名@徽沪一郎,2000年毕业于南京邮电学院,现就业于爱立信上海,在UDM部门从事相关产品研发,个人关注于Linux内核及实时计算框架如Storm、Spark等。
开发是Linux平台上的C&C++编程,常常遇到进程Crash和内存泄露之类的问题,于是就对GDB和Linux内核中的Memory Management有了比较深入的学习。
CSDN:多年C和C++项目开发及管理,有什么经验可以分享给这个领域的工作者?在程序员修养方面,他们又应该注意什么,多学些什么,多看些什么?
许鹏:尽管从事C和C++开发多年,我还是不敢说自己非常精通。有的只是一点点的感悟和体会,如果是进行Linux平台下的C语言开发,最好还是就下面几个问题多做一些试验,多读一些相关的书。
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,在这两个方面有可分享给读者的么?
CSDN:您花了大量的时间阅读Spark和Storm源码,并进行测试,对这两个计算框架您有做过比较吗?有什么结论可以为大家分享?
- 从应用的广泛程度上来说,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:大量开源项目使用和学习经验,您对开源运动怎么看?如何才能更好的学习一个开源项目?开源项目使用时又该注意些什么?
许鹏: 开源项目离不开大家的广泛参与和支持,要让一个开源项目取得成功,有多个方面的因素。
许鹏: 大数据要解决的两大基本问题是“数据存储”和“数据分析”,在数据存储领域,开源实现方面似乎大家都已经首肯HDFS的方式,不再怀疑。
云计算是大数据的支撑,虽然脱胎于虚拟化,不乏商业宣传的味道,但是大量机器的安装部署,如果全部使用物理机一台台去装,肯定会让人发疯,云计算让大规模部署和产品迁移变的更为简单。
CSDN:对于阅读源码您有着丰富的经验,对想阅读源码又不知道如何下手的同学可否做一些分享?
2. 清楚要分析产品的大体框架和关键性的概念,也就是理解清楚architecture和key concept。
4. 修改日志级别,得到丰富的日志信息。有了这个为基础,再来开始真正的源码阅读和分析。
- 这一部分代码是在同一个进程中么,同一个线程中么,运行在同一台机器中么
- 每一个线程都要问清楚,什么时候启动的,什么时候停止的
- 消息传递的路径,针对每一个函数,搞清楚,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
Apache Storm源码阅读笔记(PDF版)
专访许鹏:谈C程序员修养及大型项目源码阅读与学习相关推荐
- Thinkphp5内核大型程序员交流博客系统源码
介绍: Thinkphp5内核大型程序员交流博客系统源码 网盘下载地址: http://kekewl.cc/qGKM757akv40 图片:
- 大米新闻微信小程序和Springboot新闻管理系统项目源码
介绍 本项目分为大米news小程序端和springboot新闻管理系统后台项目.小程序主要用来新闻展示,后台管理系统用于提供相关新闻API. 项目源码 参考:https://www.bilibili. ...
- 趣谈程序员真香定律:源码即设计
来源 | 码砖杂役 责编 | Carol 封图 | CSDN 付费下载自视觉中国 我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert ...
- 【华为云技术分享】程序员真香定律:源码即设计
我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert C.Martin大叔也不同意,Martin认为"源码即设计" ...
- Python开发指南[1]之程序员计时小时钟(附源码)
Python开发指南[1]之程序员计时小时钟 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 Python作为一门编程语言,这门语言的魅力和影响力已经远超C#.C++等编程 ...
- java调用微软语音库,程序员罗杰-.NET C# 语音合成源码(TTS)微软库
应表哥要求,写一个简单的TTS软件,他们单位上用于广播通知用.源码如下: 简单说明: public partial class frmMain : Form { public frmMain() { ...
- 最炫表白网站html5源码_七夕程序员的十款表白源码
❤ 精彩专栏推荐
- b站黑马程序员python教程飞机大战源码
plane_main.py import pygame.timefrom plane_sprites import * pygame.init()class PlaneGame:"" ...
- 程序员为什么要多读源码?
首先我们要知道多读源码对我们有什么好处 1.多读源码可以让我们自己写出结构更优质的代码. 很多优质源码的质量是经过考量的,也是经过多次优化的,并且大部分是稳 ...
- 读君山-七年阿里老人谈新人程序员的成长
读了君山老师<七年阿里老人谈新人程序员的成长>觉得总结得非常好.整理记录一下. 做自己 做事积极主动 学习自我驱动 总结.沉淀.分享,积累影响力 做越来越大的事 把别人的事当成自己的事,做 ...
最新文章
- Exchange2013DAG配置-零错误
- Consul负载均衡策略
- opencv 使用cvload加载xml出现错误原因解析及方法
- VTK:可视化之ExtrudePolyDataAlongLine
- 走近NAP功能 全面了解Vista系统安全机制
- python __init__ __new___Python中的__init__和__new__介绍
- winform的UI设计关键属性汇总
- python目前有多少库文件_必学Python库 你知道多少?
- Oracle数据库----视图
- RPC-非阻塞通信下的同步API实现原理,以Dubbo为例
- iFrame can't save session cookie
- 【名词解释】7.UML类图
- 钢笔墨水能否代替打印机墨水_喷墨打印机该用染料墨水还是颜料墨水?
- 设计模式~调停者(中介)模式-06
- gdal gdal2tiles.py 的使用
- 戴尔 R730xd 服务器更改管理口密码 图文教程
- 混淆矩阵评价指标_分类效果评价指标一混淆矩阵
- 时下流行的css3页面纵向滑动效果
- scons脚本应用笔记
- Pascal 过程与函数
热门文章
- 异常0x0000005
- Flutter更改主题颜色报错:type ‘Color‘ is not a subtype of type ‘MaterialColor‘
- matlab矩阵的白化,白化原理及Matlab实现
- 数据分析师是做什么的?数据分析师岗位职责
- EXCEL 正态分布概率计算 NORM.S.DIST()和NORM.DIST()函数
- 1000瓶药水,其中1瓶有毒,最少要几只老鼠?
- 使用NLTK实现stemming
- 解决复制网页文本多一个空格的问题
- js文本框设置必填项_显示隐藏js字段 设置必填非必填
- python — 二手房