个人背景介绍

鄙人全日制本科一枚,计算机科班出身,对于很多想从事计算机行业的朋友,是一个羡慕的专业。鄙人长相天庭饱满地阁方圆,一看就是与佛有缘。在大学阶段,上课一直保持一个信念:选修课必逃,必选课选逃;考试也保持一个忠诚的信念:成绩60分万岁,61分浪费。计算机的编程课开过C,Java。基本没有写过代码,写代码也是在泡妹子的时候,表现一下自己能写代码。毕业设计的时候自己电脑编译工具还没有安装过。计算机专业课程开了,计算机概念,计算机组成原理,计算机网络,操作系统。这些课程都是在考试前比较勤奋,都是一次通过,没有挂过。到毕业的时候不知TCP/IP是何物,只闻其名,不见其人。进程线程心情好的时候能猜出来在哪个地方听过。鄙人就是这样一枚有计算机科班的“吸血光环”挂在身上的嫡系程序员。

在大学快毕业的时候,没有出去找实习单位,报了培训班学习Android。培训了6个月,学习了移动开发。明白了编程是如此有意思的,让我体会到了编程原来比男女床榻之事更加让我兴奋。在大学毕业的时候,顺利通过校招进入了一家做互联网金融P2P的公司。在当时这种行业与非法集资没有什么区别,与传销是等同性质的行业。鄙人有着一颗刀山火海也要闯闯的心态,进入这家公司。


P2P互联网金融公司

刚进入公司的时候,还不是做P2P的融资平台,因为那时候公司这块的运营资质还没有下来,公司只是致力做互联网金融。进入到公司另外一个主营业务部门做美股交易软件。美股交易软件有些朋友可能不太清楚,就是帮助国内的炒股朋友进军国际市场,能够购买到纽交所,纳斯达克,美交所的股票。将股票信息显示在App上,用户能够查看订阅,交易。把我在培训班学的Android技术,Activity,Service,Receiver,Provider四大组件全都用,各种姿势换着用。

由于我进入公司那会,项目刚刚开始,除了产品经理是金融行业出身,其他的工程师都是工程师出身,没有做过金融行业。至于图表显示的各种功能,不知如何下手,最后在github上面找到一个比较靠谱的开源框架MPAndroidChat,当时拿到这个框架如获至宝,简直可以满足我们各种需求,支持x,y轴缩放和动画,支持拖拽,手指滑动,读取txt数据显示,最重要的是还提供K线计算。以下两幅图表,就是通过手指滑动,x,y轴缩放的效果。


图1 股票软件显示

图2 股票软件扩展显示

前期做的还比较爽,但是最大的不好就是BUG太多,版本更新太快。由于美股政策方面的问题,公司没有打开美股市场,该项目给毙了。后来我光荣地进入了“非法集资平台”互联网P2P金融。

由于是公司未来的发展方向,公司大力投入,找了很多行业专家,软件规范做的很好,不再是以前自己找框架自己开发,而是框架都已确定,开源框架引入必须经过测试。

我的第一个项目就是安全键盘的项目。那为什么要使用安全键盘呢?对用户的重要信息,如支付密码,×××号需要优先考虑进行安全保护。先来理解一下App输入的按键值是何如工作呢?Android的IO子系统都是通过/dev/input/eventX的设备驱动文件(注:eventX的X表示0,1,2…),我们在触摸屏上按软键盘的时候,每次按键都会在/dev/input/eventX有对应数据(屏幕x值,屏幕y值),然后应用层通过select/poll的IO复用读取数据值,再通过屏幕位置映射到按键值。了解了触摸屏与按键值中间的映射关系后,“下九流”破解软键盘的方式拓扑图如下:

图3 破解键盘拓扑图

用户通过某些途径下了一个***后台Service,并且该Service还获取了用户手机的root权限。屏幕点击事件将数据存储在EventX设备驱动文件中,后台Service读取屏幕数据,然后转换为键值,从而盗取了密码与身份信息。

智能手机的输入方法市面上普遍分两类,第一类是系统自带的(华为手机自带软键盘),第二类是为了用户输入更加方便的输入法软件(搜狗)。这两种的键盘位置固定,键值映射固定,早已经是公开的秘密。为了保持新手福音业界良心的态度,这两种输入法都是不能用的,安全系数太低。


图4 安全键盘示意图

按键值位置随机,即使***Service获取到屏幕信息,仍然无法知道按键值。所有的屏幕位置信息与按键值映射转换关系,不能做到getevent的地方,而是做到JNI接口中。此部分代码都是采用C代码编写的。提供一下当年的部分代码:启动软键盘的时候,启动一个Linux线程,不断监听/dev/input/eventX。

