如何完成技术跃迁

2018-12-25


前言:近期又到了毕业招聘季,我作为技术分享嘉宾,回到母校参加宣讲会,做了一个主题为《如何在毕业三年完成技术跃迁》的分享,本文由此次分享整理而成,并改名为《如何完成技术跃迁》,希望能够给刚进入职场的程序员,或者卡在瓶颈期的程序员,带来一些指导,在技术的道路上少走些弯路。请注意,本文源于我的经验思考,非教条或准则,仅供参考。另由于本人主要的项目经验来源于App端(主要是iOS、Android),Web前端及后端只是稍有涉猎,因此文中的例子大多也来自App端,其他端同学可能会觉得陌生,但应该不会影响理解。

本文约1W字,阅读时长大概二十分钟,稍有啰嗦,请见谅。


1. 什么是技术跃迁

首先,我们需要明确一个定义,什么是技术跃迁?在说技术跃迁之前,跟大家解释下跃迁这个词。

”跃迁“,来源于量子力学,说的是微观状态发生跳跃式变化的过程,比如从低能态跳跃到高能态,需要注意的是:因为微观粒子的状态是分立的,也即是非连续性的,所以这个变化是跳跃性的。用这个词来说明技术的成长,个人认为是非常合适的。

以个人的经验来看,程序员的技术成长曲线大抵是这样的:

Transition

成长阶段说明:

  • 成长期:新手通过正常的学习工作积累,一般能够在一到两年成为熟手。
  • 稳定期:是程序员的舒适区,但并非停滞期,该期间,程序员会进入到比较长的学习积累期,为后续的跃迁做准备。
  • 跃迁:成长期和稳定期积累的知识点一般是离散的,点与点之间联结较少。在逐步的反思,慢慢有意识联结,一但联结成网构成了下一阶段所需具备的技术知识体系,即完成阶段的跃迁。

成长路径说明:

1) 新手成长至熟手:从新手到熟手,只需要正常的经验积累成长即可。

2) 熟手稳定期:大多数程序员会在熟手阶段经历较漫长的稳定期。此期间的表现为,有一定的平台开发经验,能够负责大部分需求功能的开发工作,但看问题不够全面,无法负责复杂系统的设计开发工作。

3) 熟手跃迁至单领域专家:这是程序员的第一个跃迁,带来的变化是非常可观的。表现为,对所在领域/平台有比较全面而深入的理解,能够负责复杂系统甚至全系统的设计开发工作。

4) 单领域专家稳定期:经过第一次跃迁之后,单领域专家会经历更漫长的稳定期,在此阶段会经常出现多方向的分化:

  • 管理方向:成为单领域专家之后,一般被认为具备了单领域/平台技术负责人的能力,此时部分人员会成为技术负责人或经理,走上管理路线。
  • 困于舒适区:大部分程序员成为单领域专家之后,会困于舒适区。因为他的能力已经足够把控所在领域的开发工作,此时无论朝单领域深度发展,或是跨领域发展,除了个人主观能动之外,还需要有合适的平台和实战机会;另外,成为单领域专家的程序员大多开始步入成家立业的阶段,生活会对其精力造成一定的分散。
  • 多领域专家方向:少部分人会朝多领域专家方向前进,这是一条最艰难的道路,如果只是自己主观意愿的话,即使努力学习,没有合适的机会去实战锻炼的话,很可能只是学些皮毛,拓展下视野。当然,天纵奇才不在此之列。

5) 多领域专家/宗师:成为单领域专家之后,要想成为多领域专家,甚至宗师,需要付出更多的努力。本人自认非多领域专家,更非宗师,所以这往上的阶段只是个人的臆想而已。

成长曲线只是一个简化的抽象模型,让大家比较形象地理解技术成长,但实际上却是因人而异,现在也没有一个认证考试来证明你具备了某一层级的技术水平,希望大家不要直接往上去套。在技术的道路上,不排除存在某些人突然灵光乍现、醍醐灌顶而跃迁飞升;但大部分人不过是日积月累、日拱一卒,慢慢形成自己的技术知识体系。

1.1 技术知识体系

上文中经常提到的技术知识体系,是跃迁重要的标志。就如同本科生、研究生、博士生的知识体系一样,不同行业不同的层级也需要不同的知识体系。知识体系,这个词其实不难理解。本节用一个例子来说明,让大家有个直观的理解,什么是技术知识体系。

