Starguard
开发笔记
Toggle navigation
Starguard
全部笔记
Unity
大话存储笔记
C语言
MongoDB
About Me
归档
标签
2023年9月23日
2023-09-23 07:12:58
72
0
0
admin
工作满四年了,过去将近一年时间在凉屋的工作让我产生了极大的转变和技术成长,在进入凉屋之前,我的技术欠缺到了现在的我完全不敢相信的程度,但之前的工作也不是完全浪费时间,所以想记录一下自己工作以来的经历,以后尽可能地将尽可能多的经验转换为决策的依据。 关于在浪潮为什么换工作,是因为浪潮工资太低,周六甚至没有加班费,而加班强度一点也不低,老板“周一来讲讲周六为什么不加班”的言论让人非常不舒服,搬服务器、一根根内存条排查问题也不是一个亟需成长的程序员整天应该做的事情。在觉得自己没有任何留下去的理由后,经过朋友的推荐,去了华为 OD,至于为什么 OD 也去,是因为当时不知道 OD 代表什么,本来就比较佛系,不想在非技术领域探究太多,所以考虑到工资几乎是浪潮月薪8500块钱的两倍,还能换个领域扩展知识和见识,没有理由不去。现在想想当时如果还留在浪潮,可能还会有很长时间在免费加班做边缘的事情,这种情况是我一定会马上做出改变的。 不过在浪潮工作期间我也学到了很多知识,虽然没有在工作中用到太多,例如从校园走到职场的热情让我啃完了《C和指针》、《Linux应用程序设计》、《UNIX/LINUX shell 编程指南》这几本书,对 linux 应用编程的学习到了华为工作中还在持续发挥重要作用。在写操作系统安装、更新脚本的过程中熟练应用了 shell 编程,从计算机上电、到 BIOS/bootloader 工作、再到 linux 系统的启动流程能略懂一二,能够自己修改操作系统镜像也是一个让极客很满足的技能。 后来到了华为,在华为的第一份工作是消息队列的 demo 开发,用于5G消息,还学习负载均衡的理论知识,因为可能会做负载均衡的服务,但后来真正开始开发,则是5G消息的 MSRP 服务,简单来说就是应用层富文本的解析、转发服务,同时需要关注底层的 TCP + MSRP 协议栈。MSRP 服务的所有数据都存在内存中,包括会话、链路的池子,缓存+顺序处理的 MSRP 包消息队列。华为在将一些虚拟机时代的应用迁移到容器中,但这种迁移并不彻底,在华为有很多被称为大颗粒的服务,实际上就是将原来虚拟机上运行的单体应用打包到了容器中运行,只体现了容器镜像的开发/生产环境一致、快速部署等优点,容器并没有硬件无关,扩缩容依赖运维的观察,很多容器并没有分布在不同的服务器上,所以并没有体现微服务的单一职责、组件化、硬件无关、可伸缩、高可用、分布式、动态调度等特点,在我开发 MSRP 服务的时候,还是在开发单体应用而已。但我自己开始学习 docker 应用和底层原理,也开始深入学习云原生时代的明星语言 go 语言,从 C 转到 go 并没有太割裂,因为 go 语言的其中一个创始人就是 C 语言的创始人之一,go 语言是现代的 C 语言,体现在他非常少的关键字、半面向对象、清晰易懂的代码、标准化的格式、易于理解的并发编程模型、随安装包自带的好用的开发工具,这些让我很快爱上 go 语言并成为后来开发微服务的主要语言。除了设计和编写主要代码还喜欢搞编译、自动化的我在项目的开发过程中也编写了很多脚本和工具来支持开发,但开发的包括进程替换、REST 接口调试工具在内的很多工具在现在云原生时代其实是非常落后的,替换容器中的进程会导致服务中断,是非常不优雅且不通用的方式;为了对容器中的接口进行调试手动去用 iptables 做端口转发,其实 K8S 早就给我们造好了轮子,我做的这些不过是谷歌早就玩过的东西,结果我还拿了优秀持续改进奖,不过就是 kubectl port-forward 或者修改 service 类型的简单事情,说明华为当时的微服务应用相比谷歌这些巨头是非常落后的,大大降低了生产力。不过华为重视编码规范让我也开始写更优雅、安全的代码,开始学习和利用设计模式,在那之前我并不能理解学设计模式有什么用,直到我在开发一个自动化框架的时候发现设计模式能够用已有的经验让自己的框架变得更可扩展、模块间更松耦合、其他开发者更易读易维护,才真正亲历设计模式的好处。 即使是落后的服务,至少还让我提升了 C 语言编程和调试的熟练程度,也了解了开发一个像即时消息这样的系统会有怎样的组件和流程,其实也是比较宝贵的经验,但在华为后来做的工作,就让我又一次失去了留下去的理由。后来我做的工作叫核心网软件升级,其实就是 python、sql 和 shell 脚本的编写,流程是自研的 XML 流程文件(非常定制化),通过文本操作、调用 API 等方式,让数据库结构、证书、配置等内容更新到新版本,检查升级是否成功,并能够回退,每个服务都需要人力去写这样的脚本,是一个技术需求甚至不如 CRUD 程序员的工作,同时却是部门领导非常关注的工作,但之所以有这样的工作,还是因为整体系统的落后,云原生应用通过滚动升级就能实现无损的效果,配置可以通过各种方式进行热更,而不是写入到文件系统中,证书则可以通过 cert-manager 这样的组件自动创建、管理和更新,这些也是我到凉屋工作之后才学到的,对于云原生系统的认识就像大爆炸一样展开,而对于在华为的工作,则意识到了工作枯燥的原因。在华为即使从 OD 转到了正式员工,还是提出了多次离职,尽管有人说提出离职还被留下就是傻,但我觉得只要现状能有一点改变,我就会尝试一下,被 PUA 大不了再换工作,我不依靠领导的品质证明自己的能力。抱着换个城市看看风景的心态,我留下来,但换了部门,新的工作是话费计费网关的开发,名为微服务,确实比之前的工作更像微服务一点,工作体验也因此好一点,但实际工作仍然是单体应用的业务逻辑开发以及硬件、编程语言相关的性能优化,因此在分布式这个重要的领域几乎毫无成长,即使网关是分布式的,也是无状态的,不会应用到缓存、数据库、消息队列这些微服务基本的组件,不会拥有高并发数据存储、转发的工作经验,性能优化涉及的领域是非常有限的。这些微服务通过 OpenStack 的 VNFD 描述虚拟机,TOSCA 描述服务资源,升级、部署是包括基础组件在内的所有组件捆绑升级和部署,而不是微服务的独立运维、独立扩缩容、滚动升级、敏捷部署,因此一到升级和部署,流程中出各种各样的问题,牵连所有相关的不相关的微服务即使守夜都要坚持等待灾难的结束,遇到问题时以“共同战斗、负责到底”为缘由让你拉会催促出问题的微服务或组件解决问题,而你则是无意义地看着会议窗口听自己半个字都听不懂的解释,一个负责业务开发的同事,陪着负责操作系统、网络堆栈等的同事,他们讲着根本没准备让你听懂的原因,你也只能点头,然后一遍又一遍地问什么时候完成,还要顶住自己领导劈头盖脸一顿催的压力,“现在的年轻人,都是怎么工作的?”。我总结一个原因,还是落后,这个落后除了技术方面,也是思想方面的,不重视技术,只重视流程。后来有一次趣事,我准备离开华为有一次面试的时候给面试官讲了华为的微服务,并说自己的目标是拥有根据需求独立设计整个微服务系统的能力,面试官笑着说:“你之前工作中的那不是微服务,没有了解到微服务的核心不怪你,我们可以让你学到真正的微服务”。 我上面提到的工作全都没有涉及到缓存、数据库和消息队列,一方面是给我分配的工作刚好都是无状态的,即使需要存储一些数据,也是存在内存池、内存消息队列中,另一方面华为研发人数众多,小兵众多,只需要关注自己很小的一块,其他的领域、服务一概接触不到,也在高强度的加班下无暇去涉及。而到了凉屋之后,一切都开始走上了正轨,为了能充分利用微服务优势,为客户提供更高质量的服务,内存、文件不应该作为持久化存储数据的方式,而是利用数据库的特性,实现数据的异地多活、高性能读写等;而独立的缓存组件则用于减轻数据库的压力,同时和业务容器解耦,减小损坏导致的损失;独立的消息队列组件则用于缓冲和削峰,相比自己编写的内存消息队列更可靠、可伸缩、可保证消费的正确性。这些是最简单的解释,在凉屋的工作中并不是空有这些理论即可,设计 redis 存储方案要考虑一致性、性能、易维护性、合理的过期机制等众多因素,设计多种方案进行选择和压测,敏捷开发的环境则能支持高效地开发和验证自己的设计方案,而不需要关注和自己不相关也无法处理的任何事情,每个人都可以专注于设计和开发,并对自己的结果负责,这样的环境下成长速度飞快,因此新员工来了之后组长让我带新员工,把自己的经验再传授给新员工,这样组里又会新增一个能很快 hold 住一片地的战力。之后我的工作每件都会越做越好,更有难度的工作也会随之而来,技术也能获得更多的提高。到凉屋工作之前,我没想到自己能这么快接触设计一个微服务系统的各种组件,听到请求延迟优化的工作超出了我的知识范围,因为和我过去针对 CPU 密集型、硬件相关应用的优化不同,我们的服务是分布式、基于云并且 IO 密集型的,这也是多数互联网企业的应用形式,有更高的系统架构技术需求。数据库优化过程中,我才觉得自己开始真正像一个工程师,真正感受到理论、计划、方法、工具、技术最终转化为满足客户的需求。除了缓存方案设计和数据库优化,到后来 kafka 消费者性能优化,我终于接触了微服务系统设计必不可少的三大组件,学到这些组件设计的精妙思想,对这些组件的优化进入生产环境稳定运行,但这些组件终究只是组件,微服务系统设计远不止学习这三个组件,不同的业务也适合不同的组件选型或组合。后来实名服务的重构和维护,再到邮箱服务从零开始设计开发,才开始把游戏业务和技术结合,在系统设计时更好地组装和使用组件,更接近我独立设计整个微服务系统的理想,而现在针对联机匹配场景,则产生新的问题,使用新的技术(云原生联机匹配框架),从而更适合业务,为玩家提供更优质的体验,为运营提供更易管理的系统,这是技术、理想转化为实际价值的最理想状态,是程序员以至架构师的真正正轨。语言方面因为要易于游戏客户端集成所以选择使用 C# 技术栈开发服务,不过最近云原生框架要开发的定制组件则因为第三方库的原因适合使用 go 语言,语言的选择其实没有太大的差别,而且因为这些原因语言的选择通常也不是自己一个人能决定的,所以开放的心态也很重要,吸取每种语言更好的地方并充分利用,觉得不好的地方尽量避免即可。 我其实也不能确定来凉屋前自己为什么没有走上正轨,究竟是因为大厂的原因,还是自己必须经历那些经验,还是因为突然的启发,不过平时想这些没有意义,除非有一天要离开凉屋,也总有一天会离开凉屋,那时如果还要选择新工作,就要考虑这些因素,现在没有必要想这些,不管是必定还是幸运,我需要做好的都是现在的事情,明天会发生什么谁也不知道,下一秒人类都有可能灭亡,至于金钱、名誉、外界对自己的评价,都没有意义,意义是自己赋予的,我的意义不过是追求自己的理想,不必畏手畏脚,现在想起来,也是在凉屋的一年里才开始意识到自己这样的价值观,只要意识到,就不会再回到那个处处担心的自己。做自己想做的,不计代价,就是自由。
上一篇: 无
下一篇:
现代C++的高级概念
0
赞
72 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航