阿里外包半年记

阿里巴巴西溪园区2019年11月阴差阳错进入了阿里巴巴视频基础实验室做外包,至今已有半年,收获挺多。本文即是对个人收获的记录,主要分为技术与工作方式两个方面。

技术

如果说要总结自己这段时间技术方面具体的收获的话,那就主要有Android、C/C++和Python三个方面:对Android平台的视频编解码有了一定了解,可以快速的进行视频数据采集和编码;C/C++使用更加熟练,终于不再担心被指针气哭;Python使用也更加熟练了,能够使用Python快速的开发一些工具脚本及跨平台的GUI程序开发。

Android

由于我是在视频基础实验室做外包,所以工作内容都是和视频相关的。入职之后做的第一个项目就是一个视频算法可视化Android软件开发,应用需要调用摄像头获取实时数据,然后使用JNI技术对流进行处理,处理之后的结果需要及时的显示在屏幕上面。处理摄像头数据的时候需要注意视频的帧率,因为CPU处理算法的时间比较长,所以需要判断手机硬件支持的帧率,设置合适的值,甚至是使用人为丢弃部分帧减少计算量。除了帧率还需要考虑到视频的颜色空间,常见的有I420、NV12等,需要根据算法支持情况进行选择或则转换。摄像头读取到的是裸流数据,如果要保存到本地,可能还需要使用编码器进行编码,主要有MediacCodec和FFmpeg两种方案。MediaCodec是Android
4.1加入的API,其通过调用手机硬件实现快速的视频编解码,效率非常高,但是不同的手机设备支持的编解码算法不一样,需要根据具体机型判断做优化处理。FFmpeg是一个十分优秀的视频处理库,使用软件算法实现视频的编解码,所以支持的格式十分多,不过效率不及MeidaCodec,需要根据实际情况判断使用。另外视频的绘制也是一个比较复杂的地方,常见的方案有通过OpenGLES或者自己利用Canvas直接绘制。使用OpenGLES渲染效率很高,不过由于项目赶时间,之前对OpenGLES也不熟,所以没有用这个方案。我使用的是利用SurfaceView控件,获取其Canvas对象,然后将视频数据转成Bitmap的方式,这种方式优点就是实现简单,缺点就是占用内存大,性能差。

C/C++

在做视频算法可视化软件开发的时候,因为算法都是C语言编译的so库,所以会涉及到C/C++的编程,在这个项目中C/C++的东西还算比较少,多是调用接口传递数据和转换格式的操作。该项目结束之后做了纯C/C++的Linux应用开发,第一次搞Linux遇到很多问题,对C/C++语言的不熟悉也导致项目进度缓慢,那段时间自己也非常焦虑。不过马老板有句鸡汤说了:“当你觉得不舒服的时候,就是你在成长的时候。”,确实是这样,当时虽然很难受,但是让我对Linux环境的使用和C/C++编程更加熟悉了。经过这些事情让我明白了C/C++是很重要的一门技术,无论是否是Android开发都会涉及到,为了弥补自己C/C++的不足,现在也一直在看《C
++ Primer Plus》这本书,对于C++初学者,这本书真的写的很好(除去很多地方翻译的很蹩脚),推荐感兴趣的人去看看。

Python

视频算法开发中的很多工作都可以使用Python脚本自动完成,例如视频质量客观检查,通过对比原始视频与编码之后的视频像素的匹配度即可告诉开发者算法的质量。另外,对于视频主观质量检查则需要肉眼观看视频对比,考虑到实验室成员使用的电脑系统很多,有Windows、Mac和Ubuntu,所以需要一个跨平台的解决方案。我选择的方案是使用Qt的Python版本进行开发,Qt是一个很强大的跨平台框架,使用C++编写,但是提供了Python接口,安装一个PyQt5即可进行开发了。另外如果需要对Python的脚本编译成exe可执行文件,可以使用pyinstaller库,然后执行pyinstaller xx.py --onefile就可以了。因为Python是脚本语言,所以第一次写的时候总是一溜从上到下写过去,很少定义函数,但是Python3是有Class的,可以实现面向对象的设计,对于大型的程序还是建议用面向对象的思路编程,可以提高代码的可读性和复用性。

习惯

回顾自己的这半年,技术部分固然有了很多收获,除此之外,也学到了很多工作习惯的东西。 ### 重视文档

早在进入外包之前,我对于技术文档就非常重视,十分关注企业内部知识的传播效率,曾主动搭建了公司内部的博客平台,分享知识。与善老师(我在阿里的主管)共事之后发现他也是一名对文档有着极致追求的人,对于文档的要求,比我更加严格。他对文字中的标点符号都很在意,如果需要配一个图片都话,对于图片的排列位置,图片元素的配色也很有讲究,这个是我需要学习的地方。

重视注释

代码中的注释就如同是给程序员的文档,需要格外重视,切不可因为一时懒惰而忽略了。注释可以提高团队开发时的效率,尤其是现在疫情环境下大家经常会远程办公。很多人不写注释的原因是自己觉得这个地方很简单,没必要。可一旦你离职之后,这块代码归别人负责,那他就不一定可以理解你的思维了。

不要害怕挑战

刚进实验室工作的时候,经常会遇到一些让人很头疼的任务,例如Linux
程序的开发,由于自己对Linux和C/C++不熟,导致项目进度缓慢,从而产生了恐惧心理,工作也不积极。但是害怕是解决不了问题的,逃避问题只会让自己更加害怕。在之后的工作中,也经常遇到这种从来没有做过的任务,不过慢慢的就不再害怕了,无非是多花点时间研究一下。当然这个也是有度的,像我就知道自己搞不定深度学习模型的训练,这里面涉及的基础知识太多了,不是几天可以突破的。

End

单老师曾经说过一句话让我印象很深,他说:

没有广度的深度是烟囱,没有深度的广度是浮萍。

在技术领域,我涉及了很多,像上文提到的Android、C/C++和Python,自己现在可能连浮萍都算不上。无论如何做技术的多学一点肯定是没错的,只不过需要取舍,例如现在我会更加偏重于C/C++方面的学习,如果一个工作在不紧急的情况下,我会优先考虑使用C/C++。以前的话我可能更加注重实用自己熟悉的技术框架去完成,这样就会让自己在一个领域跳不出来,甚至会有固步自封的可能性。半年的时间就这样过去了,虽然还在阿里做外包,但始终觉得不是个事儿,还是希望自己可以成为一名大厂的正式员工。今年下半年最大的目标就是能进个大厂了,那么,奋斗吧,骚年!

Search by:GoogleBingBaidu