开启线程:

使用poll检查/dev/input/eventX的是否有数据

安全键盘完成后,我发现我虽是移动端开发,但是我已经越来越少写Java代码了,已经变成了一个C/C++ Android底层工程师,自己对Framework也越来越熟,后来为公司做移动端基础组件开发。

    后来P2P市场越来越火热,公司业务也不断的发展,有许多没有金融资质的公司,也想在自己的应用中加入贷款的功能。比如买房中间App,汽车咨询,还有一些钻石,黄金等贵重品的公司。公司业务扩展也想在其他互联产品加入自己的广告方便别人来公司贷款和购买理财产品,专业术语就是流量互换。所以公司打算开放第三方公司开发的SDK,所以这样的重担落在做基础组件开发了。之前基础组件包含网络通信,数据加密,安全键盘等与业务无关的组件,现在这样的贷款,放款,还款,即时通信都在SDK功能里面,涉及了太多的业务。

    在我致力Android SDK开发的时候,机会就是这么悄然来到身边。通过我的同学内推,经过5轮的笔试,技术面,技术经理面,人力面,Boss面,终于如愿以偿的进入了国内一线互联网公司,从事手游开发。真是人生如戏,全靠演技;戏如人生,何必当真。虽说没有做个游戏,但是玩过游戏哈。


手游运营公司

进入一线互联网公司后,本想可以开启自己的游戏生涯,后来发现游戏早就开发完了。自己做的第一个项目就是将手游游戏投影到大屏幕上面,在电子竞技的时候,方便观看。

基于的开发背景,大家可以一起思考,采用什么方案比较合适。

1. 通过USB线传输数据,类似于豌豆荚的方式,手机界面能够及时投影在屏幕上。同样也能够在PC端操作手机。还不影响网速。对于手游玩家的手机需要数据线。再通过PC机将数据推到流媒体服务器平台

2. 采用网络,采用rtmp流媒体传输,h264的编码。网络对于游戏玩家而言是最重要的。

使用GT测试网络带宽占用,手机耗电量测等多重测试,包括用户体验,最终确定使用网络传输。手机推流是不会影响手游的体验效果。

在那个没有网红,不知直播为何物的年代,更没有腾讯阿里直播点播SDK,有的只有流媒体传输协议,性能标准也没有。再回头看当时的技术框架,俨然是现在的直播架构的雏形。接下将当时的App推流方案,娓娓道来。App推流处理流程如下图所示:

处理流程图中,音视频采集,音视频编码,RTMP封包,音视频数据发送。对这四个过程熟悉了,就对App的推流处理过程就很熟悉了。现在市场几乎所有的App推流都是这样的处理流程。

音频采集使用 MediaFormat.createAudioFormat。

视频采集使用MediaFormat.createVideoFormat。这两个模块网上代码太多就不在这里叙述,可以自行百度,即可找到答案。

设置视频录制参数,然后再写一个run方法用来开始录制视频。

以上代码是鄙人进行删减的代码。接下来有一个Android官方给出的音视频录制的流程图。

音视频采集这部分Android提供了标准接口,那音视频编码呢?RTMP组装呢?数据包发送呢?Android并没有提供官方接口的,那如何打包成H264视频编码包,AAC音频编码包呢?就必须依靠NDK开发了。接下来核心代码都是使用C开发的。

AAC音频编码与H264视频编码,具体代码都是AAC与H264中每个Byte代表什么,AAC每个Byte代表什么,不明白的同学自行百度,理解可以知道的。NDK发送音视频,将音视频分开发送,将音频包type为1,视频包type为2,分开发送即可。

做一个游戏屏幕投影,采用的视频推流的方式,发现出来音视频采集的部分Android提供了标准接口外,其实音视频编码,RTMP打包,音视频数据发送都是使用的第三方或者自己实现的C代码来做的。

    游戏的核心组件都是用的C或者C++来编写的,因为Android官方并没有提供标准的接口,所以对于游戏的很多操作,都是需要自定义实现,采用NDK开发的,并且需要使用大量的C/C++开发的。尤其是对Linux TCP网络编程,需要非常熟悉,可以说是对TCP/IP协议栈的实现。初级工程师学Android,中级工程师学Java,高级工程师学Linux C/C++。这样做了2年Android的NDK自定义组件开发。经过那两年在大公司历练,见识到了很多优秀工程师的做事态度。