假如现在你所在的项目组,需要实现一个移动端(App/H5)的登录功能,如下图:

金管家登录

你会如何开始你的表演?

你可能会计划根据软件工程的规范,做下设计,画下流程图,然后再敲代码实现。这只是你的臆想,根据我的经验观察,80%的新手都会选择:”Talk is cheap, Let’s Code!“ 直接上手写代码,大部分人在动手之前,可能脑袋都是一团浆糊,但却盲目自信:边写代码,思维会越来越清晰。

下面,来看一个具备移动App技术知识系统的程序员的常见做法:

1.1.1 设计先行

设计

1) 确定设计目标:第一要务,是要确定功能的设计目标是什么,我现在假设登录功能的优先目标是可靠性、健壮性和安全性,以保证用户能够稳定、安全地进行登录。

2) 架构设计:如果App已有成熟的架构,登录功能的架构设计会遵循App的架构设计;如果登录需要做特殊设计,应该会考虑优先采用比较成熟稳定的架构设计模式,以保证架构成熟、稳定、可靠及易于理解,满足设计目标。

3) 详细设计:假设此次登录功能采用MVC的架构设计模型,一般Model层是比较复杂的,所以我们着重Model的设计。

  • 业务逻辑层的设计:包括接口设计、重要业务逻辑设计。此处重要业务逻辑,举了个客户端登录中非常重要的,涉及切换用户导致用户上下文切换的例子。如已登录的A用户退出登录后,B用户登录,那么必须保证A用户与B用户的之间不会窜数据。有人可能认为这个非常简单,实际不然。设想下这样的场景:A用户发出了一个拉取个人收藏的请求,而然后退出了登录,并登录了B用户;由于网络关系,可能A用户的收藏请求是在B用户登录成功之后返回的,那么此时处理不好,就会导致窜数据的问题。
  • 存储层:存储层的设计,也需要根据登录的需求,保证高效、安全、隔离。后面两个比较好理解,高效?不是所有存储层都应该高效么?是这样没错,我们当然希望存储越高效越好,甚至其他特性也是越强大越好,但明显是不符合实际情况的,任何设计都需要考虑优先级。有些功能,比如活动列表,高效并非是第一优先级。而登录将高效放在第一优先级,主要是考虑到App启动之后,就需要进行登录态的判断,如果登录态的存储不够高效,势必影响启动速度。
  • 网络:网络要求安全性、健壮性,并且还需要考虑弱网情况的下异常处理。
  • 多线程:一般登录功能包含了多次加解密过程,为了登录功能的高效,我们可能希望将其放到一个独立的线程,或者多线程上去执行,这时候需要考虑多线程的设计,以及在此之上延伸出来的数据安全和锁的问题。

4) Token设计:为了安全的考虑,客户端不可能存储用户的任何加密加签的密码,而是使用具有生命周期的Token来替代,所以需要跟后台一起设计Token的机制。

1.1.2 实现思维

完成设计之后,是否就可以直接Coding 了呢?理论上是可以的,但实现过程并非大家想象的一样可以无脑码代码。在具体编码前,还需要多种知识体系支撑的,已指导编码实现的思维,进而指导代码实现。如下图:

实现思维

1) 设计模式:在动手Coding之前,我们一般会思考,是否有合适的设计模式可以使用。如一般的登录流程可能包含了多个步骤:密码验证、图形验证码、OTP验证码、Token交换等,我们可以考虑使用责任链的设计模式。

2) OOP五大原则(SOLID)/设计模式六大原则:在我们编写一个类、或者一个方法时,我们需要遵循SOLID原则,以保证代码模块的清晰、高效、松耦合和易于理解。

3) 重构:在编写详细的逻辑代码时,经常会增删类、接口、方法等,此时灵活使用《重构》里面的方法,保证代码逻辑的清晰,就显得特别重要。

从上面的例子,大家应该能够很好地理解,如何运用自身技术知识体系,解构一个普通的登录功能。当然,这个例子并不全面,还有很多细节需要考虑,限于篇幅,我这边做了简化。


2. 跃迁方法

上一章节,大家了解了跃迁其实就是构建个人的技术知识体系。本章节,想跟大家聊聊个人总结的跃迁的方法:持续学习基础知识体系和平台知识体系,再通过不断地经验总结织网,完成技术知识体系的搭建。

