在阿里一年,我颠覆了曾经坚信不疑的技术思维

本文探讨了技术人的成长路径,包括正确面对线上异常、定义真正的技术能力、避免盲目造轮子、提升问题解决高度及学会总结。强调了技术能力在于解决问题,而非单纯的知识积累。

2018.5.31~2019.5.31,一段精彩的旅程,渡过了在阿里一年的时光,这段时光有快乐、有焦虑、有迷茫、更有思考,思考的是自己过去的种种不足、思考的是一些现在看来之前错误的想法、思考的是如何成为一个更好的技术人,将这一些思考分享给看到这些文字的每个人,共勉。

一、应当如何面对线上的异常/故障

看起来毫无意义的一个问题,碰到线上异常/故障如何面对,排查解决了不就好了,但是这真的只是第一层。

最近在想“消防”这个词语很有意思,它其实是两层意思:

  • “消”是消除问题;
  • “防”是防止问题。

即“消防”这个词语表达的意思应该是先消除问题再防止相同的问题再次发生。其实线上的异常/故障也是同样的道理,我们应当先及时止血,把问题处理掉,然后深挖问题,探究根因,举几个例子:

  • 假设是某段代码的空指针异常导致的,那么是否考虑加强Code Review,或者使用findbugs插件去自动扫描代码中可能的异常?
  • 假设是线上某个配置修改导致的,那么是否今后变更的修改必须有人双重检查一遍才可以修改?
  • 假设是本地内存中某些值因为系统重启丢失导致的,那么是否引入定时任务,定时把值写入本地内存中?
  • 假设是某段代码逻辑没测试到导致的,那么是否可以反思总结为什么这段逻辑没有测试到,未来的测试应该如何改进?

根据我过往的经验,太多公司、太多团队处理线上的问题仅仅满足于把问题处理完就完事,忽略了对问题的复盘,这对团队/对公司的发展都是不利的。

二、什么是真正的技术能力

之前加了几个技术微信群,看到很多技术朋友在兴高采烈地讨论各种源码,spring源码我彻底撸了一遍、最近深入学习了dubbo底层实现方式,当然曾经的我也是这样的,记得学习volatile的时候一直挖到了volatile在硬件层面上的实现方式,但是这真的说明技术能力强吗?从今天的思考去看这个问题,我认为这更多反应的是一个人的学习能力、钻研能力以及对技术的热情,除此之外再体现不出太多其他东西了。

这个话题,可能是这一年思考的最多个的一个点,钻研是好事,但是实际上大多时候的深入钻研并不在实际工作中有用,且研究得越深,忘得越快,因为研究得越深,那么这个技术点关联的技术点就越多,边边角角的忘了,核心的东西不容易串起来。那么什么是真正的技术能力,我画一张图概括一下:

简而言之,技术能力 = 解决问题的能力,那么同样都在解决问题,大家之间的技术高低又有什么区分呢?我认为有以下几个层次:

  • 第一层级,解决当下问题;
  • 第二层级,以优雅且可复用的方式解决当下问题;
  • 第三层级,解决的问题不仅仅能满足当下,还能满足未来一段时间。

其实从这个角度上来看,不同的技术能力,在工作过程中区分度是很明显的:

  • 写的代码是否存在异常风险,多线程运行下是否存在线程安全问题,某段代码是否会导致内存泄露;
  • 写的代码是否优雅可复用,设计的框架是否足够符合开闭原则,代码结构层次是否清晰明了;
  • 针对特定的场景,技术选型、库表结构设计是否足够合理,今天你设计的框架是只能用一年,还是未来三年五年都可以持续使用;
  • 来了一个大的需求,就比如做一个App的会员体系功能好了,是否可以在充分分析需求后,精确将需求划分为几个特定的子模块并梳理清楚模块之间的关系。

越厉害的人,在代码设计与开发过程中,越能看到想到一些别人看不到想不到的问题,这叫做高屋建瓴;当代码运行出现问题的时候,有人1小时排查出问题,有人1分钟发现问题,这叫做举重若轻。

因此我认为解决问题的能力才是技术能力的真正体现,这一年对技术的探究我也从研究源码更多的转变去学习设计模式、去学习分布式环境下各种NoSql的选型对比、去学习使用Lambda让代码更简洁,往真正在实际工作中解决问题的方向去努力。

