2009年9月20日星期日

电子工程师乱弹编程-使用开源代码技巧

还记得我们学语言的时候,就是从模仿开始的。对我们这些外行人,第一件事不是试着”说话“,而是应该学习如何做到“牙牙学语”。今天我想乱弹的问题是如何阅读别人写的代码,并使用它。通过读别人的代码来学习技术即实际也很有效率。现在很容易就可以搜索到很多优质的开源代码,读懂别人的代码然后加以修改加入我们的项目,外行人或技术落后者也可以做出和专业人士一样高质量的软件。这里我想到一件事,中国最早的第二代坦克80式有:德国730匹柴油发动机+英国的双向稳定火炮控制系统+奥地利的105毫米线膛炮。通过引进吸收十几年过去了,中国的99式,第三代主战坦克,已经是世界上最先进的主战坦克之一,所有的配件完全国产,并掌握所有相关技术。以下我想结合这个坦克制造这个例子谈谈阅读使用开源代码的技巧。

技巧:

整合资源阶段:若想在我们的坦克中加入德国730匹柴油发动机,那么首先应了解这个发动机的性能参数,搞定一切我们所需要的资源,使用开源代码也是一样。


# 下载源码文档。
# 找到源码文档的网页(例如通过文档生成器的doxygen写的文档),我们可以轻松地通过这个网页阅读程序,这种方式的阅读效率也是很高的。
# 找到自己感兴趣的部分,通过这个部分可以"解决我们需要的一个特定的问题"。
# 了解命名规则(或惯例)。
# 试着在网上找一下“专业人士”对该代码的分析,这样会对我们理解整个系统代码概括达到事半功倍的效果。例如,我们想要使用FFmpeg的源码,我可以找到很多关于源码分析的文章,我们可以很轻松的理解FFmpeg的数据结构,理解它们的关系,例如“AVFormatContext派生出AVStream派生出AVCCodecContext派生出AVCodec”。通过网上的文件我们可以快速地理解FFmpeg的初始化函数和编码函数的使用方式,有些数据结构和函数比较生涩难懂,但是如果有了这些文章的帮助,我们可以迅速上手。
# 保存归纳搜索到的资源。
# 背景知识的准备,也许有时需要一些背景知识,还是FFmpeg这个例子,例如有些概念需要理解mux, demux, encode, decode, codec, yuv, 容器格式,视频格式等等。这对于真正理解源代码也很重要。如果只是停留在代码的层级上理解,其实并不是真正读懂了这个代码。也许这是我们学电子学生的优势,也许我们的抽象力不如学计算机学生,但我们可能会更容易地从现实层面知识背景层面理解代码的内涵。如果我们彻底了掌握了我们的坦克中要加入德国730匹柴油发动机的技术,那么离我们自主创新也不远了。

修改拆解,编译,调试阶段:如何将英国的双向稳定火炮控制系统放入我们坦克系统中,让它发挥出效能,是这部分我们要谈谈的内容。


# 拆解代码,然后将拆解的代码加入我们的项目中。
# 编译调试代码,在编译的过程中一定会有很多问题,一定要有耐心,细致。(也许有时先注释掉一些代码,然后再编译也是一个方法。),也许有时编译不通过 是因为没有完整加入所需要的全部元素。
# 编译成功后,试着让它能正确运行。
# 反复调试,如果可以,这时加入单元测试。

优化,提炼,系统整合阶段:继续开篇的例子,坦克系统相当复杂,如何优化,提炼,系统整合这些新加入的配件,绝对是成败的关键。


# 统一编程风格。我们整合的原代码的编码风格肯定和我们自己的风格不一样,先统一风格。
# 改善代码的结构。
# 优化代码,整合系统,考虑系统效能
# 除去一些不必要的代码,提高系统效能。

总结:整合资源,修改拆解,编译,调试,优化,提炼,系统整合并试着锻练自己的阅读技巧。

预告:下一篇文章我想结合我的一些经验和教训,谈谈电子工程师编程时的“坏习惯”和(群体成员背景和价值观的相似性产生的)“团体迷思”,文章选题比较泛将分篇释出。

没有评论: