编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.如何刻意提升
  • 02.如何做好接口人

01.如何刻意提升

目录介绍

  • 01.复杂业务写技术方案
  • 02.经常回顾并输出
  • 03.持续架构演进优化
  • 04.高级工程师自问

01.复杂业务写技术方案

1.1 不要一上手就写代码

  • 不要上手就写代码。永远不要上手就写代码。这句话我们从小就听——不要上手就写作文,先想好提纲。编程也是如此,除非胸有成竹,否则绝不一码十行。

1.2 先高透彻业务

  • 当我们拿到一个需求进行开发的时候,一定要先在大脑中推敲推敲,这个需求的每个方面是否都是完备的,是否有异常流程,这个需求的每个技术点有哪些。
  • 这个需求的流程,我是否完全都清楚了,这些东西都想不好,那就不是在编程,而是在写bug,很可能会把后面的开发者「淹没」,造成一场信任危机。

1.3 编写技术方案

  • 遇到难题首先是自己尝试去解决,如果请教别人,学习别人解决问题的思路而非拘泥于解决办法。
  • 遇到难点,卡在什么地方?从哪方面着手去解决,方案对比总结?别人解决思路是什么?写技术方案,要从大到小,整体设计思路是什么,核心流程,具体实现步骤等。
  • 拥有自己开源或者长期维护并且不断改进的项目。尝试重构自己项目,或者看过去的代码,与今日有何区别,改进再改进。

02.经常回顾并输出

2.1 做完项目不思考

  • 不要太过于浮躁。很多人最喜欢抱怨的就是:“我每天都是在做重复的CRUD工作啊!没啥意思。”、“这个公司的项目不行,没用到某某高大上的技术”......
  • 做一个项目,做完了之后就感觉自己就和这个项目没有关系了。项目上学到的一些东西或者可以改进的地方,完全不想花时间总结。以至于,很多年之后,学到的东西还是比较零散的,不成体系。
  • 别人询问你“有没有从上个项目学到点什么?”的时候,自己却没法回答。不会进行思考总结,做再多的项目,了解再多的技术又如何?可能就只是表面上好看而已,有些东西永远都成为不了自己的。

2.2 思考并持续优化

  • 这个项目是否有不合理的地方:该如何优化?技术上有哪些难点还没有搞清楚?是懂了还是深入理解原理?知其然也会知其所以然吗?怎样才能做的更好?
  • 关于代码的思考:代码是否可以更加简单健强?是否可以复用,能否提高效率?代码稳定性是否还有待提升和优化?
  • 源代码库的维护:阅读代码理解思路而非复制粘贴代码?日常项目或者开源项目能否借鉴源码好的设计模式或者思路;理清代码整体工作原理,而非拘泥于细节而无法自拔。

03.持续架构演进优化

3.1 移动端架构设计

  • 常规来看,基本就是MVC、MVP、MVVM以及组件化的东西,这些东西说是架构,但本质上就是模块化的变种,这类东西主要是做业务架构,将一个很大的业务划分为很多小业务,每个小业务就是一个模块。
  • 另一部分架构内容则是技术架构,一般是分层的,最底层是基础框架,包括网络、存储、日志、图片加载等第三方库;中间层则是上层业务经过抽象后所形成的公共业务层,也可以叫做中台,这一块往往包含账号、支付、客服、地图等相对独立的业务;最上层就是核心业务了。
  • 从变动性来说,基础框架变动最低,公共业务层次之,上层业务变动最高。总结来看:移动端架构 = 业务架构(模块化) + 技术架构(分层)

3.2 为什么要做架构设计

  • 很多人(包括我)只知道要做架构设计,但不知道为什么要做,如果非要说,大家估计能总结为如下几点:
  • “为了让项目看起来更有技术含量”;“大家都做架构设计,我也得做”;“提高程序性能和可扩展性,降低后续的维护成本”。
  • 其实这些目标都比较抽象,不好衡量,做完架构设计后未必能达到预期。举个例子,MVP特别流行,MVP的好处就是降低耦合,降低后续维护成本,但事实上,用了MVP后,代码极度膨胀,新增了很多类,代码可读性也差,很多新人上手困难,在一大堆presenter中迷失了,大家想想,这样做维护成本是否真的降低了?
  • 架构设计的目标:架构设计的目标是解决当前项目的痛点,如果当前项目没有痛点,那就先别进行架构设计了。

