致:想转行程序员的新手们的第一封信
共 2968字,需浏览 6分钟
·
2016-09-30 21:14
你有一个很棒的idea,想要创业,你看了所有关于精实创业的方法论,拥有创业家精神和准备冒险犯难的生活态度,现在只缺一件事情—你不会写code,你没有把产品做出来的能力,这个新手正是两年前的我。
在学习写程序之初,我多么希望能够有一个人告诉我该学什么,需要学到什么程度,该怎么面对学不会时的挫折,与怎么培养独立解决问题的能力,这些心情我都经历过,现在我想写这封信给你,告诉你未来会遇到什么事,该怎么克服,以及你可以成为什么样的开发者。
建立正确的心态
在开始学习写程序之前,我想分享几个心态上的建议,它能帮助你走过未来无数困难的时刻,因为这将是条困难且漫长的路,我希望你能用最少的时间,学会你所需要学会的知识和技能。
没有人规定你要花多久才能学会什么,学会了最重要。
学习分为知道,会做和熟悉三个阶段,每学到一个新的观念和技术,都要想办法和已知的知识做连接,才能变成自己能独立运作的技能。
专注在学会新的概念是最重要的,网络上有非常多的资源,但不同资源适合不同学习阶段的人,如果一篇教材用你还没有学会的概念为例去解释你正在学的概念,请忽略它,我们没办法用我们不知道的知识去记忆新的知识,能用你理解的话教会你的教材,才是适合你的教材。
大脑里负责选择和学习的位置是在不同的区域,当你在选择要学什么的时候,你并没有在学习。
希望我能以过来人的身份帮助你选择,而你只要专注在学会这件事,我将会告诉你需要学习什么和为什么需要学它,但不会告诉你它运作的方式,因为独立学习一个新的观念也是你需要培养的能力。
看到这里相信你已经准备好了,那我们开始吧!
学习基本语法(Syntax)和运算思维(Computational Thinking)
1.选择第一个接触的语言是很重要的,语言的设计影响到你对程序的理解和写作的习惯,更重要的,会影响你学习的乐趣与成就感,完全没有经验的你,我会建议你学习Java,更精确一点,从Head First Java这本书开始入门,这个阶段你的学习目标有三个:
第一个是要是要熟悉语言基础语法if、for、while、swtich要怎么使用。
第二个是要学习Java的Data Type与理解Primitive Type和Reference Type的差别。
第三个是要理解面向对象的概念,能够熟悉class的使用,并清楚地解释Encapsulation、Inheritance、Polymorphism是什么,其中Inheritance最为重要,请务必理解它。
Java是一个严格规范的语言,没有正确宣告数据类别和正确的使用class程序都会执行失败,现在这个阶段对你来说也许很不方便,却也保证你可以建立更正确的观念,而刚开始学习程序,建立正确的观念是最重要的
做到以上三件事,你在这个阶段的任务就完成了,但是这个时候的你,还不能说会写程序,一个软件工程师必须要有运算思维的思考习惯,用更简单的语言说,就是熟悉数据结构与算法的运用。
2.从熟悉语法到能够用算法解题是你会遇到的第一个门坎,因为你还没有建立一步一步拆解问题的能力,没关系,让我帮你整理你会需要用到的方法:
Big O notation:首先你会需要理解用来分析算法的方法,这个概念和微积分中多项式极限的概念很像,是用来分析时间和空间复杂度的方法,也是我们之后讨论不同算法之间权衡(trade off)的重要依据。
数据结构:Array、Stack、Queue、Hash、Linked List、Tree、Graph、Heap。
Java内部已经帮你实现Array、Stack、Queue、Hash和Heap,但Linked List、Tree和Graph需要自己建class或是用前面的数据结构组合而成,请务必熟悉各种数据结构Java内置的操作方式,因为我们未来为需要用它实现我们的想法。
算法:Binary Search、Recursion、BFS、DFS、Backtracking、Dynamic Programming。
学习算法有一个重点,不同算法的复杂度不同,请依照上面的顺序去学习它,如果前一个概念没有搞懂就去学后面,你会感受到前所未有的痛苦,并非常容易想放弃,例如DFS会用到Recursion、BFS会用到Queue和Array、Backtracking会用到DFS、Dynamic Programming会用到Recursion、DFS和Hash,观念是累积下去的,按部就班一步一步学下去,你会更容易理解它们的概念。
具备基础能力前的三个阶段
目前为止,你已经知道数据结构和算法的基本原理了,但是你还不会使用它,为了帮助你练习各种算法运用在实际的问题上面,我会建议你到leetcode照分类题型练习,解题的平台我建议复制leetcode的题目到coderpad上练习,自己想test case,通过之后,再将解法放到leetcode用别人写好的test case测试。为了有效熟悉并活用各种算法和数据结构,你会经历三个阶段:
一、第一次做题目,你会完全想不出来,就算是最简单的题目你可能都没有想法,这是很正常的,因为你还没有建立起运算思维,请坚持自己想十分钟,忍住去看解答的冲动。我明白这个过程是很痛苦的,但这十分钟是连接你学到的算法和解决实际问题的重要过程,也是必经之路。十分钟了,你还是想不出来,没关系,你可以上网找解答看看其他人是怎么做的了,然后试着在了解他的想法之后,用你的方法再写一遍,你不需要有任何沮丧的感觉,参考别人的答案也是学习的一部分,每种算法和数据结构你需要做至少五到十题去熟悉它。
二、所有分类的题型都做过之后,你会发现自己重复做第二次居然还是做不出来,这是非常正常的,因为运用算法解决实际问题这个过程,你只是知道,还不会做,所以你需要熟练你的技术。这个阶段训练的方法就不一样了,你需要重复做同一题好几次,第一次accept之后,请全部清除掉重写一次,你会发现还是有卡住的地方,试着做完,也许你还是需要看解答,没关系,每一次做完之后就清除掉重写,直到你可以独立在不看解答的情况下,一次bug free,现在,你才真的搞懂了这一题。
这样重复写的过程,你会自己归纳出来其中的pattern,这将会是属于你自己最珍贵的东西,因为这代表你能独立使用算法去解决实际问题的连接,而这个pattern在网路上别人的解答里没有,任何博客也找不到,因为每个人脑中的pattern都不一样,这才是能够跟着你一辈子的东西。
三、这个时候你对做过的题目已经非常熟悉了,然而世界上的问题何其多,这个阶段你需要的是大量浏览不同类型的题目,现在你不会知道哪一题要用哪一种算法,所以会试着尝试组合不同的算法去解决它,并讨论时间和空间复杂度,思考在不同情况下你会用哪一种方法,熟悉这个过程后你就会理解,为什么人家说每一题没有标准答案,因为实际工程问题其实都有其条件与限制,工程师在做的是讨论各种解法的权衡(trade off),熟悉这个过程将可以培养你和其他工程师沟通的能力。
到这里,恭喜你具备了初级软件工程师的基础能力,大部分的人在走到这里之前就放弃了,但你没有,你坚持下来了,恭喜!接下来,为了成为初阶的web开发工程师,下一封信我们要来谈谈学习新的语言JavaScript和网站开发所需要的知识点。