专栏名称: 程序猿
本微信公众号:imkuqin,为程序员提供最新最全的编程学习资料的查询。目前已经开通PHP、C/C++函数库、.NET Framework类库、J2SE API查询功能。
目录
相关文章推荐
51好读  ›  专栏  ›  程序猿

Github上安卓榜排名第2的程序员教你如何学习

程序猿  · 公众号  · 程序员  · 2016-10-03 23:10

正文

来自:峰瑞资本(微信号:freesvc)




    

文章作者:代码家(微信 ID:daimajia_share)
已获转载授权

软件早已吞噬整个世界,程序员是关键角色。过去 40 年中,许多伟大的公司都由程序员缔造,比如比尔·盖茨、拉里·埃里森、马克·扎克伯格、伊隆·马斯克。


一本哥哥不太关心的 Visual Basic 课外书,代码家如获至宝,他接触了简单的代码,这让他进入到一个全新的世界。从那之后,代码家一直享受着用代码解决问题过程中产生的精神愉悦,并成长为一名专家级程序员。用行话说,黑客。现在,代码家是 Github 上的开源大牛+红人,拥有 12.8k 的 followers。


这篇文章里,代码家分享了自己如何从第一天接触程序,一路学习、实践、创造的故事。他还总结了技术学习过程中的误区和突破方法。





代码家, GitHub 开源及技术分享爱好者,开发过多个流行 App,也参与过多个技术社区的构建。



每天,都会有人在微博上私信问我关于学习和成长方面的问题。我一般不会轻易回复这类问题,毕竟每个人的情况都不一样:性格各异,对待事物的方式也不尽相同。我不能夸下海口说:“你看某本书,几个月就能如何如何”,我最多能够做的只是鼓励支持他们。其次,我也从不认为自己已经到了一个很高的境界上。让我去给别人做指导,当之有愧。

但是每次看到大家的私信,我发现很多人确实在学习上处在一种很痛苦、急需帮助的状态。最近我有时间,就想写写自己从第一次接触程序,一路颠簸学习到今天的故事和经验,希望对大家有所帮助。


以下为学习的 3 个阶段:


/ 01 /

第一阶段:消费者阶段


我在快上高中的时候,开始接触的程序。那会儿家里有一本 Visual Basic 的书,30 多页左右,也是家里唯一一本计算机类书籍。那是我哥学校发的一本课外书,他对计算机貌似没有什么兴趣,就一直堆在家里,无意中被我翻到。



▲ Visual Basic 是我进入程序世界的启蒙。


书里的程序格外简单,几行简单的英语代码,就能让计算机弹出一个对话框。当时我看到这样的内容,感觉简直神奇极了!我按照书里面的提示,尝试在老妈店里的电脑上一步一步敲下代码。当电脑弹出一个简单的对话框的那一瞬间,我感觉像是推开了新世界的大门,从此一发不可收拾。


实践完 VB 后,我又在小书摊发现一本《黑客 X 档案》。我特别佩服书里面各路黑客高深的入侵、木马、盗号,我努力学会那些技能,然后去跟朋友们炫耀,但一直都无法入门。因为这里面需要太多计算机的基础知识了,不是写个弹框,或者一般计算器水平的人能搞定的。

那会儿家里也没有人懂电脑,又处在小城市,连个电脑培训班都没有。


随即,我开始漫漫买书求学路。


一旦开始买书,就进入了学习的第一个阶段:消费者阶段。当个消费者其实是个挺轻松的事情,对着书本照猫画虎,一会儿就能跑起来一个看着很有趣的程序。那会儿,我疯狂地买各种书,但是由于周围没有人指导,买了很多类似 21 天xxx 系列的书,那会儿真的有这种书,我还抱有幻想,真的觉得 21 天后我就……


我现在回想起来,国内的图书市场简直恶劣到一定程度。很多高校,教师升职评比需要考察发表书籍情况,导致国内一大批烂书其实都是高校老师发出来的。我现在依然认为,国内 95% 的技术类书籍是不值得买的,除了像侯俊杰老师这种文笔很好的技术人以外。

