准备面试以来,除了学习以外的个人成长总结。
技术
中间件
架构设计
设计模式
思想
抽象
寻找共性
提升抽象层次
构建金字塔
金字塔模型
结构化思考和表达
自下而上思考,总结概括;自上而下表达,结论先行。
如何提升抽象思维能力
多阅读,少看视频和图像
多总结,写作、表达,锻炼抽象思维和结构化能力
领域建模训练
分治
分而治之
分:递归地将原问题分解成小问题
治:逐个击破之后合并小问题的解,从而得到整个问题的解
- 分解:将要解决的问题划分成若干规模较小的同类问题
- 求解:当子问题划分得足够小时,用较简单的方法解决
- 合并:按原问题的要求,将子问题的解逐层合并,构成原问题的解
编程中的分治
相关算法
函数分解
坏味道:又臭又长的代码,将大函数分解为多个短小、易读、易维护的小函数
原则:
- 单一职责原则
- 在使用组合函数模式时,要注意抽象层次一致性原则,不同抽象层次的内容放在一起会给人凌乱、逻辑不协调的感觉。
- 写代码的两次创作
- 第一遍实现功能,创造
- 第二遍重构优化,创作
- 分治相关设计模式
管道模式,装饰者模式,责任链模式……
- 分层设计
分层设计是架构体系设计中最常见和重要的一种结构。
分层设计最大的好处就是分离关注。就可以通过分层隔离简化一个复杂的问题,让每一层只对上一层负责,从而使每一层的职责变得相对简单。
- 横切和竖切
数据库设计,分库分表分区
技术人的素养
不教条
控制系统复杂度,但凡能提高代码可读性、可扩展性和可维护性的方法,都是值得考虑的,并不一定要拘泥于某种特定的开发过程或者编程范式。
IDP:强行拆模块,导致开发复杂度提升,关键是本来也没有先做规范,导致后续开发进一步陷入混乱。
当然,首先要学会基本的原则,然后才能知道什么时候去打破规则。在遵守规范和原则的基础上适时打破规则来满足目标。
不炫技
不能为了炫技而过度设计或强行使用。存在瓶颈的时候为了解决问题才要适当引入合适的解决方案。
批判性思维
批判性思维是一种谨慎运用推理去断定一个断言是否为真的能力。它要求个人保持思考的自主性和逻辑的严密性,不被动地全盘接受,也不刻意地带着偏见去驳斥一个观点。
成长型思维
成长的过程中不可能是一帆风顺的,肯定会有痛苦、有阻力、有挫折。
面对逆境,应该怎么做?
有些人也许不堪重负,就此沉沦;有些人可以越挫越勇,把每次失败都当成学习的机会。
成长型思维和固定型思维会极大影响人们面对逆境的处理方式。
我们获得的成功并不是完全由能力和天赋决定的,更多受到我们再追求目标的过程中展现的思维模式的影响。
| 成长型思维 | 固定型思维 |
|---|---|
| 我的态度和汗水决定了一切 | 我的聪明才智决定了一切 |
| 我可以学会任何我想学的东西 | 我擅长某些事,不擅长另外一些事 |
| 我想要挑战我自己 | 我不想要尝试我可能不擅长的东西 |
| 当我失败的时候,我学会很多东西 | 如果我失败了,我就无地自容 |
| 我希望你表扬我很努力 | 我希望你表扬我很聪明 |
| 如果别人成功了,我会受到别人的启发 | 如果别人成功了,他会威胁到我 |
成长型思维和固定型思维体现了应对成功与失败、成绩与挑战时的两种基本心态。认为才智和努力哪个更重要、能力能否通过努力改变,决定了你是否会满足于既有成果,还是会积极探索新知。通过了解自己的思维模式并做出改变,人们能以最简单的方式培养对学习的热情,以及在任何领域内取得成功都需要的抗压力。
具有成长型思维的人相信自己可以通过学习来提升自我,相信学习和成长的力量,相信努力可以改变智力和能力。会用更加理性的态度看待一时的成败得失,内心坚定地相信成长和学习的力量。工作或生活中面临挑战时,不会轻言放弃,而是会积极主动地去学习,去寻找解决方案。即使最终还是失败了,也不要一蹶不振,而是把失败当成学习的动力和机会。
结构化思维
逻辑+套路
逻辑
- 演绎顺序
大前提、小前提、结论
- 时间/步骤顺序
第一、第二、第三,首先、再者、然后,大多数时间顺序也是因果顺序
- 空间/结构顺序
前端、后端、数据库,东方、南方、西方、北方,化整为零,相互独立,完全穷尽
- 程度/重要性顺序
最重要、次重要、不重要
套路
解决问题的方法论、路径和经验
5W2H:why、who、when、where、what、how、how much
逻辑是一种能力,而套路是方法论、经验;
逻辑属于道,而方法论属于术。
如何融入新团队
结构化拆解问题:团队/项目/企业——业务、技术、人
业务:产品形态,业务流程,走访客户
技术:系统架构,领域模型,代码结构
人:组织结构,人员角色,勤沟通
工具化思维
适当的懒比低效的勤奋更具智慧,懒惰的对立面除了勤奋也可能是硬干、苦干、傻干,可能是一种徒劳、低效、大可不必的努力,只会说明做事情过于急切,欠缺思考。人们很容易混淆行动与进展、忙碌与多产的概念。
在有效的工作中,最重要的是学习和思考,而人在思考的时候通常看上去不会很忙。
智慧懒是一种工具化思维,是磨刀不误砍柴工的智慧。
程序员与其他行业的最大区别是不仅使用工具,还能创造工具。
对于整天非常忙,忙到没有时间思考的人,真心建议停下来,思考一下:我是否存在知识盲区(先探索完整个地图,再选择交通工具,然后规划路线,最后一路顺风)?我的方法有没有问题?是不是有更“偷懒”的方式可以帮助我提升效率?
好奇心
记笔记,写总结
有目标,有野心
选择的自由
平和的心态
动机至善,了无私心;用无为的心,做有为的事。
无为:平和的心态,活在当下的智慧,宠辱不惊
精进
每天进步一点点,慢就是快
Leader & Manager
manager 是管理事务,是控制和权威;
leader 是领导人心,是引领和激发。
我们不需要这么多“高高在上”“指点江山”的技术 manager,而是需要更多能真正深入系统里面,深入代码细节,给团队带来提升和改变的技术 leader。
技术氛围
代码好坏味道
技术分享
代码评审
读书会
目标管理
KPI or OKR
SMART 原则
S:specific,明确性
M:measurable,衡量性
A:attainable,实现性
R:relevant,相关性
T:time bound,时限性
技术规划
- 当前问题/痛点
- 业务领域
- 技术领域
- 团队特色
工作
生活
工程师精进原则
https://tech.meituan.com/2018/08/16/10-principles-for-engineers.html
Owner 意识
- 认真负责是工作的底线。
- 积极主动是“Owner意识”更高一级的要求。
时间观念
做事有计划,工作分主次。
以终为始
先想清楚目标,然后努力实现。
要根据问题设定目标,再进行优化。
带着目标去学习。
闭环思维
一个人是否靠谱,就看他能否做到凡事有交代,件件有着落,事事有回音。它强调的是一种即时反馈闭环,如果别人给我们分配了一个任务,不管完成的结果如何,一定要在规定的时间内给出明确的反馈。
真正的闭环,要求我们对工作中的事情都能够养成良好的思维习惯,沟通要有结论,通知要有反馈,To Do要有验收。
“闭环思维”还要求能够定期主动进行阶段性的反馈。
保持敬畏
当我们进入到一个新的团队,请先暂时忘掉之前的习惯,要尽快学习团队既有的规范,并且让自己与团队保持一致。
让规范与约定与时俱进,也是另一种形式的敬畏。
事不过二
所有的评审、问题讨论、错误,不要超过两次。
设计优先
软件架构的目标,是为了让构建与维护系统的所需人力资源最小化。
架构设计,并不仅仅关系到系统的质量,还关乎团队的效能问题。
无数事实证明,忽略了前期设计,往往会导致后续开发周期被大幅拉长,给项目带来了很大的Delay风险。而且最可怕的是,不当的设计会给项目带来巨大的后期维护成本,我们不得不腾出时间,专门进行项目的优化与重构。
“设计优先”这一原则,要求写别人看得懂的设计。在设计过程中,要以需求为出发点,通过合理的抽象把问题简化,讲清楚各个模块之间的关系,再详细分述模块的实现细节。做完设计之后,可以发给比较资深的RD或者PM审阅一下,根据他们的反馈再进行完善。好的设计,一定是逻辑清晰易懂、细节落地可执行的。
P/PC 平衡
产出与产能必须平衡,才能达到真正的高效能。
从系统的角度看,每一个系统都是通过持续不断地叠加功能来实现其产出,而系统的产能是通过系统架构的可扩展性、稳定性等一系列特性来表征。为了达到产出与产能的平衡,需要在不断支持业务需求的过程中,持续进行技术架构层面的优化。如果一味地做业务需求,经过一定的时间,系统会越来越慢,最终影响业务的稳定性;反之,一个没有任何业务产出的系统,最终会消亡。
再从RD的角度来看这个问题,RD通过做需求来给公司创造价值,实现自己的产出。而RD的产能是指技术能力、软素质、身体健康状况,有这些资本后,我们才能进行持续的产出。在日常工作中,我发现很多RD往往只重视产出。他们也在很努力地做项目,但是每一个项目所使用的方法,还是沿用自己先前一贯的思路。最终,不仅项目做得一般,还会抱怨自己得不到任何成长。这就是P/PC不平衡的体现。如果能在做项目的过程中,通过学习总结持续提升自己的技术能力和软素质,并将其应用于项目实施交付中,相信一定会取得双赢的结果。
善于提问
“善于提问”,首先要勤于提问。只有在争辩中,才可能诞生最好的主意和最好的决定。
“善于提问”,还要懂得如何提问。为什么同样是参加设计评审,有的同学就能提出很好的问题,而有的同学却提不出任何问题?除了知识储备、专业技能、经验等方面的差异外,还有一点很重要:批判性思维。
批判性思维主张通过批判性思考达到理性思维,即对事物本质的认知和掌握。关于如何进行批判性思维,大家可以参考一些经典的图书如《批判性思维》、《学会提问》等。在工作中面临一项决策时,会有各种各样的意见摆在你面前,所以我们必须要学会使用批判性思维来进行分析,每个人的论据是否可靠,论证是否合理,是否有隐含的立场。同样,在阅读一篇技术博客的时候,也要使用批判性的思维,多问几个为什么,作者得出的结论是否合理?论据是否充分?只有这样,才能不断地获取真正的知识。
空杯心态
保持“空杯心态”这一原则要求我们时刻进行自我检视与反省。
工作中如何做好技术积累
https://tech.meituan.com/2018/04/16/study-vs-work.html
如何晋升蚂蚁 P8
程序员四大原则
加速原则
能加快工作的一切事物。
快捷键,工具,能提升效率的工作和沟通模式。
研究原理和其他的插件之后,手撕热部署源码,并且在组内分享,节省了大量的测试部署时间的成本消耗。
专注原则
专注可以很大程度上提高工作效率。
隔离干扰,提前上班(专注于编码一小时,完成 60%的编码工作,正常工作时间用来做沟通和自我提升,复盘、总结、整理),避免能分散自己注意力的东西(手机、浏览器)
自动化原则
把能自动化的一切都去人力去手工。
依然热部署
订阅
规范性原则
规范很重要,减少不一致。降低理解和沟通的成本。
主动做一些输出,例如开发规范、技术分享、设计模式、领域驱动等。
几项能力
承担责任,但不为团队背不该背的锅
任何事情首先从自己身上找原因,该认怂就认怂,问题尽量控制在一定范围内,避免扩大和升级
综合能力,技术、业务、项目管理都要懂
一叶知秋的洞察力
自省,善待质疑自己和与自己争论的人
带领团队一起提升,大家一起强了,其实才会轻松
同理心
情绪管理
文档能力
文档是第一生产力,通俗易懂,结构化,简化/强化沟通。
- 算法能力
除了技术的提升,思维提升也是受益良多。
解决问题的效率
表达能力
表达能力决定了所做的技术的影响范围,决定了影响力,决定了威信,决定了价值。
基于格局、思维、技巧。
优雅和美观的抽象能力
读书,总结
裸编程能力
掌握底层系统原理
追求代码世界的简约
保持谦逊,对一切充满敬畏