另外,抛开这个点,这两天我在思考,还有一个体现技术能力的点,就是学习能力。现实中的全栈是很少的,互联网这个行业的程序员的方向通常有几类:

  • 服务端;
  • 前端;
  • 移动端;
  • AI;
  • 嵌入式;
  • 大数据。

在同一类中,基础知识、基本概念、思维方向是一致的,更多可能差异在开发工具、语言上,我精通Java,但是如果明天有一个需求,使用nodejs、scala、go更好,那么是否可以快速学习、快速上手?甚至明天有一个需求需要写前端代码,是否可以快速开发、无bug上线?

所以,解决问题的能力 + 学习能力,是我认为真正的技术能力,不过说到底,学习能力某种程度上也只是为了解决问题而已。

三、不要造轮子

曾几何时,当我们看着github上这么多优秀的源代码的时候,默默立誓,这辈子我一定要写出一个牛逼的框架,开源在网上。

对于一些复杂条件的报警,比如我们上边提到的失败率和流量波动,应该如何实现呢?

很多对技术有追求的朋友,进入一家公司可能时时刻刻在寻找机会去做一些自己造轮子的事情,但是就如同前面所说的,衡量真正好技术的标准就是能否实实在在地解决问题,自己造轮子风险高、周期长,且需要长时间的验证、排坑才能达到比较好的效果。

随便举几个例子,在互联网发展的今天:

  • 数据库连接池有dbcp、c3p0、druid;
  • 本地缓存有ehcache、要用中心缓存有redis、tail;
  • 服务化有dubbo、跨语言可以用thrift;
  • 分布式任务调度可以考虑schedulex;
  • 搜索可以选es、solr;
  • 更高级一点图片存储可以用七牛、im可以用融云/环信、音视频这块声网做得比较成熟,所有这些都提供了各个开发版本的sdk,接入简单。

只要你有的技术方面的需求,绝大多数业界已经有了成熟的解决方案了,根本不需要去专门自己搞一套。因此我认为轻易一定不要造轮子,如果一定要造轮子,那么请想清楚下面几个问题:

  • 你要做的事情是否当前已经有了类似解决方案?
  • 如果有,那么你自己做的这一套东西和类似解决方案的差异点在哪里?假设不用你这套,基于已有的解决方案稍加改造是否就能达到目的?
  • 如果没有,那么为什么之前没有?是你们公司这种场景是独一无二的?还是这种场景对应的解决方案根本就是不可行的所以之前没人去搞?

如果想清楚了这些问题,那么就去干吧。

四、去提升看问题的高度

过去有太多人在我的公众号或者博客下反馈了一个问题:在这个公司,整天做着增删改查的工作,对自己一点都没有提高。

对于这种看法,说难听点就是四个字——目光短浅。我们看:

如果以普通的视角去看,那么一颗树那也就只是一棵树而已,但是如果跳脱出目前的视角,站在更高的角度去看,它其实是森林的一部分。你的主管并不是因为他是你的主管所以他就应该你比更高瞻远瞩,而是因为他看问题的高度比你更高、想得更远、做得更深,所以才成为了你的主管。

把这个问题说得实际点:

  • 假设今天你负责的是一个系统,那么你仅仅是把这个系统的基本原理搞懂了?还是可以把上下游有几个系统、每个系统之间如何调用、依赖方式都理顺?
  • 假设今天你负责的是一块业务,那么你仅仅把自己负责的功能点弄清楚了?还是你可以从最上游开始,到你负责的系统,再到最下游,都思考得非常透彻?

今天与其在抱怨没有机会、抱怨公司对自己能力没有提升,为什么不去思考机会为什么降临在别人头上不降临在你头上?为什么别人可以从小公司写着一样的增删改查走向BAT而你年复一年还在小公司写着增删改查?当你真正能转变自己的思维模式,跳脱出现在的圈子往更高一个层次去看问题、去提升自己,我相信总会有发光发热的一天的。

同样在阿里巴巴,马老师思考自然、思考环保、思考人类的发展,你的主管思考团队未来的方向和打法,我们在思考如何把某个客户需求完整落地,这就是高度,你未必能想到马老师想的,但是你对标层级高一点的人,一步一步尝试往他们的高度去靠。