很多技术作者总是做不到 “以读者能理解的顺序,而非自己认为的顺序” 写文章,坑害了不少对计算机有兴趣的同学。我一直很崇拜侯俊杰老师的另一个原因是他写的书,总是能把你最想了解的内容,如同庖丁解牛、深入浅出地解答出来。就拿 MFC 框架(MFC 是很早前的一个 Windows SDK 框架,现在用的很少了)来说,这是很复杂的一个框架。所有初学的人,都会问一样的问题:"这玩意儿是怎么工作起来的?!",但所有国产的关于 Visual C++ 的书,都避而不答,让你照猫画虎,就能弹出一个窗体。当初国内只有侯俊杰老师写的《深入浅出 MFC》一书,讲明白了 MFC 框架背后的一切。


▲ 虽然年代久远,但很多程序员对这本书很有感情


学完一些基础知识后,就进入了学习的第二个阶段实践者阶段阶段。所谓实践者,就是开始用自己所学,去开发程序,成为一名专业或非专业的码农。很多人的职业生涯,也就停留在了这个阶段,过上了小富即安的程序员的日子。


我从消费者阶段过渡到实践者阶段,大概用了三四年的时间,其实已经挺长的了。我一直都认为我是一只笨鸟,无意中起飞,却飞了很久的那种。


/ 02 /

第二阶段:实践者阶段


我真正开始实践,是在本科学校做的几个网站。


第一个做的是学校的匿名聊天系统,就是所有人都可以登录学校的站点,然后会通过匿名的方式,匹配一个异性,两人就可以开始聊天。当时用的 Asp.net 做的开发,配合 ajax + jquery,但由于当时技术太差,导致很多人聊着聊着就断线了,这个小产品不了了之。

第二个是用 PHP 给我们信息学院开发一个官网。在做这个网站的同时,我选修了一门叫《网络安全》的课程,教这门课的老师叫陈路。我曾当着老师的面儿,夸下海口:“我开发的官网,坚不可摧……” 陈老师知道了我做的网站,随即布置一个作业:"哪个学生能攻陷我们的官网,一个漏洞加五分。" 结果后来,有个同学用一个很通用的扫描工具,在他自己其实也不知道发生了什么的情况下,那个工具把网站内容都删除了……我在建设网站的时候犯了个超低级的错误:GET 请求可以删除数据,外加身份认证代码有误。


幸好,查看 Apache 日志的时候,我发现删除请求到来的前几分钟,Google 爬虫来过(那会儿Google 还能用),随即马上去 Google 的缓存里找回了所有的数据。


▲ Tips: 爬虫系统是找回数据的一个办法。


后来陈路老师被学校批斗了一顿,批斗的罪名是 “鼓励学生攻击校园网络”,我当时极力跟学校说明这个错误是我犯的,陈老师做的并没有错。我到现在还是很喜欢陈老师这种教学方法,毕竟实践出真知。


可能现在陈老师在教《网络安全》课程的时候,会以 "当年有个学生...." 作为开头,有时候想想也挺有意思的。


后来我花了很多时间学习与 Web 安全相关的知识。在写各种 Web 程序时,我都会最大程度地考虑安全问题。



▲ 这次经历强化了我的网络安全意识。


学校网站被攻陷后没多久,Android 出来了,我买了第一部 Android 手机,然后自己照着官方文档开始学习 Android 系统。我学习动力的源头,是我听说写 App 能赚钱。赚钱真的是学技术的很强的动力,我之前写网站零零星星地赚了六七千块钱,当时是同学里的小土豪。学会网站代码之后,我又把目光转到了刚出来没多久的 Android 上。

我当时设定了一个目标,写一个图片类 App,打算叫 “无尽画廊”,因为很喜欢 WeHeartIt 这个小众文艺图片网站。我计划利用正则解析图片地址,然后再把网站里的图片呈现在 App 上。我那会儿在 Java 和 Android 方面完全零基础。


