码农16年

随意写写,流水账。

小农思想,决定了前半生。

【07~08】 

毕业后,某基于高通BREW平台做APP(彩信,浏览器)开发的公司杭州分部。

回过头来看,其实开局一手潜力牌,打的稀烂。那会金融危机前夜,刚好做手机的母公司给联发科MTK平台打的溃不成军。杭州分部的主要客户其实就是母公司,手机卖不出,则利润无法支撑高成本运行,07年当年就有刚认识没几个月但是很有感情的伙伴们各奔东西,手机里还有部分小伙伴的联系方式。

08年上半年,其实也可以说移动互联网元年,可惜传统手机行业每况日下,大裁员马上来临,正逢某著名设备商招人,刚好大学那会同寝室哥们在里面当HR,投了个简历,也告知了小伙伴们。

在新一轮大裁员前后,一些小伙伴去了阿里,座上时代顺风车,一些和我一样去了设备商。

【08~14】

自从08年沾上基站软件平台开发,此后15年,都搭在基站里面了。

那会最开始从上研所接业务,大家伙都是杭州这边招聘进来,深圳培训完就飞到上海,来到陆家嘴,成为浩浩荡荡打工大军中的一份子。

大厂锻炼人,绝非浪得虚名,一开始就深有体会。绩效评比一直流行,ABCD四挡,后面新增了B+档,末位淘汰,周期不太清楚,干着干着,无意间就发现某天开始,某些熟悉的面孔,再也未见到。

我们同一个批次,同一个思想导师带的学徒之间,关系密切,就算后面各奔东西,也从未断了联系,有时候在已经是量化私募基金大拿亿万富豪帅得无可救药的领导攒局时,纷纷响应召唤,聚在一块聊聊天,人生有时候很奇妙。

偏向集体主义价值观的团队,高压的工作氛围,开发人员在整体上处在最弱势一方,大家报团取暖,感情真挚。

败则拼死相救,胜则举杯相庆。 口号猜测最初来源是市场部等一线部门,后来成了办公室必然挂的条幅。

新员工那会,导师带领大家熟悉业务,所在组对外称呼为网元接口组,主要组件至今记忆犹新。

NCM: 网络连接管理模块

SEC: 安全模块,主要是账户信息存储以及安全规则。

BIN: 二进制消息模块

MML: 人机交互语言模块,基站的主要配置信息都是通过MML下发

熟悉或者听过的朋友肯定知晓是怎么回事,所有代码加起来大概15W行。

那会TDD开发还没有流行,特别是UT这么重要的工具没有得到充分重视,所有缺陷都靠上环境发现,成了开发痛苦的主要根源。

当时比较流行的其实称呼为MT(moudle test),python编写的客户端,向基站发送命令,解析结果。

部分场景下,python难以搞定,比如默认SSL连接,以及超级管理员的鉴权,这个时候,只能再次开发专门的客户端工具,模拟管理员,用工具组装码流发给基站,有时候tester也拿着工具来手动验证,效率低到发指,后来安全问题,工具被禁掉。

这些手动case,总体对代码bug的拦截率不高的,缺少了最贴近代码的UT覆盖,回过头想想那会大家也没有充分意识到这一点。

大多数缺陷,都是靠tester来发现,环境的复杂性带来太多额外的难度。

那必须是一段爆肝的岁月。

在软件平台内业务逻辑切分上,中心层本地层适配层,模块实现上,既有API接口,又有消息接口,而vxworks的task机制,又使得所有代码特别是全局变量,暴露在多进程/多线程的严酷考验前。

时间紧任务重节奏快,缺乏完备的Code Review流程,缺乏比较有效的反馈机制,再加上很多人包括笔者在内,缺乏对代码保护的认识,造成各种恶果。

比如:

随意添加信号量保护临界资源,互锁时有发生,而且vxworks对于调用栈的提取,难度很高,大部人直到离职都可能不清楚如何在各种CPU下解析调用栈。

又比如:

纯C语言下的内存使用问题,泄露,越界,野指针,还有极难定位的飞踩。

其他资源泄露。

妥妥的开局地狱难度。

后来往回看,绝大多数bug都可以通过完善开发准备流程(好的详细设计,好的软件设计,好的失效分析),code review流程,完善UT覆盖,等等前置的方式,来堵住各种bug。

那段艰苦的日子,给笔者留下不少后遗症。

症状 1: 看到资源申请,就担心泄露

症状 2:看到信号量操作就担心互锁

症状 3: 担心自己的代码有低级错误,被发现后,那就是全员展示,鞭尸一样

症状 4: 看到coredump就慌得一比,赶紧联系黄帮主。

黄帮主不姓黄,来自专门处理各种exception的异常调测组,这个组备受尊敬,就和我们尊敬名医一样。该组的兄弟姐妹必须是最累的,不是在处理突发crash事件就是在等待crash的路上,tester给的问题单一律级别都是 “致命”,真是要了亲命。

帮主也是硬着头皮,苦中作乐,不知道哪个兄弟揶揄的起了个外号,说很黄所以叫做黄帮主。

vxworks缺乏完善的coredump手段,定位异常问题,大家都依赖鼎鼎有名的Dopra团队的兄弟开发的黑匣子套件。

症状 5:经受残酷教训后,很多时候,写的一坨代码,lint都很难发现告警个数为0,称呼为代码裸奔,居然也可用,信么?

唉,还有好几个组的兄弟太苦了,比如貌似称呼为内部机制组,主要负责基站主控板单板之间,基带和RRU之间的通信。

还记得Q922/HDLC/MTN/各种IP,NAT/L2 跨框/ODI/...

噩梦级别,基站软件对于实时性要求堪称严苛,某些粗心大意加入的代码运行时,会带来CPU使用率的急剧升高,影响板间链路,影响心跳响应的及时性。最著名的就是Q922链路闪断,触发告警,然后tester就逮着告警报问题单。

责任人就是内部机制组兄弟,而且从来都是,要在千头万绪中找到肇事者,为别人的错误买单,如果问题不容易复现,而且随着版本更新,肇事代码可能已经更新了,那就得等上一年半载才可以关闭。

通常的手段就是疯狂翻找黑匣子,拉上TRANs,拉上低软,甚至驱动层一起攻关。

每天上班就是受刑,长年累月的高负荷高压力的加班,身体跨了不说,家庭都顾不上,该组离职率特别高。

上面说的这些苦,在当时可能没有那么深切的去回味,大家都差不多,其他组又能好多少呢?

拿网元接口组来说,一个SSL证书连接失败,照样让你发量减少,秃了也不强。

只要肝不死,就往死里肝。

那么多人柱力的前赴后继的付出,死亡冲锋一样,不计代价,总体代码质量有所提升,新的问题,大多数由于新特性引入了。

从上海接业务回杭州后,过了一段比较开心的日子,赴上海把我们接回来的领导楼楼,绝顶天才,浙大物理系毕业,能力超强,真正的大神乃至神话级别人物,从大牛程序员到敏捷教练,到我们的pl,加班深夜,还带着我们去网吧嗨皮,一路过来,深深的佩服,平台的自动化CI构建系统,就是在楼楼手上完成,技术流主打,不贪慕权势,不争不抢,后来在平台被各种从2G产品线空降过来镀金的人野蛮排挤,出来创业,亲身编写量化交易系统,早在几年前就挣到我不敢想象的钱钱。

那时和小吴,帅帅,小高,超超,经常在下班后厮混在一起,小高做的千层饼很够味。

东部软件园当时有51job的漂亮妹子,电梯里经常碰到,亮眼。

后面一段时间,网元接口组特性少,人力富余,于是安排进了CI组,即持续集成组,没有后面流行的各种CI工具,版本发布效率低下,编译错误也没有在代码提交的时候,触发CI构建来发现。全靠手工,编译一次要两个小时,碰到5个以上编译问题的话,发布延迟是必然,通宵是常态,往往大家都下班,留下来孤军奋战,修改各种模块的编译错误。版本出来后,还得赶紧上环境做初步验证,如果板子启动异常,那就更艰难了。

