Matrix是少数派的全新产品,一个纯净、小众的写作平台,我们主张分享真实的产品体验,有实用价值的互联网领域经验、思考。欢迎忠于写作,喜好分享的朋友参与内测。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
本文内容仅代表作者本人观点,文章对标题和排版略作修改,原文链接。
在上一次在少数派发表的文章 《2016,一个独立开发者的心路历程》 中,我讲述了我成为独立开发者的故事,从评论来看,获得了不错的认可,在这里谢谢大家。我收获了不少关于产品的评价,也收获了很多关于我的评价,很多读者评价我是一个有执行力的人。还有不少的读者给我发邮件,微博留言表现出自己想学编程,想像我一样成为一个独立开发者。那么这篇文章我将会从学习方法上讲述一下怎么学习编程这一个技能。
对编程的理解
看了看问我问题的人的邮件,问的问题都是「我是如何在短时间内快速的完成自学的?」「学习编程很难嘛?」这样的问题。在这里我要说明一下,我并没有在短时间内快速完成自学,从我学编程的那一天到我第一个产品登录 Google Store,少说也要一年时间。
在去年暑假我找到了一份 Android 开发的实习,中间隔了两年的时间。在一开始,我学习也是磕磕绊绊,走走停停,并不是连续的,有时候好几个月都不带动的,但是,这么长时间,我坚持下来了,我并没有一直不动。就和弹钢琴一样,看着别人在台上那么风光,他在台下吃了多少苦是不会有人知道的。学好一个技能,最重要的还是坚持。
学什么语言 & 看什么书
相信这两个问题困扰了很多的小白,世界上那么多编程语言,C、C++、Java、Python、R、Swift 等等等等,数都数不清,所以经常会有人问我该学习什么语言,其实这个问题要是直接问出来的话根本不能回答,那么多语言学哪个不是编程呢?就像在问:「我要出国,应该学哪一门外语?」
在学习之前,首先要有个目标,学习编程是为了什么?是为了做网站?开发 Android?开发 iOS?还是制造出终结者那样的人工智能?在我学习的初期,我知道我要做一个 Android 开发者,所以我选择 Java 作为我学习的语言,因为 Android App 由 Java 代码写成。这样一来,学什么编程语言就明确了。
至于看什么书?这样的问题就更天真了,每过一段时间就有各种人问我这样的问题,市面上那么多书,我都一个一个看过?反正都是零基础,买哪一本不是学习新知识,还怕书上讲的是错的不成。现在书店里的书任何一本书都能带你入门,随便买一本回去看吧。等到你把那本书看完并且入门就会发现,书店里那么多书,只是换了个封面。
在这里插个干货吧,以前写的一篇文章: 《送给想学编程却又不知道选择什么语言的你》
忠告:
虽然上面我说了,通过自己的目的来选择学习什么语言。但是我在这里要说一句,如果你是零基础的话,我非常不建议你将开发 iPhone App 作为第一个目标。
iPhone 开发几年前的主要语言是 Objective-C,个人觉得语法很不友好,不适合初学者。虽然 Apple 发布了 Swift 语言作为 iOS 的下一代开发语言,Swift 很简单,代码很友好,很简洁,但是不适合用来入门,很可能你写出来点成果但是编程基础还是一塌糊涂。并且 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 的坑我早都弃了。
可以看到底下有定位的地址,这个是我直接请求了百度的 API,我把我的经纬坐标发过去后百度就能给我返回当时的地址。多方便。
之后加进来了一个水印相机的功能,可以把这个地址弄成水印放到照片里。发布后很多朋友告诉我他们启动相机后 App 会直接崩溃。当时我就很纳闷,以为是因为对方是个 Android 5.0 吧,新系统不兼容?因为我的手机上并没有出问题。
后来想通了,是因为他第一次使用而且在室内,GPS 还没有获取到坐标,所以 App 根本就没有当时的地址,当时编程时候的逻辑是启动相机的同时读取取这个地址,因为地址还没有获取到,而我又没有做处理,然后就崩溃了。这个小错误我在现在根本不可能犯的,当时还是太年轻没有经验。
编写的项目多了,自然就有很多经验,知道怎么样可以预防卡顿,在什么情况下 App 可能会内存溢出,如何去减少网络请求的负担,同时你更成熟的逻辑思维也提高了产品的稳定性,不会随随便便因为编码时候的思考不周全而卡退。
在这里不过多赘述了,经验这种东西,我讲述我的是没有意义的,只有有一天亲自才到这个坑才会有所记忆。
有了各种经验,才有潜力去设计出一个拥有良好用户体验的产品。
学好英语和数学
学好英语,这个没啥说得了吧,查文档,Google,这些都要一定的英语水平。国内的那些网站的文章我真的是不敢恭维。有的东西不会 Google 一下第一个就是,百度半天都搜索不出来。英语真的是很重要,在学习 Swift 的时候我从头到尾都几乎没看过中文的东西。
学好数学,如果是初学者的话,这个有些遥远,不过我举个例子吧。
在少数派中,很多人玩 Workflow,(其实编写这些 Workflow 的人就具备编程的潜力了)。
比如这篇 《技巧:利用 Workflow 显示附近的免费 Wi-Fi》
作者通过 Workflow 调用了聚合数据的 API,然后 API 就直接返回了附近的 Wifi 名称。
在我的 Flat Weather 中有着相似的功能。自动定位获取天气。
同样,我的天气 App 调用了一个 API 然后 API 返回了我的位置,只不过,这个 API 是我设计的。从下图中可以看出,我请求时候填入我的坐标,精度 53.383,维度 -1.47 之后请求这个地址,服务器就会返回我的位置。
有没有想过这背后的原理?假设我数据库中有 9000 个城市的精度纬度,我提供一个经纬度如何知道我离哪个城市比较近呢?用初中学过的知识能大概想出来,用两点间距离公式。分别算出这 9000 个城市的坐标与你坐标的距离然后排序,最小的一个就是。
这样做是可以的。但是要是数据库中有十万个城市呢?同时又有一千个人在请求这个API呢?服务器真的算的过来这一亿个距离?所以这个算法必须要经过优化。在这里不细说了,以前写过一篇博客: 《周围的餐馆有哪些?GeoHash 算法》。
所以说学好数学也是相当重要的,尽管短期内难以体现数学和算法的重要。编程,重要的不是语法,是思维。
硬件需求
电脑
既然是在少数派发文就难免会谈到硬件,每天网站上都有很多人在谈论自己使用 MacBook 安排时间,使用 iPad Pro 提高生产力等等一些。肯定会有人问,学编程要配一个高档的MacBook Pro 吗?
如果你是个零基础的读者,我的回答是不要,我开始学编程的时候使用的是我妈淘汰下来的一台 IBM ThinkPad R50, 1.6GHz 奔腾单核心处理器,我只有用别的程序才会很卡,跑我写的程序完全没有压力。永远不要担心你编写的单线程小程序会让一个四线程处理器的电脑卡死,不可能发生的,不要担心一台老旧一点的电脑会影响你的效率。在没有确定能不能坚持下来之前,没有必要为了学编程去购买一台高配置电脑。
在我开始编写我的博客 App MikeTech 的时候,使用的是一台 ThinkPad X220,同样是一台淘汰多年的电脑。经常带着他去旅游,晚上写点代码。
是的就是这样,没有高档的双显示器,没有拉风的机械键盘(我到现在还没有过机械键盘),但是,没有任何影响。
关于 iPad
对于编程这一学科,电脑才是第一生产力,我甚至不鼓励去使用 iPad 看书,效率比较低下,因为要来回翻阅。并且在学习的时候我更不鼓励去记笔记,把函数名称什么的都抄在本子上,把源代码都抄在本子上,这样是没有任何意义的,把大把经历放在记忆语法上是非常不值得的,在电脑上写项目的时候手打两遍就记住了。没有必要去为了记忆几个语法而花费大量时间手写笔记,第二天你的编程语言出新版本了指不定有的笔记就报废了。
笔者初学时候从未记过笔记,都是靠练习来记忆的。把大把时间放在设计软件的整体架构和逻辑上才是重点。
因为以前看过别人的文章,用 iPad 跑代码,这个是我最不推荐的,用 iPad 打代码肯定没有直接用电脑来得快,现在的开发环境都是带语法提示的,我在初学的时候使用及其自动化的开发环境,几乎任何地方都有语法提示,所以我初学时候几乎就没有特地的记忆过语法,而且现在看来没有什么影响。
不要想着把书存在 iPad 上没事等车的时候就看看,要想学习就去找一个稳定的学习环境,有想法的时候记录最快的工具永远是纸和笔。
成为独立开发者
独立开发者,会编程并不是唯一,笔者设计出来那么多 App,会编程并不是唯一的能力。在这一路上,设计,用户交互,这些往往是我最关注的。没有这些能力,编程再强,也设计不出来优秀的 App。
认识我的读者都知道,我在第一次少数派上发文是这一篇 天气应用 Flat Weather 的设计历程 ,在那里,我介绍了我新开发的天气 App——Flat Weather。
和我预估的一样,那篇文章成了 Matrix 精选,之后再大年三十那天上了少数派的首页。当天就有 500 多的下载量,虽然这不是我设计的第一个 App。但是设计后端服务器却是第一次。我很高兴我的服务器能够承受那天 500 个人的使用量并且没有出任何问题。
当时这个 App 还不是很健全,没有中文,没有自动定位,没有通知中心插件,不支持 3D Touch。这些东西在三周前刚发布的时候我还不懂,可是现在都一一支持了。作为独立开发者,既然那么多人选择了使用我的 App,那么我肯定会为我的产品负责。在上线之后不断添加新功能,前天我更新了服务器端的算法,使得响应速度大大提升并且节省了更多资源。昨天有用户发来邮件希望我支持 3D Touch 支持,今天我已经学会了适配 3D Touch 并且提交了新的版本,尽管我用的 iPhone SE 而且从来没用过 3D Touch。
独立开发者就是这样一群人,希望每一个使用自己的 App 的人满意,尽管实现这个有些困难。还记得在 App Store 上有人评论我的 App 字体难以辨认并且很卡,虽然我不知道哪里卡顿,幸好只是少数人这样。我得到的更多是努力与支持。
尾巴
虽然标题是编程入门,通篇却没有一行代码,可以说这篇文章并不算一篇干货,可是却是我想表达的,想要学会一门技能,足够的付出以及坚持是必须的。没有什么捷径。比较枯燥,都在讲述我是怎么学的,没有讲什么 Omnifocus,没有出现华丽的记笔记方法,没有推荐编程用什么电脑,没有高档的工作台面和双显示器,表面上都是一些虚伪的东西,但却是我真实的体验,是我想讲述给每一个想要成为开发者的小白的,希望你们有一天可以开发出来你们自己的产品。
关于数字生活
这篇文章的撰写一气呵成,总共使用了六个小时,也没有使用什么高大上的 Ulysses,直接在少数派的后台页面写成,可能文中有较多的错别字,实在是来不及改了,第二天还有课,请见谅。
之所以没有在少数派没有写关于我的数码生活硬件使用之类的文章,是因为和其他作者比起来我还是太简约了,只会用 iPhone 买东西刷 Apple Pay,只会用 iPad 看视频,从来不用 GTD 工具管理日程,因为我觉得每天就那点事用脑子记完全够了;写作的时候也不用什么高大上的工具,能打字出来就行,就连上课记笔记都是把讲义打印出来用笔记在上面。最经常使用的印象笔记也从来不整理。
PS:下一篇文章就写一写我对生产力工具的感觉吧,看看平时作为一个学生兼开发者都使用什么工具。