我在入门学习 Android 的时候真的超级拼。早上 6 点起来,悄悄下床(不能吵着舍友),打开电脑开始研究加开发,折腾到早上 7 点半左右,和舍友一起去吃早饭,然后上课。中午回来也不午休,到快上课还在开发,晚上基本都会熬到 12 点左右。持续了 1 个月左右,我终于从零基础到开发出一个粗糙的 1.0 版本,发布到了国内的几个 App 市场。反馈不是很多,但都挺正向的。我决定继续开发 2.0 版本,还加入了广告积分墙的功能。我就这样超拼的持续了 3 个月左右。现在网上能看到的这个应用基本都是 2.0 版本。我从这个 App 里,也赚到了一些广告费,大概几百块。但是因为广告服务商倒闭了,钱到现在还没取出来,心痛……



▲ 为了写一个图片类的 App,我正式入门安卓。


持续更新那个 App 到快毕业的时候,我选择了保送到北师大。

大学毕业后的暑假,我去上海一家小公司实习,在这家小公司,我做了一个到现在来看依然很牛的功能。现在来看这是一个相当不错的 Growth Hacker 的案例(那会儿可没有增长黑客这个概念)。

实习所在的公司,做的是类似小米盒子的产品。当时做这一类盒子产品,最重要的当属内容,当时内容版权还处于蛮荒时代,大家纷纷解析优酷,土豆这类的网站,以最少的成本,盗用这些网站的带宽。简单点儿来说,就是做视频聚合。视频聚合最麻烦的就是提取视频的真实文件地址,这种功能能为所有的创业公司免去版权纠纷,同时解决带宽费用问题。

我去那家公司实习的主要内容,就是用 Node 语言做视频地址解析。我费尽功夫搞定了几乎所有的视频网站,各种黑科技都用上了:抓包、逆向、Headless Browser 等等。搞定所有网站后,勉强算是跟竞争对手站在同一起跑线。实习第二周的时候,已经有些没事儿干了,就在这会儿,我们公司有一个疯狂的想法出现了!



▲ 简单来说,Growth Hacking 是在产品层面 利用各种技术上的最佳实践,来驱动用户的增长


可能很多人还记得当年伟大的迅雷云播,解救了不知道多少位寂寞的少男。我们当时特别疯狂的想法就是要让我们的小盒子,能够流畅地播放用户从电脑上推送的任意种子文件,无需等待。在当时这种功能简直就是创举!

我抗下大旗,开始用代码模拟迅雷云播的全套流程。开发的过程十分艰难,得从不同平台的迅雷上抓包,寻找蛛丝马迹。优先从 Web 端模拟登陆和提交种子文件,这些都相对容易一些,最难的是如何提取到视频的真实地址。我花了大概一周时间,攻陷了所有的流程,然后公司买了 10 几个迅雷会员,又和各路 BT 网站开始合作,开启了浩浩荡荡的用户增长之旅。具体增长了多少新用户,其实我心里没有数,但是看见旁边的小朋友,每天都在加服务器,优化 Socket 连接数,我猜那一周得新增了 5 - 10 万用户,更为壮观的是,每到夜里,所有的迅雷账号里就瞬间塞满各种不可描述的日本电影,全部清空后,又被瞬间塞满。以至于后来,实习到第十七八天的时候,我的老板和 CTO 喊我过去,直接送了我 20 万期权,那感觉也是蛮爽的。后来微博上,这个功能也是火了一阵子,不过很快就挂了,起因是有用户在微博上 @了小米电视和迅雷,让他们跟我们学着点儿⋯⋯然后,不超过半小时⋯⋯服务就挂掉了⋯⋯不过挂掉没几天我就去帝都准备研究生报名了。

还有一件很爽的事,就是我上了研究生后的半年里,那家公司一直给我支付着工资⋯⋯每个月轻轻松松就有几千块钱零花钱⋯⋯再后来的后来,那家公司倒闭了⋯⋯



▲ 加入 AnimeTaste。