对产品的追求会比追求自己女神还要上心。因为女神只能解决生理需求,对于优秀的工程师就跟自己的双手功能是一样的;而产品的完美能满足一个男人的自豪感与荣誉感。哲人曾说:除了交配的时候,男人还是比较喜欢跟男人一起玩的。在此处我对这位哲人表示由衷的佩服。在设计代码的时候,就像在设计一件艺术品的一样的对待。追求每一个细节的极致,每一个业务都需要进行性能测试。在与这些优秀工程师(屌丝中的屌中屌)相处的时候,让我也成为了一个脱离了低级趣味的人。

    每一个屌丝程序员心中都有一颗创业的梦,因为IT行业太好拿钱了,只需要有用户群体,就是能找风投融到钱。老学长下海开始做第三方支付,邀请我加入他的公司,因为他已经拿到天使,很快就能进入A轮。因为在毕业的3年里面,跟我的老学长一起见过很多次面,因为都是大学毕业来到南方,并且大学阶段的dota还是他带着我飞的。邀请我加入他的公司,并且开出的待遇也比我现在待遇好而且还有期权。当时的想法是

1. 虽是进入创业公司但是并没有压低待遇,就当跳槽了。

2. 常言道三十岁以前跟着别人学做事,三十岁以后自己学着做点事。就当自己这次尝试一下创业。内心还是有着一颗不甘平凡的心。

3. 自己并没有想在大公司做一辈子,来一场想辞就辞的离职。



第三方支付公司

进入到学长的公司后,做移动支付,何为第三方支付呢?现在大名鼎鼎的支付宝,微信都是第三方支付公司,市场前期特别大,当时创业的想法就是做Pos机刷卡与售货机的支付,现在我们在火车站,高铁站看到的售货机,通过微信或者支付包付款的那种,都是当时我们的想法衍生产品。

当时还是自己的老本行Android移动开发,×××识别与银行卡号识别,用户对×××与银行牌照后能够准确的识别出号码。说到这里,做图像识别,脱口而出的一个词汇叫做OpenCV。没错,我就是用OpenCV做的。由于自己对技术的追求,想自己实现这个识别,所以并没有找老学长花钱买第三方的组件。在这里跟大家好好捯饬捯饬Android的图像识别的开发。先把支付放一边,现在只谈图像识别。

图像识别分为两部分:图像处理与图像识别,我所使用的的方案,图像处理使用的OpenCV,图像识别使用的TessBaseAPI,TessBaseAPI是google code里面的一个开源的识别的框架,因为开源的代码是一个通用的图像处理方法,对于识别率要求比较高的产品是达不到要求的,还是经过自己的图像处理,再有TessBaseAPI来识别。早期做的时候,识别率一直不高,在阴暗的地方就是别人不准确,或者手拿着牌照的就是不准确。TessBaseAPI有Android Java的接口,但是图像处理没有Java版的接口。做起来很方便。但是图像处理是没有标准Java接口的,还必须得实现NDK C/C++代码处理图像。让我还有点尊严。

    图像处理流程:灰度处理,二值化,区域检测,将处理完的图片保存在另外一张图表中,并返回到JNI接口层。再来使用TessBaseAPI是何如识别一张图片的。看到以后让无数学者专家的大量研究的图像识别,在无耻的TessBaseAPI面前,就成了。两个接口调用,了解的朋友可以参照TessBaseAPI官网API介绍。识别的代码就俨然成为了两行代码。无耻之极。在这里我非常感谢TessBaseAPI的大神作者,但是对如此高深的图像识别是不是有点亵渎。好歹人家也是人工智能的一个分支耶!!!

作为一名IT设计师,系统架构师,伪科学家,对技术与产品精益求精的追求是用不停止的。通过自己的努力创造出来的产品与技术,给自己带来的满足感与快感是无法比拟的。这种快感与满足感是男女床榻之事不能媲美的。男女床榻之事带来的快感是短暂的,但是自己研究出来的产品与一门技术给自己带来的快感与满足感能持续很长一段时间。并且男女床榻之事是不能让人铭记于心的,更不能让世人了解自己,但是前者能够让人们记住你与你的作品。

在技术爆炸的IT领域,如果想把技术学好做精的朋友,调用接口,难道真的是能够与床榻之事媲美的技术追求吗?要想在IT技术领域越走越远的朋友,好好学习Linux C/C++的开发。Linux C/C++的开发就是九阴真经与无相神功的内功心法,而业务开发就是花拳绣腿的花架子,到头来什么都不会!!!

经过了一年的好时机,突然国家对于第三方支付需要牌照,没有牌照的公司一律按照非法集资处理。申请牌照之麻烦,对于一个技术男来说,比写个内核还麻烦。反正由于各种问题,老学长的公司被迫卖给一个一线互联网公司了。在这段创业的经历里面,我对产品有了一个全新的理解,老学长已经赚的盆满钵满了。有了这一次的信任后,我跟他一起做一家公司,我们成为了合伙人。我负责技术与产品,他负责公司方向把控。我们一起做智能家居。



