借少数派新人报到的机会给自己的职业生涯做个总结;到目前为止我已经从事程序员这个职业15年了,我大概给它分成了六个阶段:
技术类型发展阶段
- 【嵌入式阶段】最早的时候做的是嵌入式设备的开发;基于Linux系统的电影播放机,时间一年多;
- 【Android阶段】后来随着整个行业的趋势变化,我转入了Android系统的开发,不是应用的开发;纯Android系统开发大概4-5年,主要工作是Android系统框架的多媒体部分;其中接触了很多Android的机顶盒设备,电视机设备;从Android 2.2开始到Android4.3 结束;后来我转行业了,听说我在电视机上开发和维护的多媒体的框架被其他同事移植到了手机上;这些开发的软件都是内置在了某个品牌的硬件设备里,包括电视机,机顶盒,手机,也许你们中的某些人曾经拥有的设备里还有我那时写的代码。
- 【手搓转型】到前面这个阶段,我发现我已经是一个彻头彻尾的多媒体程序员了;然后我就开始思考:我为什么要一直在Android系统下开发多媒体呢?我就觉得这样的方式不好,我觉得搞多媒体不如去搞跨平台的应用或者sdk。于是开始自己尝试手搓播放器,自己做出了一个自认为还不错的播放器,那个时候正好是IJK播放器刚开始开源但还没火的时候,那时候我也有自己的播放器了,并且我的架构做的比IJK要好一些,因为那个时候我的sdk是有架构和模块概念的,毕竟做了好几年的Android系统开发,有这个意识。但是我并没有开源,现在它还静静地躺在gitee上。
- 【跨平台阶段】正好公司有个视频云部门成立,也正好他们需要一个跨平台的终端sdk成为他们闭环中的一个节点,我就转入了这个部门,成功的找到了这个合适我的坑儿;然后在这个部门开始重新手搓跨平台播放器sdk,支持Android和iOS,(当然我还私下支持了Linux,主要是开发方便)服务的客户主要是集团内子公司,并成功合并了其他子公司的多媒体相关团队;当然对于我个人来讲,最重要的还是还服务了一些商业客户,像京东这样的客户。可是由于不可抗力,公司忽然就黄了。
- 【商业化阶段】然后我进入了一个国内大厂,开始了我的播放器SDK的商业化之旅,进入公司大概一年后,终于说服老大重新写播放器sdk,然后就又一次的开始手搓播放器SDK;但是这次不同的是开始使用 C++(之前主要是C语言,Android系统开发用的C++是假C++),经过一番努力迭代后新的SDK完全替代了之前的播放器SDK,并支持Linux,Mac,Windows平台。在我离职前,播放器SDK已经被几万个App集成,每日的视频播放量有6亿次;国内一些知名的公司在集成和使用,包括当时互联网教育行业的老大,互联网化最好的银行,最有影响力的之一的新闻客户端;还有上亿人必须使用的学习客户端;当时sdk是免费提供的,我离职后他们开始收费了。
- 【独立开发者阶段】由于个人原因我不得不离开上一家公司;开始面对一个全新的世界,于是开始尝试做独立开发者,开始研究如何做一款App,最终我选择了用react-native做跨平台开发,从头开始学习,一边学习一边做,我想做一款音乐播放器App,因为我个人本身就对发烧音乐有很强的兴趣,并且对现有的很多软件都不太满意,于是就又开始手搓音乐播放器App。
技能发展过程
我发现我这个经历,是一直在从底层技术慢慢的向上层传播的过程,技术面也在不停的拓展;其实我是个半路出家的野路子程序员,相信我的技能发展比较好玩。
从最开始的纯c语言嵌入式开发,到Android系统开发
- 软件架构意识: 接触到了Android系统后,我知道了软件开发要有架构设计,更要有抽象思维,尤其是那段给Android系统做设备驱动升级的日子里,彻底给我洗了脑。
- 源代码管理: 那个时候刚刚流行git,Android系统就已经在用了,强迫你使用git,多个git库的协同管理,这些其实已经超越了一般程序员的能力;现在有多少程序员能使用git熟练的应付日常工作?我相信整体不足三分一,更别说多个git库协同了,估计都没听说过,毕竟像Android系统这样超大的代码群才需要。
- C++启蒙:真的也就是启蒙,由于Android系统对c++的支持是阉割版的,我并没有意识到c++的灵魂,就像写C一样,在现有的架构里面做拓展;像这种大型的标准化代码结构,普通开发者没有机会去考虑架构之类的,只能遵循它原有的设计。
从Android系统到跨平台SDK
由于上个阶段的开发,并没有开启我对C++的追捧,所以这个阶段,我又用回了C语言
- 跨平台意识:从这里开始,跨平台意识已经深入思想了,为了应对跨平台,手搓播放器的时候不得不处理一些架构问题,交叉编译问题。
- 产品意识:我开发的不是一堆代码,而是一个产品;这个产品要有版本计划,性能指标,要达到的目标,如何高效的工作,服务意识。
- 不再纠结语言和技术栈:我要做这个产品,要给客户提供这样的服务,这个是目标,为了实现这个目标需要用什么语言什么技术栈就要用,不管你之前会不会;在这里我必须去写JNI代码,java接口,甚至简单的Android应用,当然还有iOS的 oc;开发工具也从简单的 source insight扩展到 Android studio, Xcode等。
成熟的商业化SDK阶段
由于进了大厂,接触到的人更多了,同时真正的拓展了自己的视野
- 整体转向C++: 那时候正是C++11的黄金时期,让C++再获生命,在同事的引导下,又向候捷老师学习,彻底开启了我C++的大门,然后猛学设计模式,由于之前的底子,学习进度很快,我强烈推荐侯捷老师的视频,学c++就看他的视频,看其他的都是浪费时间。
- 跨平台开发工具的提升: 由于全面转向C++,再加上CMake跨平台编译工具,使得跨平台的开发已经进入正式阶段,在加上CLion集成开发环境的引入,大大提高了开发效率。
- 产品质量提升:由于开发工具的升级,很容易实现单元测试,代码覆盖率,内存错误检查等手段,用工具来和数字来保障产品的开发质量,而不是个人的素质;要知道一个有上万个App在用的sdk,开发时一点疏漏,如果上线,很可能造成大面积的bug,引来大量的客户投诉。
- 产品易用性:产品接口设计的一定要容易让人懂,并且规避可能出现问题的使用方式;否则,客户的支持工作就会搞死你,同样一个问题,会有100个客户问你101遍。
独立开发者阶段
我现在正在处于这个阶段,我现在还不太好总结这个阶段,软件质量真的做不到也没有必要做到商业化sdk那个地步,即使是商业的公司,对代码的质量也不会达到商业SDK的要求;
但是我始终觉得,对于一个比较小型的软件,商业化的公司一般无法做得比一个有责任的独立开发者做的好,尤其是目前AI时代的来临,更是给个人开发者如虎添翼;原因是:不像SDK,应用程序的迭代经常带有大量的修改,公司老板要的就是一个结果,而程序员做的一定是按需求修改代码,完成功能,没有任何一个程序员会在修改功能的同时把代码架构进行相应的调整,因为这样的工作绝大多数情况下是徒劳的,因为:
- 没有一个负责产品架构的人一直在守候,没有人知道这个产品的架构路线是什么样的,没有一个长期的规划;你想象一个发展架构去重构,明天换个产品经理,你的工作就全白费了;
- 代码重构短期内无法看到效益,并且在大部分人看来,是负向的效益,因为这可能拖慢开发周期。而绝大部分情况下感受不到架构对整个产品的作用,直到后面架构问题太严重了,导致产品快死了的时候,他们的产品可能变得更新速度特别慢,开发效率特别低。
- 大部分情况下是,如果有新页面,就复制一份之前相似页面的代码,然后再改改,马上就完成新功能了,工程中存在大量冗余代码。
- 程序员不会把他当成自己的产品,而只是一个工作,完成当前KPI才是工作。
而对于一个独立开发者,情况就不一样了,每一行代码出现问题,都要自己后面去改,跑也跑不掉,所以他自己就一定有整体的架构意识,发展路线;后面加的每个功能,都要他自己来写,他绝对不会用复制一份代码再改改这种方式,因为一旦这些复制的地方的逻辑需要修改,或者有bug,他就要一个一个的去改,更容易出现新bug。
写了这么多,可能有点逻辑混乱,就不再继续发挥了,有空再聊!