在上海实习快结束的时候,我认识了少楠,加入了 AT!(AnimeTaste),一个分享优质原创动画的小团队。我也因为这一段经历,从一枚野生开发正式晋升为一枚正规军,开发出了近百万用户量级的 App。少楠是一位非常优秀的产品经理兼设计师,我跟着他学到了很多产品知识和团队协作的技巧。AT!(AnimeTaste)组织到现在都是我爱的组织,大家虽然从事不同行业,但就跟亲人一样。每次聚会都是一年一度最嗨皮的日子,都是我经历过最真诚的聊天。从 AnimeTaste 再到 EverMemo(第三方印象笔记应用),我越来越感觉到了团队的重要性,见识到了优秀的设计师和 iOS 开发者。

这漫长的三四年都是我的实践者阶段。以上的诸多经历,也为我自己创业埋下了很多伏笔。


/ 03 /

第三阶段:创造者阶段


实践者阶段之后,我开始尝试创造,进入学习的第三个阶段——创造者阶段,这个阶段对我来说没有结束节点,就一直这么存在着。

我大致是在研究生一年级的时候,摸到创造者阶段的门梁。大三的时候接触的 GitHub,感觉是我学程序来,打开的第二个世界的大门(第一个,算是那个 VB 程序的弹框)。接触到 GitHub 之后,让我第一次开始学习和研究脚本语言( Python,Node,PhantomJS 等等),也是我第一次开始接触真正的生产工具(类似 Less,Sass 等等)。


我那会儿在研究生阶段,每个月有了公司发的几千块钱,也入手了人生第一台 iPhone:一台土豪金版的 iPhone5s。买 App 太贵便折腾起了越狱(现在都是买 App 了)。装了一款越狱后的 AppStore,在那个 Store 里面,在下载一个 App 的时候,有个超漂亮的进度条,我每次都会认真地盯着那个进度条,一边看,一边感叹,一边也暗许自己也要在Android 上实现这一套。这也是我开始第一次开发自定义组件的初衷,也是 NumberProgressBar (实现带数字进度的Android 进度控件) 诞生的最初原因。

啃下第一个自定义组件,对很多学习编程的人来说都是很痛苦的,我也一样。那会儿的 Android 组件少的可怜,我试图搞清楚更多更底层的东西,需要不断地看文档,看源码,读别人的代码,不断地尝试运行……每天超过 10 小时投入,折腾了一周左右,终于做出来了。照猫画虎式地写好文档,做好测试,小心翼翼地发布到 GitHub,然后发表到当时 GitHub Android 的分享社群里。地址在这里: https://plus.google.com/+daimajia/posts/d6DJhLhLn1c


▲ GitHub 简直是求学者的宝库,你会很期待明天的 Trending 榜单上会有什么新东西冒了出来。


再到后来的几个月,又陆续写了一些其他的库,发到 GitHub 上,其实我根本没想到会有那么多人去 Star,可能跟我 “下手” 比较早有关。

在创造者阶段,要努力创造那些没有的,源自你脑海里的东西,而不是别人安排给你的。努力做到开发的东西让更多的人用到,可以是一个 App,也可以是一个帮助人们提高效率的 Chrome 插件,还可以是一个简单的组件。创造,最能够挑战你对一个行业的热爱程度。

我从来不反对重复发明轮子。每一个新的轮子即便有一些小的改进,都是适应自然法则,优胜劣汰的。

就我身边人而言,我最崇拜的创造者是尤小右。他把一个小的 Framework,一点点地做大,再到做出国际影响力,真是个不得了的事情,也是很多技术人梦寐以求的事情。


/ 04 /

编程学习中的误区和突破方法


总而言之,如果你突然意识到自己这几年一直处在一个很稳定的状态中,没有提升,那你得想想自己是不是卡在了某个阶段,一直无法突破。想想自己该做些什么,才能突破到下一阶段去?我总结了一些在学习编程过程中存在的误区和突破方法。







请到「今天看啥」查看全文


推荐文章
经典短篇阅读小组  ·  以为要开始,却从未开始
8 年前
玩转手机摄影  ·  欣赏 | 乡间小桥的独特美
7 年前