在上一次在少数派发表的文章《2016,一个独立开发者的心路历程》中,我讲述了我成为独立开发者的故事。从评论来看,获得了不错的认可,在这里谢谢大家。我收获了不少关于产品的评价,也收获了很多关于我的评价,很多读者评价我是一个有执行力的人。还有不少的读者给我发邮件,微博留言表现出自己想学编程,想像我一样成为一个独立开发者。那么这篇文章我将会从学习方法和对编程的理解上讲述一下怎么学习编程这一个技能。

看了看问我问题的人的邮件,问的问题都是:“我是如何在短时间内快速的完成自学的?”、“学习编程很难嘛?”这样的问题。在这里我要说明一下,我并没有在短时间内快速完成自学,从我学编程的那一天到我第一个产品登录Google Store,少说也要一年时间。在去年暑假我找到了一份Android开发的实习,中间隔了两年的时间。在一开始,我学习也是磕磕绊绊,走走停停,并不是连续的,有时候好几个月都不带动的,但是,这么长时间,我坚持下来了,我并没有一直不动。就和弹钢琴一样,看着别人在台上那么风光,他在台下吃了多少苦是不会有人知道的。学好一个技能,最重要的还是坚持。

学什么语言 & 看什么书

相信这两个问题困扰了很多的小白,世界上那么多编程语言,C、C++、Java、Python、R、Swift等等等等,数都数不清,所以经常会有人问我该学习什么语言。其实这个问题要是直接问出来的话根本不能回答,那么多语言学哪个不是编程呢?就像在问:“我要出国?应该学哪一门外语?”

在学习之前,首先要有个目标,学习编程是为了什么?是为了做网站?开发Android?开发iOS?还是制造出终结者那样的人工智能?在我学习的初期,我知道我要做一个Android开发者,所以我选择Java作为我学习的语言,因为Android app由Java代码写成。这样一来,学什么编程语言就明确了。

至于看什么书?这样的问题就更天真了,每过一段时间就有各种人问我这样的问题,市面上那么多书,我都一个一个看过?反正都是0基础,买哪一本不是学习新知识,还怕书上讲的是错的不成。现在书店里的书任何一本书都能带你入门,随便买一本回去看吧。等到你把那本书看完并且入门,就会发现,书店里那么多书,只是换了个封面。

忠告:

虽然在前面我已经提到了,根据自己的需求来选择学习哪种语言是很重要的。但是在这里,我想强调一下,如果你是编程新手,我并不建议你把开发iPhone应用作为入门目标。几年前,iPhone开发的主流语言是Objective-C,个人认为其语法并不友好,不太适合初学者。然而,Apple推出了Swift作为一种新的iOS开发语言,它简单、易读、简洁,但不适合作为入门教材,因为即使你能写出一些代码,你的编程基础可能依然很薄弱。此外,Swift语言更新非常迅速,从Swift 2升级到Swift 3的过程中,有很多语法都发生了变化。如果你现在购买的教材是Swift 2版本的,实际运行时可能会出现很多错误。所以,请不要选择这类新兴语言作为入门教材。

多实践

在编程初期,多加练习是非常必要的。仅仅阅读教材是远远不够的,你可能看了也不会记住语法规则,记住了也不知道如何应用。死记硬背并不能帮助你真正掌握编程技能。在这里,我想分享一下我写的第一个有点实用的程序:2014年高考前几天,我出于好奇开始学习Java。高考结束后,虽然大部分时间都是出去玩、和同学去网吧、出去旅游,但我还是会抽空看看书。经过两个月的努力,我开发出了一个程序:这个程序可以读取一张图片并将其转换为一个记事本文件。

听起来可能没什么用处,但正是通过编写这个程序,我掌握了基本的思维方式,如读取图片、计算灰度值、生成与灰度值对应的字符以及输出文件。这些都是教材上不会教你的,教材只会告诉你如何读取文件、如何写入文件等基本操作。至于如何组合这些操作,完全取决于你自己。这就是编程的魅力所在。

后来上了大学之后,由于全英文授课,论文也需要用英语撰写。为了方便查询生词,我还专门开发了一个词典程序。这个词典窗口很小,可以一直置顶。当你遇到不认识的单词时,只需复制粘贴到搜索框中,程序就会读取剪贴板中的文本并显示其含义。这个程序至今仍在使用。通过编写这个程序,我对网络通信方面的知识有了初步了解,逐渐对API的概念也有了一定的认识。

