工作感悟
从去年参加工作(C++开发工程师),到现在已经一年多3个月了,相比于刚参加工作时的懵懂,现在有了点自己的思考,写出来分享给大家。
我这里想总结3点
- why C++ ? (C++场景的特点)
- C++工程师的几个阶段
- 什么是价值?
写完这三点回头看,发现说的其实是同一件事,“业务”
1. Why C++?
这段比较杂,中心思想是“选择C++,是由业务背景决定的。成为一个优秀的C++工程师,需要掌握很多底层的知识”
由于C++低级语言(更接近硬件)的特性,一般多用在”实时性强、高并发“的场景(如搜广推引擎、游戏引擎、金融交易系统、深度学习框架等)。
就个人而言,工作中接触到场景是基于C++的在线服务,“在线服务”的特性,要求写出的程序要有极强的稳定性,满足“365 x 24” 稳定服务不宕机,无性能衰减等。
这其实是一件非常难的事情,如果写的程序很容易有内存碎片的产生,一点数据的波动就可能导致无法正常提供在线服务,要手动重启才能解决。
另外,写高性能的C++的程序,不光要正确的实现业务逻辑,还要对操作系统、硬件结构有清晰的了解。
例如涉及到数据密集型的业务场景时,系统需要处理大量的数据,那我们在设计、实现的时候,就需要考虑怎样做才能获得更高的性能。如“增加L1 Cache的命中率”,“对于某段热点逻辑,是否可以直接写汇编代码来加速处理”。
一个优秀的C++工程师,需要掌握的不光是基本的语言知识,还有操作系统,计算机体系结构,这样才能对自己写的代码了如指掌。
2. C++工程师的几个阶段
结合一年的工作经验,以及对周围同事的观察,一个C++工程师职业生涯发展可以划分为以下的几个阶段。
1. 规范化代码风格,熟悉系统设计,实现业务需求
这个阶段,需要掌握基本的C++语法知识,熟练使用STL来实现需求。在实现需求的时候,也要额外注意自己的代码习惯(如Google的C++规范或公司内部的编码规范)。
工作中的业务需求,经常可能是对已有的项目进行改动,如添加新的功能。这个时候要求我们先要看懂原有系统的设计,思考怎样改动才能对原项目改动较小。如果原来的系统耦合太紧,那可能还涉及到项目的重构,那我们就要注意,如何保证重构后的逻辑跟重构前的逻辑保持一致。
这个阶段可能需要持续1~2年,一方面不仅需要大量的需求来练手,另一方面也需要熟悉优秀的代码是怎么设计的,这个时候就需要去看优秀的开源代码(如TensorFlow,brpc,redis等),去学习。“先看猪跑,看的多了,总有天能吃到猪肉”。
2. 分析性能热点,写出高性能的代码
在这个阶段,随着业务的迭代,原有系统的性能已经不能满足业务需求,这个时候我们需要对系统性能的瓶颈和热点进行分析,看是否有改进的空间,如果瓶颈受限于原系统的架构设计,那需要重新写一个新的系统,来支持业务的发展。
这个阶段可能持续1~2年,一方面公司可能没有那么快的业务迭代周期,对系统性能提出挑战需要一段时间,另一方面掌握各种调试工具,积攒各种场景的调试经验也需要一段时间。
3. 分析场景、业务,对下一代框架,技术的思考
前两点可能更多的是在“术”的修炼,更确切的比喻是把自己的刀磨的更快了。到第三点,可能需要"道"的修炼了,更多的是对业务的思考,业务将来的迭代方向会朝哪里,当前的系统是否满足业务的需求?如果不能支持,瓶颈在哪里?系统下一步发展方向在哪里?
这个阶段可能持续3~年,有时不仅需要对业务进行思考,更需要对整个行业的发展思考。在思考以后,更重要的是要有行动,随着软件的日益复杂,即便你是一个10x效率工程师,也无法独立完成一个项目,那就需要你有很强的管理能力或者感染力,召集能干的小伙伴一起干番大事。
3. 什么是价值
最近在想什么是“价值”,读文章的你也可以思考一下,
”自己每天写的代码,真的值公司付的工资么?“ ”如果不值,你的价值在哪里?公司为什要花这么高的工资招你进来?“
…
这个问题在昨天终于想明白了,谜底揭晓,对公司来说,真正具有价值的是“业务”。
在”业务“这个大背景下,你写的代码才有价值。
每个公司都有自己的业务,招人进来是希望能让该业务有更大的发展空间,
”或许是更快的迭代速度“, ”或许是解决业务问题的能力“。 “或许…”
这是公司付你工资的根本原因。
所以我们在学习、思考技术的时候,一定不要脱离业务背景,不能在业务中落地,再牛逼的代码,框架,也是一文不值。
尤其是应届生同学要注意,可能刚入职的时候觉得拿到一个不错的offer就沾沾自喜,觉得自己对公司很有”价值“。但在接下来工作中,如果你不能对业务的产生增益,一段时间后,你对公司的价值会趋近于0,在该公司可能不会有好的发展。
切记,真正具有价值的不是个人,是业务。
|