不要怀疑自己的背景,任何人都可以学习软件开发,现在就去动手做,不再害怕,暂时放起自己的想法,自学的时候要像个傻瓜。
睡好觉,咖啡抵不住困
现在不管做什么,前提都得要睡好。我睡眠一直还行,不过有时候手欠,晚上如果有点工作要做,就想喝个咖啡。工作做完以后会很兴奋,加上咖啡因起作用,眼睛雪亮像狼一样,过于兴奋就会晚睡,但是咖啡因又让我比平时早起一两小时。
一遇到这种情况我就知道,今天一定是费掉了,觉得亏了,还不如前一天少做一会。因为早起那一两小时,脑子里的垃圾没清理干净,一直有困意。但又不想浪费一天时间,就会再喝个咖啡,然后又会补上两杯。发现没什么效果,又想着补个觉。但是咖啡因起作用了,又有困意,又兴奋的睡不觉,这种感觉很难受。
咖啡只能在你清醒的时候让你更清醒,更专注,但它绝对不是困意的对手。我说的困,还不是真正的困,就是你会感觉有种物质在脑袋里面,可以想成是垃圾,又像是一种力量在拽着你要开工的大脑,它会影响大脑的正常工作。这种状态下,我几乎什么都做不了,即使是不需要太多思考的事情,甚至是让我看个喜欢的电影也不行。
像这种情况每个月都会有两次,也没什么好的办法,只能等咖啡因跑掉,晚上再睡个好觉。不过今天我想应该可以用点酒来稀释咖啡因的作用,我喝点酒就会困,但很多人是越喝越兴奋。写到这里感觉好一些了。
二十几岁的时候体能恢复的比较快,喜欢很晚睡,第二天也会有精神。不过三十以后,我就发现自己是决对不能熬夜的,对我来说熬夜工作很亏,因为会搭上白天一整天时间。而且情绪低落,还易怒,可爱的女儿说 “ I Love U 爸比”,我都不想理会,直接拿了钥匙出门。骑着电动车跑出去转一圈,跑到河边,还查查地图,看看檀抱泉在哪,一看还有 40 公里,算了,电动车骑不到啊。
不管学习还是工作,都要睡好,不能睡得太早或太晚,也不能起的太早或太晚。如果 12 点睡,第二天 8 点左右起来正正好。保证充足的睡眠,再配上杯咖啡,心情愉悦,效率倍增。不要在困的时候,或者睡觉前 6 小时喝咖啡。困了就去睡会。
别害怕,任何背景的人都可以
我很清楚地记得当初考虑是否要学一下开发。那年 30,现在后悔了,后悔当初的决定有点晚。我一直都对网络与 Web 有兴趣,也经常会尝试一些东西,但都是想图省事,大部分都是去修修改改别人做好的一些东西。可能觉得这样更简单,也是一种找捷径的心理吧。
对于软件开发,我是有想法要学一下,不过一直都有一种恐怖心理,觉得这是一件挺难的事儿,自己可能学不会。很多年前,曾经尝试着学习 PHP,几次都放弃了。后来接触了 Drupal 以后,惊叹功能之强大,又让我认为学习开发完全没有必要,点点鼠标就能完成的事情,为什么要去费事写几行代码呢。
直到决定要做宁皓网的时候,我还不懂 PHP,CSS 也没完全理解。但 Drupal 真的是强大,让我这种不懂开发的人也能搞个网站出来。后来我是因为宁皓网需要 CSS 课程,我才真正弄明白它。
宁皓网前两三年的课程,主要还是以应用为主,怎么用 Joomla,Drupal,WordPress 做个网站出来。课程做的都很用心,也挺受欢迎。也是因为环境,还有自己的见识问题,一直没有机会看到能写几行代码会有多么强大,多么了不起。
后来也是为了丰富网站上的课程,才决定要真正去学习一门程序语言(JavaScript)。但当时也并不认为学习开发有什么必要性。这种观念今年我才完全转变过来,我觉得任何人都应该给软件开发一次机会,试着去写几行代码。不管怎么样,都要试一下,当个业余爱好也好。如果能投入一两年时间,任何人都可以基于软件开发去建立一份自己的事业。
如果你是一个技术爱好者,业余时间做点技术相关的工作赚些外快,喜欢拿别人的东西简单的修修改改,觉得这样做是最省事的,并且从来没把开发当回事。现在你要做的就是给开发一次机会,下决心学一下。到某个程度的时候,我保证你的思维方式会发生巨大的变化,很多以前看起来不可能的事情,现在变得没那么难了。
如果你一直恐惧开发,认为自己专业不对,学历不行,水平不够。不用克服恐惧,直接把它扔了就行了。任何能长时间面对电脑的人,都可以成为一名软件开发者。开发肯定不是一件容易的事,但决对不是一件不可能的事,任何人都有机会。
陌生的词
对于初学者,一开始最怕的就是面对一堆陌生的技术词汇。这些词如果出现在现实生活中,你可能知道它的意思,但把它放在技术领域,你就懵了,这是因为你想多了。其实很多技术领域的词汇是模拟现实的,就是借用了现实的用法。
比如 Container 这个词,在现实中它表示的就是一种装东西的容器,一个杯子,一个盆子都可以装东西,所以都可以看成是个 Container。在技术领域,这个词表示了很多东西,可能指的是一个 HTML 标签,一个 Flutter 的小部件,一个运行软件的容器,一个装了很多软件服务的东西。不过它出现在哪里,它的本意跟现实中的意思是差不多的,指的就是一个可以盛东西的容器。
再比如 Stack 这个词,它在现实中指的就是 “A stack of things”,一叠,一堆,或者叫一摞东西。这个词如果出现在软件开发上面,比如它可能指的是一种数据的类型。别想太多,Stack 在这里还是有一摞的意思,只不过这里指的就是一摞数据。
先考虑一个现实场景,你把一些盘子一个一个地摞在一起,就得到了一摞盘子。想一下这摞盘子的特点,就是我们只能把新的盘子摞在所有这摞盘子的最上面(push)。要从这摞盘子里取走一个盘子,一般也只能从这摞盘子的最上面取走一个(pop)。这其实就描述了 Stack 这种类型的数据的特点。我们把数据一个一个的摞到一块儿,新放进来的数据会在所有数据的最上面,拿走数据的时候,拿走的也是这摞数据里的最上面那个。
所以,遇到一个陌生的技术类型的词汇,首先可以把它跟现实的用法做类比。当然还是会遇到很多无法类比的词汇,比如 Git ,在软件开发领域,它指的可不是 “浑蛋”,而是一种源代码管理工具或者叫版本控制工具。这时候要做的是不要抵触,这些名词被发明出来不是为了唬人的,而是在开发者之间建立的一种沟通的语言。认识一段时间以后,一切都会变得和谐自然。
学会自学
至今我学到的所有技术相关的知识,除了五笔打字是在学校里学的以外,其它都是通过自学获得的。我也听说有很多开发者都是自学的,自学可能是技术领域的一种文化。因为这个领域变化很快,我们需要不断地给更新自己的知识,给自己打补丁,添加新的功能,所以自学也是唯一可行的办法。
谨慎地考虑参加培训学校。你可能准备花两三万用半年时间在一家培训学校让你快速成为一名开发者。我觉得不要太依赖培训学校,要尽早学会自学,这是开发者必备的本领。如果你是那种必须得有人培训才能学习的人,我建议在去之前先把基本的东西学一下,比如程序语言的基本语法,基本的工具,比如 Git(源代码管理)。这些东西要是去培训学校学的话就太浪费了。而且你要目标非常明确,知道去学校要学什么,而不是幻想着只要进去转一圈就什么都会了,这种事情永远都不会发生。
参加一些线下活动也是比较好的学习进步的方法。技术类的社区格外活跃且友善,你所关注的技术门类一定会在线下举行一些活动,不过一般都在发达的城市举行,但也没啥,高铁很方便,就当旅游了。如果你幸运地生活在一线城市,那就再好不过了。
准备学习资料
图书,文档,视频。自学的话,就这三种形式的学习资料,获取的方式是通过搜索引擎。一开始你可能会更喜欢找一本图书,比如学 JavaScript,就找一本厚厚的 《JavaScript 权威指南》,学 Git ,就买一本厚厚的《Git 权限指南》。图书其实会给我们一些错觉,首先你会觉得一本厚厚的 “权限指南” 里面一定有你需要的所有内容,有了这本书,就有了学会 JavaScript 语言的可能性。另一面你又会想,我靠,学个 Git 工具需要看 500 页的书才行吗?放弃!
图书里面一般会有很多废话,因为出版社一定有要求,书不能太薄,字数越多越好。
还有人可能喜欢把书捧在手里的那种沉甸甸的感觉,要是捧个文学小说之类的书找找感觉还行,或许在咖啡馆,地铁,公交上故意露出书的封面给对面的女生/男生看,显得我们很文雅。但你捧本技术书,封面一般都不太好看,所以除了沉真的没有其它的感觉了。
如果你能找到一本能看着舒服的书,那你很幸运,其实能看得下去就已经是非常好的书了。最好选电子书,技术类的纸制书是非常浪费的,不能做笔记,不能搜索,又不能复制粘贴。而且出版周期很长,所以书里面肯定会包含些过时的内容,纸制书又不能及时更新。将来应该会出现更多更敏捷的电子书出版商,可以做到快速出版及时更新,而且敢出只有 25 页内容的书。
我经常会在找书上花很多时间,很多又是只看了几页就不能继续下去了。转了一圈最后发现,其实官方的文档可能写的更清楚,更容易理解所学的东西。在学习前端开发框架 React.js 的时候,我就深有这个体会。不要被图书的可能提供的完整性所迷惑,初学者要的可能不是完整,而是快速地理解,这是什么,它是怎么工作的,我能拿它做什么。
当然如果你能幸运地在初学某样技术的时候,找到了精心制作的视频教程(比如宁皓网的视频教程:),那就更好了。视频是最容易理解的一种形式。视频内容要简单,直接,没废话。把技术教学类的视频做成娱乐节目应该不是什么好想法。
像个傻瓜
在自学的时候,我经常犯的错就是太贪心,还有就是太早有自己的想法。初学某样东西,因为我们不可能对它有一个全局的认识,所以从哪里开始你都会觉得有问题,都觉得不够,不全面,肯定还有更好的。看着这本书,想着另一本,然后又觉得文档不错,又可能想再看看这个视频。如果我来回频繁切换不同的学习资料,基本上什么都学不会,而且感觉非常疲惫。
初学者应该先把自己的想法放一放,像个傻瓜一样,跟着你现有的某一个学习资料去做练习,上面说让干嘛就干嘛,一开始自己的想法越少越好。举个例子,比如视频里面说要创建一个表示文章列表的数据,名字叫 posts,你觉得这名字不好听,非要换成 articles,entries,这种尝试通常都没什么意义,不值得浪费思考能量。
跟着内容作者的思路,你得知道他在制作内容的时候也花了很多时间思考,要用什么样的例子讲明白一个什么概念或方法。
瘾
学习的过程中大部分时间都很痛苦,一个小问题可能要憋很久才能解决,但又是什么让我们不断地尝试这件痛苦的事?我觉得学习可能是一种瘾,当我们学会一个什么东西的时候,大脑会给一点愉悦感作为奖赏。一个问题花的时间越久,解决之后获得的快乐也就越多一些。
我记得有天下午,终于学会了怎么用 Drupal 的一个模块去完成一个动作(Flag 模块触发执行定制的某个规则)。晚上骑着车子出去的时候,迎着微风,吹着口哨,哼着歌,感觉自己很帅很厉害。原来学习是一件很快乐的事儿,这种感觉在短暂的求学经历中从未获得。在中学的时候语文老师有个作文命题叫《学习是一种享受》,这篇作文还是个系列,连续写了一段时间。但那时我从来没觉得学习真的是一种享受。
切入点
我们会无数次地成为初学者,在初学某样新东西的时候总得有个切入点,就是决定到底要从哪里开始。一开始我们对这个主题(学习的对象)一无所知, 不可能知道到底从哪里开始是最正确的选择。所以杀到哪里就从哪里开始,不用想太多,不要求全面。知识面都是由一个点一个点连接形成的,没人能一下子学到一个面。你可能分散的学了某些看起来不相关的几个点,就这样学着学着,在某个时刻你会突然有种开窍的感觉,这就是你的点与点之间互相有了联系,形成了一个面。这种感觉非常神奇。
我现在做视频的时候就会想着,在每个视频里面只包含一两个点,每个视频的目标都极为明确。压缩视频时长,一两分钟就要完成传达的意图,让用户得到一两个点,十几个视频一组,一二十分钟就要解决某个问题,用户能得到一个知识块,十几组这样的练习,用户就能获取一面。
比如最近你可以尝试《Node.js 应用开发》这个系列,连续性与完成度也很高,完全能跟着写每一行代码。完成所有的练习,你会获得一个后端应用开发的知识面,也会伴随着很大的满足感。正在制作的《Flutter 移动应用》也值得一试。
动手
学习的人有几种类型:视觉型,听觉型,触觉型。我好像从来没有只看不做就学会了某种新的技术。有些视频是给你观念的启发,并不会真正教会你什么,但会让你有个印象,让你对某种事情产生兴趣,让你兴奋。这种视频只看只听就行,不用动手,因为也没什么可动的。如果你想真正学会个什么,那就必须要动手做,打开编辑器写几行代码,打开终端执行几行命令...
有时候我会想,我先只浏览一遍视频,有个大概的印象也行。不过看着看着就把自己看丢了,思维开始阻塞,完全听不下去,只感觉有人在“#¥%……%&%……&……&(!@#¥%……&*&”,然后就睡着了。我猜可能就是懒,脑袋根本不愿意组织视频中介绍的场景,也不想思考,就是懒。
动作可以帮助理解抽象的概念。有时候某些概念,方法,光看的话,不容易理解,一但动手做了某些相关的练习,就会有 “哦,原来是这么回事” 的感觉。我无法从科学的角度解释为什么会这样,我猜应该是动作与思维之间有很奇妙的关系,思维控制动作,动作也能影响思维。
遗忘,其实是存档
你开心的学会了一门技术,但中间隔了一段时间没机会使用,时间不用很长,几天就够了。几天以后你会觉得自己之前白学了,全都忘了。这种现象经常在我身上发生,但是我发现,那不是真的忘了,而是被大脑把那部分知识存档了。因为如果你理解了一样东西,基本上不太可能把它完全忘了。
把已经存档的东西重新再找出来需要花点时间。我会有一个当前状态,比如最近做移动应用相关的东西,我的当前状态就在移动应用这里。这时候如果让我解决个前端问题我可能要想一会,而且非常不愿意去想。我觉得应该可以同时提取几个状态,不过我还没有试过。用大块的时间集中解决一个主题,我觉得这样效率更高一些,当然代价就是把其它的东西全都存档了。
实际应用
有人说最好的学习方法就是在实际应用。自己有明确的目标,比如想开发个 App,这个 App 提供的功能你非常清楚,甚至 App 的标志,界面的样子都已经想好了。带着强烈的目标去学习,效率可能会更高。一个是因为有很强的学习意愿,因为你知道你要解决哪些问题,还有就是你不会学习多余的东西。当时要做宁皓网的时候,我并不知道什么是 Linux 服务器,也不懂开发,全都是现用现学。再做不出来就快没饭吃了,所以也是拼了。
大方向
我推荐一个大体的学习方向,供您参考。
- 学会设计 Web 界面。
- 第一门要学的程序语言:JavaScript。
- 学会基于 Node.js 的后端应用开发。
- 学会基于 Vue.js / React.js 的前端应用开发。
- 学会基于 Flutter 的移动端应用开发。
- 学会在 Linux 系统上搭建各种服务。
设计 Web 界面
先学会 Web 界面的设计。打开浏览器访问一个地址,显示那个页面就是 Web 界面,这个界面的组成主要用了三种材料,HTML,CSS 还有 JavaScript。用 HTML 组织界面结构与内容,然后用 CSS 去装饰界面的结构与内容。什么东西多长,多宽,用什么背景颜色,圆角,阴影,显示的位置等等,这些都要使用 CSS 控制。
界面需要一此交互功能,这些交互功能要用 JavaScript 语言来设计。比如按了这个喜欢按钮要去做什么,怎么验证用户在表单里输入的内容等等。我们给 Web 界面写的 JavaScript 代码,会直接在浏览器上运行,因为浏览器都有一个 JavaScript 引擎可以处理这种代码。
学习 Web 界面的设计是非常值得的,也是一开始就要学会的。以后不管做什么,多少都会用到你在设计 Web 界面时学到的知识。
程序语言
开发应用至少要学一门程序设计语言,我推荐你的第一门程序语言选择学习 JavaScript。这门语言的用途广泛,设计 Web 界面时需要用到,开发后端,前端应用的时候也会用到。你也可以用它开发桌面或者移动端应用。打开浏览器,新建一个标签,打开浏览器的开发者工具,就可以学习 JavaScript 了。当然最好是在编辑器上练习,比如使用 Atom 或者 VS Code 编辑器。
后端应用
后端指的是服务器这头,对应的前端指的是浏览器那头。在服务器上运行的应用就叫后端应用,我们经常说的网站就是一种后端应用,移动应用需要的接口也是后端应用提供的。后端会响应前端的请求,为前端提供需要的资源,处理前端请求或者发送的数据等等,这些都是后端要做的事情。
很多语言都可以开发后端应用,比如 PHP,Ruby,Python,Go,还有 JavaScript(基于 Node.js)。这里我推荐大家选择基于 Node.js 的后端应用开发。你不需要单独再学一门程序语言,因为你之前已经学了 JavaScript。Node.js 就是让你可以在服务器上运行 JavaScript 代码。
Node.js 起步学习的成本很低,在自己电脑上安装一个 Node.js 就行了,不需要配置复杂的开发环境,打开编辑器直接就能开始。Node.js 有非常活跃的社区,超级多的可用的功能包。大厂小厂都在用,阿里还专门出了个开源的 Node.js 应用框架叫 Egg.js。Uber 公司估值 500 亿的时候用的还是非常早期版本的 Node.js。所以开始不用太担心它的扩展性问题,当你真正需要担心的时候,那时候你应该已经非常强大了。
学习使用 Node.js 开发后端应用,你先要理解 Node.js 是怎么回事,然后去选择一款应用框架,基于框架去开发你想要的后端应用。
数据库
后端应用的数据处理能力要配合一种数据库,所以你还得再花点时间学会使用一种数据库, 比如关系型的数据库系统,像 MySQL / MariaDB / PostgreSQL,这些都属于关系型数据库。这种类型的数据库会使用一种叫 SQL 的语言来处理数据,你的后端应用可以连接到数据库,然后通过代码执行用 SQL 语言写的查询任务去处理数据库里的数据,比如把数据从数据库里提取出来,或者把数据放到数据库里存起来等等。
前端应用
开发 Web 应用,现在比较流行的做法是,把网站的前端还有后端分离开,后端只负责为前端提供数据的处理能力。这就需要你单独再去开发一个前端应用,这种应用的使用体验比传统的前后结合到一块儿的网站更好一些。一般我们会用 Vue.js,React.js,Angular.js 这种前端应用框架去开发这样的应用。
移动端应用
移动端现在主要是两大平台:苹果(iOS) 与 安卓(Android)。打算为 iOS 平台开发,就要学一下 Xcode 工具,Swift 语言。要开发安卓平台的应用,需要学一下 Kotlin / Java,还有 Android Studio 开发工具。这是原生应用的开发方法。成本会高一些,因为要学两套开发方法,还要维护两套应用代码库。
还有一种选择是开发混合型的移动端应用,就是应用里面包含了一些原本应用的功能,比如重力感应,相机等等。还有一部分是来自一个内置的浏览器(webview)。就是你可以把一个前端应用,套上一个移动应用的壳子,打包成一个能安装在 iOS 与 Android 平台上的应用。比如 Cordova 就能做这件事。
我们也可以选择另一种创建原生应用的方法,比如基于 Google 的 Flutter 去开发。一套代码库,生成两种平台的原生应用。Flutter 应用要使用 Dart 语言编写,所以多少还是要学一下这门语言,不过如果你有 JavaScript 语言的基础,可以很快理解并使用它去开发。Flutter 提供了大量的界面组件,可以让我们很快开发出漂亮的 iOS 与 Android 原生应用。
搭建服务
这里说的搭建服务主要是为应用的后端,比如后端应用的 Web 服务,数据库服务等等。我们要把在本地写好的后端应用,放到远程的服务器上去运行,这样才能让所有人使用我们开发的应用。这些服务一般要运行在 Linux 操作系统上。阿里云,腾讯云都会提供这种远程服务器。
Linux 有很多发行的版本,比如 CentOS,Ubuntu 等等。不同的发行版都有各自的一些特点。选择使用哪一种发行版本都可以,你只要能理解其中的一种就行。在服务器上运行的 Linux 操作系统不会给你提供图形界面,也就是你要做的所有的任务都必须通过命令行界面执行命令来完成。这种工种方式需要适应一阵子,但是这也是非常值得做的事情,也是必须要掌握的一门技术。
总结
自学绝对不是一种特别容易的事情,但又充满了乐趣。根据自己的习惯构建出一套适合自己的自学方法,你将无法阻挡。希望宁皓网能成为你自学方法的一个组成部分。
评论
痛并自学着
6 年 2 个月 以前
皓哥这些都是经验之谈,获得自学能力,培养自学习惯,连点成线,设定好目标和衡量方式,获得一些正反馈支撑自己……
受益匪浅,感谢~
6 年 2 个月 以前
感觉自己和皓哥的是同一类人,一切全靠自学,我是从UI设计转前端开发的,此外还对游戏开发、游戏动画、3D建模和动画、视频编辑等方面有很浓厚的兴趣,但都只是皮毛,看了皓哥Node课程突然觉得精通一门后端语言真的很有必要。
6 年 2 个月 以前
皓哥,想学习c++和c# 开发桌面端的软件 ,有没有好的学习方法和建议?
6 年 1个月 以前
感谢皓哥!
6 年 1个月 以前
非常棒、有价值的经验!多谢皓哥
5 年 10 个月 以前
谢谢啦 :)
5 年 10 个月 以前