编程只是一个工具,用来创造什么完全取决于你自己的兴趣和创意。人们不会因为你会使用铅笔就夸你厉害,只有当你能用铅笔画出美丽的画作时,才会受到赞誉。因此,关键在于发挥自己的创造力和自学能力。

作为一个开发者,自学能力是最重要的能力。只靠书上的知识是完全不够的。那么厚的一本书,讲的知识都是基础的不能再基础了。把那本书啃完只能算个入门。其实那些书上讲的东西都在那个编程语言官方的文档上。那个文档就像一个字典,记录着那个语言中所有的东西,书上其实只是列举了一些常用的,所以说看书是远远不够的。

遇到不会的就上Google去查,要么就去翻一下文档,比如上一个图片转换字符画的程序,就要有一个读取每个像素颜色的功能,书上根本就没有,当时是我自己看文档找到的。知道了这些就算遇到了问题也能自己解决了,在自己编写项目的时候遇到问题自己去解决,不要遇到个什么小问题就去求助别人,没有人比你自己更了解自己的项目。等你对这个编程语言慢慢的熟悉了,就可以去编写更大的项目了,我当初选择进入Android开发,又买了本关于Android开发的书看,之后开发出了我的博客app,维护至今。

关于对编程书的一点建议:如果是第一次编程,那么购买的书可能要通读一遍,看看这一门语言是怎么用的,代码应该怎么写,逻辑是什么样的,读完那本书让你对编程语言会有一个大概的认识。在我购买Android开发的书籍后我并没有通读,毕竟没有人会去通读一本字典,我的做法是把目录看了一遍,这样会对Android有一个大概的理解,知道能用代码去实现什么功能。比如上图的文章列表,在Android里面这种视图叫ListView,尽管我不知道怎么用,但我知道可以使用ListView来实现这种列表。之后编写这个app的时候,直接去找ListView的使用那一章节,然后学完就写。这就是学习方法。

到了后来接触了iPhone开发,开发语言为Swift,其实在那之后我就再也没有买过教编程语言的书,因为已经没有必要了,所有的语言都一样:变量,选择语句,循环语句....只是语法有不一样,再买一本书的话简直在浪费钱。直接去看看Apple给的官方导引就好,了解下这门新语言的特性,知道他能干什么。认识下下iOS的各种视图控件叫什么。然后直接开写,遇到困难再Google。

经验的累积对编程语言的掌握只是一个开始,之后要经常去使用他。多去开发点有用的东西来积攒经验。举一个很简单的例子。我的第一个试手的App,是一个指南针应用,是我学习Android开发后两天之后写出来的。请不要吐槽这个app的设计了。。。这个app的坑我早都弃了。

在开发过程中,我遇到了一个问题:当我加入了一个水印相机功能后,很多用户告诉我他们的应用程序在启动相机时会直接崩溃。当时我感到很困惑,以为这是因为对方使用的是Android 5.0系统,新系统不兼容吗?因为我的手机上并没有出现这个问题。后来我明白了,原因是他们第一次使用这个功能,而且在室内,GPS还没有获取到坐标,所以应用程序根本就没有当时的地址信息。当时编程时的逻辑是启动相机的同时读取地址信息,但由于地址还没有获取到,而我又没有做处理,导致应用程序崩溃。这个错误在我现在的编程经验中是不可能犯的,那时我还太年轻,缺乏经验。

随着项目经验的增加,我自然学会了如何预防卡顿、预测应用程序可能出现的内存溢出情况,以及如何减轻网络请求的负担。同时,我的逻辑思维也变得更加成熟,可以提高产品的稳定性,避免因为编码时的思考不周而导致应用程序崩溃。

在这里我就不再详细赘述这些经验了,因为对于每个人来说,只有亲自经历过这些坑,才能真正记住它们。有了这些经验,我们才有潜力去设计出一个拥有良好用户体验的产品。

学好英语和数学

学好英语的重要性就不言而喻了。在查阅文档、使用Google等过程中,都需要一定的英语水平。国内的一些网站文章质量参差不齐,有些内容不会用Google搜索一下根本找不到答案。英语真的很重要,我在学习Swift的过程中几乎没有看过任何中文资料。