2.1 基础知识体系

  如果大学是计算机相关专业的程序员,那么大学学习的大部分课程,都是跃迁所需的基础知识体系。下表是列举的是一般软件开发工程师所需的基础知识,而目标列则是想要三年跃迁为单领域专家必要条件。

知识点 目标
计算机基础/操作系统 了解计算机是怎么运作的
网络 HTTP1.1/HTTP2.0/HTTPS、TCP/IP、TLS
算法 会计算时间/空间复杂度
数据结构 掌握List、Set、Map、Stack、Tree
存储 File、数据库等各项操作开销
多线程 线程开销、线程池、锁
架构设计 基础的架构设计模式
编程 掌握常用设计原则、设计模式和重构方法

上表中,除了“架构设计”这一项不涵盖在大学课程里,其他几项基本都是大学课程知识。接下来,我会一一做简单分析,基础扎实的同学可以略过。

1) 计算机基础/操作系统:在量子计算机真正面世应用之前,我们现在绝大部分计算机都是冯诺依曼结构。了解操作系统,了解计算机运行的机制,包括CPU(流水线、多线程、锁)、内存(虚存、物理地址、虚拟地址)、IO等等,能够让我们了解自己开发的程序运行的基本原理和机制,从而写出高效的代码,同时还能帮助快速定位问题。比如iOS开发工程师,了解iOS操作系统,对启动性能优化很有帮助。

2) 网络:在互联网时代,一个程序员不了解网络,跟厨子不懂火候、戏子不懂台词没什么区别。现在不连入网络的应用寥寥无几,每个接入网络的应用,为满足可靠性,都需要考虑网络延迟、安全等问题,所以网络基础知识是非常重要的。

3) 算法:AI的发展,让算法的应用更为广泛而流行起来。虽然现在硬件发展迅速,平台API封装的算法足够高效,需要我们实现特殊算法的状况越来越少,但基本的时间空间复杂度还是需要掌握的,不然很可能有合适的算法而不会用,导致程序执行效率低。

4) 数据结构:在一般的编程领域,数据结构的重要性比算法要高。一个很主要的原因是,数据结构在编码过程中无处不在。所以掌握常用的数据结构,知道每个数据结构的适用场景,以及在平台上的特性,如线程安全等,是非常重要的。

5) 存储:我们常用的存储(IO)系统包括了文件系统和数据库系统,当然数据库的最终落地也是以文件的形式存在的,但为简化模型,此处文件系统特指除数据库以外的文件系统。只要信息需要持久化,我们就需要用到存储系统,其重要性不言而喻。其中,重点是需要了解存储系统各种操作的开销。比如文件系统,如果要拷贝一个文件,软链接、硬链接的开销要比物理拷贝要小很多;比如数据库增加索引,会导致更新操作的额外开销等。

6) 多线程:多线程是编程中一个重要的知识点,也是很多程序员需要花比较长时间迈过去的一个坎。当然,现在各端流行框架基本上会把复杂性进行封装,包括多线程,所以在是使用框架进行开发时,不需要多线程的知识也能够完成开发任务。但我们想要的并非只是会用,想要跃迁,掌握线程的开销、线程池/线程队列和锁是必须的。

7) 架构设计:架构设计是唯一不在大学课本上基础知识,因为没有实践,教了也没用。大部分程序员,初接触架构都是学习各端平台框架上最流行最简单的架构设计模型,如MVC、MVP、MVVM等;而后慢慢接触到分层架构模式、事件驱动架构模式、微服务架构模式等;最终才会系统地学习什么是架构,进行架构设计的方法论。我认为,一个合格的领域专家,也应该是这个领域合格的架构师。

8) 编程:编程,掌握几门不同类型编程语言(编译型、解释型、动态、静态等)是基础,在此基础上,还需掌握通用的编程技能。比如前面例子中说的SOLID设计原则、软件设计模式(GOF)以及常见的重构方法。上个例子中已经说明。

   

2.2 平台知识体系

前面说到,基础知识体系是大学时的课程,那么平台知识体系则大部分来源于工作中的项目实战。在讨论如何积累平台知识体系之前,大家须先理解,什么是平台知识体系;而要想理解平台知识体系,需要了先解什么是平台。

2.2.1 平台定义

在本文定义的平台,跟计算机中定义的系统平台比较类似。在计算机中,系统平台的定义是:指在计算机里让软件运行的系统环境,包括硬件环境和软件环境。而本文平台的定义稍微狭宽泛一点:是指支持特定软件运行的相关环境,包括开发环境、软件环境和硬件环境。

