代码是负债,功能是资产

周末快速学习了一下Rust,关于这一语言本身除了有点类似Swift之外,倒是没有太多的感觉,但是Cargo是真的一下子吸引我入坑了。众所周知,C++的一直以来都缺少很好的包管理工具,很多时候在GitHub查看代码的状态就是,看一下这个库是不是写了Cmake,有的话下载下来然后尝试编译(一般也不知道到底要加什么flag),发现似乎没有编译完全然后就开始翻CMakeList,找到要加上的编译参数,做的好的话会有git submodule来拉取依赖,做的不好一点直接就是找不到,要你自己配置路径,自己安装依赖。反过来,对于自己的库也是如此,每次构建编译流程都是非常痛苦的体验。 但是在Cargo下,就和NPM一样,把crate上的package写在dependence下,一键安装,没有痛苦。自己的包也可以发布到crate.io上(Rust2021马上就可以构建私有的crate仓库),Rust作为一门底层语言,构建和编写方式竟然可以和前端语言语言一样方便,实在让我感到如沐春风。 当然我觉得crate还很原始,一个很大的缺陷是不能在一个project下构建项目,所以很容易你的名字会和其他人冲突,最搞笑的是rust官方有一个packad-simd项目,README里面说,原来packed-simd的维护者联系不到了,我们无法获得之前package的权限,所以要重新再建一个packed-simd2😂

进一步研究Cargo发现这个东西并不只是包管理工具,还可以一键生成文档(并且发布到crate.io上后,文档会被自动部署),一键运行测试,一键测试Benchmark。对于我这种每次创建C++库都要写弄几个文件夹,链接GoogleTest的人来说,这种集成操作简直是量身定制。更加逆天的是,Rust的测试可以写在各种地方,写在模块内部,写在外部,甚至写在注释环境里!

这里我就要特别说一下注释环境,我不知道其他语言有没有类似的功能(似乎Python有)在我之前的习惯里面,对于要学习的新库,都会弄一个Gtest的项目,然后写一点小测试,这里的测试并不是为了验证代码是否正确,而是为了验证我对他的API理解是不是对的,比如一个函数告诉你做LU分解,分解出来两个矩阵,哪个是L哪个是U,文档字面的意思是不是就是自己理解的意思,需要通过这样的方式来验证。也许这个库已经把他的用法都通过他的单元测试一一都展示出来了,但是测试和代码是分离的,用户很难一下找到具体的用法。 但是,注释里面如果可以写测试,而且这一测试还真的可以运行起来,不仅能让开发者在写代码的时候,随手就测试了(或者按照TDD,先定义测试,然后再实现代码),随手写的测试也不需要删除,直接放在那里,用户一看就知道怎么用)。在Rust当中,有非常多的内置Trait,一开始我都不会用,例如如何重载运算符,但是通过他的代码文档,我一下就能看到怎么去使用这个功能。 多说一句,Rust的文档写的是真的全,但缺陷也很明显,那就是不断和C++去做比较。Rust需要彻底忘记C++,才能真正超越C++。期待Rust Primier这样的基础教程会很快出现。

有句话是程序员常说的,代码是负债,功能是资产,我在GitHub上看到很多库,写了一大堆,没有单元测试,也很少有注释,说自己有多牛逼,其实第三方很难拿过来用,因为无法预计里面到底是怎么构建的,出现bug要怎么办。我在学习物理模拟的过程中,非常有幸遇到fluid-engine-dev这个项目,不仅在算法上,在对C++的理解上都因此得到了很大的提升。在数值计算领域中,Dealii项目曾经发表文章介绍开源经验,作者认为在让开发者在开发的时候就去写文档和注释,让文档和代码一体化,是推动这一项目发展很重要的要素。因此,Dealii当中,文档和测试的数量是源码的几倍多,非常容易让人拿来上手。

Rust的出现,在我看来除了对于C++的一系列改进,很重要的一点或许是推动程序员,从写代码,转变成写注释文档,因为注释即功能,功能即资产!

Future Plan

I have already decided to move all the codes in VoxSpace into Rust!, It will spend some time but will make the project in VoxSpace much easy to be used and deployed!

results matching ""

    No results matching ""