最开始是春哥(也是个大拿,后来去了阿里)时不时帮忙,后来1个人就是1个组,简称光杆司令,后面终于有一个美女来到组里当领导,事务分配上,让人轻松了一些。

干集成的两年,老的快,好在同事之间关系融洽,也幸亏没有落下锻炼,不然早扛不住了。

个中辛苦,领导看在眼里,手里发出的版本也没有事故,在集成组拿了加入大厂以来以及以后的唯一个A,评为艰苦奋斗奖。回过头来看,想苦笑也不觉得应该笑。

后来不知怎么的,安排来到翻了好几台的内部机制组,后面改名内核平台组。离走的兄弟之前吃过的苦,受过的罪,一个没有落下,靠着互相打气,才坚持下来。

这就是成长吧,个人编码水平只能说中规中矩,没有特色,和各路高手比不来,唯一值得称道的是平平无奇的代码造成的问题很少,特别是crash问题,印象中没有。

后来异常调测组也并入内核平台,主要是人都走光了,遭不住,等到黄帮主也离职回宁波进银行,呵呵,异常定位的新活儿,就留给我们剩下的人。帮主的离职,对个人影响很大,有一段时间挺悲观。

精神长期紧张,高血压边缘游走,锻炼的时间越来越少,体检出现轻度脂肪浸润,下一步就是脂肪肝,慌得一比。

同伴们互相帮助,熬过一个又一个的坚苦日子,都特么能吃苦,吃得苦中苦,还有无尽苦。

幸亏异常调测的专家还有一位,来自软件管理组出身的张老师,也是个大牛,帮我们屏蔽了很多大难题,不然作为一个团队,早崩了。

做开发的时间,远远小于搞维护的时间,甚至印象中,除了刚来内核平台开发了3个月,后面大部分时间都在搞维护,试问这样如何提升个人能力呢? 熟悉业务不代表能力提升,朴素的认知中,能编码,编好码才是最重要的。

稍稍有点新剧情,因为精通CI,熟悉2G/3G/4G所有产品的编译工程,熟悉Dopra,熟悉内核平台,熟悉网元接口,自己都不信居然能够维护将近40w行代码,被临时抽调到一个后来看意义重大的项目中。

那就是从vxworks切换到linux。

大领导的充分重视,集结精兵强将,可谓群星璀璨。在一众大专家的黄金圣斗士队伍里面,什么概念呢?18级专家们熟悉OS,那时18级可不像后来那么多,要知道当时19级就是fellow,科学家级别。15级的笔者就是个青铜,但是这个抽调堪称恰如其分,笔者熟悉平台,熟悉业务,熟悉周边依赖,尽管平台算是临阵换人,火线加入,一开始还被FO质疑。

FO冬哥总协调,系统方面以18级专家为核心,15级的笔者成为最终集成的总执行,大家一起经常肝到2~3点,2~3个月,项目终于顺利完成,Arm环境下的linux主控在文山商用局点试运行。

那段时间,不知道有没有记错,大概是13年年初,也称得上高光时刻,

冬哥邀功很有一套,因为这个项目申请了好几个奖,拿到奖金就去饭饭。

很幸运被抽调到攻关项目组,见识到了系统级专家的风采,也见识到诸位linux专家以及BSP/TRANS/Dopra专家的深厚功底,他们中的一些人,走到了更辉煌,成为行业领军级别人物(真实无虚,了解个中信息的,知名不具)。

虽然和专家们无法相提并论,自认为后面的工作中,可以大胆一点,做得更好。

会战圆满结束后,回归资源线原本的项目组,开始了不算长的真正意义上的带领3~4人小团队的的开发岁月。