假如你是一名Android开发工程师,对应的平台就是:

  • 开发环境:JAVA、Kotlin、Android Studio、Gradle、Git、LeakCanary等
  • 软件环境:Dalvik、Android Framework、Linux等
  • 硬件环境:屏幕(分辨率、DPI)、内存、不同手机的特性;   理解了平台的定义之后,就不难理解平台知识体系了。

2.2.2 平台知识体系思维图

平台知识体系就是基于平台进行开发所需的知识的系统集合。

以下是个人总结的平台知识体系的思维图。虽然每个平台自己的差异,但总结下来,平台知识体系大体可以按下图来划分。

平台知识体系思维图

1) 编程语言:即平台相关语言,如Android平台是Java、Kotlin;Java后端则是Java等等;

2) 平台库API:即平台提供的API,如Android平台有Android的相关库和API,H5前端HTML、CSS、Javascript等的Web API。

3) 架构模式/框架:平台一般会提供开发框架或常用的架构模式,如Apple官方推荐的iOS开发的MVC架构、Java后端的Spring框架;

4) 系统内核:应用软件都需要运行在操作系统上,而学习系统内核运行机制,能够帮助我们更好地理解程序底层运行的机制。如上一章所说的,iOS开发工程师学习iOS的系统内核,能够更好的理解iOS App的启动运行原理。而这对于Android开发更常见,有时候一些系统Bug,需要对系统内核有深入的认识,才能规避或者解决。

5) 关联系统:所谓关联系统,即是与程序有交互的其他进程或系统,如App里面的Push系统,后端开发常见的Web服务器、容器、数据库等。

6) 开发工具:就是前面所说的开发环境,主要包括了IDE、VCS代码版本控制系统、包管理、调试工具等。

7) 性能:不同的平台有不同的性能要求,如App开发会比较多考虑内存、CPU、IO、网络等比较孤立的项,而后端开发会考虑负载均衡、TPS等比较具规模的项;

8) 安全:不同的平台,安全性和安全措施都不一样。后端主要须保护服务器,防止被入侵和攻击,常用的安全措施是防火墙、防止被注入等;而App端安全性要求相对来说没那么高,主要是需要保护本地逻辑和小部分敏感数据。

9) 构建及发布:开发完成的程序想要运行在平台上的必经步骤。

这些知识类型,大家都应该很熟悉。你可以一一对应自我评估下,看看自己各方面的水平如何。  

2.2.3 如何构建平台知识体系

对平台知识体系有了大体的认识之后,你可能会疑惑,那么多知识类型,我应该怎么来学习呢?这个问题不止困扰你,同时也困扰了无数的程序员们,所以这些踩过坑的前辈们就制定了许多的学习路线图,也就是Roadmap,帮助后面的同学,按照这个学习就行了。

下面两张图分别是Web前端开发的Roadmap和iOS开发的Roadmap,供各位参考。

Web前端开发 Roadmap

Web前端开发 Roadmap(图片来源于 The 2018 Web Developer Roadmap)

iOS开发 Roadmap iOS开发 Roadmap (图片来源于The 2018 Web Developer Roadmap)

那如何按照Roadmap来渐进式学习,以达到技术跃迁呢?总结有四点:

1) 选择合适的Roadmap,制定规划。网络上的信息是爆炸式的,每个人的学习路线也是不一样,所以导致,在不同端不同平台有非常多的Roadmap,哪个合适你呢?我的建议是,你可以向你的导师、Leader,或者团队内的牛人寻求帮助,让他帮你选择好Roadmap,并规划好学习的计划。这样有两个好处:一是他们的经验丰富,了解你的自身情况,更能帮助你选择合适的Roadmap;二是他们选择的Roadmap一般也是他们自己认可并赞成的,很可能跟他们的技术栈是比较契合的,能够给你更深入的指导。

2) 刻意进行系统性总结和思考。大家应该都听说过一万小时定律,其中很重要的点是,练习需要有目标、专注、有反馈及走出舒适区的刻意练习。Roadmap的学习也是类似的。由于Roadmap包含了很多知识点,所以新手可能会遇到学习不全面,不扎实等问题,这就需要你定期停下来进行系统性总结和思考,这些总结和思考最好能够形成博文、分享课程等,能及时收获反馈,增强学习的积极性。

