导读: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,接入简单。
只要你有的技术方面的需求,绝大多数业界已经有了成熟的解决方案了,根本不需要去专门自己搞一套。因此我认为轻易一定不要造轮子,如果一定要造轮子,那么请想清楚下面几个问题:
-
你要做的事情是否当前已经有了类似解决方案?
-
如果有,那么你自己做的这一套东西和类似解决方案的差异点在哪里?假设不用你这套,基于已有的解决方案稍加改造是否就能达到目的?
-
如果没有,那么为什么之前没有?是你们公司这种场景是独一无二的?还是这种场景对应的解决方案根本就是不可行的所以之前没人去搞?
如果想清楚了这些问题,那么就去干吧。
去提升看问题的高度
过去有太多人在我的公众号或者博客下反馈了一个问题:在这个公司,整天做着增删改查的工作,对自己一点都没有提高。
对于这种看法,说难听点就是四个字——目光短浅。我们看:
也可以通过字典方式传参,MGJRouter提供了带有字典参数的方法,这样就可以传递非字符串之外的其他类型参数,例如对象类型参数。
如果以普通的视角去看,那么一颗树那也就只是一棵树而已,但是如果跳脱出目前的视角,站在更高的角度去看,它其实是森林的一部分。你的主管并不是因为他是你的主管所以他就应该你比更高瞻远瞩,而是因为他看问题的高度比你更高、想得更远、做得更深,所以才成为了你的主管。
把这个问题说得实际点:
-
假设今天你负责的是一个系统,那么你仅仅是把这个系统的基本原理搞懂了?还是可以把上下游有几个系统、每个系统之间如何调用、依赖方式都理顺?
-
假设今天你负责的是一块业务,那么你仅仅把自己负责的功能点弄清楚了?还是你可以从最上游开始,到你负责的系统,再到最下游,都思考得非常透彻?
今天与其在抱怨没有机会、抱怨公司对自己能力没有提升,为什么不去思考机会为什么降临在别人头上不降临在你头上?为什么别人可以从小公司写着一样的增删改查走向BAT而你年复一年还在小公司写着增删改查?当你真正能转变自己的思维模式,跳脱出现在的圈子往更高一个层次去看问题、去提升自己,我相信总会有发光发热的一天的。
同样在阿里巴巴,马老师思考自然、思考环保、思考人类的发展,你的主管思考团队未来的方向和打法,我们在思考如何把某个客户需求完整落地,这就是高度,你未必能想到马老师想的,但是你对标层级高一点的人,一步一步尝试往他们的高度去靠。
总而言之:眼界决定高度,多看、多想、多保持好奇心、多问几个为什么,久而久之自然就迈上了一个新的台阶。
学会总结
需求、项目的复盘是非常重要的一部分内容,然而我之前见过的太多团队、太多Leader,只顾着一个迭代接着一个迭代,一个版本接着一个版本,只满足于把需求做好,而忽略了总结的重要性。
我认为大到项目、小到需求,如果在完成之后缺乏总结那么某种程度上来说是失败的,可以总结的点非常多:
-
通过这个项目/需求,是否吃透了某一块业务,搞懂了来龙去脉;
-
通过这个项目/需求,是否充分理解了公司某个技术框架/基础组件的用法;
-
在整个项目的设计上,有哪些做的不好的地方;
-
在整个项目的开发(针对程序员而言),是否踩了坑,犯了低级的错误;
-
在整个项目的进度把控上、人员安排上、上下游协调上,是否存在不足之处;
-
经历了某次大促的值班,是否对可以熟练使用公司的监控工具,遇到突发事件,是否快速有效地进行了解决。
任何工作一定对个人都是有提升的,但是不会总结的人,在每个项目/需求中成长的东西都是散的,久而久之就忘了。通过充分的总结之后,犯过的错误我们不会二次再犯,理清楚的业务的来龙去脉铭记在心,对自己是一种提升,分享给别人对别人也是很大的帮助。
失败者失败的原因各有不同,成功者的做事方式总是相似的,从宏观角度去看,我认为总结就是成功者之所以能成功,很重要一个原因。
文章来源:五月的仓颉微信公众号
作者:五月的仓颉,目前就职于阿里巴巴-菜鸟网络-国际物流技术部,从事后台开发。
相关推荐
从给定的文件内容中,我们可以提炼出以下关于精神病学的重要知识点: 首先,精神病学是一门研究精神疾病的学科,主要...在实际学习和应用时,应结合医学教材、案例研究、临床经验和最新的研究成果进行深入学习和理解。
在职场中,自我介绍往往是一场面试或者商务交流的开场白,它能在短时间内塑造他人对你的第一印象。因此,做好一分钟自我介绍至关重要。以下是一些关键的窍门和策略: 1. **自我认识**:首先,你需要清晰地了解自己...
妄想是在病理基础上产生的歪曲信念,内容通常与事实不符,缺乏客观现实基础,但患者仍然坚信不疑。妄想可以根据其产生背景不同分为原发性妄想和继发性妄想。疑病妄想和超价观念是妄想的特殊类型,而虚构和错构则涉及...
3、偏执型人格特点:表现为无根据地怀疑他人,对自己的健康过度担忧且坚信不疑。这种人格特征在医患关系中可能会导致误解和沟通障碍。 4、反社会型人格特点:主要特征为不遵守社会规范,可能会对医疗环境造成困扰,...
思维内容障碍主要表现为妄想,妄想的特点是与现实不符却坚信不疑,且具有个人特色。其中,被害妄想、关系妄想、物理影响妄想等都是常见的妄想类型。记忆障碍如记忆增强和界限性遗忘则反映了认知功能的变化。情感障碍...
在二年级的语文学习中,学生们会接触到各种类型的文学作品,其中寓言故事占据了重要位置。寓言不仅以其生动的故事情节吸引学生的兴趣,而且往往蕴含着深刻的道德寓意,对孩子的思维发展和价值观塑造起着重要作用。在...
自信心则是建立在自尊基础之上的一种信任,是个体对自身能力的坚信不疑。它与自负不同,后者源于不切实际的过高自我评价,缺乏对他人意见的接纳,而自信心则需要正确评估自己的能力,保持积极的态度,并勇于面对挑战...
- 诗中多次使用“定然”和“定”这样的词语,虽然所描述的是想象中的场景,但诗人用肯定的语气来表达,显示了他对理想世界的坚信不疑,也增强了诗意的表现力,使读者感受到诗人对美好未来的信心。 **基础积累部分*...
这份信任不仅是对孩子们学习能力的肯定,更是对孩子们未来潜力的坚信不疑。朱永新教授在《中国新教育》中提出:“每个孩子都有巨大的发展潜力,教育的首要任务就是相信并激发这种潜力,让每个孩子都能成为最好的自己...
- 妄想是缺乏事实依据,患者却坚信不疑的病理信念,比如坚信自己被跟踪或被特殊能力控制。 5. 精神疾病的分类: - 反应性精神病:常由应激事件引发,可能伴有幻觉和妄想。 - 抑郁症:主要表现为情绪低落,但有时...
精神科护理是医疗领域的重要组成部分,特别是在精神病医院如钦州市第三人民医院中,护士们需要具备扎实的专业知识,以便提供高质量的护理服务。本考试主要涵盖了精神科护理的基础知识,包括认知过程、感觉障碍、知觉...
1. 在生物科技和医疗技术领域,器官移植是科技进步的体现,涉及法律问题。我国专家呼吁立法来规范器官捐献和移植,反映了科技发展对法律的影响,法律需要适应科技的进步,同时也要考虑伦理道德和社会风俗。 2. 行政...
在现代,相信Yeti存在的人已经不多,但那些坚信不疑的探险者们仍旧在继续他们的探索,试图捕捉到这个神秘生物的切实证据。如果真有一天,人类能够捕获到一个活生生的“雪人”,这无疑将是一个前所未有的科学突破。但...
在卢梭和马克斯·韦伯的论述中,我们看到,文明与技术的进步,并不总能带来精神上的自由。卢梭认为社会使人失去天然的自由,韦伯则揭示了现代社会的官僚化导致人的精神异化。 进步论曾是现代人坚信不疑的信条,认为...
在舞台上表现出寒冷刺骨的冬日景象。优秀的演员会凭借其强大的想象力,让自己置身于冰冷的雪地中,感受到雪花飘落的冰凉,他们的身体语言、表情和声音都会体现出那种严寒,使得观众仿佛也能感受到那份寒意。而缺乏...
它主要关注的是在精神疾病的背景下出现的感知、思维、情感和行为方面的异常表现。在这众多异常现象中,感知障碍尤为关键,因为它们是许多精神障碍的明显信号,能够为临床诊断和治疗提供重要的线索。 感知障碍,按照...
- 粘连(nián lián):动词,物体相互粘合在一起。 - 脂粉奁(zhī fěn lián):名词,古代女子化妆用的小盒子。 - 污秽(wū huì):名词,肮脏、不干净。 - 犀利(xī lì):形容词,尖锐、锋利。 - 迸射(bèng...
在人生的旅途中,自信犹如一把钥匙,打开了通往成功的大门。自信心是个人成长和实现目标的强大驱动力。从斯坦尼拉夫斯基大姐的转变中,我们可以深刻体会到自信对于一个人生活和职业发展的改变是多么的巨大。她的故事...
届时,当我们站在人生的巅峰回望,那些曾经让我们感到失望的“山”,都成为了我们前进道路上的风景。 整首诗的结尾,用“一个全新的世界,在一瞬间照亮你的眼睛”来描绘目标达成时的喜悦和成就感。这种自我超越后的...
当团队在赛场上面对逆境,几近放弃之时,一句“我相信我们能行”如同号角般鼓舞人心,唤起了队友们内心的潜能和坚持下去的决心。最终,团队逆转胜局,这不仅仅是一场足球比赛的胜利,更是自信的胜利。这个例子有力地...