写这篇文章的起因是因为,在微信群里有个朋友问到:"想学习Swift,有没有推荐的视频?"
忽然就想到最近刚刚就把Swift学下来了,因此决定写这么一篇短文
当我们已经掌握一门编程语言的时候,如何更快速并相对熟练地上手其他语言呢?
我大概是从2016年正式接触到编程,因为对苹果设备的喜爱,于是决定从Objective-C入手,正式地成为了一个光荣的程序猿。
这篇文章并不打算细说从零入门,打算谈谈我们如何更为高效的上手一门新的语言。
作者曾在17年中,因为兴趣粗略地学过一段时间的python,随后在18年因为公司需求,学习过Java,还有c++。当然,这些编程语言并没有熟练到足以支撑作者去依靠它去找到新工作。但是至少使作者在和后台的小伙伴们交流感情(找茬)的时候,不至于被他们的随意的借口给唬住,可以更快地寻找并定位程序的bug。(这段也可不看,因为是在装X用-_-)
一般当我们已经掌握一门语言后,再去学习新的语言的时候,我们会有熟悉感,因为尽管各个语言有各个语言自身的特点,但在很多的时候他们是相互借鉴的。
接下来就该说到正点上了,如何更为高效地掌握一门新语言。
首先是准备好对应的编程环境与开发工具,比如python我更喜欢直接使用pycharm(因为方便),java使用的IDEA,如果是JavaScript就推荐使用Webstorm,几乎都是JetBrains的全家桶。他们的开发工具都是相似的,而相似的开发工具,能减少我们的学习成本。
学习这个事情,是一项漫长而痛苦的事情,我们需要有一个明确的目标进行快速的学习。完成自己目标所带来激励是非常大的。
任何一门语言,语法都是固定的,我们为什么会对新的语言感觉陌生,是因为对语言掌握的程度不够。说到底,编程是门熟练工,多写代码,才能使自己摆脱对语言的陌生感。
但是,我们又不能盲目的练习,因为这样会降低效率,我们的目标是高效的学习。如我们在学习语言的前中期,其实是在熟悉语言的各种基础对象的操作,如数组,键值对(字典)之类的操作,因为近乎所有的高级对象都是构建于这些基础的对象之上。因此,这里在过程中我更推荐的是刷题,也就是 LeetCode 刷题的过程既增加了我们对语言的掌握,也增加了我们对于数据结构的理解,锻炼自己的逻辑思维能力,还有就是,如果刷题多了,我们的简历上便可以多增加这么一笔(说不定就有面试官看重这个)。
这里说的阅读,指的是阅读开源项目,GitHub上高star的那种,我们通过阅读他们的代码,可以更快的掌握一些通用的写法。
为什么要叫翻写?因为这里还是需要阅读开源项目,但是阅读的开源项目是你原本掌握的那门语言的高Star项目,然后尝试将它翻写成现有语言的项目。
但是也要注意,这里的翻写一般是指翻写相对较底层的项目,也就是说,我们一般翻写的都是通用类的库,如网络I/O层,文件操作层,算法层等等的库。因为如UI库之类的项目,很可能我们学习的语言就没有办法实现,或者其依赖的库我们没有,而通用的库则是因为近乎所有的计算机语言都需要至少包含相应的模块,我们至少能初步保证不至于因为语言问题无法实现。
在第四条中,我给出的是阅读,阅读在这里是让我们更好的掌握别人的项目是怎么写的。第五条中我们给出的翻写,翻写是能让我们更好的掌握语言。
在翻写中,我们总会遇到这样或者那样的错误(不论是编译时的,还是运行时的),这些都需要我们去自己解决。 而我们自己解决的问题,印象会更加深刻 。
同时,翻写项目,能使我们彻底掌握我们所阅读项目的架构、设计理念等等,我们掌握的越多,我们以后写出的代码就会越好。
这条是我想主要说的,因为翻写开源项目使我感觉受益匪浅。
一个例子呢,就是我最近正在学习Swift,决定翻写OC库(当然Swift和OC其实是差不多的),因此决定翻写网络层I/O的库,所以翻写 CocoaAsyncSocket 出 SwiftAsnycSocket 。当这个库正式写完,并且通过自测的时候,觉得对Swift的熟悉程度立马上了一个台阶。同时还增加了对网络请求相关的了解,也就有了, 关于Socket,看我这几篇就够了 一系列的文章。
翻写项目,能使我们掌握的更快,掌握的更牢固。
最后一条,也是我推荐的,这里说的重构是种小重构。
因为我们翻写的项目有可能是别人为了解决问题而制作的,所以他们的代码可能写的比较随意,所以这也导致了,我们翻写的项目可能较为随意。本着严谨的想法,我们应该重构翻写的代码。
在翻写库完毕后,我们应该会对原本的项目有一定的了解,这便减小了我们重构的难度。
但是很多时候我们有可能不知道应该如何进行重构,这里有个推荐 XXLint(XX代表的是当前语言),我们总能找到对应语言类似的代码检查工具,它能迫使我们去主动重构。
重构是个加深对项目理解的过程
其实,学习一门语言真的不难,我们主要难在了掌握通用的设计思想,与这门语言对应的框架的使用与原理。
毕竟我们学习语言肯定是看上这个语言的某个项目,或者某些特性。如我们学习Java如果不是因为Android便是因为Spring全家桶。
其实在掌握语言的时候,才是我们的开始。就如同魔兽世界(游戏)一样,满级才是游戏的开始。
如果大家有什么更好的建议或意见,或者本文有什么错误,还望评论指出。