过往学习经验:
2016年年初学了大概100个小时左右的HTML和CSS,今年8月辞职後花了约30小时学Ruby。
但是後来发现太没有系统性而且当时自学能力还不够有系统,所以我就报了XDite推荐他朋友创立的Launch School的课程自学(谁知道现在就打对台了),从九月初有系统性的上课到现在大约4个月了。
为何开始学编程:
从工作的角度:(1)编程是相对不容易被取代的技能(2)复利效应好(3)一个底薪高而且相对来说没有收入天花板的职业
从个人的角度:我一直想要不受地域限制,有一台电脑和网路就能工作,而显然编程能够完美的符合这个条件。作为一个过往没有什麽积累和成就的加上兴趣相对广泛,既然要从头开始所以我选择了一个能满足自己目标丶收入丶未来发展的技能。
为何选择Ruby:
因为在先前的实习还有打工经验都会碰到网站,曾经用wordpress架网站。但发现花了数百个小时只学会了下载一堆套件丶跟客服写信沟通丶自己手动调整网页,完全没有技术可言,加上当时想要离职而且深信会coding是未来的机会,所以我就跳下去学了。
而Ruby作为架网站的语言之一,有惯例优於设定丶DIY等特点,感觉起来虽然有限制性,但却给了初学者有更多的时间专注在真正有价值的事物上,所以我才开始学Ruby。(但让我晚几个月开始我可能会学Python就是了)
是否该选择线下/上课程:
以台湾的alphacamp为例(澄清一下我没上他们的课程哈),这个营队最大的好处是,他会把同时在进行营销丶iOS开发丶网页开发丶UI设计的学生组合在一起,让不同领域的人一起做出一个毕业专案,让在老师手把手的情况下进行像业界一样开发产品的过程,而这种学习协作的能力是一般线上课程办不到的。
除此之外在入门时有高手手把手教你,绝对可以让你在未来省下很多力气,像是如何debug丶怎麽写出漂亮的代码丶如何设计userstory等。这样的课程强度高效率又好,但是唯一的缺点就是:贵。
相反的,线上课程的最大好处在於相对便宜和时间自由,还有另外一点是可以锻炼个人的英文跟自学能力。所以最终要衡量的话应该要把学费丶总共学习时间丶何时能找到工作丶第一份薪水多少钱等等纳入计算。
像是台湾的alphacamp要3.5w人民币,耗时两个月,但是在毕业一个月内可能可以找到一份1.3w人民币的工作,所以这样以一年的区间来看,我的净收入应该是13 X 9 - 35 = 82 k人民币。
相反的,如果今天一个学生自学6个月,每个月学费1.2k人民币,在毕业一个月内找到工作,以一年来看净收入是13 X 5 - 1.2 X 6 = 57.8 k人民币。虽然这个计算可能会随着个人的学习效率还有很多变动因素影响,但我在这边是想提供一个比较完整的计算方式供大家参考。
如何选择编程的教材:
「花钱买时间和注意力」,我一开始适用codecademy的课程上,这个课程的好处就在於它帮你一些大观念拆分成小观念,不要求你先理解但会带你跑过一遍,并在之後一步步给你解答,而且他的价钱算是相当便宜又有线上助教,确实是初学者不错的选择。
但是我後来发现这样的课程也是有点问题,像是:
(1)codcademy的助教有时不太靠谱:之前有几次其实只是我漏打了一些什麽,结果助教debug就花上了30-50分钟,而事後也发现是些特别小的问题
(2)codecademy的平台有時不太靠谱:我曾经有几次代码出了点问题,不论怎麽debug或是向助教求助都没办法解决,後来助教跟我说是系统本身的问题,跟我说声抱歉。但这种情况也发生好几次,累积起来好几个小时也就这样过去了。
(3)很好的入门教材,但强度可能不够:这教材很适合入门,但是在我下个阶段的学习历程这样的强度可能不够。
每个人有自学选择教材的喜好,但是至少当时我真的觉得被浪费了太多时间,所以我後来就跟他说掰掰了。
注:我2017年2月份又再次使用codecademy的课程学jQuery,发现平台已经稳定许多。但我依旧认为Codecademy比较适合初学者入门,要更进一步势必要找其他教材。
所以我後来学乖了,再加上看到笑来老师提到注意力>时间>金钱,所以我就直接选择当是市面上最贵的教材Launch School,一个月要1.2k人民币。但是我现在完全体会到了这个课程的好处,因为它真的很扎实,一个月内学到的东西可能比我更早一个月自学的多太多。
学编程需不需要英文能力
学编程初期可能英文不重要,但是要成为厉害的程序员英文很重要。简单来说就是在程序员的世界中,最新最好的资料大多都还是用英语写成的。
当然有人会说我们可以看翻译过的就好,但是那些高深的技术和词汇通常也都需要牛人消化丶整理过後再翻译,但是哪来那麽多牛人帮你翻,而且牛人真的有那麽多时间帮你翻吗?所以我个人的观点是,学编程英文能力不一定要好,但从长远来看,把英文搞好绝不是坏事。
不过学编程的另外一个好处就是英文会同时进步。我的英文能力还算可以,TOEIC大概800多分的程度,但是我一开始在看英文教材的时候还是很吃力,一方面英文还是不够好,一方面不够理解。
但我知道英文这种技能也是会越用越上手的,所以我还是每天看,一天大约看个6个小时,加上每天早上我都会朗读15分钟,所以自学现在阅读能力进步不少。
还有一个另外的收获就是,因为我有意地想要提升学习速度和效率,所以我到後来都会试着把教学影片加快到1.25倍,平时听电子书也都加快。几个月下来,慢慢的我现在听TED或是影片都可以到1.5-2倍。
虽然不敢说英文听力变得多好,但是大概就像是能够用1.5-2倍的速度听懂原本用原速播放的音档。
关於Xdite的建议:先抄代码再理解?
关於这个想法我也是不停地在测试。我一开始遇到的问题是,往往花了好几个小时看完一个章节开始要做题目时,一开始看的东西已经忘了差不多,往往又要边写边回头复习,而且若是阅读时间拉得越长效果越差,而我也认为这是让我目前学习编程速率较差的原因之一。
因为我平常都会看很多书,也会希望能够提高读书效率,所以我陆陆续续在一些书中找到了跟以往读书方法不一样的观念,像是直接从解答开始学习,而不是课本。这几本书分别是《狡猾的读书法》丶《关於考试,你用的方法都是错的》丶《关键20小时,快速学会任何技能!》
前两本书似乎只在台湾有翻译本,所以我建议大家可以看看第三本。第三本书的作者乔许考夫曼花了90个小时从零开始自学编程(但是他在大学也有一点学编程的经验),然後就做出了两个程序(而根据乔许在书中的说法,把一个大概念拆成小概念学习,并藉由直接的反馈修正是很好的学习方法)。
当我看到这一段是我简直是无地自容,因为我们两个都用得是Ruby,但我觉得我学了几百个小时却似乎还没有办法真的见一个作品,但他一下就做到了,是不是我的学习方法出了问题?(当然这跟我目前上的Launch Scool刻意放慢教学速度跟加深深度有关。)
所以我就开始尝试直接打代码学编程的尝试。由於目前学ruby已经有了一段时间跟,我就这样一步一步地靠直接做题目丶看解答丶查资料就搞懂了不少JS的问题,而且我到现在沒开始看教科书。
当然我并不是在倡导教科书无用论,我只是在分享我测试学习方法的观点,至少就实验结果来看,直接从零开始从小的习题丶甚至是从完整的作品开始着手是有可能的,虽然一开始的挫折感会重一些,但是长远来看我觉得整体速度可能更快。
实际的例子
举例来说如果你现在完全不懂Ruby,我丢了一段Code给你,你要怎麽解?
题目:
Write a method that takes one argument in the form of an integer or a float; this argument may be either positive or negative. This method should check if a number is odd, returning true if its absolute value is odd. You may assume that only integers are passed in as arguments.
解答:
也许看起来很可怕,但是不用慌。在这边我们可以看到几个关键字:method丶def丶return true丶%丶==。接下来你要做的就是到Google搜寻 “what is def in ruby?" “what is method?" “what is double equal sign ruby"等等。
大概半小时左右的时间你就可以知道如何建立Method丶%和==代表什麽丶argument又是什麽,而不用从头看一大堆的文档再开始练习。
而还有一件很重要的问题值得询问:「为什麽很多从学校丶补习班丶职业训练所出来的人,依旧没办法找到一个工作?这些地方的功能(之一)不就是为了达到这个目标吗?」。
这的确是一个很耐人寻味的问题,这就像是在问一个从小到大十几年考英文都考高分却说不出几句话,跟到了国外用英文生活了一年的人比起来,还是只能不断被啪啪啪打脸的份一样。因为很多时候我们都自以为自己在解决问题,但是显然并非像我们想像的这麽美好。
我的一些学习方法:
目前我是在用LS的课程上课,但是我在学习过程中发现了几个问题(1)没抓好复习的时间效果大打折扣(2)练习时进步最多,而不是阅读(3)练得越熟下次看到类似的题目解得越快。
先前跟大家提到的三本书,还有Xdite(ruby&rails专家)都推崇把一些项目做熟的好处,以下我撷取Xdite的一段文字:
「比如说很多人以为我写 code 这麽快是因为 rails 写项目很快。这根本是大错特错。那是因为我写过了一两百个小项目中项目练手(很多人根本不知道这件事),我写到最後任何 idea 到了根本不用想不用折腾的境界。」
「我做项目做到已经到了可以看完写完 user story 就知道可以「非常准确」算出一个项目要花多少时间人力。(误差在1%,而且在职场上没有失误过。)正因为我有这样的能力。所以我的学生打 hackathon 也会有同样的速度结果(比如说几个人八小时搞出一个项目而且效率奇高)。因为这对我来说根本已经是一套公式。
」
所以我也开始把题目练熟这件事情放在自己心中,加上LS的课程在每完成一个阶段需要分享萤幕live coding,并由老师评分及格才算通过,并且才能进到下一个课程,所以能不能熟练的coding就变得很重要。
所以大部份章节都有大量的练习题,而因为有了过往的一些体悟,我现在练习是这样练习的:看了五分钟发现脑海里没有想法的话,直接开解答看步骤,观察别人的编程丶学习新的观念丶了解如何推演过程,接着看熟之後试着自己重头写一遍。
然後从隔天开始每天都复习,复习的方法分成回想练习(也就是只看题目名称,然後在大脑推演),还有实际练习。也就是说我的练习次数是一天至少一次,不是久久才一次,而这个过程可能会持续1丶2个礼拜以上直到这个段落的课程结束。
再加上我现在不像以前看了整个章节才开始写习题丶复习丶准备考试,而是直接开始写习题抓重点,看书丶每天复习丶准备考试,整体下来我的练习量会比原本的做法多很多。而我现在也开始准备直接尝试做一个完整的作品,因为对我来说这显然是更快的学习方法。
每天记录学习心得
我目前除了每天固定写一篇非技术性文章之外(中文),我还会每天花时间写一篇技术性文章(英文)。这个技术性文章不需要很高深,我的作法就是每天记录学到了什麽丶哪些事情该注意。
这样的做法除了能够让你总结一天所学当做复习之外,还能同时记录你的学习历程,你之後有遇到类似的问题可以回头来看看,而且另外一个重点就是把你的作品集和思考过程分享给大家。
一来不论对错大家都可以互相交流,而且未来如果有面试机会也可以把自己的博客当作作品集之一,加上用英文写作也可以顺便练习英文,即使一开始在糟,人总是会慢慢进步的不是吗?
学会一门语言学其他更快
虽然对其他大牛来说这根本就是尝试,但是我现在在写题目学JS确特别有体悟。
就拿学习日语跟韩语这件事情来说,会说日语的人学韩语特别快,会说韩语的人学日语特别快,因为这两种语言在文法架构丶社会礼俗丶语言使用时机上有高度的相似,更不用说在韩国去汉字化之前也使用汉字,所以在那个时代这两个国家的人互相学习对方的语言简直是快到不像话,其他国家的人只能望尘莫及。
相同的编程(或是任何的知识)也是一样,你说得越多会发现其实一些重要的概念早就在别的地方介绍过了。
关於找工作
虽然由我这个自学编程才几个月的人谈论这个话题似乎有点愚蠢,但是我觉得如果学编程的目的是希望能够找到一份工作的话,这件事情就不能不在意。而活在未来最好的方式就是像专家一样生活,所以为了找到理想中的职务,最好现在就开始准备。
以英语流利说这间公司的面试标准来说,如果为了有机会能够面试这间公司,我必须要熟悉如何测试辅助开发(如Rspec)丶熟悉如何开发RESTful API丶熟悉系列行数据库(如MySQL)丶熟悉如何自动化部属Ruby/Rails丶熟悉使用Git。而当我足够熟悉这些技能时,对流利说这间公司来说,我就是那个有可能替他们解决这些问题的人。
所以我不能傻傻地埋头苦练,而是要开始花更多的时间加强这方面的能力,这才是合理的准备方式。而要如何准备,我个人的想法是直接抓几个会牵涉到这些点的代码来练习,像是多产出一些API相关的作品集等等。
当你有足够多这样的作品集跟经验,在同一群能力差不多的人来看你的履历会更好看;而即使没有机会面试,至少你加强了一些公司看重的能力,何乐而不为呢?
最後
专精任何一项技能都是需要花费很长的时间才能达到的目标,虽然专注和持续是绝对不可少的,但是在这个过程中我们可以用各种方法来提高效率但却不致於走偏,帮助自己能够有更多的时间跟注意力去做自己想做的事,而这也是我还不断在学习的。
希望这篇文章能够给看到的朋友们带来一点点的帮助,若是有任何说错或是不够精确的地方,还请多多指教。