3) 优先深度:很多人为了贪快或贪全,就好像是打卡一样,草草看了几篇技术文章之后,就觉得自己掌握了某项技术,这是很不可取的。知识点的学习,最重要的是深度。优先深度,不仅学习知识点比较扎实,最重要的是学习效率高,这可能违背了很多人的直觉。举个例子,假如你需要挖一个直径10米、深10米的大坑,你会怎么做?假如你是画一个十米的圆,然后在每个点均匀的往下挖,那么你每个点做功都是一样的;还有另外一个选择,先挖一个10米深的坑,然后在中间或底部开始往四周挖,你会发现挖一点就泥沙俱下,比每一个点均匀做功往下挖要省时省力。技术知识的学习也是一样的,因为知识点之间并非孤立的,而是连结的,比如网络的知识,又会连结安全、性能和关联系统等知识点。深入学习了一个知识点,学习其他知识点的时候,就能够与之前深入理解的知识点进行印证思考,并建立连结。说句题外话,假如面试过程中,应聘者对某些知识点有深入理解,是非常重要的亮点。

4) 织网:上一节已经说了,知识点并非孤立的,织网才能让你的平台知识体系更完整。随着你知识的增长,织网是非常自然而然的,但也是最难的一环。因为连结并非是一个简单的事情,就算你已经深入理解了两个知识点,但如果没有合适的实战和深入的思索,你可能永远不会发现他们之间的特殊的连结。

2.3 沟通交流

大家可能比较奇怪,技术跃迁跟沟通交流有什么关系?

大家应该都接受过这样一个理念:沟通很重要。但实际上大部分人不太明白沟通的重要性在哪。可能工作了几年的同学感触会比较深,而如果是学生,基本不会有什么概念,因为在学校这样的关系纯粹的象牙塔里,沟通能产生的影响微乎极微。工作越长的同学越能深刻理解沟通在职场上的重要性。同一批大学生进入到同一个公司,负责同一个项目,假如大家的天分一样的话,沟通很可能是造成几年后分化的最重要因素。其实道理很简单,你的沟通能力越好,你获得的机会就会越多,也会越好,最终导致你成长越快,成就越大。

作为程序员,在职场上的沟通主要分以下几个方面:

1) 对上(直线Leader)沟通:很明显,对上沟通是最重要的。不仅仅是因为他是你的年终重要考核人,而且他一般还是团队内比较优秀的人,更重要的是他最了解团队目标(KPI)的人,也掌握着工作资源分配权力。因此,如果能够与上级形成非常良好的沟通,那么,你会知道团队的目标是什么,确定努力的正确方向,少走弯路;你还能够获得团队优秀人员(你的Leader)的指导,有了好的学习模范;并通过自己的主动和努力,去获得更多的资源支持;最后,你还能够通过沟通,增进与Leader的相互了解,Leader了解了你的贡献,你也了解了Leader对你的期望和满意程度,从而大大降低了年底考核与预期出入太大的概率。

2) 对内(程序员之间)沟通:团队内部,与程序员的沟通也是非常重要的。在我个人的技术成长道路上,跟同事或者其他程序员之间的沟通,让我受益良多。通过跟团队内其他程序员的交流、讨论,甚至争论,我发现了很多我不知道的知识点,这个越在初期越明显。慢慢的,我成为了一个有经验的,或者说有成见的程序员,这时每次与其他程序员讨论之后,我都会反思,自己的观点是否是错的,为什么他是这个观点看问题的,然后我会去尝试从对方的角度来思考问题,甚至去实际操作一遍,对比优劣,总结,然后提升。所以,与团队内其他程序员保持良好而有效的沟通,也许是你能够最容易获得的最长久有效的跃迁资源。

3) 对外(产品经理、项目经理、测试、设计等)沟通:当你成为一个熟手,你应该已经融入在项目里面,此时,你的工作也跳出了一个纯程序员做的事情——写代码,一般你会参与需求评审、设计评审、接口协议评审、测试用例评审、ShowCase等繁杂的流程,此时,建立一个良好的沟通渠道,能够达到事半功倍的效果,让项目高效运行。我们常说的敏捷的工作模式,其中提升沟通饱和度就是一个很重要的点。跟业务/产品经理多沟通,可以培养你主人翁的意识,也就是说你是在切实关注业务产品的。而且有良好的沟通的话,能够形成良好的推动力,让你实现需求更加高效。如果一开始不理解需求,也不沟通或者沟通不充分,做出来的东西可能就会有错漏;但如果一开始就沟通充分,你出错的概率就大大降低;或者有持续沟通的机制,你的错误也能够及时的改正过来。跟测试沟通,你会了解你团队的质量状况,或者一些常见的bug,这样可以有效提升你的代码质量。跟项目管理沟通,让你了解项目的流程,帮助你做好工作规划等。