GRM,通用资源管理,不知道这个模块后面演进到什么样子,是不是还存在,里面有一个子模块主要是根据需要,建立板间以及跨框的srio swich的路由。该模块属于次新级别,第一个版本完成并没有多久,维护难度高,bug不少,部分问题不是动几十行代码能够轻易解决。

可能是大会战的成功带来的气势,不忍了,不知道哪里来的勇气,决定趁着有新特性,重构。

也感谢领导的包容,任性了3个多月。

几个小伙伴一起,吃透业务流程,整理和规划子模块接口和功能,理顺代码逻辑,吸取之前的教训。大家积极交流,力求互相之间认知一致。

那会娱乐项目不多,除了可以在桌上足球上一挑多,大杀四方(有点夸张,其实菜鸡互啄,比拼时大呼小叫,缓解压力),内部的小文化就是下班就约着小伙伴一起去小饭馆搞一些小炒,嗯,实惠,个人很喜欢做东,吃完回来继续肝。

编码时,注释完善,架构清晰,函数简洁易懂,无任何花俏代码,可维可测性比较好,作为典型的多coordinater场景,引入了板间,框间的数据的同步机制,保障数据的完整性,一致性。

其实没有特别技巧,最重要的是UT做到位,UT不仅仅用于接口测试,建立了一个数据框架来存储所有框间板间信息,通过不同参数设置,使得消息流能够模拟真实框间,板间的处理,这种模拟,极为接近ST测试了。

除了少部分可能过度保护的分支,UT力求完成所有分支覆盖。

这样交付的18000行代码,能够放心。事实证明,bug极少,后面就算个人离职也放心,不仅小伙伴们都精熟了该模块,也因为尽可能的还留下总结方面的文档。

也正是在那段时间以后,对不少比较看不上的代码做出不少比较大的改进。

也不知道哪方面的成绩得到哪个技术层面领导的赏识,在不知不觉下,13年,被评为“杭研十佳程序员”,这之前都不知道还有这种称号存在,惭愧,真没有什么出彩的贡献可以拿出来说,仍然要谢谢这位推荐的领导,谢谢你的认可,让我在后续的开发生涯中,从不摆烂,从不气磊。

13年总体比较快乐,真真实实的能够投入精力做了一段时间的全职开发,证明自己是一个可以单纯并快乐的程序员。善战者往往无赫赫之功,然后光荣的拿了一个绩效考评C,15级的,和十佳配在一起,有一种怪诞(这次评比资源线领导可能不知道,如果去争取的话,组内另外的兄弟可能就会和我绩效评比互换,唉)。

31~32岁是一个创造力的高峰,比较幸运能够有机会出击,在代码优化,重构上做了一些工作,这些工作带来的经验和见识在后来单位的日常工作中,非常重要。

当时租住在关系比较好的一个哥们家里,称呼为庆总,浙大计算机硕士,系出名门,顶顶聪明的一个牛人,坚持自己的原则,有自己的追求,工作很高效,不以加班为荣,也不追求绩效,是一个正常的不会被狼性团队驯化的人。嗯,炒股很厉害,后来我们差不多时间加入新公司,再后来他谋到了金融业内鼎鼎有名的浙江金融控股集团职位,从此走上高峰。

目光短浅的我,还在勤勤恳恳的在一亩三分地上耕耘。

【14~23】受大波波,老高,小吴,小高,庆总的影响,这帮老哥们也都是自认适应不了狼性文化早早就入职另外一家设备商,于是也跟风和邱总一起也跳到这家公司。

和邱总不在同一个部门了,加入的是lte TDD L2 macps,幸运的碰到mentor 远兴,以及后面几年在工作上一直指导和扶持我的德庚,感觉所有同事都很nice,大家也乐于互相帮助。

完全不同的工作氛围,scrum开发模式,敏捷,清晰的任务划分,不用加班,一开始也接触不到问题单,没有人总是打电话找你定位问题,很新奇。

l2 macps承担基站的业务schedule职责,抛开载波聚合,要保障小区内的UE在业务调度上,顾及公平和效率,有非常非常多的背景知识需要掌握。我有个短板,看到协议里面的公式就开始脑子发蒙,看到连篇的英文文档就眼花。

