温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
不止
代码
阿里巴巴
阿里技术微信公众号阿里巴巴机器智能公众号扫一扫二维码图案,关注我吧如何快速成长为技术大牛?阿里资深技术专家的总结亮了 1毕业 3 年,为何技术能力相差越来越大?10程序员吃的是青春饭?本质上取决于 15技术变化那么快,程序员如何做到不被淘汰?21加班越久故障越多,如何跳出程序员的恶性循环?32如何在阿里技术面试中脱颖而出?39使用开源项目的正确姿势,血和泪的总结 48前端工程师的未来在哪里?57前端 Leader 如何做好团队规划?阿里内部培训总结公开 65一位优秀前端的自我修养 76如何成为一名顶尖的阿里架构师?87哪些技术好书值得一读再读?这有一份经典书单 94阿里技术大牛最爱的“闲书”,你看过多少?103目录阿里技术人生阿里技术人生我也是一位程序员,所以我希望通过以下基于程序开发的一些例子,帮助大家解决这些困惑。大道理是相通的,测试、运维都可以借鉴。几个典型的误区拜大牛为师有人认为想成为技术大牛最简单直接、快速有效的方式是“拜团队技术大牛为师”,让他们平时给你开小灶,给你分配一些有难度的任务。我个人是反对这种方法的,主要的原因有几个:大牛很忙,不太可能单独给你开小灶,更不可能每天都给你开 1 个小时的小灶;而且一个团队里面,如果大牛平时经常给你开小灶,难免会引起其他团队成员的疑惑,我个人认为如果团队里的大牛如果真正有心的话,多给团队培训是最好的。然而做过培训的都知道,准备一场培训是很耗费时间的,课件和材料至少 2 个小时(还不能是碎片时间),讲解 1 个小时,大牛们一个月做一次培训已经是很高频了。因为第一个原因,所以一般要找大牛,都是带着问题去请教或者探讨。因为回答或者探讨问题无需太多的时间,更多的是靠经验和积累,这种情况下大牛们都是很乐意的,毕竟影响力是大牛的一个重要指标嘛。然而也要特别注意:如果经常问那些书本或者 google 能够很容易查到的知识,大牛们也会很不耐烦的,毕竟时间宝贵。经常有网友问我诸如“jvm 的-Xmn 参数如何配置”这类问题,我都是直接回答“请直接去 google”,因为这样的问题实在是太多了,如果自己不去系统学习,每个都要问是非常浪费自己和别人的时间的。大牛不多,不太可能每个团队都有技术大牛,只能说团队里面会有比你水平高的人,即使他每天给你开小灶,最终你也只能提升到他的水平;而如果是跨团队的技术大牛,由于工作安排和分配的原因,直接请教和辅导的机会是比较少的,单凭参加几次大牛的培训,是不太可能就成为技术大牛的。阿里技术人生阿里技术人生1)上班做的都是重复工作,要想提升必须自己额外去学习形成这个误区的主要原因还是在于认为“写业务代码是没有技术含量的”,而我现在上班就是写业务代码,所以我在工作中不能提升。2)学习需要大段的连续时间很多人以为要学习就要像学校上课一样,给你一整天时间来上课才算学习,而我们平时加班又比较多,周末累的只想睡懒觉,或者只想去看看电影打打游戏来放松,所以就没有时间学习了。实际上的做法正好相反:首先我们应该在工作中学习和提升,因为学以致用或者有实例参考,学习的效果是最好的;其次工作后学习不需要大段时间,而是要挤出时间,利用时间碎片来学习。正确的做法Do more做的更多,做的比你主管安排给你的任务更多。我在 HW 的时候,负责一个版本的开发,这个版本的工作量大约是 2000 行左右,但是我除了做完这个功能,还将关联的功能全部掌握清楚了,代码(大约 10000行)也全部看了一遍,做完这个版本后,我对这个版本相关的整套业务全部很熟悉了。经过一两次会议后,大家发现我对这块掌握最熟了,接下来就有趣了:产品讨论需求找我、测试有问题也找我、老大对外支撑也找我;后来,不是我负责的功能他们也找我,即使我当时不知道,我也会看代码或者找文档帮他们回答。最后我就成了我这个系统的“专家”了。虽然这个时候我还是做业务的,还是写业务代码,但是我已经对整个业务都很熟悉了。以上只是一个简单的例子,其实就是想说:要想有机会,首先你得从人群中冒出来,要想冒出来,你就必须做到与众不同,要做到与众不同,你就要做得更多!怎么做得更多呢?可以从以下几个方面着手:1)熟悉更多业务,不管是不是你负责的;熟悉更多代码,不管是不是你写的这样做有很多好处,举几个简单的例子:阿里技术人生阿里技术人生后来用上了几次,每次都解决了卡死的大问题,而有的同学,写了几年的 java 代码,对于 stop-the-world 是什么概念都不知道,更不用说去优化了。Do better要知道这个世界上没有完美的东西,你负责的系统和业务,总有不合理和可以改进的地方,这些“不合理”和“可改进”的地方,都是更高级别的怪物,打完后能够增加更多的经验值。识别出这些地方,并且给出解决方案,然后向主管提出,一次不行两次,多提几次,只要有一次落地了,这就是你的机会。例如:重复代码太多,是否可以引入设计模式?系统性能一般,可否进行优化?目前是单机,如果做成双机是否更好?版本开发质量不高,是否引入高效的单元测试和集成测试方案?目前的系统太庞大,是否可以通过重构和解耦改为 3 个系统?阿里中间件有一些系统感觉我们也可以用,是否可以引入?只要你去想,其实总能发现可以改进的地方的;如果你觉得系统哪里都没有改进的地方,那就说明你的水平还不够,可以多学习相关技术,多看看业界其它优秀公司怎么做。我 2013 年调配到九游,刚开始接手了一个简单的后台系统,每天就是配合前台做数据增删改查,看起来完全没意思,是吧?如果只做这些确实没意思,但我们接手后做了很多事情:解耦,将一个后台拆分为 2 个后台,提升可扩展性和稳定性;双机,将单机改为双机系统,提高可靠性;优化,将原来一个耗时 5 小时的接口优化为耗时 5 分钟还有其它很多优化,后来我们这个组承担了更多的系统,后来这个小组 5 个人,负责了 6 个系统。阿里技术人生阿里技术人生内存分布和垃圾回收情况。这样的程序写起来很简单,简单一点的就几行,复杂一点的也就几十行。Reactor 原理:自己真正去尝试写一个 Reactor 模式的 Demo,不要以为这个很难,最简单的 Reactor 模式代码量(包括注释)不超过 200 行(可以参考Doug Lee 的 PPT)。自己写完后,再去看看 netty 怎么做,一对比理解就更加深刻了。MySQL:既然有线上的配置可以参考,那可以直接让 DBA 将线上配置发给我们(注意去掉敏感信息),直接学习;然后自己搭建一个 MySQL 环境,用线上的配置启动;要知道很多同学用了很多年 MySQL,但是连个简单的 MySQL环境都搭不起来。框架封装了 DAL 层:可以自己用 JDBC 尝试去写一个分库分表的简单实现,然后与框架的实现进行对比,看看差异在哪里。用浏览器的工具查看 HTTP 缓存实现,看看不同种类的网站,不同类型的资源,具体是如何控制缓存的;也可以自己用 Python 写一个简单的 HTTP 服务器,模拟返回各种 HTTP Headers 来观察浏览器的反应。还有很多方法,这里就不一一列举,简单来说,就是要将学到的东西真正试试,才能理解更加深刻,印第安人有一句谚语:I hear and I forget.I see and I remember.I do and I understand,而且“试试”其实可以比较简单,很多时候我们都可以自己动手做。当然,如果能够在实际工作中使用,效果会更好,毕竟实际的线上环境和业务复杂度不是我们写个模拟程序就能够模拟的,但这样的机会可遇不可求,大部分情况我们还真的只能靠自己模拟,然后等到真正业务要用的时候,能够信手拈来。3)Teaching一般来说,经过 Learning 和 Trying,能掌握 70%左右,但要真正掌握,我觉得一定要做到能够跟别人讲清楚。因为在讲的时候,我们既需要将一个知识点系统化,也需要考虑各种细节,这会促使我们进一步思考和学习。同时,讲出来后看或者听的人可以有不同的理解,或者有新的补充,这相当于继续完善了整个知识技能体系。阿里技术人生阿里技术人生毕业 3 年,为何技术能力相差越来越大?蛰剑阿里妹导读:毕业三年,每个人在技术能力跑道上,有了或大或小的差距。有些人永远在重复的劳动,有些人却能从中总结和解决问题。今天我们来探讨下,如何避免让战术上的勤奋掩盖战略上的懒惰,使得真正掌握好的知识点慢慢生长,连接,最终组成一张大网。写在前面高考的时候大家都是一样的教科书,同一个教室,同样的老师辅导,时间精力基本差不多,可是最后别人考的是清华、北大或者一本,而有些童鞋的实力只能考个三本,这是为什么?阿里技术人生阿里技术人生系统化的知识哪里来?知识之间是可以联系起来的并且像一颗大树一样自我生长,但是当你都没理解透彻,自然没法产生联系,也就不能够自我生长了。当我们讲到入门了某块知识的时候一般是指对关键问题的点理解清晰,并且能够自我生长,也就如滚雪球一样可以滚起来了。好的逻辑又怎么来?实践 复盘讲个前同事的故事我有一个前同事,所有解决不了的问题都找他。这位同学让我最佩服的是解决问题的能力,好多问题其实他也不一定擅长,但是他就是有本事通过 Help、Google 不停地验证、尝试就把一个不熟悉的问题给解决了,这是我最羡慕的能力,在后面的职业生涯中一直不停地往这个方面尝试。阿里技术人生阿里技术人生空洞的口号很多文章都会教大家:举一反三、灵活运用、活学活用、多做多练。但是只有这些口号是没法落地的,落地的基本原则就是前面提到的,却总是被忽视了。什么是工程效率,什么是知识效率有些人纯看理论就能掌握好一门技能,还能举一反三,这是知识效率,这种人非常少。大多数普通人都是看点知识,然后结合实践来强化理论,要经过反反复复才能比较好地掌握一个知识,这就是工程效率,讲究技巧、工具来达到目的。肯定是知识效率最牛逼,但是拥有这种技能的人毕竟非常少(天生的高智商吧)。从小我们周边那种不怎么学的学霸型基本都是这类,这种学霸都还能触类旁通非常快地掌握一个新知识,非常气人。剩下的绝大部分只能拼时间+方法+总结等,也能掌握一些知识。非常遗憾我就是工程效率型,只能羡慕那些知识效率型的学霸。但是这事又不能独立看待,有些人在某些方向上是工程效率型,有些方向就又是知识效率型(有一种知识效率型是你掌握的实在太多,也就比较容易触类旁通了,这算灰色知识效率型。)使劲挖掘自己在知识效率型方面的能力吧,两者之间当然没有明显的界限,知识积累多了,逻辑训练好了,在别人看来你的智商就高了。知识分两种一种是通用知识(不是说对所有人通用,而是说在一个专业领域去到哪个公司都能通用),另外一种是跟业务公司绑定的特定知识。通用知识没有任何疑问,碰到后要非常饥渴地扑上去掌握他们(受益终生,这还有什么疑问吗?)。对于特定知识就要看你对业务需要掌握的深度了,肯定也是需要掌握一些的,特定知识掌握得好的,一般在公司里混得也会比较好。阿里技术人生阿里技术人生 你希望技术能进一步积累,那你积累的方向和期望达到的结果分别是啥?你希望能有技术决策,希望有影响力,你觉得应该如何做到?是希望通过岗位任命的方式吗?你觉得是否成功的标志,就是今年或明年得到晋升吗?等等大部分同学在面对这些问题时,其实是比较迷茫的,也缺少真正可度量的衡量标准。是否能在短期内获得晋升成了大部分人作为“组织是否认可、自己是否认可”的衡量标准了。当然,这个话题仁者见仁、智者见智,这里我简单地谈谈我的看法。我以相对比较口水化的方式,将职业发展分两个阶段来进行阐述:1)第一阶段:大学毕业 3 到 5 年2)第二阶段:大学毕业 5 到 10 年阿里技术人生阿里技术人生发现没有?这个阶段,我们能协调好的资源其实就是自己,更多的是一个“个人贡献者”。只要把自己管好了,学习计划执行好了,工作高质量做好了就能得到认可。第二阶段:大学毕业 5 到 10 年很多本科同学,特别是研究生同学。在毕业 10 年后,就已经到了 34、35 岁左右了。也是前段时间网上广泛讨论的所谓 34+岁现象。其实,年龄并不是问题的真正原因。真正的原因还是在于自身“竞争力”是否符合这个年龄所应该具备的。到