上面说了沟通的重要性,那如何来做好沟通交流呢?由于本人在这方面并不太专业,无法系统讲解,只能给些个人的建议:

  • 主动最重要:沟通是相互的,总有一个人需要先主动,你是那个主动的人么?
  • 空杯心态:多倾听,多反思,不要只听得见你想听的。而且沟通的目标是找到问题的最优解,而不是为了说服对方;
  • 日常多交流:沟通其实是一个持续的过程,请重视与每个人日常关系处理,因为这很可能会影响到你们的下次沟通;
  • 有原则,懂妥协:在每一次沟通中,保持底线,让人知道你是个有原则的人,能够提升下次的沟通效率。而懂的妥协,则是为了双赢的目标而努力,也为下一次沟通奠定基础。

沟通是重要的,但要成长也不是单一因素所能决定的;而且职场上,大部分人的情商和沟通技巧其实没有太大的差别,主动性反而变得比较重要。与各种角色建立良好的沟通关系,确实能够让你的跃迁道路上走得更快,但绝不是让你成为交际花,或者成为圆滑世故而没有原则的人。沟通很重要,但也不要妖魔化了。  

2.4 经验总结

跃迁的道路,跟游戏升级没什么区别,也是需要经验积累的,然后再总结过往的经验,不断夯实自己的技术知识体系。很多熟手,难以跃迁成为一个技术专家,很重要的原因,就是缺少经验总结的环节,导致无法搭建完整的、有深度的知识体系。

我们先来做个评测,请看以下情景:

  • 作为应聘者参加面试,对面试官的问题都能说上一部分,但问细问深就不知道怎么答了。
  • 看一些分享讲座,你觉得讲师说的大部分你都懂,但你做分享的时候却又不知从何说起。
  • 你掌握很多解决问题的方法,但一谈到根本原因、内在机制的时候,你却一头雾水。
  • 需要实现相似功能时候,你习惯复制代码,而不是思考如何提炼重构。

如果上述情景,你符合两条或以上,那么你应该是很少总结,个人的技术知识体系是比较薄弱的。

经验总结,分两部分,经验和总结。经验,大部分是从工作实践中来,所以需要我们比别人更加积极主动,去争取更多的机会,从而获得更快的成长。当然,能力与责任是相辅相成的,能力越大责任越大。反之,能力不够,也很难获得好的机会。但积极主动,至少比能力相同的其他人要更容易获得机会。实践经验很重要,是因为没有实践经验支持而学习的知识,很可能只是空中楼阁,很快就会被遗忘。假如实在没有合适的实践机会,可以考虑做一些个人业余项目,也是非常好的锻炼机会。   而总结,则是在实践经验的基础上,进行织网,完善相关的技术知识。关于经验的总结,本人以个人成长经验,推荐我认为比较有效果的方式:

1) 成体系地学习:由于移动互联网大爆炸,导致我们的阅读学习越来越碎片化,从而导致我们的知识也是碎片的,难以形成体系的知识结构。相比于每天看公众号上散乱的知识点,我更推荐大家结合工作需要和工作中遇到的问题,成体系地学习某个知识点。比如学习网络知识,可以先看《图解HTTP》、《图解TCP/IP》,然后进阶看《HTTP权威指南》、《Web性能权威指南》,还想在深入,可以看《TCP_IP详解》的三卷。这里列举的是通过阅读书本来系统学习,现在在线教育发展飞速,如“极客时间”、“GitChat”等在IT在线教育平台上,也有很多优秀的成体系的课程,而且这些课程普遍有较强的实践指导性,通过这些课程学习也是很好的方式。在学习过程中,我个人的方法是绘制思维脑图来提炼总结知识点,从而形成网络知识体系巩固下来。有成体系的书本来帮你构建个人的知识体系,会事半功倍。而平时碎片化的有时效性的阅读,则用来填充知识网里的空隙,以及拓展个人视野。