智能家居公司

智能家居是一个长久的话题,公司的产品理念就是每一个家庭都会有一台电视,每一台电视都会有一个机顶盒,工作所做的产品就是机顶盒开发,认为机顶盒将是智能家居的中心网关,在给普通家庭提供网络机顶盒的时候,加入方便控制家庭里面的电器。我做的工作当然还是老本行,Android开发。因为机顶盒就是一个Android系统的。以下为粗略产品框图。

看到这个图大家肯定一脸懵逼,也许归纳到一起是两个问题

1. 为何不直接使用路由器做数据数据网关呢?

2. 机顶盒如何跟家用电器通信的?

保持一个新手福音业界良心的态度,一一为大家,娓娓道来。

第一个问题:如果你想到这个问题,你是一个聪明人,但是你有见过谁在家里拿遥控器操作路由器的。所以路由器在家庭内部使用的时候,是不会成为数据网关的。

第二个问题:家里这些买的常用家电能够符合机顶盒的定制的协议,就可以连接的。在这里可以为大家介绍一个新的概念叫做Alljoyn开源框架。

在现在这个创新的时代,只要有想法,就能实现,并且还有人能够为你的想法买单。只要能够创造价值,就会有人帮你创造的价值套现。这时代也许是中国过去五千年最创新的时代,也是最适合创业者生存的时代。把创业者放在清朝,马上给你来个文字狱,满门抄斩。把创业者放在文革时代,马上给你打成右派和走资派,让你老妈都不敢认识你。

说完了假大空,感谢时代的话,说说Android能够做什么?刚刚说过了机顶盒就是Android系统的。机顶盒的主方案是AML8726M,首先得保证机顶盒的正常功能,流媒体解码,HDMI传输,红外遥控,系统UI,WIFI通信。还有智能家居的功能Alljoyn的移植。

在这个项目当中,我已经完全与Android的应用开发脱离,做的就是Android底层的驱动移植与调试,网络协议移植的工作。主要的做的工作就是Linux内核,网络通信,数据总线通信(串口,I2C,SPI)等。负责公司技术把控与公司技术走向,创业初期还负责公司的驱动调试等等。后面只负责与公司的供应商探讨方案新技术,产品技术参数等等。

个人经历总结

Android作为我对技术的入门,一路走来我也没有离开过Android。7年工作经历,只有第一年正式写Android应用开发,后面的工作经历是Android C/C++的开发。特别是现在站在一个CTO的角度并结合物联网产品如图6所示,智能家居拓扑图,在我们现在产品里面,是一个非常典型的生态系统应用,有嵌入式物联网设备,有智能操作系统设备,有App(Android/IOS),云平台服务器,web前端,后台开发,持久化集群,缓存集群,分布式文件系统,高并发网络IO,负载均衡,集群监控,集群测试等等。

图6. 智能家居拓扑图

在Android应用开发的朋友们,对Android开发迷茫的朋友们,想在研发走向更高的Level朋友。以后技术路线有两条比较合适的建议路线:

1. 学C/C++,Linux运行原理, 做Android Framework开发与驱动开发。这条路线在Android应用开发的基础上,学习Linux驱动移植,低速总线(串口,I2C,SPI)原理图。就基本应付Android底层驱动开发与调试的。

2. 学Linux操作系统原理,走向服务器性能架构师方向。Android开发的基础(Java,C/C++)本身就是一个综合的生态技术圈。你对Android系统架构有一定理解,并且熟悉C/C++,Java的朋友。我建议走一条架构师之路。对整体系统调优,这条路线学习知识较多,但是收获更多,需要对许多高性能组件(负载均衡,高并发网络IO,持久化集群,缓存集群,分布式文件系统,集群测试,Linux系统参数调优)熟悉。

图7. 架构师知识树

以上这两条路都需要依赖完善的计算机知识体系,在我目前招聘工程师的思路,最重要的一点就是要有完善的计算机知识体系,如何学习好并且深入理解计算机知识体系呢?建议把C/C++学好,在这里不是让大家学习语法,是让大家学习C是如何驱动计算机运行的,将帮助对你的计算机知识体系至关重要,走向架构师之路。在工作中,一定不要给自己贴标签,把自己标识为一片技术区域。对于任何一个未知的系统,出了问题都能解决,才算是一个合格的工程师。也只有深入理解计算机知识体系的朋友方能做到这点。

进入企业工作,就是为企业创造价值的。保持一颗自己与企业共赢的心态,方能使得自己能力越做越强,格局越做越大。

希望我的经历与建议能够帮助到迷茫的开发人员少走弯路。



QQ图片20180315212334.png