把自己当成工具来解决问题 - freecodecamp 分享
简介
19 年毕业于信息科大计算机学院软件工程,字节跳动 iOS 开发工程师,负责西瓜视频 & 今日头条 iOS 客户端。沉迷于 Apple 生态圈的开源爱好者,业余时间参与维护 Vary app(曾冲入App Store 效率榜前 20),拿到了 WWDC19 学生奖学金,给本科学习画上一个圆满的句号。同时也是一名公路自行车运动爱好者(正在筹备环中国骑游),目前在学习口琴,准备给自己做的游戏用口琴吹出配乐。
编程对我的意义
结缘
我与大部分同学一样,大学之前完全没有接触过编程,甚至连编程应该在什么软件下进行都不知道,但也就是这样,当我用自己前十八年积攒下的压岁钱买下人生中第一台 mac 时,开机之前绕着看了半个多小时,之前从未见识过做工如此精细的笔记本,从那一刻开始我决定编程已经给我打下了特殊的印记,对于我来说这是一件很神圣的事。
当时我还没入学,用 QQ 跟远在北京学校里的一位学长,同时他也是我的师傅,我们就通过 QQ 语音的方式,学长在电话里从头开始教我下载 Xcode,如何创建工程文件,哪个按钮是编译,哪个按钮是运行等等,经过了将近四个小时,我终于在这台 mac 上敲出我的第一行代码 hello, world
。
这个过程给我印象特别深,我给它定义为了“304事件”,同时敲下的这行“hello,world”也是我与编程的结缘。
触动最深的一次
编程,或者说学计算机这个专业对我带来触动最深的一次呢,是我准备参加的一个比赛,这个比赛的全称叫《首届中国 iOS 应用开发大赛》,虽然说是首届,但也仅仅只有这一届,后续这个比赛就被合并了。
当时刚上大三初生牛犊不怕虎嘛,觉得自己什么都能做,就给自己开了一个非常庞大的题目,这个项目的核心是做荧光笔的识别,如果用正常的思路去做,会牵扯到很多 ML 方面的东西,时间上根本来不及,但又要出成果,就通过了非常原始的方法,用了一周的时间啃完了当时 3~4cm 厚的《OpenCV 3》开发指南,最后提交作品时我也没想到自己还真的能做出来,而且效果还不错,可用性很高。
后来比赛结果出来了,非常惊喜的拿到了三等奖,奖品是一台 iPad Pro,收获了人生中第一台 iPad。这个作品当时开源的时候,还冲上了当天 GitHub 的 treading repo 第一,让我确实开心了好久。
我是如何学习编程的
说到「我是如何学习编程」的这个话题,我觉得主要是要看自己对自己的定位是怎么样的。如果我们的定位就是本科毕业即工作,很多事情就很好办了,目标就是工作,一些犄角旮旯的事情完全不用 care,比如上课点名时,如何发挥出室友的能动性,把一些时间匀出来,让自己更加专注。
Github contributions
算法
我接触 github 的时间也不早,是在大一的一次社团活动上,学长一步一步的带领我们从注册账号到 push 第一次代码全流程。从此我就打开了一个新世界,开始关注各路豪杰,曾经有一段时间我觉得刷 github 看大家的动态就跟刷微博朋友圈一样,时不时就要刷一刷看看大家都在关注什么新奇好玩的技术,能不能用在自己做的东西上。
后来我有从一些渠道了解到有一些大佬开始玩类似「每日打卡」的活动,就是选定几个主题,在接下来一年的时间里每天都提交代码,而且是要有意义代码,不能说因为今天没来得及 commit 就胡乱敲几个回车或者空格敷衍任务,当然了,这个活动存粹靠自觉,毕竟这种活动不但可以养成自己每天都能写点代码的好习惯还能逼迫自己保持对新技术的热情。
但是一开始的我并没有很多的经验,也不知道选择什么样的主题适合自己,刚开始也是跟大部分参与活动的前辈们一样,每天至少一道算法题,坚持了差不多一个月就放弃了,因为真的太无聊了,每天解决一两道算法题并没有给我带来在计算机方面实质性的提升,刷题之前的我和刷题之后的我都是一样的菜,因为我并没有解决任何实质性的问题,刷题只是在解决一些特定场景下相对虚伪的问题,因为算法题大部分都是过于抽象的。
freecodecamp
接下来的时间里呢,我也没有很好的办法,前面也已经说过,我与大部分同学一样,大学之前从未接触过编程,在计算机上没有自己的学习思路和方法,所以我采取的办法是加入学校最强技术社团,通过学长学姐带我上道。
其次就是大量的去网上浏览一些技术社区,看当下大家都在讨论什么新奇的技术,久而久之,耳濡目染,自己也能明白整个技术圈里的一些黑话,一些好玩的学习方法,也是在这个时候我知道了 freeCodeCamp 这个社区。
当时我得知这个社区时,得知这个社区的学习方式时,立马就疯狂安利给身边的同学朋友,尤其是我的女朋友,当时她是准备走前端工程师的道路,但因为一些个人原因,现在做了设计师。
但是当时她在 freeCodeCamp 上刷了将近一个暑假,她给我的反馈是,如果学校一开始就用这种方式来引导我们一步步所见即所得的方式来学习,那她应该不会那么厌烦这个专业。
这个时候我发现我好像可以做出一些东西来了,但是都太像玩具了,因为这个时候做出来的东西都是发生在「最优解」的前提下做出来的, 跟实际问题还是有很大的一段差距。
app
后来我慢慢的参与更多的社团活动,接触到了更多的人和事,并且也是在这个时候断定了我就要走 iOS 开发的路线。刚好当时有另外一个小伙伴得知我正在做 iOS 开发,他就和我筹划了一个产品去刷比赛,当时是大一暑假军训完,距离开学还有一个多月的时间。
这一个多月里我写了当时我所能承受的最大代码量,三千多行代码,自己熬了几个星期,最后总算做完了,现在回过头去看当时自己写的代码,有些地方的实现还是挺精妙的,因为当时自己并没有用上正规的软件开发套路,导致很多 feature 的实现都是按照自己的经验来的,导致了一些现在看回去稍微还是有一点点眼前一亮的地方。
其实这也说明了,啥都不懂的时候,其实往往能突破一点常规限制哈哈哈。正是因为自己第一个做出来的产品,给了我自己极大的自信心,同时也收获了很多很多奖励,包括也是通过这个 app 在大二下学期刚开学就找到了第一份实习。
虽然去的是一家名不见经传的外包公司,但我是没想到自己能够这么快的接触社会,接触商业化的软件开发流程,这对自己后面的发展给了一个非常大的帮助。
开源
有时候从别人手里获取的东西多了,自己就老想着能回报点什么。所以也慢慢开始了做一些同时也参与一些开源项目。截止目前为止,总共在 github 的总共拿到了 1132 个 star,远超预期。
在做一些开源项目的同时,自己也在尝试性的输出一些东西,慢慢的就会结识技术圈里的各个大佬,不管是人脉还是交际圈都得到了质量上的提升,这点给自己后续的不管是职业发展还是个人成长都有很大的进步。
最近主要是专注在使用 Swift 语言深入到 Apple 自家的生态圈中去,串联各个硬件平台,做一些新奇好玩的小游戏,这算是我个人近期比较大的一个 side project,同样是以完全开源的方式去做的,会出文章和视频教程,目前已经完成了三个小游戏。
总的来说,不管是参与还是发起一个开源项目,首先「开源」本身是一个非常好的主题,这个主题可以承载对我们个人相当多的发挥,换句话说,我们可以在开源这个平台上玩出很多自己的花样,不用受以往的限制,存粹是凭自己的兴趣爱好去驱使。
MVP 最小化可行性产品
从上文所说的内容来看,我在编程这一层面上总结出了一套自己的学习方法和流程,核心是 MVP,也就是「最小化可行性产品」,把自己当作工具,把自己当作一把「瑞士军刀」,遇到问题不可怕,反而是透过问题的本质来转化出自己可以得到成长的地方才是可取的。
实话实说,在本科的学习生活里,我非常不喜欢上课,不是不喜欢学习,而是不喜欢「上课」的这种模式,我不是很懂为什么都到大学了还要从早到晚五六十人坐在一间屋子里,听着老师滔滔不绝的讲课,这跟我上大学之前对大学的设想是完全不一致的。
所以我大一一结束,就把自己和课堂脱离开来,一切以学习到东西为底线去展开,我反而更加喜欢通过做某一个东西来反映出自己欠缺哪方面的知识,从而刺激自己去学习这一方面的内容。我认为这才是对症下药,而且下的还是猛药,如果在这一过程有琢磨不透的地方,我认为这个时候老师或者学长学姐的作用就体现出来了,也就是所谓的指路人的作用也就出来了。
PFollow 是我当成和女朋友出去旅行了一趟,发现当时并没有一个比较好的 app 去记录自己当时去过的地方,旅行结束回学校后,我就用了半个月的时间从设计到开发,再到最后的发布,做了一个符合当时自己的品味的产品,后来是因为看到了一些资料,了解到 Instagram 是前身就是做地点签到的,然后仔细想了一些,这个赛道太窄了,最算这个产品最后持续运营下去我认为也是自嗨,就直接开源了。
Peek 就是上文所说的,让我触动最深的一次,做这个产品当时是在一次离散数学的课上,课上真的太无聊了,我就又开始刷知乎,然后突然看到日本一个产品的宣传视频,核心就是荧光笔识别,我看完宣传视频后,整个人都嗨起来了,因为我在高中的时候就是「荧光笔标注」的资深用户,每次想到早操时要带一堆的课本就头大,前前后后从放弃到重新拿起来,做了大半年的时间,如果不是当时有比赛催着我,后续还真的不一定能够逼自己把成品做出来。
Vary 也是我在课上刷知乎刷到的,具体是上什么课记不得了。当时是 Vary 的开发者 Dandy 在知乎上发了一篇文章,说了他为什么要做 Vary,然后我就顺着了解到了 Dandy 这个人,我发现他真的好厉害,他的博客非常非常漂亮,而且只上过十几天的小学,从此就变成了一个自学者,摄影技术非常之强,总之就是一个很棒很棒的人!也就是从这个时候开始,我成为了 Vary 的忠实用户。
后来呢我就一直在给 Dandy 报 Vary 的 bug,bug 报多了他烦我也烦哈哈哈,Dandy 就说,那干脆你加入 Vary 的开发吧,我们一起来完善它!我当时非常高兴,我记得非常清楚是 2019 年 8 月 16 日的那天晚上,这是我第一次因为热爱而被接纳。一直到现在我都是 Vary iOS 客户端的核心开发成员,这种给自己非常喜欢的产品写代码,感觉真的很棒很棒!
星球罐子是我和两个小伙伴做的一个小游戏,也是通过这个小游戏打开了我对游戏开发的大门,我是从被游戏伤害,到厌恶游戏,再到现如今热爱游戏,我所发生的这种转变很大一部分是我对「游戏」本身的认识有了很大的转变。以前我只认为游戏就是大人口中的害人精,但直到我真真正正的进入游戏开发这个领域,我才直到,原来「定义一个属于自己的世界」,做自己上帝的感觉是多么的有趣。
在去年夏天,我再次通过 MVP的方式拿到了 WWDC19 学生奖学金。这个奖学金对我而言意义巨大,首先是我可以非常有底气的对自己说,之前给自己的定位和指导都是可行的,其次是作为一个 iOS 开发者,终于踏上了朝圣之旅,一睹 Apple Park!
Apple 的 WWDC 奖学金申请我认为非常友好,允许我们天马行空的想法,对作品的主题不做任何要求,但必须使用 Swift 语言和 Swift Playgrouns 完成,我的作品是关于「黎族织锦」的故事,通过拼图游戏的方式去讲述,WWDC 奖学金我写了几篇比较详细的文章进行描述,从申请流程、作品细节甚至是签证过程都有说到,因为时间关系就不在此展开,欢迎大家到我们的博客继续阅读。
同时呢,也是因为拿到了 WWDC 奖学金的原因吧,再加上其他一些因素,受 Apple Store 北京西单店的邀请,我和 Kevin 一同给来自北京燕京小天鹅公益学校的小朋友做了分享,与小朋友们度过了一个非常有趣的六一儿童节。
MVP 最小化可行性产品的核心思想我自己的理解是这样的,做某一个产品或者项目,花 80% 的时间解决最核心的 20% 的问题,其余花 20% 的时间去解决或者不解决其余 80% 的问题。因为这剩下 80% 的问题,其中的 80% 是我们之前已经解决过或者有思路的,没必要花费重复的时间去解决重复的问题。
重复的问题和思考的总结,可以通过输出博客文章的方式进行记录,写文章是一件对自己过往经历经验总结十分到位的方式,写文章是自己和自己对话,我个人不是很喜欢戴着面具写博客,本来我们在日常生活与人交往过程中,就在不停的给自己戴上不同的面具,如果在自己的博客,这个自己在互联网上的自留地还戴上面具,我觉得这也太说不过去了。
所以呢,结合 MVP 的思想和写博客的方式,通过这两把剑和盾,可以较好的把我们自身以一个滚雪球的方式不停的向前滚,越滚越大,一旦这个习惯养成了,并且形成了一套自己的思维方式,你会发现自己看到很多问题都不一样了,自己也就成为了一个能够真正解决问题的工具。
之前我也是挺不相信博客能够带给一个人的改变有大多,但经过我自己的尝试后发现,其实当我们真正的在去做一件自己认为有价值、有意义的事情时,是一定会或多或少的对身边的人对自己产生影响的。
总结
好啦~在这次分享中简单的和大家分享了一些我关于编程和在计算机方面的学习方法,其实我觉得计算机和编程并不复杂,但它的魅力也就在一个个看上去十分复杂,毫无头绪的问题面前,我们可以发挥自己的主观能动性,根据自己的想法和创意去设计出一套套的解决方案,这种「来者不拒」的感觉还颇有一番侠客之味呢!