3.3 如何做架构设计

  • 架构设计要以实用为目的,不要光想着造一个世上最牛逼的架构,这样往往是不靠谱的,我们不是救世主。总结下,架构设计有三个基本原则:
  • 1、合适优于世界领先。适合自己当前业务的就好,不要总想搞世界领先的架构,比如一个用户量100万的系统,光想着对标微信的架构,那微信日活上亿,适合微信的架构未必适合自己。
  • 2、简单优于复杂。如同写代码一样,代码量越少越简单越好,架构设计也是一样,越简单的架构越牛逼。
  • 3、演进优于一步到位。可扩展性我们当然要考虑,但是人不是神,无论你怎么去预测未来的系统演进,总是很大可能会失算。所以架构设计优先解决当下的问题,至于后来的问题,到时候再对架构方案进行改进。
  • 这三个原则也是有优先级的,具体是:合适优于先进 > 演化优于一步到位 > 简单优于复杂
  • 合适也就是适应当前需要是首位的,连当前需求都满足不了谈不到其他。架构整体发展是要不断演进的,在这个大前提下,尽量追求简单,但也有该复杂的时候,就要复杂,比如生物从单细胞一直演化到如今,复杂是避免不了的。

04.高级工程师自问

4.1 程序员吃青春饭吗

  • 程序员是吃青春饭的吗?等我们老了,技术过时了,公司有什么理由不裁掉我们,去雇一些既有活力、薪资要求又低的年轻人呢?
  • 这个老生常谈的问题困扰着诸多渐入中年的程序员。会让很多人陷入了年龄感带来的危机之中。

4.2 要注重软技能

  • 作为一名程序员,编码硬实力固然很重要,但很多软技能都能成倍地增加我们的影响力,比如代码审查礼节、如何优雅地遏制项目范围蔓延、如何向其他部门直观的方式解释高技术问题、如何在生产任务爆满和日以继夜的比赛中保持镇定自若等。

4.3 问自己一些问题

  • 1.你的代码的可维护性如何?你提出的系统架构可用性如何?你的方法是直观、易理解的吗?是否有其他工程师不停地轻敲你的肩膀,让你解释你代码的每一行都是如何工作的?
  • 当你发现自己在复制粘贴很多行代码时,你是否能将这些代码的功能写入可重用的服务中?
  • 2.别人能够从你在拉取请求中留下的评论中受益吗?你的反馈意见是有建设性的,还是太过粗糙?
  • 当你发现别人的知识存在缺口时,你是只告诉他们“把这条线从 ABC 更改为 XYZ”,还是有能力引导他们认识到自己方法的缺点?
  • 3.你如何将非常技术的问题分解为公司其他部门可以理解的简单语言?
  • 向市场解释为什么一个功能实际上不可行时,你是否会让大量的工程术语从嘴里溜出来?
  • 4.你的写作能力如何?
  • 线上沟通时,你是能把自己的意思表达清楚,还是同事仍然需要走到你的办公桌旁,来询问你更多的背景信息?
  • 5.你是否会主动提出想法,使你的团队效率更高?
  • 当需要改动现有进程时,你是否能够向所有参与方说明收益?你能使所有人都对这一变化感到兴奋吗?你是否可以持续跟进,并确保新流程确实有效?
  • 6.你尊重别人的时间吗?
  • 当你请求别人帮助时,你能否准确描述你遇到问题?别人是否必须反复问你,才能从你嘴里撬出相关信息?
  • 7.在与其他部门一起确定大型项目的范围时,你对要开发的新功能的问题了解得有多深入?
  • 在开始编码之前,你是否能够考虑到每个边缘情况?你是否能够及早识别项目范围蔓延并尽早制止,从而使自己免于加班?
  • 8.你的多任务处理能力如何?
  • 你有养成扎实的记笔记习惯吗?你能安排好一段时间内工作的优先级排序吗?
  • 9.领导可以放心地让你去负责面试候选人吗?
  • 你是否擅长通过有限的信息来对人员进行分类,并可视化他们和团队的适合程度?
  • 10.机会成本是一件必须考虑的事。你在平衡技术债务和推动业务发展方面做得如何?
  • 你是否会重构发现的每个微小的编码样式问题?
  • 11.你有能力扑灭生产大火吗?
  • 你是否会在遇到大麻烦时惊慌、不知所措?你是会在压力之下崩溃,还是会在解决问题的同时保持镇静,并与其他部门进行有效的沟通?

4.4 增强价值优势

  • 高级开发者能在工作中有效地解决问题。他们按时完成任务,减轻公司压力。
  • 他们知道如何编写经得起时间考验、可维护的代码。他们对项目的方向可以有准确的把控。
  • 他们可以发现当前流程中的缺陷,并使每个人都接受他们的想法以进行改进。他们处事冷静,不会轻易情绪崩溃。
  • 因此,许多企业愿意使用一些经验丰富的“老兵”,来保证业务进行顺利。那么你又是否提升了自己的价值优势?
贡献者: yangchong211
下一篇
02.如何做好接口人