2) 写博客(公众号、专栏):很多同学经常遇到的问题是,认为已经掌握了某个知识点,但很可能你掌握的只是其中一小点,甚至可能只是知其然而不知其所以然。比如感觉学了《计算机网络》,了解了网络七层模型,会Network API组包拆包,就觉得掌握了网络知识;但却连HTTP协议报文结构都说不明白,更不用说HTTP请求经历了哪些网络往返阶段。而写博客,则是一个很好的总结提炼知识点的方式。当你需要说明清楚一个知识点时,你必然想要去了解内在的逻辑是什么,然后你接触越多,你就会越发现你懂得越少。比如我曾经写了篇关于怎么写界面的博客,其中谈到界面的优化,为了说清楚这个知识点,去查了很多资料,包括UIView与CALayer的关系,Offscreen Render的机制等。从而形成较完整的界面优化知识。当然,现在看看还是有很多可改进的空间。

3) 做分享演讲:这个方法的成效与写博客比较类似,都是需要将知识再整理,形成一套个人的知识体系后,让更多的人能够理解。不同点在于博客通过平面文字图像,而分享演讲则是通过文字图像声音,并且能够与分享的对象进行实时的沟通反馈,更有利于知识的传播交流。

上述的三个方法,是我自己认为比较有效的经验积累的方式。三个方法与工作相结合,可以形成良好的有机循环:

  • 工作实践中需要的解决的问题,或者需要的技术储备,可以通过成体系地学习,掌握比较完整的知识点;
  • 将这些知识点运用到工作中,解决实际问题,获得实战经验加成;
  • 将经验和知识点串联,形成博客,或者做分享演讲,这是一个知识加工的过程,可以让你掌握的知识更加系统。


4. 跃迁规划 

为更好的完成技术跃迁,本章节为刚毕业的同学准备了一份跃迁规划,仅供参考。主要点在于构建平台知识体系,粗略分三阶段:

跃迁规划

1) 入门:入门大概需要半年的时间,该阶段主要需要完成心态上的转化:从一个学生角色转换成一位职员的角色。另外,还需要适应公司文化,学习团队开发过程中常用的系统、工具等。入门完成之后,应该可以完成基础功能的开发。

2) 熟练:熟练的阶段,也就是要锻炼成熟手的阶段,这个阶段大概需要两年。在这个阶段前期,主要学习编程语言初级特性、平台API、开发工具和关联系统,主要目的是为了能够高质高效地完成开发任务;而在熟练阶段后期,则需要学习所在平台的编程语言的高级特性,高级API,以及常用的架构模式和框架。熟练阶段不存在什么难度,只要保持积极主动、好学好问,勤于思考,基本能够达成。完成之后,应该可以独当一面,开发一个中型系统不在话下。

3) 进阶:进阶,也就是为最后的跃迁做准备的阶段。该阶段需要学习系统内核、平台性能和安全、以及构建发布等相关知识,拼上平台知识体系最后一块拼图。图上画的是半年,但实际情况因人而异,有些同学进展缓慢,主要的原因可能是受限于项目团队规模,无法获得良好的技术指导和实践经验,此时需要多发挥主观能动性,积极发掘项目中可改进和实践的点,或者启动个人项目,进行实践。

而其余两点,构建基础知识体系和经验总结,则是一个持续学习、总结的过程,此处不展开讲。


5. 结语

非常感谢你耐着性子,阅读到了这里,相信你一定有所收获,而这也是我写下这篇文字最大的期许。曾经年少时,好为人师,跟没小几岁的后辈大谈人生道理,历数惨痛教训,以为他必鉴往知来,前程一片坦途;后面慢慢明白,所谓的良苦用心,还不如让他碰上几块墙壁,跌上几个跟头。等你明白了舍身取义,你自然会回来跟我唱这首歌的。

当我们从婴儿,成长为少年、青年,我们一直都在蓬勃向上成长;慢慢的,我们的身体成长转而停滞,而此时知识、阅历还会继续不断成长壮大,建筑我们强大的内心。能感受成长,是一件很美好的事情。我相信,不管任何阶段,任何年龄,只要你坚持主动学习、思考,成长和跃迁是非常自然的事情。

最后,给各位推荐下,个人在学习成长过程中,对我帮助很大的书籍,请参考:跃迁书单。    



Previous     Next
jaminzzhang /
Published under (CC) BY-NC-SA in categories
Tagged with 技术跃迁  毕业