目录
本文只是一个杂谈向没啥技术意义的文章,实在是心态被搞崩了吐槽一下。
非要从源码安装软件
很多人安装软件喜欢从源码安装,因为可自定义程度高一些。这无可厚非。
但为什么你们写博文也引导别人从源码开始构建???是嫌新人学东西不够累还是嫌开发者带新人不够麻烦,需要普及的知识不够多???有时候只是要进行一个简单的验证,需要的仅仅是一个非常非常简单的能用就行的版本,结果网上一搜好家伙十篇高点击量博文恨不得有九篇是从源码安装而不是简单方便的包管理系统。学生们(连pkg-config都不知道那种)看了你们的博文后非得死抠源码安装,但这其实就是一个apt/yum能解决的事啊!这到底是为什么?为什么你们这么执着于从源码开始构建呢?我就不信了,难不成网上写博客的人个个都有自定义安装需求?而且连压根不需要你去自定义的库都要从源码安装,到底是为了啥啊?单纯为了追求技术极限?不是,你也不研究源码,也不需要自定义安装,也不需要总是保持最新版本的库,你这是追求了个锤子啊?
建议
如果你没有自定义库的需求,而是能用就行,使用包管理系统或其他官方安装渠道在99%的情况下是可行的。比较常见的例子是OpenCV,明明一个apt能搞定的事,非得从源码开始自己瞎折腾,麻烦不说还容易出错。还有hiredis也是,网络上十篇相关博文里,九篇都有类似的迷惑行为。
路径硬编码“教程”
很多时候,用户想要CMake能做的傻瓜式操作,最好是开箱即用的项目配置,而不是说,如果我的库依赖于GTest,我必须在构建它的时候先手动指定GTest路径——绝大多数情况下,这不是很难做到。但是,偏偏有的人就把VS的那套硬编码指定方案当教程发出来。
拜托,大家都是工程师,VS怎么用需要你来教吗???不会的新人自然会去搜索VS用法的。
建议
那类教程纯属垃圾,不要生产那种玩意。
能查文档的地方就是不查;博客误导他人
有新人写了if (isdigit() == 1),挂了(行为和预期不一致),问别人为啥。我寻思无论是cppreference还是man手册都写得非常清楚吧,isdigit返回值不是0和1、不是0和1、不是0和1,重要的事情说三遍!那些博客里胡写的人也是够不负责任的,我查到的但凡是有出处可循的资料都写得很明确,isdigit的返回值是0和非零值来区分的,至于这个非零值是多少就完全是实现定义的了,可以是1可以是2也可以是其他数。但凡写博客的人稍微负点责任也不会犯这种错误,可是网上就是很多人瞎写,真的是服了,瞎写还不如不写。
建议
别轻信网上的博客,遇事多查权威资料和第一手资料,例如cppreference和StackOverflow(虽然这里的也不可尽信)。
胡乱分析问题
曾经看到了一个特别有意思的问题。确切而言,不是问题本身有意思,而是底下回答有意思。
问题:
LPSTR buf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
0,
(LPTSTR)&buf,
0,
NULL);
输出为啥是乱码呢?
很显然或多或少跟编码问题有关。而回答区一堆人说什么LPSTR没分配,给我气笑了。稍微去MSDN查查就知道FORMAT_MESSAGE_ALLOCATE_BUFFER是自动分配内存的含义,就算不查,类似的函数总遇到过吧?就算没遇到过,英语看得懂吧?allocate分配,buffer缓冲区,这是什么很难的单词吗?结果底下回答者也不看代码细节,也不查资料,甚至很可能没有足够的工程经验(C标准库里就存在一些不需要程序员管理内存的调用),就在那乱分析一气。
我个人强烈建议工程师们都多学学英语,但凡英语四级能过的水平也不至于不认识这点词汇。就算真不想学英语,动动手查查文档也没那么难吧?
建议
不会用的东西不要乱说好吗!提问者没有提供源码、没有判断的切入点也就算了,包含主观判断的东西你怎么想也无所谓,但源码这么清楚了,自己尝试编译一下就能复现问题,这都能乱答一气,这合适吗?
根本不能称之为博客的文章
竞赛生写题解都是要有详细题目分析的,有的人写的博客只有代码,没有注释没有出处没有说明,堪称三无博客。(说实在的,这种东西能叫博客?他们不知道有种东西叫做github吗?他们不知道那才是专门放代码的地方吗?)要命的是这种三无博客的代码复制出来还很可能是错的,有些代码稍微改下环境就不能正确运行,存在明显的bug,而博文中对这种明显bug只字不提。
建议
如果你只有代码没有解释,那么你的东西应该发到git网站而不是作为博客。更何况有些这类“博客”代码风格非常糟糕,根本没有任何参考价值。真的不要这样做了,对于别人而言是浪费在搜索页面上翻找结果的时间,写这种东西对你自己而言也毫无益处。
值得一提的是,这么做的一般是做点简单竞赛和简单工程的小工程师,往往把自己的那点世界当成全世界的普遍情况,因此也就不难理解为什么他们的博客往往只有代码——他们以为自己的代码能在任何机器上跑起来,完全不需要说明平台环境。算是典型的“所有东西都是PC/蓝桥杯/OI/ARM/x86/Windows etc综合征”患者。
“所有东西都是PC综合征”
有的文章标题写着的内容和代码关联度不足,题目描述的平台背景很不细致(这么干的一般都是新人,觉得他那台PC就能代表全世界的计算机),比如说标题是“C++实现xxxx”,找了半天linux解决方案的我看见这个标题还以为是C++标准库提供的标准方案,兴冲冲点进来一看满眼的Windows API调用,这种文章的作者一看就是初学者,至少对软件的理解极其浅薄;这些代码甚至有些换个Windows版本就不能正常编译了。有意思的是有些copy小能手偏偏喜欢复制这种,真是服了。
建议
醒醒,你手里那台笔记本完全代表不了全世界。与许多新人的认知正相反,Windows并不是万物起源;事实上,世界上最主流的开发设计思想还是Unix留下的,就连Windows也继承了其中的很大一部分,但是Windows的设计仍然与其他主流平台(除了Windows外,其他平台一般普遍接受POSIX等Unix设计标准)有着巨大的差异。而且事实上,Linux和Unix之间也有差异,Debian、RH系Linux系统也有差异。总之,如果你的代码缺乏跨平台能力,那就不要写“xxx语言实现的xxx功能”这种标题党标题(尽管不是故意的),这完全是在浪费读者的时间。请写“xxx平台上xxx语言实现的xxx功能”。
暴力做法
我见过有的人写C++复制文件时直接就一个ifstream一个ofstream一边读一边写。我真服气了,不知道有复制API你可以查啊,你觉得文件系统有可能不提供这么基础的功能吗?这为了复制个文件,本来一次内核FS操作能解决的事,非得反复陷入内核,是客户嫌你的程序效率太高了要改低点么……还有啊,我见过有的学生做个位运算,直接bitset暴力遍历,给我人看麻了,本来掩码一条指令搞定的事,让他整的又是循环又是逐位读取(没错这个人其实连bitset都不怎么会用!),直接八倍常数起步,还搁我这抬杠说自己位运算很好……现在有些学生仔真是太掂不清自己几斤几两了……
建议
不会就学,少误导别人。写博客前先查,哪怕你只是做个翻译或综述,也比这么做要好……
“工程等于竞赛综合征”
有的人管C++的vector叫数组,由此衍生出了“bool数组每个元素只占一比特”的说法。竞赛生为了方便这么叫,我们管不着,但你作为做工程项目的工程师真就信了,这不是离谱么……人家说的bool数组是vector<bool>,而且说真的,把vector叫做数组严格而言就是错误的,STL中有个专门的数组容器array,管vector叫数组的工程师……emmmmm……建议补习英语。
还有的其他各种代码风格之类的问题,就不多提了。
建议
作为工程师,多刷题,少看OJ上各路人士的竞赛讲法。
标题党
上文提到的只有代码的文章,相比标题党还算好的。我见过最离谱的标题党是把linux下的文章翻译一下改个名就说这是windows下的操作,全文到处都是gnu的东西,msvc连影子都没有,根本没提mingw和cygwin之类的,文章标题改成Linux下的库使用也完全没问题。问题是,我特意找win下的使用,就是因为我是在win下工作(而且我要适配MSVC),结果居然找到的是披着windows名字(也只是空有一个名字)的linux文章。哪怕文章里提一下mingw也不至于显得这么离谱。你说这种标题党行为有意思吗?程序员知道Cygwin,知道MinGW,该用的时候会用的,不需要你写个只有Windows名字的Linux文章,工程师们没那么傻。就算是小白,只要去查一下Win怎么适配Linux/GNU/POSIX API,肯定能查到有关软件。诚然很多普本只教学生其然不教其所以然,但工程师们不是普本里的混子,不然也不会上优快云提问和找资料,不要再生产毫无营养的标题党文章骗流量了谢谢。
建议
麻烦不要挂着羊头卖狗肉谢谢,工程师们不需要。
还有,建议优快云严查标题党好吗!这种标题党真的非常非常浪费时间、非常讨人嫌、非常令人厌恶!
“能用就行”党
我认为是水平差到仅次于标题党的存在。事实上,只写代码不写解释的人,恐怕多半是这类。这类人知其然不知其所以然,本着“能用就行”的思维,给这世界多贡献了不知多少垃圾代码。
典型的例子是,复制文件中,系统底层一定是提供copy调用的,很多语言也有自己的封装。而我见过一个这么写的:
ifstream ifs(origin, ios::in);
ofstream ofs(newfile, ios::out);
string buff;
ifs >> buff;
ofs << buff;
我当时就震惊了,谁教你这么搞的?长点心吧,你这一小块一小块IO,不比系统调用慢太多了?谁这么教写代码的,那他可以离职了。
我还见过一个更离谱的:要求用掩码设置标识位,这位直接一个bitset暴力遍历,还嘴硬告诉我这是位运算(虽然说确实是位运算实现了bitset,可能8位一起设置你为啥偏要一个一个设置?)。就真离谱。能教出这种玩意,建议他们的教授引咎辞职。
建议
多读读书多找找资料多写写代码准没坏处,多了解底层没坏处。还有,建议国家清理掉连个基本语法都教不会的劳什子教授,这种饭桶留着有什么意义吗?
复制狂
不多解释。复制点好文章我也不说啥,居然有人复制毫无营养的标题党文章,真不懂这些人是怎么想的……
建议
复制那种东西还不如让你的博客页面保持空白。