macps在算法上的复杂性比较高,不是特指数据结构相关的算法,而是各种为优化调度流程而创建的环环相扣的算法集,相关介绍不少,不做赘述。

当时的代码有两个大的改进点。

1 部分函数/类 冗长,难以理解,需要refine

2 peformance 堪忧

后面的2到3年就和这两大问题刚上了。

DSP 上学了粗浅的排流水知识,比较快速而充分的掌握了crash调测知识,因为有完备的core dump解析工具,总之没有碰到定位不出来的问题。

之前单位里面学到的很多调测知识和经验,派上了用场,部分情况下,看两眼就可能知道问题出在哪里。

印象比较深的是17年,德庚带着我搞CP4的性能比拼,和各大厂商在移动北京总部那边,负责的case 是400个2cc CA + 20 个3cc UE的上下行调度(有可能记忆有偏差)。

德庚具备深厚的协议以及CA 相关的功底,有着安徽人的纯良,朴实,从未看过有疾言厉色的时候,总是耐心的帮助我们,提供了许多的有关键性价值的优化意见,准备了2个月,不断的优化,精简,诸如 优化数据结构,减少单个流程中的cache miss, 减少冗余的上下行同步,对于精度要求不高的一些参数,降低运算参与频率来节省资源,几十个优化点下来,性能要求堪堪达成,在移动总部和老东家同台PK,顺利的参与了演示。

平时的维护工作,大家伙最恐惧的其实还是KPI相关的PR,往往都标识为TOP(这个和老单位致命单一回事),KPI测试仅在每一轮大版本后期才开始,往往大版本已经开发了半年,期间有无数的commit可能影响该KPI,你首先得理解KPI背后的参数构成,然后很大概率你需要大海捞针,记得文俊曾经接到一个KPI PR,硬是从上千个commit里面,用二分法生生出了10多个knife才最终找到是哪次commit引入,搞了一个多月。

越到后面,维护工作消耗的时间越来越超出参与开发的时间,一年12个月,3个月开发,9个月维护,应接不暇,让人疲惫。

不知不觉间,老本早就吃完,笔者的C++知识和应用水准,还停留在C++11标准之前,落后于时代了,危机感渐增,似乎日子太安逸了。

后面印象深刻的不太多,一开始还搞2CC/3CC CA,18年开始搞cat-M, 随后FDD L2 macps, 19年出差,首次走出国门,去了一次日本。出差回来后,发现一个趋势,那就是业务慢慢的都迁移到印度, 杭州site这边的几个部门有点尴尬了。

后来LM找活,19年11月份,带领我们去了5G L2,5G的 L2Ps 一言难尽,同样是一个人柱力的无底洞,要用生命来填别人造成的坑,基本看不到比较完备的review流程,不同实例间,耦合到完全迷失,几百个来自中国,法国,印度,德国,波兰site的人在里面堆叠代码。你会看到种类繁多的代码风格,各种炫酷的C++新特性你都可以在里面找到,但是bug太多了。

比较庆幸的是,继承了FDD L2 CI的优点,波兰的兄弟搞出的zuul CI 系统真的很给力,每一轮合入周期内,就会触发CI,各种静态检查,动态检查,层层筛选,你的代码过五关斩六将,满足了要求才行,然后回归所有的case,对于case fail,或者cnp不达标的,自动revert,有利于限制一些不良的合入。

或许年岁增长丧失了锐气,不想重蹈覆辙。

一天天的,都在用wireshark来抓包,几兆,几百兆上千兆大小的都有,解析各种业务数据,各种扯皮,甚至碰到很多扯淡的pronto分析,不靠谱的人和事真心不少,有一次还干起了之前单位的老本行,帮着OM来定位他们是在哪里出问题,亲自画流程图来证实他们会在某些状态下失效。

