热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

阿里一年,聊聊我成长了什么,入职阿里的职业生涯感悟

阿里一年,聊聊我成长了什么,入职阿里的职业生涯感悟,Go语言社区,Golang程序员人脉社
 

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、tair
  • 服务化有dubbo、跨语言可以用thrift
  • 分布式任务调度可以考虑schedulex
  • 搜索可以选es、solr
  • 更高级一点图片存储可以用七牛、im可以用融云/环信、音视频这块声网做得比较成熟,所有这些都提供了各个开发版本的sdk,接入简单

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

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

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

 

关注软技能的成长

      这个点之前没有写到,深感遗憾,文章发表之后一直想要补充进来,因为关注软技能的成长是我这一年除了技术思维转变以外成长最大的地方。

我们是一个技术人没错,技术是我们每个人的立身之本,但是在工作中我们又不是单纯与代码打交道:

  • 我们有PD,需要向他们了解需求的整体交互
  • 我们有业务,需要全面了解需求的背景
  • 技术团队内部,我们需要相互之间沟通进度,交流技术方案、设计方案
  • 技术团队外部,我们需要对相互之间的交互方式,上下游进度不理想如何去推动
  • 出了问题,我们需要知道对外应当怎么说,对内应该怎么做
  • 有一个想法,应当如何以正确的方式去落地,而不是我有一个想法直接说也不说、讨论也不讨论干就完事了

      凡此种种,都需要经历和成长,曾经我也以为程序员只要把代码写好就好了,来了阿里,才深刻地感觉到写代码真的只是工作的一部分(可能50%?)而已。

      我相信无论你在50个人的小公司还是在5000个人的大公司,身处3个人的技术团队还是30个人的技术团队,没有一个人是单兵作战的,这个行业对技术人的要求从单纯的技术要求已经越来越往综合素质去靠,所以,关注对自己软技能的,相信无论对当下还是对未来,百利而无一害。

 

去提升看问题的高度

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

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

                     

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

把这个问题说得实际点:

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

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

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

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

 

学会总结

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

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

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

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

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

 

选择大于努力

      好吧,我承认调皮了,但是这一段我也是很真诚的!

      人,努力是最重要的,但是选择也非常重要。有能力是非常好的,有能力的同时,一个好的Leader、一个好的团队将会让你在平时工作中感到无比舒心,将会让你有家一般的温暖,更能将你的能力最大化!

      菜鸟国际物流技术团队就是这么一个团队!

      最后,非常重要的一点:不要害怕面试。通过面试才能发现不足,才能知道未来在技术道路上还需要在哪些方面进行提高,在面试的结尾,你也可以询问面试官自己有什么不足,面试官一定会给到你最诚恳的建议!

 

结合这篇文章和自己的总结:

1、学习能力影响技能,探索能力影响高度;

2、重复造轮子 = 时间成本浪费;

3、知识固化很重要(项目、文档、博客、总结...);

4、把持自主选择权(大多数情况下莫得选);

5、环境很重要

 

原文链接:https://juejin.im/post/5d01c558e51d45777540fd95 

 

 

 

 

 


推荐阅读
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
author-avatar
相信奇迹的发生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有