作者:阿秀
阿秀的校招笔记:https://interviewguide.cn
大家好,我是阿秀,今天给大家分享一点不一样的东西。
上个月我在公司搬砖写码间歇,趁机摸鱼划水的时候,看到一篇针对校招新人,主要是讲“在当今快节奏时代,如何快速学会一门编程语言”的文章,看完很受震撼!!
这篇文章在我看的时候已经有超过28,000次的浏览,也收获了8000+ 点赞,不少小伙伴都直呼学到了并且受益不少。
我在浏览文章的过程中发现文章中有些观点说的很好,跟我自身的体会差不多,在取得原文主人同意后,我结合自身的经历跟大家分享一下:如何在技术更新速度极快的今天快速学会一门编程语言?
不过如果你是一名小白,Hello World都不会写的那种,那么这篇文章并不是很适合你。
这篇文章适合那种有自己的主攻语言,但是由于一些原因,需要在十天半个月的时间内快速学会一门语言的小伙伴。
我以前就分享过不少学习路线和优秀的编程资源,公众号后台回复“学习路线”可见。
我觉得自己就比较适合上述这种情况,我写过很多语言,VB、C、C#、Java、Python、C++等。
写的时间最久的应该是C#,大学的课程设计基本都是用C#做的。
还有就是C++写的时间也比较久,我也最喜欢这门语言,不为别的,就因为它足够严谨。。
1、两种方法
“新鞋走老路,新瓶装旧酒” ,这句话是很多互联网的职场根本,说人话就是要在有限的时间里做正确的事情,如果你不会,那就去学。
怎么学?方法很重要。
方法对了可以大大提升学习效率;方法错了,耗时耗力不说,且得不偿失。
一般而言,现在的互联网开发工作中经常需要我们快速掌握一门语言,但跟你在学校里不一样,没有学校期间那种充沛的一两个月去让你学习一门语言,去彻彻底底了解它的前世今生,把它彻底掰碎了揉开了再去动手写东西干活。
等你毕业踏入工作会慢慢发现,花两三个月去学一门语言这种情况基本不会再出现了。
大多数人在面临需要完成这种”快速学会一门语言的挑战“时,一般会采取如下两种方法:
第一种方法:大致看看语言的基本语法,比如for循环怎么写、int变量怎么定义、数组如何定义、如何输出变量,是printf、还是cout 或者是console.log,这样大致了解一下。
然后直接撸起袖子开始干,一边干一边查,去菜鸟教程、W3C、各种博客快速入门教程中去查。
第二种方法:花自己能花的最大时间完整的把整个语言系统性学习一遍,每个知识点都做到胸有成竹,不学明白不罢手!然后再开始干活!
我知道很多人,看到这里都会觉得我在说废话,是个人都能知道第二种方法不可取,应该采用第一种方法。
我也是这么想的,说明你和我一样,我也觉得应该用第一种方法,说明大家都是正常人哈哈哈
其实两种方法都不好,都有各自的弊病。
第二种方法缺点很明显,浪费时间不说,还偏离初心。
大家要时刻紧记学习一门语言的目的是为了解决问题的,没有谁是专门为了学习语言而去学习一门语言的。
除此之外,第二种学习方法的学习效率很低,想一想你要在很短时间内系统学习一门语言,你能学好吗?
这与大家在大学里进行期末考试不一样,期末考试考察的基本都是课后题,你把课后题学会了,那这门考试基本就稳了。
如果你一直使用第二种学习方法学习,你会不自觉地成为了一名语言专家,对于各种语言的优缺点可能随口就能娓娓道来,但这种没有实际问题去驱动的学习所带来的知识一般都是不牢固的,当然也不深入。
那么第一种语言就没毛病吗?
不是,如果我们在对于一门语言还不了解的情况下就直接上手开始干,写出来的基本都是不入流的代码。
这里说的了解指的是对于一门语言的脾气秉性的有一个基本的了解,不是说上来就直接撸袖子开始干!
如果你直接撸起袖子就开始干,短时间内没什么问题,因为在开发阶段的初期测试完备程度有限,你的那些自以为写的很好实际上很垃圾的代码能够通过代码审查或者Review,然后就会想艾滋病一样潜伏在整个项目各个地方。
在后期,这些毒瘤会冷不丁地跳出来狠狠地打你的脸!你会陷入拆东墙补西墙的循环往复中,掉入泥潭而无法自拔!
2、危害
其实学习编程语言是有一定的规律的,如果你是像我这样有一门主攻的编程语言的话,学会一门陌生的语言,基本十天半个月就足够了。
在短短的一周时间里就可以掌握一门语言最常用的50%,不会出现路子走偏了,甚至开车开到沟里去了的情况。
不怕你完全不会,也不怕你全部会了,最怕的是你一知半解,似会似不会,这是最糟糕的一种情况。
这不是张无忌学习太极拳和太极剑,学着学着忘了,然后直接去一打二、甚至一打三了。
假如你完全不会这门语言,那你就会去查阅资料,查百度、查stackoverflow、查书籍,如果你的学习能力好的话,写出来的代码自然不会差,代码质量也过得去。
假如你会了,那就不说了...
最严重的就是你不会,那就好像中国大跃进时期土法炼铁炼钢一样。
大家听完号召都兴冲冲的把家里吃饭的家伙事儿,锅碗瓢盆、饭勺锄头,有一个算一个,只要是含铁的全部丢进土窑里炼,这样你炼出来的基本都是用不上的废铜烂铁。
在编程语言上,最典型的应该就是C语言的指针,很多人不去了解“正路子”,只会死记硬背一句“指针里的都是地址,不是真正的值”,不管在什么情况下永远是这一句。
这样凭借自己的一知半解去攒野路子是最危险的,这就像是达摩克利斯之剑一样,不知道什么时候就会给你来上一刀。
因此,即使时间再紧张、情况再紧急,有些内容也是必须要首先完整了解一遍的。
只有掌握这些内容之后再进入实际的开发过程中,才不会剑走偏锋,误入歧途,退一步说,即使有问题,也基本不会伤及项目大体。
所以归纳总结一番就是:在实际的工作中,学习一门新的编程语言,既不能不能一上来就瞎干,也不能等系统学完了再实践。
应该首先掌握最基本的数据类型和基本语义语法和构造等核心基础的知识再开始动手开始写东西,然后在实践中不断巩固和深入,这才是最正确的方法。
当然了,如果你还在学校里那自然不必,你大可以花几个月去学习一门新语言和新技术。
写到这里,再次感慨后悔没能在学校里多接触点前沿的技术,掌握多点技能。
上学期间真的是最好的学习新技术的时候了。
3、提纲
最后分享一个学习提纲,再次重申一点:这个提纲的适用者是上文中我提到的那些有一门自己主攻语言的小伙伴,而不是小白新手们,千万注意!
这个提纲适用于绝大多数语言,基本上流行编程语言Top30都适用。
我专门去查了一下2021年的编程语言排行榜,参阅了TIOBE Index for October 2021:
基本上我听过的语言都在这上面了,简单罗列一下:
Python、C、Java、C++、C#、Visual Basic、JavaScript、SQL、PHP、Assembly language、Classic Visual Basic、Go、MATLAB、R、Groovy、Ruby、Swift、Fortran、Perl、Delphi/Object Pascal
这份提纲又分为初级部分和高级部分,在简单了解完初级部分就可以动手开始干活。
初级部分
1、最基本的数据结构和基本语法要做到粗略了解,然后加以运用。比如基本的运算符(&&、||、!、?)、输出格式(Printf?Cout?System.out.Println?console.log?)等。
2、了解一些集合的基本运用。比如数组、字符串、set、map、哈希表等数据结构是如何定义和输出,具体来说如何为数组赋初始值。
3、了解集合的处理和使用。在了解完最基本的集合定义和输出后,这个阶段要学会一些基本集合方法的使用,比如数组最常用的push方法、splice方法,字符串最常用的split方法,set集合的add方法以及字符串的简单处理,比如查找、替换、截断等基本方法。
当然了,如果你对泛型有所了解的话,也可以理解一下泛型,没有理解也没关系,日后用到再说。
4、了解面向对象或者函数式编程的特征,就好比C++三大特性:封装、继承、多态等,还有一些Lambda函数或者JavaScript中的箭头函数的语法糖之类的,如果有别的语言的经验的话,其实很快就能明白过来。
这里多说一句,其实很多东西都是换汤不换药、新瓶装旧酒,大山沟里的村花陈素芬和一线城市中光鲜亮丽的都市白领Madam.Chen其实是一个人,只是身处的环境和周遭人不同而已,所在环境不同造就人的不同,其实内里是一个人。
5、了解断言、异常、错误捕捉、调试等,特别是异常的使用。在我们日常开发中,bug是再正常不过的了,特别是在刚开始接手写一个项目的时候,正确捕捉和处理这些错误/异常是很重要的。
6、了解整个程序的组织机制,比如典型的作用域上浮,关键字/变量的查找顺序等,不过大多数书籍并不是很注意这部分的知识点。
以上就是初级部分,在对上述部分初步了解之后其实就可以开始动手写项目了,这个时候你已经能够写出一些简单的控制数据,达到你初步想要的结果了。
然后在实际生产环境中,根据具体需求去学,不管是做DB数据库还是网络通信等,去找当下比较流行的框架或库,一边做一边学,在实战中学会、沉淀、总结、进步。
高级部分
高级部分有好几个大部分组成,并不意味着你需要每个都学会甚至是掌握,在具体的工作中,遇到哪个再去了解哪个即可。
时刻谨记:你是来解决问题的,而不是来学习编程语言的。
1、了解回调函数以及时间驱动编程模型。比如回调函数的机制,它是是如何调用的,最典型的应该就是JavaScript中的回调函数,如果不能好好了解回调函数的特性和机制,初学者很容易陷入回调地域的漩涡中。还有C++中的tr1::function/bind等知识点。
2、了解序列化和反序列化,掌握缺省机制以及Regex处理问题,如果当前项目没有这个必要直接跳过即可。
3、进一步了解并发以及异步调用机制。学习一个项目最好的方式就是去学习仿写别人已经写好的项目,研究被人的源码再去动手写自己的代码,特别是并发和异步部分,如果没有现成的例子可以参考,就贸贸然开始动手写,写出来的东西绝对是一个噩梦。
4、更深的知识点,主要包括动态编程、元数据编程、程序运行执行的机制和编译/解释执行的机制
5、如果有可能的话,去找一些大手子去请教一些当前语言最常用一些特性/功能是什么?可不可以给一些关键字?然后自己去补充学习。
巨人的肩膀:
https://bytedance.feishu.cn/docs/doccnI6ZwT4fI1GaUQAJkn4g
https://blog.csdn.net/myan/article/details/3144661
我是阿秀,一个在互联网苟延残喘的人,我们下期再见。
推荐👍:《逆袭进大厂系列》(包含C++、操作系统、计算机网络、MySQL、Redis、情景题)
推荐👍:总有人在你不知道的时候,默默前行(他人经验)
推荐👍:求职软实力(面试、话术、简历)
---END---
你好,我是阿秀,本硕均于普通双非学校就读,读书时做过写手、玩过爬虫、耍过单片机、搞 过GPU、搭过服务器。校招时拿下字节跳动SP、华为、百度等6个offer,现于抖音旗下担任研发工程师,技术栈为C/C++/Golang,前端缺人偶尔也能顶一手。
点击此处查看我的幡然醒悟的八个月自学经历,不是逆天改命也不是逆袭,只是多花了点时间和坚持。一路走来,很累也很不容易,希望能帮助到更多像我一样的普通学校的学生。我踩的坑不希望你再踩,我走过的路希望你照着走下来。