首次编辑:2024/10/29/22:02
最后编辑:2024/10/29/23:00
做开发的,最忌讳造轮子,毕竟时间本身就是最大的成本,哪个甲方/老板不给时限。
会在开发时自己造轮子可能分两种人,第一种是愣头青,新手开发者;第二种是大神,当然这种人写代码也许大多都是“just for fun”,时间成本并不在他们的考虑范围内。
于是开发时不得不使用别人造好的轮子,可能是一些拿来即用的库,也可能是开源的代码。
作为“科学家”,高校研究生大多数会用python,我们课题组也不例外。
python生态非常好,各种轮子应有尽有,加上官方也有包管理pip,除了pip还有别的包管理工具,需要拿别人的轮子时直接各种“install”就行了,确实是方便。
但实际用起来可能也不尽然。install一时爽,真跑起代码来就是火葬场,各种run time error直接把人整到心态爆炸,然后只能去网上搜索相应的问题,然后搜索引擎抛给你一堆域名为“csdn.net”的答辩,有时候觉得可能是自己对此网站带有偏见,为了早点解决问题强忍不适点进去,发现真的是答辩,还真没误解它,接着在搜索关键词最后键入“-site:csdn.net”再次搜索,然后发现其它地方的回答和答辩里的也没什么区别,接着就可以打开抖音摆烂了。
python依赖出问题很多时候都是版本问题,依赖本身也依赖别人写好的轮子,依赖的依赖又依赖了别的轮子,这么套娃下去,其中的某一环来个版本更新,可能这玩意儿就跑不动了。但除了版本问题,甚至遇到过包本身就有问题的,也不知道为什么不修复就摆上去了。
前些天搞这个python依赖的时候,出现run time error,在网上找解答,所有的解答都让我不要用pip install,而要去某个网站上直接下载whl文件,然后附上了网站的链接。好玩的是这个链接在年初失效了,由于失效的时间不是很久,几乎没有新的解决方案出现(反正我没找到),所以这个问题直接无解了。最后还是有聪明把那些whl文件保存在了github上,才暂时救了我崩溃的心灵。什么?为什么是暂时?因为很快就有新的run time error出现了。
迫不得已我选择放弃python,毕竟很多python包本身就只是C/C++批了层python的外壳而已,python的语言特性也使得它维护起来比较麻烦,虽然开发时确实快。我后来想着直接用C/C++吧,毕竟C作为python的爹,两者交互起来还是比较简单的。
于是到了C/C++这边。
纯粹的C库,规模小的其实还不少,但一旦上规模,纯C库就几乎看不到了。大家都乐意用OOP,选择了C++,但C++可不止只有OOP。
如果说写python最怕run time error,那么写C++的最怕的是……反正我最怕的是template,一旦出现模板问题,那报错真的又臭又长,生怕你知道问题在哪里。
template的问题可远远不止于此。python、C、C++程序员同时进行相同目的的开发,python的写完了,C的在造轮子,C++的还在写typedef
。template固然强大,但用起带template的库,那可真是太幸福了,模板参数里有模板参数,模板参数的模板参数里还有模板参数,一个模板类型就可以占好几行代码,于是只好不停地typedef
。所以我最怕用的就是C++库,用python把库的用法看完了,用起来了,用C++看着一堆模板参数陷入沉思,再看看库中配套的example,一个个typedef
再次陷入沉思。
当然这都是把依赖库装完之后的事了,C/C++装依赖库可也不是件容易的事。相对于python,C/C++没有什么广为接受的包管理机制(什么?vcpkg?msvc的东西能叫C吗?——参见我对msvc的吐槽),所以依赖都要自己装。这可热闹了,每个库的安装方式都不一样。
第一次接触比较大型的C/C++项目的时候,我跟着课题组的师兄装了很多依赖库。当时还在搞机器人,装的依赖有ROS、Qt、eigen、opencv……那时我第一次感受到了依赖对项目的重要性。而因为需要对依赖库作出适配需求的修改,很多依赖都需要源码编译。然后就是痛苦的装库过程,俗称“配置环境”。今天源码编译,先config
,然后cmake
,然后make
,然后make install
……特别是make
这一步,大型的库可以等上一天,然后中间还可能爆error,然后重来一遍。不晓得这要是天天开会怎么跟领导汇报,装环境装了一个星期,还没装好。后来不搞机器人了,做现在这个项目时也找了很多开源库,发现还有一种更加友好的库,那就是“header-only”的库。这种库只有头文件,不需要编译安装,用起来十分方便。
岁月还是没那么静好,虽然用的是header-only的库,但今天面对这个庞大的C++库的时候,还是没能够用起来。太庞大了,超级多模块,甚至根本不知道自己该用哪个模块,官方文档感觉做的也不是很好,只好去跑example,结果很讨厌的是,example很多都需要依赖别的库,而且这些个“别的库”还不是这个库的必备依赖。最终只能落得个example也看不懂,跑也跑不动的下场,实在是让人沮丧。
很久之前我就一直好奇为什么软件专业的同学电脑里已经装了vscode,却还要装个visual studio。
直到后来我看了一本叫《windows核心编程》的书,然后想敲敲书里的代码,结果因为某些原因还是需要用到msvc(此前我一直是用mingw-w64 gcc作为编译器),然后以为可以像gcc一样下载一个轻量的命令行工具,结果它告诉我要下载msvc就得下载几十个g大小的Visual Studio,我只是要朵花,偏偏送我依托答辩,我不要还不行。那之后我就对这托答辩更加厌恶,你答辩还是你答辩。