前言
[开源笔记] 系列是我在开源道路上的文章专栏,内容涉及我在开源方面的工作历程,对开源理念的思考,在开源项目方面的心得体会,以及在GitHub使用上的一些说明等。作为开源领域的小白,希望这个专栏和我一起在开源领域不断成长。注意,本专栏不涉及开源项目的具体细节(例如项目代码和Issue管理等),这些内容可以在我的团队账户(https://github.com/VisionRush)或者个人账户(https://github.com/wangboNlpr)上找到,这个专栏的定位是我在开源工作中的日记。
本文是我在开发vraux项目过程中的一些笔记和思考,作为开源领域的小白,希望得到批评指正。vraux是一个应用于c++项目开发的辅助工具库,它源自于我这几年研发工作中积累的各种工具函数代码并加以整理,提供了常用的文件遍历、文件检查/验证、文件加解密、简单日志、字符串处理等功能,支持linux和windows平台的编译使用,并且不依赖其他任何软件库。目前vraux项目还处在内部测试阶段,有很多不完善的地方,欢迎大家批评指正,提出宝贵的意见。
vraux的项目地址:https://github.com/VisionRush/vraux
文章小节安排如下:
1)VRAUX项目介绍
2)为什么要发布开源项目
一、VRAUX项目介绍
1.1 vraux的开发初衷
首先来思考几个问题,或许在coding的过程中你们也遇到过。
1)为了遍历文件夹而引入boost;
2)为了加密解密文件而引入crypt++;
3)为了计算直方图而引入opencv;
4)为了简单记录一下日志而引入glog;
5)写了无数遍的文件遍历;
6)为了打印日期而编写好几行格式化代码;
…………
我们经常为了某一个功能而不得不引入一个庞大的软件库,例如boost、opencv,或者为了一些简单的功能反复编写函数,例如文件遍历(不得不说我写过无数次文件遍历),又或者为了一个小功能编写十几行代码(c/c++有时候就这么不方便),例如带日期和线程id的消息输出等(日期的格式化就需要三行代码)。
如果你们也遇到上述的问题,那么你们一定知道这些问题会导致复杂的软件库链接,冗余的程序代码等等问题,同时我们知道,项目代码中30%~40%的代码量其实只贡献了10%~15%的价值。这些都是令我抓狂的现象,我无法容忍过度复杂和冗余,我相信一切优秀的事物都是可以用简单高效的方式呈现,所以在这些年的无论是科研还是编码工作中,文件结构整齐清晰和程序代码精炼高效一直都是我的追求。
出于对精炼高效代码风格的考虑,我决定建立这样一个软件库项目,解决那些零碎繁琐的编程问题,在项目中可以用更少的代码量贡献更多的价值。这便是该项目的初心。
1.2 vraux的主要模块
因为我从事科研工作以,并长期参与机器学习项目开发,因此在开发vraux的时候设计了五个模块,
1)File System Operation,涉及文件遍历、文件验证等功能;
2)System Operation,涉及时间、简单日志、字符串和文件的加密解密等;
3)String Process,涉及字符串分割、字词替换等;
4)AI,涉及特征归一化、相似度计算、矩阵计算、坐标旋转等;
随着项目经历的丰富,以及开源社区用户的不断参与,后续也许还会继续扩展模块,但我希望可以一直保持着精炼高效易用的基本原则。
1.3 vraux的特点
vraux是一个轻量级的工具类软件库,以c/c++为开发语言,支持linux和windows系统。vraux提供c/c+项目开发中常用的函数功能,复杂度非常低,软件体积小,方便集成,并且易于扩展和更新,适用于在中小型项目中应用。
1.4 vraux的使用
vraux的定位是“方便小巧的辅助工具库”,目的是精炼项目代码,减少第三方依赖,提高开发效率。例如我们在遍历文件夹的时候只需要三句代码就可以了:
VRFileSystemTool vrtool;
vector filenames;
vrtool.TraverseFileNamesRecursively(“somedir”, filenames, “*.h”);
又或者分割字符串和替换关键词,只需要执行:
VRStringProcTool vrtool;
vector items;
vrtool.Split(str, ‘&’, items);
再或者你需要加密解密一个文件:
VRSystemTool vrtool;
char pwd[11] = “1234567890”;
// 加密文件
vrtool.EncryptFilevr(input_file, encrypted_file, pwd);
// 解密文件
vrtool.DecryptFilevr(encrypted_file, decrypted_file, pwd);
这些都不是很复杂的函数,在项目里也只是很小很小的一个功能,但自己写起来却也是要花费一些功夫的,而且我们也不愿意花时间在这些苦力工作上,对了,也许还需要同时支持windows和linux。
vraux就是为了解决这些烦恼的,在我的使用中,我一般是将其生成一个动态链接库使用,并在我的类中声明一个需要的对象,然后就可以方便的在任何类函数中使用了,例如:
class SomeClass
{
public:
……
private:
VRFileSystemTool vrfiletool;
VRSystemTool vrsystool;
};
1.5 vraux发布情况
vraux在GitHub上发布,地址是:https://github.com/VisionRush/vraux,在2017年7月30日发布第一个内测版本,发布账号是VisionRush,这是我们团队的GitHub账户,目前参与人员有我(wangbo@ia.ac.cn)和另一个同事(wangjian4500@gmail.com)。希望看到本文的读者可以积极参与进来,一起讨论一起开发,将vraux建设成为一个有价值的开源项目,为更多的开发者提供服务。
作为开源领域的小白,我在Git项目管理上几乎是一片白纸,发布过程也是一边学习一边发布项目,足足发布了一个下午,到现在GitHub上也还有很多功能不了解是干什么的,但总算是把vraux发布了出去,期待着批评和指正。
我希望可以通过vraux项目来不断学习开源精神,学习一个开源项目的管理,同时也提升自己在项目管理上的能力,和vraux项目一起成长。
二、为什么要发布开源项目
我为什么要在GitHub上发布一个开源项目vraux???总结下来应该是以下几点:
1)提高自身的项目管理能力和效率
随着工作经验的丰富,我负责的项目开始多了起来,如何管理好每个项目成为我必须面对和思考的问题,尤其是对于项目代码的管理。从我的经验来看,项目研发的参与者越多,程序代码的管理就会越复杂,我们可能会搞不清楚自己电脑里哪个文件里存储的是最新版,在协作中很可能需要花费大量时间弄清楚彼此代码版本的差异,项目代码会趋于混乱直至失控,最终不得不花大量时间精力来重构代码。
因此版本管理的重要性愈加突出!良好的版本管理意味着工作效率的提升,所以我决定开始深入学习Git,希望可以提高自己在项目管理方面的能力,也希望提高团队的项目管理效率。
这也就是发布vraux的目的之一,就是为了更深入的探索Git的各种版本管理功能,提高自己使用Git工具的熟练度。
2)提高自身的自律能力
人都是有惰性的,如何监督自己在技术的道路上不断前行呢?显然光靠列计划做保证是不行的,干脆发布一个开源项目让自己行动起来,我知道自己是非常要面子的,所以我为了不丢人也要不断的优化vraux软件库,提高vraux的运算效率。利用自身的性格特点来制定计划提高自己的自律能力,应该是个不错的办法。
如果我不把项目放在GitHub上,那我也许就不会去认真优化每一行代码每一个函数,但如果我放上去了,那我就会非常慎重的编写代码,思考程序结构,优化计算速度等,因为我非常不希望当有人阅读我的项目时候说:这个项目写的太烂了,就是垃圾!
3)希望可以帮助别人
在丹·艾瑞里的《怪诞行为学》中讲到,人们热衷于为他人提供帮助,乐于为社区做贡献却不收取任何报酬,这是社会规范下人们的行为特点。深入思考的话,我认为在这个世界上,每个人都希望自己是一个有价值的人,希望得到尊重,希望不被遗忘,希望结交志同道合的朋友,而帮助他人是收获这四点最好的方式。
4)虚荣心与满足感
如果有人star了我的项目,我会很开心;如果有人fork了我的项目,我会非常高兴;如果有人向我提了问题,那我也许会兴奋的跳起来(这说明有人在使用我的代码),并且也许会按捺激动的心情有意无意的向朋友提及此事,这就是虚荣心在作怪;如果有人留言称赞我,那我的心情会愉快好几天,这是一种强烈的满足感。
人性就是这么简单。
无论是发布开源项目也好,还是我写博客也好,基本可以概括为以上一些原因,世界之所以美好,依赖的就是每一个人孜孜不倦地努力做着那些看似不产生价值地事情,但这不意味着没有收获。最后以自由软件精神领袖理查德 · 马修 · 斯托曼的一句话作为结尾:
Free is not free.