快速技术成长:提炼和总结项目中的技术重难点
踏着重难点前进。
引语
在“程序员工作中的理性与感性活动及所需的技能素养 ”一文中,谈到程序员软件开发中的常见活动及所需需要的技能素养;在“谈谈程序员应当具备的技术思维”一文中,谈到了程序员在其职业生涯中需要具备的技术性思维;在“程序员做什么有利于技术能力的成长”一文中,谈到了程序员提升技术能力的常用方法和途径;在“如何突破技术瓶颈”一文中,谈到了程序员如何突破在一定阶段的技术瓶颈。
最近,我又发现了一种能够快速提升技术的方法,就是提炼和总结项目中的技术重难点。项目中的技术重难点,通常是一次项目中的最大收获点,也是下次面试中你能够突出的亮点。功夫在平时。
一个项目,大部分情况可能都是平淡无奇的码代码墙,有时则可能会有一些挑战,这就是项目中的技术重难点。能否及时攻克这些重难点,设计方案是否可靠,决定了项目的成败和是否会返工,也有助于个人技术能力的提升和技术经验的积累,和后续待遇的上涨。
那么项目中技术重难点有哪些呢? 从自己的职业生涯中提炼出如下一些,与读者分享。
项目中的技术重难点
开发新系统
面试官看到你的简历时,很难说想看到你的工作经验只是一直维护老系统,而是希望能看到有新系统新项目开发。新系统新项目,往往意味着新的技术栈、先进的技术应用。无论是负责系统整体方案、架构设计和技术选型、新语言的掌握应用、新技术栈、还是作为团队开发负责人,都是亮点。
比如我参与一个入侵系统新系统开发。一个团队采用新的理念、新的设计方案来改写原来的系统。所有模块都重新实现了一遍。当然也有借鉴原有系统的好的做法,但更多的是新的做法。
新系统的开发,可以将你的简历亮点一次拉满。
技术重难点:架构设计和整体方案、模块设计与开发、团队领导力、新技术栈、新语言应用。
性能优化
性能优化是第二个能够抓住面试官的亮点。
搭建性能实验,使用性能工具来分析性能、定位热点区域、遇到的困难、找到办法去提升性能,积累性能优化经验,是一个很重要的技术提升点。
当面试官问到这一点时,可以通过 STAR 简洁地回答某个项目的背景、问题、困难、方法、成果;能够系统地说出性能优化的常用手段;能够说出遇到的问题及解决方案,基本上就过关了。
日常面试中,很多候选人能够说出几点,但会比较散,不够系统。如果有 5-7 年工作经验,还表达得不够有条理不够系统化,那么这种回答就是普通水平的。
技术重难点:性能问题及解决方案;性能手段及经验。
大数据量
大数据量是性能优化之上的一个较大的技术挑战。
你所负责的项目或系统中,业务数据量级有多大,增量有多少,如何应对。小数据了有小而美的做法,大数据量有更好的技术手段。
是否要分表、分库、分片,遇到哪些开发难题、如何解决、如何部署上线,都需要记录下来。
技术重难点:大数据量、存储扩展能力、性能。
瞬时大并发流量
瞬时大并发流量,是另一个较大的技术挑战。与大数据量这种逐渐累积的类型不同,瞬时大并发流量只出现很短的一段时间,却能对系统带来很大的冲击,甚至使系统直接崩溃。
怎么应对瞬时大并发流量,有一整套高并发方案。服务治理、限流、熔断降级、负载均衡、CDN、冗余、全链路压测、应急方案等。即使自己的业务中暂时用不到,也可以去深入了解下,作为技术进阶的一层阶梯。
技术重难点:高并发、系统稳定性优化。
新算法设计
新算法设计往往是一种有乐趣的技术挑战。
同时,要在实际系统中应用新算法,还需要加入各种工程考量。比如多正则规则命中文本内容高亮展示。除了设计出算法外,还需要考虑各种复杂的正则、正则表达式超时、多行匹配的情况。
技术重难点:算法设计、工程考量。
结构变更
从一对一到多对多,往往需要对原有代码结构进行较大的改造,从而满足对灵活性和性能的要求。
比如做网络封禁,从一个主机封禁一个IP,到多个主机封禁多个IP,采用并发批量的结构来改造原有单个处理的结构。
结构变更,在代码设计上,是一种挑战。对个人思维能力、技术和设计能力提升有一定帮助。
技术重难点:设计模式、结构重构。
API 设计
前端有自己的逻辑组织结构。后端如果仅仅只按照自己的想象给前端提供的接口,可能自以为是通用的,但实际上用起来很难用。
比如IP详情优化,涉及与前端的交互。在不同场景下,前端需要展示IP不同的样式,同时在某种情形下,需要能够展示IP对应的主机列表。这个问题,要考虑前端接口易用性,后端可能得遇到一个需求就改一次;如果只考虑后端接口通用性,则前端就写得很难看。
如何兼顾 API 接口的友好性和通用性,确实也是一种类型的挑战。
技术重难点:API 接口设计。
后端系统交互
除了提供 API 与前端交互,后端系统常常还需要其它系统交互、跟各种大数据系统对接。比如对接大数据算法组件、检测引擎等。制定合理的数据格式和安全便捷的通信方式,就是技术重难点。此外,还需要考虑各种容错处理。
技术重难点:数据格式制定、通信方案、容错处理。
系统集成
需要构建业务监控系统。此时,并不需要你精通什么原理,而是评估各种系统,善于把已有系统的能力组合起来,为我所用。
技术重难点:评估系统,系统集成
技术预研
偶尔,可能会遇到技术预研的事情。不是有了方案立即去开发,而是要先去探索尝试各种方案利弊如何,是否满足项目需求,做一些技术预研与技术选型。比如,入职一月后做虚表机制探索,后面应用到 K8S 日志审计检测里。
预研结果,往往是通过一个表格来汇报的。需要满足哪些指标、有哪些实现方式,每一种实现方式在各个指标上的表现如何,最终根据实际情况权衡出一个比较适合的实现来。
技术重难点:技术预研、技术选型、预研结果报告。
中间件改造
中间件改造,有时需要对中间件做一些源码修改,以满足项目中的特定要求,有时需要做出中间件的某种功能平替。这个过程中,往往需要解决很多小的技术问题,而这些小的技术问题中,可能会出现比较***钻的。
比如近期做的信创改造,用 kafka 实现 redis 的 pub sub 机制,并满足容器场景下的应用。从接口交互到实现方案到细节打磨,都有受益。
中间件属于较底层的层面,且影响面通常很大,因此中间件改造是一种难度偏大的技术挑战。如果你能搞定,相信你一定会感觉到内功又上一层楼。
技术重难点:中间件源码、技术小难题攻克。
复杂流程设计与改造
有时,你需要在已有的复杂流程中加入一些功能,或者改造流程使之更简洁更高效。难的不是加功能,而是现有流程实现中通常插根针都比较难,并且常常涉及到较大的影响面。此外,复杂流程很容易出现难查的 bug, 尤其是有大量交互或高并发情况下。
比如做恶意进程服务端解壳处理流程,就总结出构建复杂流程的方法论:“分解-抽象-封装-复用-组合-关联-重构”。任意复杂的流程,都可以采用这个方法论构建出来。
技术重难点: 结构重构,影响范围大,保证改动不影响原有功能,疑难问题排查。
技术重构迁移
如果你加入到一个已经度过初创期的团队,那么很可能会遇到系统需要技术重构的事情。也就是原系统之前因为难以承载业务复杂度的增长和业务量的增长,而需要作出一些技术性的重构。换技术栈。
比如在阿里云入职后将 Flex 迁移到 Java ,在有赞刚入职不久的订单导出重构(php 迁移到大数据栈),接下来的交易系统重构(用领域驱动模型改写),还有进入青藤云之后的入侵系统重构(检测流程的组件编排,Java 迁移到 Go)、降噪系统迁移重构。
系统重构,难的是架构设计和部署迁移。架构设计,需要满足未来几年的业务需求;而部署迁移,难的是不造成线上故障。
技术重难点:架构设计(性能、稳定性、可用性、扩展性、定制性、部署等)、部署(灰度、分流)、数据迁移。
全模块开发
一个人完成一个功能的所有涉及模块的开发。
比如服务端入侵的一个功能开发,涉及检测配置、系统规则下发、告警检测流程、告警列表、告警详情、事件列表、事件总览和分析板、告警归并、自定义规则、加白处理、元素响应及处置。
这需要一个人对现有系统有相当的理解和掌握,有整体观和全景视角。同时也需要系统设计得足够通用灵活,这样一个人做起来也不费事。可能搞定这个功能的一个模块也就是一两行配置而已。
可以说,这是一种较大的挑战类型。
技术重难点: 全局视角、熟悉系统各个模块的实现、熟悉系统技术栈。
设计方案不周到的坑
有时,设计方案考虑不周到,就会踩一些坑。
比如进程元素的唯一标识用 PGUID,但是会出现同一个元素在不同告警里出现,而客户端因为业务的不同,上报的字段有细微差异,就会导致进程元素的某些信息被反复覆写,查不到自己所新增的那个字段的值。
实际上,这个就是进程元素唯一标识设计不太合理或者说缺乏进程扩展信息导致。进程元素应当包含一个扩展信息,这个扩展信息包含一个告警ID到特有字段的映射(这个也可以记录在告警表里)。这样,通用信息不会受影响,而扩展信息也不会被覆写。
记录这些教训,也是积累了系统设计方面的经验。
技术重难点:设计方案的坑
疑难问题排查
开发过程中,有时也会遇到一些疑难问题排查,比如临界问题、并发问题、时间差问题、数据不一致问题等。
疑难问题排查,可以锻炼一个人“心细如针、明察秋毫”的细心的特质。
技术重难点:临界问题、并发问题、时间差问题、数据不一致问题等各种问题类型。
科学地提升
相较于平平无奇地完成一个又一个需求(嗯,像不像接客?),采用科学的方法快速提升,更见效果。
咱们来看奥运健儿,他们为了冲锋世界冠军之座,显然不是一个事情低水平重复做,而是采用一定的科学方法和量化指标,不断训练、测量、反馈、提升、再训练、再测量、再反馈、再提升。这样子螺旋式提升的。
那么,在做软件开发的过程中,要快速提升自身技术能力,也需要有意识地去提炼项目中的重难点,借助这些重难点的磨炼,让自己的能力更上一层楼,而不是在一个个平庸的需求开发里原地踏步。
我把入职青藤云安全的三年的项目重难点总结出来之后,就觉得自己还是有了不少提升的。如果我把前两家公司的项目重难点都总结出来,就能看到一个清晰的技术提升路线。
小结
本文分享了自己在职业生涯中遇到的大大小小各种技术挑战。正是解决这些技术挑战,促进了能力的提升。要想快速提升,不能简单地重复已有的事情,而是有意识地去识别项目中的重难点,思考和解决他们,最终把方法和经验都记录下来。日积月累,总有一天,你会发现自己不负时光,更上一层楼。