当时写C代码,其中有个矩阵乘法。这种没有技术含量的玩意我向来是懒得写的,就问同组的同事要。
同事给我,我问了接口,就直接拿着用了。写完后我就去吃饭了。
吃着吃着,我突然有点想不通一个问题。什么问题呢?
为什么同事给我的代码这么好用?
矩阵乘法方法的返回值应该是一个矩阵对吧?但是C语言是没有办法返回矩阵的。大公司的做法一般只有一种——将返回矩阵的地址作为入参,修改这个入参就可以了。
大概是这样:
void func( float input1[], float input2[], float output[])
如果是要求不高的小公司,还有一种做法。就是在函数中定义一个static的矩阵,在这个矩阵上修改,然后返回矩阵地址。在主函数上建立一个地址,引用该函数的返回值。
大概是这样:
float *func(float input1[], float input2[]){
static float output[10] = {0};
//do something to output
return output;
}
void main(){
float *p;
p = func( input1, input2);
}
这种方法为什么不推荐用呢?主要问题是采用了static关键字,大公司不喜欢这种生存周期和函数不匹配的玩意。
不推荐用的原因还有一个,就是这个函数第二次被调用时,这个参数的地址还是不变的。换句话说,该参数的值会沿用上次的值。
然而我注意到同事给我的代码,入参并没有output。main函数也确实弄了一个句柄去接受函数func返回的地址。但同时没有出现我所说的问题。
我就很奇怪啊,什么时候C语言支持返回数组了?我就去看同事的函数。
看了之后我他妈大呼娘希匹!整个函数的逻辑是这样的。
float *func(float input1[], float input2[]){
static float output[99999][10] = {0};
int x =rand();
//do something to output[x]
return output[x];
}
他他妈为了避免第二次调用该函数会引发一维数组重复调用引发的问题,他直接建立了一个极大的二维数组,然后每次调用不同的一维数组,避免重复调用的问题。
最骚的是他调用不同的一维数组的方法是随机一个数。
我真是活到老学到老。
有些人没看懂。我尝试解释一下。
简单的说,正常的写法是函数制造一个数组,修改数组,返回数组地址。这样的问题是第二次调用的时候,返回的数组是同一个数组,会有问题。
这位Super Baby他妈的弄了99999个数组,每次随机取一个,修改好返回,于是第二次调用时不会返回同样的数组。
你可真是个小机机鬼啊!
根据评论区一些同学的反馈我更新一下:可能之前没有写太清楚让人以为我写的是这人的技术水平。我这里提的“差”是指职业道德上的,拿最多的钱,干最少的活。忽悠同事不懂,把自己的代码藏成黑匣子。
纯从业务来说,这些代码是满足他们当下的业务需求的。但是该技术总监躺在20行代码的功劳簿上,并且这种态度把公司做死,我认为比任何代码写的差都严重。
我在约2010年的时候,曾经接手过一个“技术总监”的代码。
当时还是视频网站百家争鸣竞争的时代,这家公司的业务与优酷、土豆网、56等新兴视频网站类似。
据说该技术总监管理了后台几百台服务器的调度(当时还没有云计算,都是自己买服务器堆到IDC机房),用来处理整个后台的所有视频转码。大神很牛逼,耗时两年一个人独自打造全套代码,不需要带任何小弟,可以完成整个网站的视频编码任务,由于该模块属于公司核心机密,所以大神手头的系统是一个黑匣子。
直到这个公司倒闭,我所在公司收购了这家公司的资产,所以我有幸看到了这位大神的代码。
我只能用
“叹 为 观 止”
来形容这位大神的代码!
两年时间约写了20行代码,其中大概有2处goto,goto的标记是这位大神的名字拼音。
代码是用perl语言写的一个脚本,大概逻辑是:检查某个目录(挂载的nas目录)是否有待转码视频文件,如果有,则改名并且调用ffmpeg转码。
去掉goto和一堆辣鸡print后,大致核心伪代码如下:
while(true){ if exist {video file} in Directory{ rename {video file} to {video file encoding} ffmpeg -i {video file encoding} -o {video file output} other params } sleep(60 * 1000) }
(注:ffmpeg为调用一个开源的视频转码工具 -i 是指定输入文件 -o 是指定输出文件)
每台转码服务器上运行大概5-10个以上进程,这些进程分别每隔一小段时间就到共享磁盘上去“抢”待转码任务。。。好一个分布式调度!
这段代码居然支撑了2年业务没出太大问题……
但该技术总监拿着公司几乎最高的年薪,2年写了20行有用的代码。(精简后可能不到10行)
我当时大致明白了这家公司为什么会倒闭。
后来清点该公司资产的时候,服务器、交换机等都是花了市场上5到10倍的价格采购,据说也出自该技术总监与采购部门负责人合谋。
真的是打工皇帝典范。。。。。
这事我知道,是因为他们用袋鼠摘葡萄。据悉,当地人会用小袋鼠胁迫成年袋鼠一天工作10小时以上,不完成任务还会克扣口粮。更有甚者会对袋鼠进行拳击。中国作为爱好自然、坚持可持续发展的国家,决不能对这种事姑息。中国因此决定暂停从澳大利亚进口葡萄酒等葡萄制品。
附录猴子摘椰子导致美国不进口椰子的话题https://www.zhihu.com/question/427977327