2017年12月23日,受腾讯的朋友邀请,回了一趟深圳,去腾讯参加「第二届前端体验大会」做分享嘉宾。
前端体验大会前身是创办于2007年的 Webrebuild 。去年改名叫「前端体验大会」,2016年第一届,我和阅文的同事专门从北京和上海过去参加,与腾讯和微信的前端朋友面基了一番。
这是我第二次参加前端体验大会,上一次是去当观众,这一次过来当分享嘉宾。这一次我的分享主题是《跨界-成长:非典型程序员之路 》。
课件在上面的链接有放出下载,相比其他分享嘉宾的技术分享,我的这个分享,带有更多的个人色彩,更多是从自己职业成长和发展的角度,来分享一个「非典型程序员」的成长经历。
今天写这篇博客,即是这次参会经历的回顾,也是自己这几年职业成长的一个总结,这两年来,我的博客大多是旅行、科技和数码类的内容,已经很久没有写技术或者职业相关的主题,如果你是从旅行和数码关注到我,看到我这发这篇博客,请不要奇怪。
为什么选择这个话题
说到程序员,联想到几个关键字和最近的几个悲情事件:女朋友、加班、翟欣欣、跳楼,不管是社会上的刻板印象,还是程序员的自嘲自讽自黑,「钱多、话少、死得早」,一定程度上,程序员的确是一个会让人觉得「闷」和「呆」的职业。
我是一个程序员,但是认识我的朋友,经常会嘲讽说我一点都不像一个程序员:一年到头在外面跑,写文章、拍照片、剪视频。
我被问到最多的问题就是「你怎么又出去玩了,怎么这么多假期?你怎么不用加班?」。
这一次分享,主办方给我以「后起之秀」的角色定位,当我听到这个名头的时候,心里倒是有点紧张。自己没写过什么知名框架、技术上面并没有值得背书的地方,被人冠以「秀」之名头,是有点不好意思,也有压力。
后来跟主办方沟通课件和主题,梳理了一下自己的职场经历,从「不会写JS的渣,到会写些渣JS,再到写支持千万用户量级的前端框架」,一路走来,作为一个非典型程序员,不管对公司和用户,还是做了一些「微小的工作」和贡献,这些年,也是收到了来自职场和市场的认可回报。
上面这张图是我参与过的一些项目,虽然几经迭代,但一定意义上,这些项目就是我参与设计、开发的代码所支撑的。
有了项目背书,自己也是有了以「秀」之名对外分享的底气。2012 年开始接触前端,到2013 年去北京猎豹实习,再到 2015 年加入阅文,参与了公司的 Web 架构改造,经历了公司上市,一路走来,自己也的确是不负「折腾」两字,从「切图仔」到「写Web架构」,自己的确是一直在「跨界」尝试,进阶。
今天这篇文章,结合我在大会上的分享,依旧以「选择」、「发展」、「尊师」、「精神」这四个部分进行阐述。
一.选择
如果说这几年市场和职场给我的最有价值的经验,那就是:
有些时候,选择比努力更重要。
对于我来说,从大学管理专业,跨界到编程,是一个选择;选择离开广州,去北京实习是一个选择;选择离开北京,来上海,也是一个选择;加入创业公司,是一个选择;加入独角兽,是一个选择。
做出这些选择的时候,我并不知道这个选择,会给自己带来什么样的成果或者后果,唯一可知的就是:
承担每一个选择后果的,只能是做出选择的人自己。
有时候,听到一些不认识的朋友说「看到你的经历,真励志,向你学习」。长久以来,我都有写作的习惯,写博客将近十年。从骑行西藏,到当程序员;从旅行拍摄,到视频自媒体。我的这些文字、照片、影像,公开在网络上,记录了自己的成长,记录了自己的变化。自知自己的这些经历,也的确影响了一些朋友。
我一直觉得自己不是一个「牛逼」的人,更像是一个「装逼」的人,或者更准确的描述:一个会装逼的人。
在2014年的一篇博客《装逼这件事》中,我就说过了我对「装逼」这个行为的看法。
装逼,牛逼,装更大的逼。
这种「自黑」式的自我驱动,也的确激励自己不断尝试新的领域、不断前行,进入了一个对的行业,拿了一份还可以的收入,能够在生活中,有更多的选择和可能性。
每个人的经历,都有其独立无二的经验和背景。对于这些朋友,我大多报以更「理性」和「现实」的回应:好好上学、不要挂科、争取去大公司。
我2009年参加高考,高考成绩高出重点线36,上了广州的暨南大学。高中的时候,对大学专业一无所知,跟风填写了当时的热门专业领域「金融、管理」,结果由于未达到专业录取分数线,被调剂到一个新的专业「应急管理」。
我的大学专业,对口的岗位是政府的应急管理办公室(所谓的维稳),课程跟行政管理类似,掺杂了一些诸如医疗、反恐之类的内容。同大多被调剂专业的人一样,我并不喜欢自己的专业,大一、大二的时候,心思并没有放在学业上面,在外兼职、打工。有一学期甚至挂科5门,收到了学业警示函。
2012年,大三,那一年,我做出了一个震惊学校的举动,逃课,带着10多个骑友,从成都出发,骑行去西藏。恰好那段时间,我校有一个学生,精神不正常,跑到黄山跳崖被救回,学校领导颇为紧张,担心我也出事,要求我立马返校,否则开除。院长在教职工大会上点名我,辅导员在班会上说要把我抓回去。
当时的我已经走到了新都桥,心和身子都已经在路上了,实在是不想放弃,最后通过运作,干脆就休学半年,安心骑行,把我妈气得个半死。
后面的事情,也是自己人生中的一段花絮了。川藏线318国道上,骑行了29天,走了2300多公里,回来后剪辑了一个视频,拿了自行车行业的两个奖,上了《南方都市报》,接受了广州电视台的采访。
其中有一个奖,是去南京参加「亚洲自行车展」,主办方报销机票,顺便去了杭州,找了当时在支付宝实习的郭宇。
当时跟郭宇去了支付宝大楼参观,第一次体验到互联网公司的办公环境,去了浙大校区闲逛。
我从上大学一开始,就经常通过 Google Reader 看国内外的互联网资讯,但是多是关注行业资讯,并不怎么关注技术领域。也是那一次交流,跟郭宇聊到了很多关于前端的话题。
从杭州回来,我就下定决心,我要当一个程序员。后面的事情,就比较接近我现在的轨道了。后面整整一年,我每天起床就去图书馆,翻遍了图书馆所有跟前端相关的动物书,学习编程、做笔记、Coding,基本上每天都是图书馆闭馆,才回宿舍。
再后来,我去了北京猎豹实习,算是正式成了一个程序员,再后来,正式入职,跳槽,直到如今。
把四五年的经历,浓缩到几段话,并不容易,这几段话里,我面临了许多选择,我也做出了自己的选择。之所以选择当程序员,一个很大的原因,就是当时我做出了这么一个简单的判断:
如果我从事管理或者其他相关工作,刚毕业工资大多是处于5000-8000;如果我晚一年毕业,去当一个程序员,工资直接上万,甚至更多。从短期收入的角度看,程序员一年的收入,就能抵掉晚一年毕业的影响;长期来看,互联网正在渗透各行各业,属于极有前景的领域。
基于上面的判断,我做出了自己的选择。这些年,互联网行业的收入水平,大家是有目共睹的,事实也证明了我的选择和判断并没有错。
二.发展
分享的第二部分,也是这次分享的主要内容:结合我在不同阶段、不同公司的经历,我总结了一些经验,尤其是介绍了我对于工作中遇到的问题的一些思路。
2.1 因问题而起的研究
接触到编程,很大程度上,是因为方滨兴校长,2013年4月,北邮校长方滨兴来我学院演讲,事后我写了一篇文章《GFW之父方滨兴讲座后杂想》,结果这篇文章在中文推特圈迅速传播,让我的虚拟主机流量一天就用完,被逼无奈,我购买了第一台VPS,从此开始折腾起服务器,也是这个契机,我开始接触Wordpress、Ubuntu、Centos、Mysql。
这几年来,与防火墙的斗法,是我的一个很大的乐趣,墙高一尺,梯高一丈。为了解决访问谷歌、Youtube的需求,我研究、实践了几乎所有的翻墙解决方案,并且做到了最佳实践和优化。翻墙并不是一个简单的VPN或者SS就能解决的问题,其背后涉及的网络线路、网络协议、加密算法、防火墙、路由、负载、乃至算法优化,每一个角度都有学问可以研究。
也正是通过研究翻墙,让我对网络运维层,有了较熟练的了解,为我后续写服务端打了下基础。
2.2 因忙乱而起的研究
回归到前端本身,刚开始工作的时候,与大多新人前端开发者一样,我负责的主要工作就是 UI 重构,通俗点来讲就是切图。在猎豹工作的时候,每周都要写大量的 H5 页面,我们部门有十多个前端开发,主要的开发模式就是:
产品提需求 > 设计师出稿 > 前端UI重构 > 套模板 > 上线
在这种模式下,前端承担了大量的重复性工作。对于新手来说,这样的工作,能够迅速训练对 HTML,CSS 的掌握能力。设计还原考验的是开发者对语言的熟练程度,对不同设备、浏览爱的兼容则更多考查的是项目经验。在那新人岁月里,每次新写一个 H5 页面,都要在十几台、乃至几十台设备中进行不同分辨、不同浏览器、不同系统条件的测试。
但是面对这重复性的工作,弄久了,也是枯燥和无趣,当时我们部门并没有对应的工具或者系统,于是,我自己通过研究grunt
,结合less
,Sass
之类的预编译语言,根据自己的开发需求,做出了一套简单的脚手架工具,当时还写了一篇文章《让前端工作更快、更智能:利用StaticPage自动化工作流 27 April 2014》,虽然只是自己个人使用的工具,但是面对重复性的切图工具,还是提升了我的开发效率,每次来了新需求,只需要 clone 一个新项目,然后就可以开始本地开发了。也是从这个时候起,我开始接触前端工程化和自动化。
后来从猎豹离职,加入上海的小蚁科技。相比猎豹十多人的前端团队,小蚁的专职 Web 开发只有两个,我需要面对更杂乱的需求,不仅仅要切图,还要维护服务器。在小蚁的这段时间,中间的一个 APP 测试的需求,让我颇为头疼。
我们的 iOS 开发团队,每天都会发布多个 ipa 测试安装包,由于 iOS 安装限制,需要把这个 ipa 文件上传到七牛上面,然后手动更新一个线上的 xml 文件(里面含有当前版本号、线上的ipa 安装包地址)之列的动态信息,然后再把这个 xml 文件发布到线上。
这是重复性需求,由于当时是我负责维护网站,每次 iOS 开发同学一编译新包,就要找我。有些时候一天甚至可以找我4、5次,烦不甚烦。
针对这种情况,我研究了一下这个流程,发现这个需求完全可以通过工具自动化。可是,作为仅存的两个前端开发,后端的同事又有各自的工作,我发现只能自己干,这是我前端生涯中的,第一次被迫「跨界」。也是从这个契机,我第一次开始写服务端和后台,我选择了用 'Nodejs' 来写这个项目。
用Express
来作为 Web 框架,本地用gulp
来进行构建,数据库则选择了mongoDB
,并且自己按照RESTful
规范设计了一套API,前端部分则选择了一套谷歌样式的bootstrap
和ejs
的模板引擎。
最后,硬是在一个星期不到的时间里,从0到1,做出了一个有模有样的后台。有账号系统,有历史记录,iOS 开发的同事可以直接把 ipa 安装包拖拽到浏览器,自动上传到又拍云,自动生成 xml 文件,自动生成线上可访问的网页。
说一个插曲,在我开发完这个系统后,我才发现,其实蒲公英有提供这种服务,由于当时并不了解 iOS 开发,我造了一个轮子,但毕竟是自己造的轮子,经历了这一个副本,经验值暴涨。
从那之后,原本需要两个人,花10分钟才能完成的事情,现在只需要10秒就能解决。这个系统上线后,我再也没被这类需求所烦过。
2015年10月,从小蚁离职,正式加入阅文集团。这是腾讯文学收购盛大文学,阅文集团成立的第一年。当时上海团队主要负责的是起点中文网、创世等老项目,起点中文网是公司的重头产品。
这个时候,公司的整个技术架构,用一句话来说就是:
沉重的历史技术包袱,极其低效的开发效率。
上面这张图这是改版前的起点中文网,UI十分复古,后端是Java,前端团队只负责重构,然后把 HTML 交付给后端套模板。在这种开发模式下,前端团队没有太大的话语权,在公司里的定位就是「切图」,考验前端团队的标准,也仅仅局限在完成网页数量、视觉还原度。前端开发者,在这种情况下,各自为战,有人纯手写代码,有人用 Less,有人用 Sass,有人用四个空格,有人用一个Tab,并没有一套统一的开发规范和代码规范,也没有相应的工具来保证交付质量,就更别谈什么前端性能指标了。
刚入职的时候,为了熟悉公司业务,我也做过一些 H5 页面,也遇到需求方的同事问「你是新来的切图吗?」,这种让人略显尴尬的问题。
2016年初,起点中文网的改版工作正式启动。公司级的小黑屋项目组也在这个时候成立,借此契机,我从头到尾,参与了这次网站改版和架构改造的工作。在这次改造中,我主要做了两块工作:
起点改版工作涉及全站,业务复杂,前端前后有四个开发参与到这个项目中。后端也投入了将近10个人力进行开发。
起点改版涉及全站,业务复杂,前端前后有四个开发参与到这个项目中。后端也投入了将近10个人力进行开发。对一个有十多年历史的大型站点,进行前后端分离重构,并不是一件简单的事情,我过去没有写过 Web 框架,在这种情况下,我先跟前端和后端的老板约定了双方的业务界线。最终确定的方向就是:
前端负责开发基于 Nodejs 的 Web 服务框架,框架机仅承载渲染直出功能,业务逻辑完全由PHP层接口封装。
在这种思路下,前端框架机的逻辑就简单和清晰多了。
Client 请求对应的路由,Nginx层将用户请求转发到框架机,框架机根据请求头 Header 中的 Host 和路由信息,请求配置文件中配置的对应后端接口,找到对应的模板文件,最终渲染出 HTML 返回给Client。
框架机的框架十分简洁,但是结合业务需要,利用中间件,封装了不少自定义功能。有人可能问,为什么不让前端来处理数据业务、管理Session呀?答案很简单,因为当时没人力做这些事情。
这一次项目改造, 是前端人员第一次介入服务端开发,在很长的一段时间里,只有我一个人负责框架机相关的工作,团队其他人对服务端开发并不熟悉,短期内也招不到专人来进行相关的开发工作,在这种情况下,框架机只提供简单渲染功能,是更加现实和理性的解决方案。
Web 架构设计好了,框架机上线了,本地开发也是一个大问题,不同于过去的一个人负责一个项目,起点中文网是一个颇为庞大的项目,三四个前端开发人员,分属于不同子站点,要同时维护这个大项目。在这种前提下,统一开发工具、规范开发流程成了一个必做项。
为了让前端的同事能够更加方便在本地进行复杂业务的开发和调试,我开发了一套基于gulp、Express 的本地构建脚手架。对于这套脚手架,一句话总结就是:
开发流程自动化,顺便把前端框架机Yuenode在本地做了一套模拟。
这个脚手架,针对模板、Css、Js的预处理、预编译,精灵图管理、SVG、中文icon生成、静态资源版本化、资源 comobo 等,等等,均做了定制支持。
Yuenode 和 Yworkflow 跟我们公司的业务场景强依赖,做了较为深度的个性定制,具体的功能就不在这里繁琐介绍。
有了架构和工具支持,前端开发同事的工作就简单多了,框架机属于通用基础服务,后续新增项目,只需要新增一个配置文件,就能够做到快速发布。在统一的规范和流程下,前端开发只需要关注业务,一定程序上,规范带来了效率的提升。
2.3 因兴趣而起的研究
解决工作中的需求是职责所在,而工作之外的这些事情,就比较偏个人 Side Project 的意思。
从我接触 Wordpress 开始,我就开始折腾不同的主题,在过去这几年,自己也做了不少原创的博客主题,有几个主题在国内也有不少的用户。
做博客主题,是一个特别有趣的过程,很早我就有了自己的独立博客。个人博客就好像是一个人的名片,也会有美丑、快慢。让自己的博客变得好看、好用,也是一个需要打磨的过程。
制作博客主题,一方面要求你对网页设计、UI设计有一定的了解和掌握,所谓对「美」的把握,同时也需要你有一定的开发能力。对于前端开发者来说,这是一个很好地训练自己能力的途径。这两年,我见到不少开发者,从前端到后端,自己开发博客系统,对于这类开发者,他的博客(以及代码)本身,就已经是他的简历。
除此之外,我一直在坚持写原创技术文章。对于一个观点,我深有其感:
输出是最好的输入,教授他人也是最好的学习手段。
写技术文章,前提需要你去了解、学习相关的知识,写作的过程中,你得重新组织、逻辑化你的知识,能够加深你对这个知识的理解。如果下次你学习一门新的语言、技术,不妨试着边学边写,把你的学习过程梳理成一篇新的教程。
除了写原创技术文章,翻译国外的文章,也让自己获益匪浅。长久以来,国外开发者社区都远比中文社区活跃,初创、原创的资讯也更多,对于国外优秀的文章,可以尝试去翻译成中文。一方面可以提高你的英文能力,另一方面可以通过文章的传播,提高自己的影响力(所谓的对社区的贡献)。翻译是一个提高英文阅读、写作能力的好方法,英语对于程序员的重要性,就不再在这里多说了。
多亏了过去长时间的英文阅读和翻译训练,如今阅读非专业性英文,基本上没有任何阻碍,最多就是遇到生词,查一下词典就可以了。
在这里说一个插曲,在知乎上面,有一个问题《作为一个程序员,你是如何在工作以后找到女朋友的?》,我的回答排名第一,没错,我的女朋友(现老婆),的确是因为自己翻译了一篇文章,才找到的。具体的可以点进知乎看全文,欢迎给我点赞。
三.感恩
谈完了项目、谈完了Side Project,接下来再聊点虚的,就是要感谢一些朋友。
在文章开头,我提到的郭宇,就是影响我职业选择的一个人,可以说,要是没认识他,我很大可能上,是不会当程序员的,谢谢郭总。
后来,入了行,陆陆续续从各种渠道,认识了不少朋友,不少人是从线上的网友,发展成线下的朋友。
小胡子哥、芋头君、Sofish 等等,通过各种乱七八糟渠道勾搭上。虽然各居一城,有时候,也会交流一些职场问题,有时候遇到技术问题,搜遍网络也没找到一个好的解决方案,发个红包,打个招呼,人家一句话就点拨了,毕竟是在大厂从业多年,经验丰富。
跳槽的时候,由朋友推荐或者内推,成功率也会更大。在大会上分享完后,有人私信问我**「怎么才能认识这些大牛呀?」**。
我想了想,之前认识这些网友、朋友,大多是通过朋友介绍,或者是线下聚会,或是公司交流,圈子就这么大,要认识也不难,并没有刻意勾搭。但是有一个点,这些网友,大多是在网络上比较活跃的人,比如说小胡子哥、屈屈的博客,都是持续输出干货,在社区也十分活跃,我虽然没啥技术干货,但毕竟也算是一个活跃分子,经常写些乱七八糟的文章。与这些朋友,遇到面的时候,打个招呼,人家也能知道你是谁,这样就比较容易自来熟了。
你对社区做出了贡献,社区本身也会回馈你。
精神
前面啰嗦一大堆,最近这两年,一直在写旅游、数码,被读者吐槽博客沦为成「开箱网站」,很久没有写自己内心思考的东西,想想一直这样也不好,不「真诚」,谈何写出好的文章。
我一直不觉得自己是一个牛逼的人,最多只能算一个运气不错的人:工作这些年,进了几个还不错的公司,遇到了好的老板,买了房,结了婚,并没遇到什么太大的曲折。
现在回过来想一想,自己这些年的折腾,从公共管理跨专业到程序员,从切图到服务端开发,最后成了个半吊子全栈,很大程度上,就像乔布斯在斯坦福大学毕业典礼上的那段讲话:
你们同样不可能从现在这个点上看到将来;只有回头看时,才会发现它们之间的关系。所以你必须相信,那些点点滴滴,会在你未来的生命里,以某种方式串联起来。你必须相信一些东西——你的勇气、宿命、生活、因缘,随便什么——因为相信这些点滴能够一路连接会给你带来循从本觉的自信,它使你远离平凡,变得与众不同。
阅读、跟方校长斗法、骑行、逃课、敲代码、翻译、写博客、拍照片、拍视频。自己人生中,也是有许多看似分割的点,做这些事情的时候,并没有想会对未来的自己有什么影响。
随着人生轨迹的逐渐清晰,这些点,这些事情,带给自己的内在影响,也逐渐浮现和愈发清晰:长久以来对互联网行业的关注,让自己在职业方向上做出了正确的判断,折腾博客,让自己接触到网络 Web 技术;阅读各种乱七八糟的书籍,翻译、做主题,让自己对用户体验、产品有了一定的认知………………等等等等。
如今,程序员职业之外,我也是一个自媒体视频制作人。在拍照、做视频、自媒体的过程中,我程序员的背景,又给自己带来了技术上的优势。是的,新的点,依旧在出现,而人生的这条线,依旧在这些老点、新点之间继续连接。
最后放张合照,感谢组办方的各位工作人员和参会嘉宾。