总而言之:眼界决定高度,多看、多想、多保持好奇心、多问几个为什么,久而久之自然就迈上了一个新的台阶。

五、学会总结

需求、项目的复盘是非常重要的一部分内容,然而我之前见过的太多团队、太多Leader,只顾着一个迭代接着一个迭代,一个版本接着一个版本,只满足于把需求做好,而忽略了总结的重要性。

我认为大到项目、小到需求,如果在完成之后缺乏总结那么某种程度上来说是失败的,可以总结的点非常多:

  • 通过这个项目/需求,是否吃透了某一块业务,搞懂了来龙去脉;
  • 通过这个项目/需求,是否充分理解了公司某个技术框架/基础组件的用法;
  • 在整个项目的设计上,有哪些做的不好的地方;
  • 在整个项目的开发(针对程序员而言),是否踩了坑,犯了低级的错误;
  • 在整个项目的进度把控上、人员安排上、上下游协调上,是否存在不足之处;
  • 经历了某次大促的值班,是否对可以熟练使用公司的监控工具,遇到突发事件,是否快速有效地进行了解决。

任何工作一定对个人都是有提升的,但是不会总结的人,在每个项目/需求中成长的东西都是散的,久而久之就忘了。通过充分的总结之后,犯过的错误我们不会二次再犯,理清楚的业务的来龙去脉铭记在心,对自己是一种提升,分享给别人对别人也是很大的帮助。

失败者失败的原因各有不同,成功者的做事方式总是相似的,从宏观角度去看,我认为总结就是成功者之所以能成功,很重要一个原因。

Java_supermanNO1:专注于Java开发技术的研究与知识分享!

————END————

精彩尽在评论区
  • 点赞(编辑不易,感谢您的支持)
  • 转发(分享知识,传播快乐)
  • 关注(每天更新Java开发技术)
