本文章为《不止代码》阅读笔记,本书可以在阿里技术公众号中找到,这是一本大牛分享经验的书,感谢大牛们的分享~
一、如何快速成长为技术大牛 -- 李运华
Do More
1)熟悉更多的业务,不管是不是你负责的;熟悉更多代码,不管是不是你写的
好处:* 需求分析时更加准确,能在需求阶段识别风险、影响、难点
* 处理问题更快,能够快速的判断问题可能原因并进行排查处理
* 方案设计更全面。能够设计出更好的方案
2)熟悉端到端。比如你负责web后端开发,但是实际上用户发起http请求,通过很多步骤到达服务器(例如浏览器缓存、DNS、nginx等),服务器一般又会经过很多处理才到你写的那部分代码(路由、权限等),掌握整个流程中的很多系统或者步骤,对综合水平有很大作用
* 方案设计、线上故障处理都需要综合技术水平
3)自学。例如垃圾回收,调优,网络编程等
Do Better
例如:* 重复代码太多,是否可以引入设计模式?
* 系统性能一般,可否进行优化?
* 目前是单机,如果做成双机是否更好?
* 版本开发质量不高,是否引入高效的单元测试和集成测试方案?
* 目前的系统太庞大,是否可以通过重构和解耦改成三个系统?
* 阿里中间件有一些系统感觉我们也可以用,是否可以引入?
Do exercise
1)Learning 要注意系统化,例如JVM原理、Java编程、网络编程、HTTP协议等等,建议先完整的看完一本书全面的了解,然后通过google、视频、博客有针对性的查有疑问的地方或者一些技巧
2)Try 自己去尝试搭建一些模拟环境,自己写一些测试程序
3)Teaching 经过Learning和Trying,能掌握70%左右,但要真正掌握,一定要做到能够跟别人讲清楚。
二、毕业 3 年,为何技术能力相差越来越大? -- 蛰剑
作者认为 能力 = 知识 + 逻辑
系统化的知识是在关键问题的点的清晰理解的基础上,逐渐联系形成的。
好的逻辑是在知识的实践和复盘中建立的。
三、程序员吃的是青春饭?本质上取决于...... -- 毗卢
程序员职业发展分两个阶段:
第一阶段:大学毕业 3 到 5 年,主要以学习、积累为主
* 基础的Java知识:《Java编程思想》、《Effective Java》
* 高质量代码进阶知识:《重构:改善既有代码的设计》、《代码大全》、《编程珠玑》
* 常用的主流框架:比如 SSH 相关的《Spring实战》、《Spring Boot 实战》、《Hibernate实战(第2版)》、Apache官网、Spring官网、Hibnate官网、StackOverflow
* 系统设计与算法知识:《系统分析与设计方法》、《设计模式》、《需求分析与系统设计》、《面向对象分析与设计》、《UML用户指南》、《算法导论》
* 其他知识:比如数据库调优、缓存框架、NoSQL数据库、日志框架等等
第二阶段:大学毕业 5 到10 年 ,成为团队贡献者,而非个人贡献者
* 对所负责领域的业务特点、发展趋势、友商竞争分析有很好的洞察,知道业务领域的客户群体及其需求,并了解其痛点。此时需要学习《资讯的奥秘》、《探索需求》、《系统化思维导论》、《成为技术领导者:掌握全面解决问题的方法》。
* 了解客户的需求、企业架构、业务知识,清楚规划的产品、服务,此时需要学习一些TOGAF、NGOSS、ITIL等业务理论以及业务知识。
* 能清晰且有逻辑性的进行表达与沟通,能将自己对于市场的洞察转换成业务规划,争取到老板的同意,包括资金、人力资源等。此时需要学习《金字塔原理》、《博弈论》、《影响力》等。
* 能将业务趋势、客户痛点进行业务建模。此时需要学习《领域驱动设计:软件核心复杂性应对之道》、《实现领域驱动设计》、《企业应用架构模式》、《恰如其分的软件架构》等。
* 需要具备软件项目管理的能力,能带领团队做技术方案设计、接口设计以及编码实现等。此时需要学习《PMBOK指南》、《敏捷软件开发》、《人月神话》、《程序开发心理学》。
* 对于有国际化要求的公司,需要学习英语。
* 需要一个好身体,经常锻炼。
* 积极面对团队磨合的挑战、技术方案的政治、平台优先 or 业务优先的博弈、低落的团队氛围、个人的低估等等。
四、技术变化那么快,程序员如何做到不被淘汰? -- 空融
业务、技术与软件系统的价值链:业务就是指某种有目的的工作或者工作项目,业务的目的就是解决人类社会与吃喝住行洗洗相关的领域问题,包括物质的需求和精神的需求,使开展业务活动的主题和受众都能得到利益。通俗的讲业务就是用户的痛点,是业务提供方(公司)的盈利点。而技术是解决问题的工具和手段。软件系统的价值是为了解决业务问题。
公司依靠软件系统提供业务服务而创造价值,程序员则是通过构建并持续演进软件系统服务能力以及业务功能以支撑公司业务发展而创造价值。
软件系统体现自身价值的方向:
* 业务领域与功能
* 服务能力:系统正确性(程序能够正确标书业务流程,没有bug)
可用性(可以 7 * 24 小时 * 365 不间歇工作)
大规模(高并发,高吞吐量)
架构:将人员、技术等资源组织起来以解决业务问题,支撑业务增长的一种活动。具体可从以下角度看:
组织业务:通过探索和研究业务领域的知识,构建自身看待业务的“世界观”。基于这种认识拆分业务声明周期,确立业务边界,构建出了一套解决特定业务问题的领域模型,并且确认模型之间、领域之间的关系与写作方式,完成里对业务领域内的要素的组织工作。
组织技术:选用合适的框架、中间件、编程语言、网络协议等技术工具依据之前设计方案组织起来次年改成一套软件系统方案。
组织人员:根据人员按不同工种、不同职责、不同系统进行组织,确定这些人员之间的协作方式,并关注这个组织系统能否运作良好比如沟通是否顺畅、产出是否达到要求、能否按时间完成等。
组织全局,对外输出:需要关注运行过程中产生的数据比如业务成功率,系统运行资源占用数据、用户反馈信息、业务增长情况等。
成本与收益:可以基于成本与收益的关系去思考自己的每一项技能的价值。比如降低软件构建成本的相关工程技术:项目管理、敏捷开发、单元测试、持续集成、持续构建、版本管理等。
架构目标需要适应业务的发展:仔细衡量正确性、大规模、可用性三者的关系。确保系统是复核设计需求的,保证系统达到可接受的正确性,为后续能过快前进打下基础,为企业降低构建成本。
正确看待分工:分工是有价值的,将软件系统生命周期进行拆分(比如开发生命周期、测试生命周期、测试生命周期、用户访问生命周期、软件运维生命周期等),他使得复杂昂贵的任务可以被简单、并行、可替换的流水线方式解决。但同时也要关注整体价值,避免增加软件实施成本。
从价值触发 - 找寻学习与工作的新思路
明确自身的业务相关主体:找到工作的协作关系网内的业务方和客户方,进而找到客户方中找到离自己最近的业务价值点,从也无妨中挖掘更多的资源。甚至可以按这个思路顺着网络向上或向下挖掘价值链条,整合更多的上下游资源以实现更大的价值。
向前一步,为更大的价值负责:试着转变思维,从架构师的角度思考价值问题,看能否将技术贯穿到业务、到用户、到最终的价值去。
像架构师一样思考,用价值找寻重心:向架构师那样全局性思考,把遇到问题进行拆分,把学习到的事务串联起来,努力构成完整的价值链条。
学会连接,构建体系:我们应当树立自身的知识体系以吸收融合新知识,将鼓励的概念连接起来,形成自身的价值链条。
五、加班越久故障越多,如何跳出程序员的恶性循环? -- 冠楠
问题:团队负载较重的情况下回出现质量不高的情况
解决方案:
需求细化:拆分成最小可交付产出
随时拥抱用户:迭代式产出,交付即验收
重点跟进质量管理和运营
尽全力保证线上发布成功率
评估的标准:
需求的吞吐量:团队指定时间内完成的需求数。
需求的平均完成时长
新增缺陷的数量
缺陷平均解决时长
线上发布的成功率
缺陷的reopen率:缺陷呗reopen的次数与缺陷书目之比
六、如何在阿里技术面试中脱颖而出? -- 宗心
招人的衡量标准:
技能:工作项目经验,以及解决疑难问题的能力。
潜力:对计算机相关的专业的只是体系是不是完整,基础是不是扎实,平时是不是喜欢钻研。
软实力:包含了性格、执行力、领导力等方方面面,它代表了候选人是否能快速融入团队,拿到结果,带领团队攻城拔寨,激励和影响身边的人变的更加优秀等等。
对比标杆:是否比团队中同一等级中50%的同学优秀。
面试的方法:
面试不要做的事情:问一些知道性的问题(百度)
问一些特别复杂的问题,比如特别复杂的算法
问一些假设性的问题假设你参加了这个项目
面试应该做的事:
问已经发生的事
问解题思路:比如说,很多同学说自己做过架构,然后都会讲自己做了一个解耦和分层的框架,其实这类框架iOS很多,外部github上就有各种方案。在阿里内部手淘糟践做的bundle拆分时沉淀的容器规则,天猫开源出去的beeHive,闲鱼内部的Xframework,抑或是服务端的spring mvc,其实都实现了IOC,但实现和思路上都有一些差异,到底为什么这么做是有区别的,这里面就可以看出知识广度,总结和思辨能力,在关键路径上的技术判断。
少问多听:尽量让应试者自己陈述,然后以学习和交流的心态对陈述中存疑的地方再进行发问。
STAR原则:
处境:在什么样的环境下
任务:接到了什么样的任务
行动:然后具体怎么落地
结果:拿到了什么结果
鉴别方式:
更多的关心 What/How/Why :做了什么事情,怎么做,为什么这么做
细节!细节!细节!
市场需要什么样的技术人:
经验丰富,只是体系完整:经验能解决实际的问题,另外知识体系可以让你在遇到新的问题时举一反三。找到身边的标杆,向更优秀的同学学习。
保持良好的习惯,不忘总结和提升:不积跬步无以至千里,贵在坚持积累。比如每周写周报的时候,想自己这一周到底收获什么,最近有研究什么新的技术或者看到什么有趣的文章没有。
七、使用开源项目的正确姿势,血与泪的总结 -- 李运华
软件开发领域流行的原则:DRY,Don't repeat yourself-不要重复造轮子
选:如何选择一个开源项目?
聚焦是否满足业务:过早优化是万恶之源--《UNIX编程哲学》
聚焦是否成熟:1>版本号
2>使用的公司数量
3>社区活跃度:看看社区是否活跃,发帖数,回复数,问题处理速度等
聚焦运维能力:1>开源方案日志是否齐全
2>开源方案是否有命令行、管理控制台等维护工具,能够看到系统运行时的情况
3>开源方案是否有故障检测和回复的能力,例如告警、倒换等。
用:如何使用开源方案?
深入研究,仔细测试:1>通读开源项目的设计文档或者白皮书,了解其设计原理
2>核对每个配置项的作用和影响,是被出关键配置项
3>进行多种场景的性能测试
4>进行压力测试,连续跑几天,观察cpu、内存、磁盘io等指标波动
5>进行故障测试:kill,断电,拔网线,重启100次以上、倒换等
小心应用,灰度发布
做好应急,以防万一:例如,如果要用MongoDB或者Redis,可以用MySQL做备份存储
改:如何基于开源项目做二次开发?
保持纯洁,加以包装:建议不要改动原系统,而是要开发辅助系统:监控,报警,负载均衡,管理等。
发明你要的轮子
八、前端工程师的未来在哪里?--成曰 详见文章
1、继续分化(领域、行业、技术栈)
2、继续融合(端技术、Web全栈技术、人工智能与端技术)
3、核心不变(计算机科学本质、软件工程思想与实践、程序员职业素养)
九、前端Leader如何做好团队规划?阿里内部培训总结公开 -- 剑平 详见文章
十、一位优秀前端的自我修养 -- 寒泉
能力:
编程能力:就是用代码解决问题的能力,细分又有调试、算法、数据结构、OS原理等
架构能力:是解决代码规模的问题,包含了一些意识,比如解耦、接口隔离,也包含人事业务建立抽象模型,也有一些常见的模式,比如经典的MVC,还有设计层面,面向对象、设计模式等等。
工程能力:是解决写作的问题,当系统规模更大,如何保证几个高手互相能够配合好?如何保证项目里水平最差的人不脱后退?包括前后端解耦,模块化,质量保证,代码风格,等等。
建立自己的知识体系:
1、寻找线索(列表)
2、建立联系
3、分类(图谱)
4、追本溯源
十一、如何成为一名顶尖的阿里架构师? -- 无叶
架构师的职责:
职责一:全局的技术规划
职责二:统一的方法 & 规范 & 机制
职责三:完备的基础构建
职责四:落地的规划才是架构
专职架构师的考核:
考核一:全局的技术规划:技术规划的好坏、全面性、前瞻性
考核二:统一的方法 & 规范 & 机制:关注对应的产出
考核三:完备的基础构建:克制跨团队的合作(清晰边界,共建)
考核四:落地的规划才是架构:紧跟拆解的事情结合实际的组织和业务情况作出决策
关于实施:
第一:建立“架构语言”:是指产品的业务架构,用例和领域模型;研发的应用架构,组件和时序图;运维的部署架构等。
第二:建立“认同体”:通过技术能力、知识传递、领域组织等方式形成“认同体”,且在其中形成架构体系对应的人员体系。
第三:永远做服务者:架构师存在的目的是成就研发团队每一个同学
十二、那些技术好书值得一读再读?这又一份经典书单 -- 阿里技术
《Effectice Software Testing》
《程序员修炼之道---从小工到专家》
《设计模式之禅》
《Spoken Language Processing:A Guide to Theory,Algorithm and System Development》
《机器学习导论》
《Reinforcement Learning:An Introduction》
《Programming Rust》
《Machine Learning:A Probalilistic Perspective》
《Architecture of a Database System》
十三、阿里技术大牛最爱的“闲书”,你看过多少? -- 阿里技术
《从优秀到卓越》
《为什么精英都是时间控》
《创新者的囧境》
《魔鬼经济学》
《孙子兵法》
《创造自然》
《浮生六记》