学好数学对于初学者来说可能有些遥远,但我可以举一个例子来说明。在少数派中,很多人喜欢使用Workflow(实际上编写这些工作流的人已经具备了编程的潜力)。作者通过Workflow调用了聚合数据的API,然后API直接返回了附近的Wifi名称。在我的Flat Weather应用中也有类似的功能:自动定位并获取天气信息。同样地,我的天气应用调用了一个API,该API返回了我的位置信息。你有没有想过这背后的原理?假设我的数据库中有9000个城市的经纬度信息,我提供一个经纬度坐标,如何知道离哪个城市最近呢?利用初中学过的知识,我们可以大致推算出结果:使用两点间距离公式计算这9000个城市的坐标与你坐标的距离,然后排序,最小的一个即为最近的城市。

这样做是可以的。但是,如果数据库中有十万个城市呢?同时又有一千个人在请求这个API呢?服务器真的能够处理这亿万个距离吗?所以这个算法必须要经过优化。在这里不细说了,以前写过一篇博客: 周围的餐馆有哪些?GeoHash算法

因此,学习好数学也是相当重要的,尽管短期内难以体现数学和算法的重要性。编程,重要的不是语法,而是思维。

硬件需求

电脑

既然是在少数派发文就难免会谈到硬件,每天网站上都有很多人在谈论自己使用MacBook安排时间,使用iPad Pro提高生产力等等一些。肯定会有人问,学编程要配一个高档的MacBook Pro吗?如果你是个零基础的读者,我的回答是不要,我开始学编程的时候使用的是我妈淘汰下来的一台IBM ThinkPad R50, 1.6GHz奔腾单核心处理器,我只有用别的程序才会很卡,跑我写的程序完全没有压力。

永远不要担心你编写的单线程小程序会让一个四线程处理器的电脑卡死,不可能发生的,不要担心一台老旧一点的电脑会影响你的效率。在没有确定能不能坚持下来之前,没有必要为了学编程去购买一台高配置电脑。

在我开始编写我的博客app MikeTech的时候,使用的是一台ThinkPad X220,同样是一台淘汰多年的电脑。经常带着他去旅游,晚上写点代码。

是的就是这样,没有高档的双显示器,没有拉风的机械键盘(我到现在还没有过机械键盘),但是,没有任何影响。

关于iPad

对于编程这一学科,电脑才是第一生产力。我甚至不鼓励去使用iPad看书,效率比较低下,因为要来回翻阅。并且在学习的时候我更不鼓励去记笔记,把函数名称什么的都抄在本子上,把源代码都抄在本子上,这样是没有任何意义的。把大把经历放在记忆语法上是非常不值得的,在电脑上写项目的时候手打两遍就记住了。没有必要去为了记忆几个语法而花费大量时间手写笔记,第二天你的编程语言出新版本了指不定有的笔记就报废了。

笔者初学时候从未记过笔记,都是靠练习来记忆的。把大把时间放在设计软件的整体架构和逻辑上才是重点。因为以前看过别人的文章,用iPad跑代码,这个是我最不推荐的。用iPad打代码肯定没有直接用电脑来得快,现在的开发环境都是带语法提示的。我在初学的时候使用及其自动化的开发环境,几乎任何地方都有语法提示,所以我初学时候几乎就没有特地的记忆过语法,而且现在看来没有什么影响。

您好,要成为独立开发者,需要具备扎实的技术技能和广泛的知识,这包括掌握编程语言、开发工具和框架,并不断学习和跟进技术的最新趋势和发展。此外,还需要明确自身能力范围、合理规划、专注工作、战胜拖延、有效划分任务和社交网络建设等关键要素 。

这篇文章的撰写可谓是一波三折,从构思、写作到修改,总共历时六个小时。在文章完成之际,我并没有选择使用那些高大上的Ulysses等写作软件,而是直接在少数派的后台页面上敲下了这些文字。也许是因为时间紧迫,文中有较多的错别字尚未来得及修改,还请谅解。

之所以没有在少数派撰写关于我的数码生活硬件使用之类的文章,是因为与其他作者相比,我觉得自己还是过于简约了。我只用iPhone购物、刷Apple Pay;只用iPad观看视频;从未尝试过使用GTD工具管理日程,因为我觉得每天的事情并不多,用脑子记就足够了;写作时也不需要什么高端工具,只要能打字就行。甚至在上课记笔记时,我都是将讲义打印出来,然后在上面做简单的笔记。至于经常使用的印象笔记,更是从未进行过整理。

当然,这并不意味着我对这些工具毫无兴趣。事实上,下一篇文章我打算分享一下自己对生产力工具的看法,以及作为一个学生兼开发者,我平时都使用哪些工具。希望通过这次分享,能够给大家带来一些启发和实用的建议。