已经博主授权,源码转载自 https://pan.quark.cn/s/fb533687a163 《C++经典代码大全》是一部专门针对C++入门者的重要参考资料,其核心目标在于提供易于理解的C++编程范例,旨在协助新学者迅速领会C++语言的关键概念与技术要点。此压缩文件所包含的信息或许涵盖了从基础到高级的各类C++编程技巧,涉及面向对象编程中的类与对象、函数的应用、程序流程控制、数据结构设计、模板技术以及异常管理等多个关键领域。 1. **基础语法** - 变量声明与初始化:掌握如何声明并初始化不同数据类型的变量,例如整型(int)、浮点型(float)、字符型(char)等。 - 基本输入输出:学习运用`std::cin`和`std::cout`执行标准数据输入与输出操作。 - 控制流语句:熟练运用条件语句(if、if-else、switch-case)以及循环语句(for、while、do-while)来控制程序流程。 2. **类与对象** - 类的定义:学会如何构建类,包含其成员变量与成员函数的设定。 - 对象的创建与使用:掌握如何实例化对象,并经由对象访问类的成员函数。 - 封装:理解封装的理念,并学习使用private和public访问修饰符来保护数据。 - 构造函数与析构函数:掌握如何为类定义自定义的构造过程与析构过程。 3. **函数** - 函数的定义与调用:理解函数的功能与作用,以及如何进行函数的定义和调用。 - 函数参数:精通不同类型的参数传递方法,包括值传递和引用传递。 - 函数重载:学习在同一作用域内定义多个具有相同名称但参数列表不同的函数。 - 函数指针:了解函数指针的运用方法,及其在回调函数和模板中的应用场景。 4. **数组与字符串** -...
内容概要:本文研究了一种计及自适应预测修正的微电网模型预测控制(MPC)优化调度方法,并提供了Matlab代码实现。该方法针对微电网中风电出力等可再生能源的强不确定性,引入自适应预测修正机制,动态调整预测模型以提升短期功率预测精度,从而增强调度决策的准确性与系统运行的鲁棒性。研究构建了完整的MPC滚动优化框架,涵盖预测模型建立、多时间尺度优化求解、实时反馈校正等关键环节,实现了系统运行成本最小化、能源高效利用与功率平衡的多重目标。所提方法有效应对了负荷波动与新能源出力随机性带来的调度挑战,提升了微电网能量管理系统的智能化水平。; 适合人群:具备电力系统、自动化、控制理论或相关领域基础知识的研究生、科研人员及工程技术人员,尤其适合从事微电网优化、可再生能源集成、模型预测控制研究的专业人士,熟悉Matlab编程与优化算法者更佳。; 使用场景及目标:①应用于高比例可再生能源接入的微电网能量管理系统,提升调度方案的实时性与鲁棒性;②为不确定性环境下电力系统动态优化控制策略的研究提供仿真验证平台;③支持学术论文复现、科研课题攻关及实际工程项目的前期技术验证与方案预研。; 阅读建议:建议结合Matlab代码逐模块分析算法实现细节,重点关注预测模型构建与反馈修正机制的设计逻辑,通过调整风电出力、负荷需求等场景参数进行仿真实验,深入理解MPC在微电网调度中的滚动优化特性与自适应修正能力。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,字符编码扮演着处理文本数据的核心角色。本文着重研究在微控制器系统中,运用C语言如何将UTF-8编码格式转换为GBK编码格式,旨在处理串口通信、TF卡存储或LCD显示屏上可能出现的中文显示错误问题。我们将详细剖析UTF-8与GBK编码的运作机制,并研究基于Keil开发平台的C语言实现流程。 UTF-8是一种被广泛接纳的Unicode字符编码方案,它采用可变长度的字节序列来表示字符,每个Unicode字符都对应一个独一无二的数字标识,即码点。UTF-8的一个显著特点是对ASCII字符(英文文本)保持不变,因此在网络传输和文件存储方面展现出优秀的兼容性。 GBK编码,正式名称为“汉字内码扩展规范”,是中国大陆的标准化编码,是对GB2312编码的延伸,总共涵盖了20902个汉字及其他符号,每个字符使用两个字节来表示。GBK在GB2312的基础上扩充了许多繁体字、少数民族文字以及特殊符号,目的是满足更广泛的语言需求。 将UTF-8转换为GBK的主要难点在于GBK是一种固定长度的双字节编码,而UTF-8则是可变长度的编码。转换过程中需要将UTF-8的多字节序列解析为相应的Unicode码点,然后依据GBK的编码规则查找匹配的编码。这一过程通常借助查表法完成,即建立一个从Unicode码点到GBK编码的映射库。 在Keil开发环境中,使用C语言实现UTF-8到GBK的转换可以遵循以下步骤: 1. **构建查表法所需的GBK编码库**:需要准备一个包含所有GBK字符二进制形式的GBK编码库。这个库通常是一个二进制文件,其大小大约为41KB。 2. **解析UTF-8编码**...
内容概要:本文提出一种基于CNN-BiGRU-Attention混合神经网络模型的风电功率预测方法,旨在提升风力发电功率预测的精度。该模型面向多变量输入的单步预测任务,首先利用卷积神经网络(CNN)提取风速、风向、温度等气象因素的局部时空特征,再通过双向门控循环单元(BiGRU)充分捕捉时间序列数据的前后向时序依赖关系,最终引入注意力(Attention)机制对关键历史时刻的特征进行自适应加权,强化对预测结果贡献更大的时间步信息,从而显著提高预测准确性。整个模型在Matlab平台上实现,特别适用于处理风电数据固有的强随机性与剧烈波动性,能够有效应对复杂多变气象条件下的功率预测挑战,为电网调度提供高精度的数据支撑。; 适合人群:具备一定机器学习和深度学习理论基础,熟悉Matlab编程语言,从事新能源发电预测、电力系统调度、智能算法开发与应用等相关领域的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①应用于风电场实际运行中的短期功率预测,为电网的安全稳定调度与经济运行提供可靠依据;②作为深度学习在可再生能源预测领域应用的典型案例,帮助学习者深入理解CNN、RNN变体(BiGRU)及Attention机制的协同建模原理与实现方法;③为后续研究多步预测、模型轻量化或网络结构优化等方向提供坚实的技术参考和可复用的代码基础。; 阅读建议:学习者应重点关注模型各组件的设计思路与集成方式,结合提供的Matlab代码,系统掌握数据预处理、模型搭建、训练流程及性能验证的完整环节,建议通过调整输入变量组合、优化网络超参数或替换数据集等方式,观察模型性能变化,以深入理解该混合架构的核心优势与调优策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值