IT技术博客大学习 共学习 共进步

如何在毕业三年完成技术跃迁

jaminzzhang 2018-12-26 23:37:12 浏览 3,225 次

   前言:近期又到了毕业招聘季,我作为技术分享嘉宾,回到母校参加宣讲会,做了一个主题为《如何在毕业三年完成技术跃迁》的分享,本文由此次分享整理而成,希望能够给将进入职场的准程序员,或者刚进入职场的程序员,带来一些指导,帮助你们在技术的道路上少走些弯路。请注意,本文源于我的经验思考,非教条或准则,仅供参考。另由于本人主要的项目经验来源于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开发 RoadmapiOS开发 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. 结语

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

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

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

建议继续学习

  1. 创业三部曲之一――学技术 (阅读 6,481)
  2. 技术同学在业务中的成长 (阅读 4,003)
  3. 程序员与技术讨论 (阅读 3,845)
  4. Apple 谈论产品 vs Microsoft 谈论技术 (阅读 3,701)
  5. 技术跃迁书单推荐 (阅读 3,167)
  6. 关于前端开发那些事儿(四) 技术的本质何在? (阅读 2,722)
  7. 我是产品经理我需不需要学技术? (阅读 2,582)