正值口罩期间,后面领到一个活,由于cnp在毫米波下告急,美国实验室这边要达成运营商的比拼指标,继续老本行,继续在德庚还有其他同事的指导和帮助下,干起L2Lo模块的优化,肝了一个多月,不知道出了多少次knife,总算有了成果。

但是心真的有些疲惫,快40岁的人,想换一个部门,希望能够有比较前沿一点的开发工作。

我们团队一直比较稳定,最早跟着LM讨生活的几个,联兵,小龙,文俊,马老板,委员长,公认的帅哥Willy还有后面来的大帅比铺成老总,大多数互相陪伴相互扶持了6年,感情深厚,也正因为感情深厚加上LM从不做压力管理,都是我们自我管理,再加上德庚升为arch后一直定力支持,整体氛围相当轻松,轻易舍不得离开,有曾经离开的兄弟后面又回来了。

加入新岗位的决定,过程有点艰难,LM尽力挽留,那会刚到5G没多久,LM和tribe leader的关系还在磨合阶段,让LM承诺升职加薪,并非恰当时机。等我转到新的团队,几个老兄弟都纷纷证明了自己,站稳了脚跟,各种升值加薪,为他们感到开心。

20年8月份加入新团队,开始k8s下的container开发新征程。

来了新部门不到一个月,4G时候的老部门领导还居然让我给一帮还未介入到5G开发的整个tribe的老兄弟姐妹讲讲5G和4G有哪些不同,真的是瞧得起我啊,头一次站上会议室讲台作为培训人,滔滔不绝的废话连篇,不是谦虚,兄弟姐妹们能力大都比我强(大多数都是technical leader级别),更多的只能讲讲问题定位所用的工具以及4G同5G在实现上的一些差异。

Arch的老领导隆哥得知我换部门了,先通过老哥们书延找我问问是否有意向于做软件arch,后来亲自专门一对一谈心了很久,非常感谢隆哥的赏识,当时的确一意孤行了,放弃了耕耘了6年的领域,可惜! 路,自己选的,自己硬着头皮往前走。

新团队以及新部门的风格是大大不一样的,有如下几个特点印象深刻。

1 pod/container 机制带来灵活的部署,都是微服务形式的开发,每一个模块的代码并不多,但是模块数量特别多,每一个模块都有独立进程,linux原生风格,要求有比较好的linux开发背景。

2 所在team高峰时有6到7个人,后来转组离职奔赴新前途等因素,剩下了4个人,彻彻底底的小团队,快节奏。

3 由于各类subsystem相对独立,同一团队的成员有可能负责开发和维护不同的模块,那种天然的互相交流的场景减少,大都默默工作,办公室安静,有时候一天下来也说不了几句话。

4 要求比较强的思维能力,出现问题后,独立找到问题解决方案,很少可以直接找到人帮助。

5 微服务下,对于架构天然比较看中,专家们对于代码质量把关相对更严,代码尽可能精炼,厌恶C风格,对于C++高级特性大受欢迎。

6 不断参与新工具,新特性研发,好好的过了一把开发瘾。

7 line内有两位在公司级别都很有名气的C++专家,和这二位相比,感觉自己差了好几个档次,无论是思维还是视野的开阔程度,以及解决linux系统系各种问题的经验。

8 总体学习氛围很好,LM会组织大家做C++关键特性的分享,每个人自定title,share给大家。

这三年,相对比较充实,比较深刻了解到自己的不足,提升了C++新特性的了解,初步习惯新特性下的代码编写。

gmock 技能有较大提升,同时养成了万事问谷歌的好习惯,积极主动吸纳新知识,学以致用。

英文文档书写能力有所提升,花了3个月时间,输出两篇各自近一百页的架构描述,以及开发指导文档,也比较深刻的了解了无线云平台架构。

部门以及团队还是组织了口语训练营,打造了良好的英语学习氛围。

22年初,担任scrum master的同事离职,矮子拔将军,火线上任。

SM岗前培训,在岗经验分享,思维提升,沙龙,等等活动,见识到了各位自身SM的风采,对于后续开展工作受益匪浅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值