前言
【技术精进】和【管理探秘】部分不错,但【架构修炼】部分感觉太官方化,有种直接从教材里面复制黏贴的感觉,领域驱动设计过于缺乏可操作性
技术精进
Google研究总监 Peter Norvig曾给出自己的观点:一名优秀的程序员至少应该掌握6门编程语言,其中包括支持类抽象的编程语言如Java或C++,支持函数抽象的编程语言如Lisp或ML,支持语义抽象的编程语言如Lisp,支持声明规范的编程语言如 Prolog或C++模板,支持协程的编程语言如con或 Scheme,以及支持并发的编程语言如 Sisal。
《计算机程序的构造和解释》的作者曾经表达这样的观点:在学习一门新的编程语言时,应该关注这门语言的基本表达形式(Primitive Elements)组合的方法( Means of Combination)及抽象的方法( Means of Abstraction)这三个特性。
如果展开以上三个特性的话,就几乎包含了学习一门编程语言所需要关注的所有重要知识。
基础知识:基本语法、关键字、变量与常量、数据类型、运算符、流程控制、异常处理、文件处理、编程思想(面向对象、面向过程、函数式编程)多线程支持等。
应用知识:网络请求、数据处理、内置函数、对日志和调试的支持、对单元测试的支持、序列化与反序列化等。
高级知识:开源类库、开源框架、底层原理等。编程语言分类
编程语言 | 分类 |
---|---|
动态类型语言 | Python、Ruby、Erlang、JS、 Swift、PHP、Perl |
静态类型语言 | C、C++、Java、Object-C |
强类型语言 | Java、C#、Python、Object-CRuby |
弱类型语言 | JS、PHP、C、C++ |
编译型语言 | C、C++、Pascal、Object-C、Swift |
解释型语言 | Python、JS、 Erlang、PHP、Perl、Ruby、Java |
静态语言 | C、C++、Java |
动态语言 | C#、 Python、Object-C、PHP、 Erlang、JS |
带着问题去学习
学习要由目标驱动,在目标驱动起作用后,我们还可以采用问题驱动方式进行学习,即在学习过程中多问问题。
问问题可以采用六何法。六何法,又叫作6W或5W分析法,即What、Who、When、Where、Why及How,需要我们在学习的过程中多思考、多问问题。
举个简单的例子,在学习设计模式中的单例模式时,可以用六何法多提几个问题,例如:
什么是单例模式?
什么时候使用单例模式?
怎么实现单例模式?
哪种单例实现方式最好?
在单例模式中如何保证线程安全?教是最好的学习
以通过技术分享、线下会议及线上教学等方式将自己学到的知识分享给他人,这就是教学学习法。教学学习法可以:
迫使自己更深入地了解更多的知识。
在教学的过程中会加入自己的理解。
可以回头翻看教学的内容
可以加深记忆。
可以和别人深入探讨。审查清单
审查清单可以帮助审查者快速找到问题,甚至开发者在开发阶段就可以按照审查清单进行代码自查。网上有很多代码审查清单,但是不同的团队可能需要不同的代码审查清单,这需要根据团队的实际情况进行调整和完善。
一般来说,一份代码审查清单应该包括如下几个大的类目。
- 代码结构:是否包含超长代码,代码层次嵌套是否过深,函数是否入参过多,循环条件是否有跳出点,if语句是否有对应的else语句,是否存在重复的代码,等等。
- 代码安全性:I/O流是否正常关闭,资金计算是否使用了 Double数据类型,是否有超大的临时对象,线程池大小是否合理,异常是否被忽略,是否有详细的日志记录,是否存在并发问题,参数是否做了必要的检查,远程服务的入参出参是否实现了 Serialization并且自定义了 serialVersionUID.应用是否依赖 SNAPSHOT版本的类库,等等。
- 代码性能:是否有长SQL语句、SQL语句是否用到索引,是否有成熟的类库可以替换自己实现的代码,是否可以考虑单例模式,是否可以考虑线程池,是否可以考虑NIO,是否可以进行锁优化,等等。
- 代码注释:指类及方法是否有注释,注释是否可以表达其准确含义,在代码中是否存在 FIXME及TODO等注释,注释是否包含边界值及对异常情况的说明,等等。
- 单元测试:代码是否有可测试性,新代码是否有单元测试,单元测试是否可以覆盖所有场景,等等。
- 代码优化:是否可以使用举代替自定义的常量,在代码中是否包含魔法值,是否可以使用 Optional代替NPE的检查,是否可以使用 Stream代替for循环,是否可以使用设计模式,等等
- 其他:代码逻辑是否正确,是否实现了业务功能,代码是否有好的可读性及可测试性,等等
- 查询和定位自动化
搜资料、查单词、定位并打开文件、打开网址、打开书签、打开计算器及其他App,这些通常是我们在办公过程中要做的事情。虽然这些事情都很简单,但是我们可以使用一个工具来更高效地做这些事情,这个工具就是 Alfred。Alfred是Mac系统上的一个专注于效率提升的著名应用,通过这个工具简单配置很多流程化的操作,就可以用很简单的命令实现自动化操作。
- 在想搜索一个词汇时,直接通过快捷键调出Alfred输入框,输入“baidu 搜索词”即可。
- 若突然忘记一个单词的中文意思是什么,在 Alfred中直接输入单词就可以知道其含义。
- 定位文件、打开文件是 Alfred提供的基础功能,它能让你无须打开文件浏览器便可定位或打开文件,只需调出 Alfred的输入框(默认快捷键是 Command+ Space)输入对应的文字即可。在打开文件时直接输入要打开的文件或文件夹的名称,Alfred便会将搜索结果显示出来,我们可以用 Command+数字进行结果选择。在定位文件或文件夹时则需要先输入“find关键词+空格+对应的名字”
- 在想打开对应的网址、书签或App的时候,无须打开浏览器,直接通过 Alfred搜索即可。
高效学习的途径:阅读书籍【显性知识】、参加在线课程【隐性知识】、参与线下会议【隐性知识】、贡献开源项目【隐性知识】、编程竞赛隐性知识】、创建博客隐性知识】、编码训练营(培训机构)
德雷福斯模型
德雷福斯模型是一种衡量人们的工作方法和能力,反省并提高专业技能的层级模型。它把从新手到专家的技能阶段分成五个层级:
等级 | 解释 |
---|---|
新手( Novice) | 新手需要指令清单,在该技能领域经验很少或者没有经验。这里提到的经验,指的是通过实施这项技术促进了思维的改变。 |
高级新手( Advanced Beginner) | 高级新手不想要全局思维。一旦经过新手的历练,人们就开始以高级新手的角度看待问题。高级新手能够或多或少地摆脱固定的规则,可以独自尝试任务,但仍难以解决问题。 |
胜任者( Competent) | 胜任者能够解决问题,处于这一水平的人通常被认为“有主动性”和“足智多谋”。他们往往在团队中发挥领导作用(无论是否有正式的头衔),既可以指导新手,也不会经常“骚扰”专家。 |
精通者( Proficient) | 精通者能够自我纠正。精通水平的从业者需要全局思维,将围绕某种技术,寻找并想了解更大的概念框架。对于过于简单化的信息,他们会非常沮丧。 |
专家(Expert) | 专家凭直觉工作。专家是各个领域知识和信息的主要来源,总是不断地寻找更好的方法和方式去做事。他们有丰富的经验,可以在恰当的情境中选取和应用这些经验。他们写文章,并做巡回演讲。 |
《程序员的思维修炼》的作者针对德雷福斯模型给出一些诀窍:
- 新手使用规则;专家使用直觉。
新手通过模仿和观察来学习;专家要保持实践来维持专家水平。
- 终生成长理念将人的思维分为固定型思维和成长型思维:
拥有固定型思维的人喜欢与人对比,并不断证明自己最棒,挫折、批评和否定能让其收到打击或者重创。
拥有成长型思维的人则只考虑能不能够学到知识,可不可以变得更强,能不能够继续成长。
架构修炼
虽然面向对象起初专指在程序设计中采用封装继承、多态、抽象等设计方法,然而现在它已经渗透到软件开发的各个方面,比如面向对象的分析(OOA)面向对象的设计(OOD)和面向对象的编程(OOP)等环节,其在各环节的职责如下。
1、在需求分析阶段采用面向对象的分析方法,这个阶段不需要思考怎么用程序实现它,只需要思考和分析需求中稳定不变的客体是什么,这些客体之间的关系又是什么,以及完成概要建模。
2、在设计阶段采用面向对象的设计方法,把在需求分析阶段分析出来的需求进一步扩充为模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。
3、在编程开发阶段采用面向对象的编程语言来具体实现在前一个阶段得到的业务模型。ESB模式
ESB( Enterprise Service Bus,企业服务总线)提供服务对接、协议转换、消息传输、数据转换、内容路由等功能,隐藏了服务提供者的物理位置、协议和数据格式,由中间件产品技术实现,通过事件驱动和XML消息引擎为更复杂的面向服务的架构提供服务。ESB通常在企业的消息系统上提供一个抽象层,可以帮助设计者利用消息(不用编码)就能完成集成工作。
管理探秘
- 成为T型人才,需要以下准备:
- 离开舒适区,学会挑战自己,让自己所掌握的技能变得更为精深;与同行保持交流,从中掌握不同的设计方案和不同的思考方式。
- 坚持阅读及与不同领域的人交流,以接纳更多的信息和观点。
- 创造需求,及时应用和实践自己掌握的知识,这也是让知识变得更有价值的好方法,而不仅仅是让知识成为一种可阅读的信息流。
- 尝试训练自己从多个角度分析问题,或用不同的思维思考问题。
- 给学习和应用设定目标和里程碑,让自己一步步地成为T型人才
确定在做的事情符合自己的目标
1、确定自己究竟想要什么
一种非常有趣且有效的办法是:利用面向未来的场景进行一次思考。设想未来5年后、50年后想听到怎么样对自己的总结
2、把自己的目标写下来
3、为自己的目标设定一个最后期限,并让大家都知道
承诺和一致性原理指的是,人一旦做出承诺,所做的行动都会跟承诺的事保持一致。
4、将实现目标需要做的最重要的事情列出来【定义范围 创建WBS】
“魔数3”原理:我们推荐的做法是根据优先级从高到低只列出实现目标所需要做的最重要的三件事。这么做的好处是:因为只有三件事,所以人们会觉得更有信心去完成;同时,能够立即着手去实施,还能较快地看到成效,从而更有信心完成任务,进入一个正循环。【滚动式规划】
5、每天都做一些接近自己目标的事情对时区效率进行分类
虽然早晨的1个小时和午间的1个小时有同等的时长,但是由于每个人的能量水平和大脑活跃水平不同,不同时间段的效率、创造力和能量都不尽相同。因此,为了更好地利用每天的时间,以及通过合理安排划分出大块的时间用于工作和创意性事务,我们需要基于时间和能量这两个维度对一天的时间进行规划。锚定效应【量化绩效评价】
锚定效应是心理学领域非常重要的一个现象,指的是当人们在对某人或者某些事情做出判断时,非常容易受到第一形象或者第一次获得的信息的支配——就像轮船的锚一样,把人们之后的判断和决策固定在某个地方。建设性反馈【沟通方法】
建设性反馈=明确目标(“我希望和你讨论____”)+ 观察(“我观察到____”)+影响(“这么做的影响是____”)+要求(“我期望今后你能____”)+讨论(“你觉得呢?____”)
1、明确此次“建设性反馈”的目标
2、具体描述观察到的事实
3、阐述行为所产生的影响
4、清晰描述期望的行为
5、给对方机会阐述他的想法