2015年终回顾-改变
05 February 2016

2015年,真的不能再丰富。

完成了学校方面的各种事宜,只等待颁发毕业证了。经历了从初创公司到成熟公司,算是真的踏入社会了。对自己认识的更深了,一方面是技术方面开始专注深入,走上正轨,对前端领域认识的清晰了,对自己所在的阶段和自己的长板和短板认识的清晰了,这得感谢面试经历;另一方面是对自己的生活和性格认识的清晰了,这得感谢感情经历。。。

初创到成熟

从初创到成熟的不仅是所在公司,也是我自己个人技术。

在初创公司的日子

14年暑假加入的初创公司,没有多少对公司的信心和展望什么的,更多的是想练自己的技术。体验了一把把想要实践的东西,玩了1年,也够了,再呆就感觉到瓶颈了,没法再继续发展了。倒是对公司对产品并没有什么信心,一开始就不觉得公司能走多远,对于产品,只是尽心尽力想要用技术最好的呈现它,做到最好的交互和体验,但是并不能给它能否推到市场带来什么帮助。

15年1月到7月,都还是在这家初创公司(HW)工作,前端由我1人到5人到3人,团队一直在变动不稳定,做的很累,招进来的人会的太少,先让他们熟悉开发工具、工具流、必备技能就得半个月,熟悉后还没实践就走了,一批批实在太累。我感觉自己都还没成熟,就成了个前端团队leader的角色了,很疑惑。(这样写成流水账了。。。得理一下)

无协作

前端届鱼龙混杂,多是鱼,很多人只是觉得前端简单就来学,也没啥兴趣就是想混口饭吃,殊不知前端虽然门槛低,但是深入起来水很深的。跟没有追求的前端一起工作实在是蛮痛苦的,除了用jquery啥也不会写,jquery做个交互逻辑复杂一点的还不知道怎么根据用户操作映射dom树做出交互,工作量大,我也没时间一次次教,导致每个项目80%的代码都是我自己写的,后来不行就是有类似内容的项目(公司接的一些外包项目,多是微信平台开发)全给他们,新项目自己一个人上,丝毫没有团队协作感。这1年的经历真的一点没让我培养起前端之间的协作模式。

其实后来进了成熟的公司,看着带着我的学长一步步引导我和其它他带的孩子,感觉到这一切是我自己不够成熟,团队意识不强,没有引导好其他人,没有激发大家的热情,一切还是自己做的不对。

孤独

喜欢折腾,自己做的项目都不会用重复的技术,每次都尝试新的模式,这个探索的过程会不断遇到问题,但是却没有可以交流的同事,有深深的孤独感。只能google,stackoverflow,SF,知乎,搜不到就只能去提问。虽说社区很繁荣,问题都能解决。但是远没有可以面对面讨论的快感和透彻,一个人写代码有深深的孤独感。

疑惑

很多时候自己遇到的问题,自己找的解决方案,并不知道是不是最优解,自己架构的东西也不知道又没有更合理的方案。我有很多的困惑,虽说社区繁荣,我也不能拉着个大牛询问这么具体的东西(总觉得问得问题应该具有代表性是抽象出来的,业务耦合的问题没人有时间帮你),我充满疑惑,代码写的越多,以会越多。这是导致我想离开初创公司,想出去最直接的原因。

凭着一腔热情,不断的在公司耕耘,什么996,我是没课时早上9点到晚上10点,一周7天。。。尝试新技术时很兴奋,但是被项目进度压着又很害怕,要保证进度,又在尝试不熟悉的东西,只能加班加班加班。时间久了,1年左右就会周期性疲倦,想要度假了。。。

挑战

虽浮现出种种不好的方面,但是我从未后悔过来初创公司,相反非常感激这段日子。因为这里充满挑战。我可以尝试一切我想尝试的东西(虽然默默加班保证进度),我是自己的leader,随便自己折腾,我不断使用新的库和工具,体验他们的优势和不足,思考他们的设计。

这些是我去了大公司后就不再拥有的快乐。

犹记得最后一个项目带着2个协会的小朋友上angular时的兴奋。这是我在决定离开HW后做的最后一个项目,也是最开心的一个,这2个小朋友蛮给力,我们合作的很愉快,这个项目不是我一个人写的,我贡献的代码量只有30%不到。但是是我一个人架构选型,写基础demo,解决他们抛给我的技术难题,非常有挑战,也有意义,学到了很多。然后目前为止,angular在我心中是用的最爽的框架,选型很成功,很适合那个中小型交互多、表单多的项目,数据双向绑定,MVVM大大解放了我们的生产力,1个月就做完了(虽然还用了1个月测试修Bug,变动需求)。

在做这个项目时,第一次用了angular,也是第一次用bower\gulp这些工具流,架构时花了不少时间,重复了4次,经验不够的我来选型显然有点赶鸭子上架,我知道架构做的不好会坑死项目,这也是我感到挑战最大的一次。所以我不断的测试开发流程,部署开发环境,模拟开发,和后端讨论交互,想象可能存在的问题,一次次推翻重构,来让这个结构变得可靠。

在🍄的日子

后来我通过校招内推进了蘑菇街,这是一个1000+人蛮成熟的公司了,所在团队前端10几人,也符合我想要的规模了。

虽然做好了进去先好好学习搬砖的准备,但是还是挺不习惯的,感觉以前是在写项目,现在是在写页面。还好我能及时告诉自己即使做最简单的事也有可以锻炼的地方,关键是自己会不会寻找和把握。这几个月在🍄的日子,更多的练就的基础和细致。

现在综合看看,团队项目还有很多我可以努力改善的地方,除了搬砖似的日常需求,我还是能发挥价值的。但是进了大公司以后,任务没有那么重,责任没有那么大,人激情和精力也有些消退,开发节奏慢了,开始有双休日并且真的会休息了,贪图享乐的变化得遏制。

极致体验

所在部门前端是和广大用户直接交互的,所以对于交互体验要求很高,动画的流畅,交互的合理性要求都很高。测试也很仔细,一遍一遍,上线后出交互问题也是要问责的(一直很害怕)。学到了rem的真正的适配。还有dom动态移除,图片动态加载,动画桢requestAnimationFrame、无处不在的图片大小保护、文字数量保护、后端数据空白保护等等。

组件库

项目组有整套通用的组件库,导致运营提出的新需求,如果不是活动页,产品页其实也就是拉拉组件拼拼页面。听上去是挺没意思的,但我觉得对公司来说,这是产品成熟的标志,通用化后不需要重复劳动,对于程序员,我们这些新手可以先拿这种简单的活熟悉环境,还可以研究组件库的组件代码,熟悉原理,练功底。组件库也不是完美的,还有可以改进的用户体验和扩展的功能配置,所以自己也可以在组件库上动刀子,创造更好的组件。只要有心,能够做的还是很多的。

环境

我们团队有很多事做,譬如活动页和产品页是不同的开发环境,然后我们自己也在开发开发环境。我对这些环境很感兴趣,其实我对一切解放程序员生产力的东西感兴趣,这些开发环境让本地开发变得方便。各种平台和开发环境都有自己的特色和适用性,我还没深入,但是蠢蠢欲动。我总是想清楚一个本地项目是如何跑起来的,了解到前后端和服务器端,才觉得清晰安心。


接下来说说在🍄的几件事:

前端小黑屋

刚来公司一个星期后进行了小黑屋训练,就是给我们4个活动页面,4个人组成一个团队(我们团3个人),3天去完成,要求纯手工,不用任何框架。

作为一个开源库重度依赖者,对于要自己纯手工打造这些动画效果,是非常痛苦的。我是硬逼着自己一步步的去写,一开始心理上的排斥和不适应,让我开始写时非常慢。我去看了看魔方上学长们写模块的代码,看完一遍后觉得真的就是那么回事,思路并不难,难得是自己的心理障碍。这些动画怎么做其实我都是有思路的,但是一直不喜欢做动画,所以畏惧。但是任务当头,直得硬着头皮写。写着写着却觉得原来越顺畅,回头看看,真的没什么可畏惧的。因为向来喜欢挑战,我认领一个主会场的页面去完成,是动画和交互最多的一个页面。但是真的不能在规定时间内很好的完成,XF学长便跟我说不要急慢慢写,先把你觉得难得有意义模块写了。我便写了页面上4个难的模块,剩下的一个拼凑了队友的。最终,意外的我们因为完后度最高,被评为最优作品,还领了个电源。。。这个受之有愧。

这个事件,对于个人来说,让我克服了对动画的恐惧之情,其实我们部门的业务做动画的需求还是不少的。技术上也有成长,由一直的字面量写法升到了原型。后来在做业务时也都将通用的组件抽成原型了,以前对于原型都是书上看看,并不会真的在项目里写,写了以后理解对this指针、原型链的理解和使用深入了,开始成为真正的jser了。

这个事件,对于团队,是我最不满意的一个维度。因为我们一开始就想着任务划分清楚,按页面切了任务,而不是按模块。并没有很好的合作交流。做完这个后就在反思该如何团队化。

对于项目,也不是让自己很满意,时间确实不充足,做的很草率,代码写的也挺乱的,细节也没有优化,对于有强迫症的人来说写这样的代码是很痛苦的,因为我总是想尽可能的优化代码,做到细致优雅,为了完成视觉上的效果而抛弃质量的做法很难做到。好在日后在项目中时间都很充足,能够将代码做到优雅。

双十二bug惊魂

双十二我和我的队友MS做了个活动页面,我做的h5,他做的pc。因为是双十二页面,又是新人,我们都诚惶诚恐,最后一星期基本每天测试一遍页面。

然而最后上线时我的页面还是出bug了,剩余商品数量数据取成了库存数据,幸好一上线就发现自己数据不动,2分钟内及时改了过来。虽然这个问题不容易测试,因为测试时数据的剩余数和库存数相等,但是在写代码时,正常的人都不会犯这个错误,填错字段。

这件事也着实吓到了我,让我时常活在bug的恐惧之中。后来在做日常需求时,虽然没出现过大bug,可是我的小bug不断,譬如没给金额加『¥』符号。

好的程序员必定不能把bug带上线,所以我开始越来越注意这个问题。我一直不是很严谨,越小的地方越容易出错误。我开始梳理自己写代码的过程,要想不出Bug,不仅测试要仔细,写的时候更应该严谨。对于自己页面的每一句代码都要了如指掌,特别是用了别人的模块或者copy的代码,更应该在review一下。测试数据要覆盖尽可能多的情况,利用测试工具和平台造尽可能全面的测试数据。测试时,页面元素要耐心的一个个看,所有交互都要包含。

团队方面,我发现我的同事MS就是一个很严谨的人,他上线的代码几乎没出过bug,我要好好学习。

项目方便,当然很惭愧,把bug带上线已深深检讨。

支援审理平台开发-挑战

这是我15年最后2周做的事,由于该团队只有一个前端,又年关将近,他们的审理平台项目前端还没开工,要延期了,leader便来我们团队借人,我就被借出去了。

我先了解了他们的项目代码(一期的,现在是二期开发),发现虽然引入了react和redux,但是用的极度不规范。react组件拆分不够细,跟业务耦合太强,可复用的太低,结果就是页面长的区别不大,却没有公用组件夹。最可怕的是引入了redux,搭建了基础结构,内部完全没有用redux数据流,没有一个页面redux数据流闭环了,都是setState随时改状态,redux和react组合的优势尽失。

我不想就这样扭曲的用react和redux,如果引用了一款框架,却没有使用他的优势,那么引入一个新框架折腾另外一种写法的意义何在。所以我非常想用真正的redux数据流来管理state,但是我之前也没有react和redux项目经验,入门门槛又不低,我害怕自己会导致项目延期,他们给了我2个模块5个页面,一周完成。我和我的学长XX沟通了,XX学长说节操还是要有的,想要做就去做,想写好代码就要花时间。我默默的决定规范的去用这些。

但是支付金融那边的前端(他们团队只有一个前端。。。)还是按照一期那种不规范的写法在写项目,并且让我也这么做。因为时间很紧,害怕折腾后会延期,而以前的写法虽然不规范,但是快速。但是我默默决定就是加班也要规范的去用。第一天很不顺利,因为刚上手,写写改改,很多情况找不到标准,只有后面踩坑了或者觉得不方便了,才发觉前面的设计不合适,于是又去改之前的。我也开始害怕了,但是我还是想用规范的写法,第一天写到很晚先写了4个页面的UI,还不是很规范,但是毕竟完成了这么多页面有底进行接下来的尝试了,第二天我去和他们的前端沟通了我的想法,他也有点害怕延期,但是他还是支持我尝试。非常感谢XX学长和他的支持,我才敢实践,毕竟不是自己写着玩的,还是要考虑项目进度的。

第二天我一天都在倒腾redux数据流,这玩意在这个项目里没有参考了,幸好我之前看过redux开发文档的大部分,也看过2个demo。就是边学习边尝试,但是终于把一个页面的数据流跑通了,心里也有底了,舒了口气。

第三天又改造了一个页面,这个页面做的比较细致,不管是数据设计还是代码都规范优雅了很多,通用的小的react页面组件也被我拆出来扔到了公用组件文件夹中。总算是有一个拿的出手的页面了。

第四天和第五天,画完了剩下的一个页面,又改写了之前设计的不好的页面。这周的完成所有页面的计划是没有延期,接下来就是调用后端接口联调了。周三时他们的前端问我跑通redux没有,我说通了,周四他看了我代码并且和我讨论了redux,他说也决定改成redux数据流。好开心,项目走上正轨了。

能通过自己的努力保住节操,规范的写代码,并且能够感染他人,这是我在🍄的3个月内,最有成就感的一件事。

那周是真的累压力也大,毕竟在做没有做过的事,还没有自己嫡亲学长的解惑,感觉就像回到了初创公司,其实这个久违的感觉蛮亲切,也蛮激动的。这种挑战总是让我很兴奋,让我对代码保持高度热情。我在写react和redux的时候也在不断的思考他这种设计的目的和意义,发掘他所说的优势。优势确实有不少,形成redux数据流后,状态可控,只在一个地方操作数据,降低了bug的发生率,也方便和后端定接口或者接口变更。但是我也看到了redux和react的的其他特点,入门门槛高,而且为了达到redux数据流闭环,我们在设计和代码上要做很多工作,就是本来可以一步搞定的事,现在要5步的概念。这就决定了react+redux适应中大型项目,项目越大,越体现他的优势,越复杂的项目,前期为了闭环数据流所做的操作所占的比重越小,后期业务代码和状态变更占的比例越大,让前期的操作变得有意义,而且大型项目用了react后状态可控,非常方便维护和二期开发。但是小项目用react+redux就是折腾了,开发效率会降低。

这次我除了尝鲜追了一下红遍大江南北的react+redux,也有了自己的思考和看法,不再只是局限于开发文档的介绍。一开始不理解为什么组件划分要那么细,并且没有按照那么细的标准来划分,等到后来发现要通用很麻烦时,才体会到组件划分细致的意义,就是要一个输入框都做成一个组件,就像搭积木,积木越小,类型越多,可堆成的成品类型越多。但是拆分设计组件也是要时间的,所以觉得react适合大型项目,这样因为重用率高,编写组件投入的精力才更有价值。

项目上,我觉得我尽了最大的努力把它拉到规范化,并且自己默默写到半夜保证不延期。但是如果这个项目就目前的体积,我觉得更适合angular,而不是react。

认识自己

这个要感谢阿里的面试,碰壁了一次又一次,也让我更清楚的认识自己的技术。

我是框架重度依赖者,上手新框架和库比较快,自己几乎只写业务逻辑代码,从不写动画或功能组件,都是依赖开源库,这样在小公司活的很好,即能出东西,又稳靠,我觉得团队专业维护的插件肯定比我自己写的靠谱,有为何不用。我便也因为能写项目而忽视js基础,this指向傻傻分不清楚,原型原型链也只是纸上谈兵,从未用过。甚至在3月份面阿里时连一本完整的js的书都没看过。。。现在想想,被刷的毫无悬念。

我开始重视基础,首先从看书开始,认真读了《js面向对象编程》,虽然还是没有实践,但是理论基础有了。

7月份又面了阿里一次,这次人家不问别的,就问原生dom操作,还只是问api我就卡死了,别说性能了。。。因为平时从来不用原生js操作dom,我便彻底忽略了这块,我尝试引导面试官聊点别的,但是面试官就问这方面,后来我问面试官为何一直问这个,开发过程如果不自己写框架并不会真的用到这个,面试官说dom操作是js的一个核心,是基础检查的一个方面。我想就这个方面已经能看出一个人的js基础水平了吧。然后我自然又挂了。

其实因为之前开发任务重,我也没时间准备面试,一些必备知识我都不清楚(在小公司有开源社区的贡献,这些知识也没有必备的刚需。。。),在我决定还是要换个大平台的时候,我毅然辞职了。然后8-9月就是修修以前公司存在的bug和小的需求过度(他们招不到人),一边对着网上的面试须知,各种看前端基础知识,倒不完全为了答题,也是为了补基础,记了好多印象笔记,很多东西解决了以前开发时的疑惑。开始清楚css盒模型,知道BFC和浮动到底是什么,了解了http协议和装态码,项目优化原则,js性能提升,浏览器渲染过程……这些都是花一点时间就能获益很多的知识点,很遗憾自己没在刚入门前端时由浅入深的就去了解这些。这段时间没有什么实践,但是基础补的不少。后来有时间间也试了下less,sass,jade,react之类之前没接触的东西。

之后拥抱变化一出来,阿里是去不了了,但是网易、蘑菇街的面试都过的很轻松。想要找个好工作,基础还是很重要的,特别是应届生,你的公司很看重你的基础,基础是敲门砖,敲完了,才有兴趣看你潜力、学习能力什么的。

方向

找工作及入职后,我都没以前初创公司里那么忙了,我有时间可以关注微博前端大V的动态,关注知乎相关话题,看些新兴的技术,开始看到整个行业的发展,猜测趋势(虽然不一定看清、看准)。开始明白前端是什么,优秀的前端是怎样的,自己在哪一步,自己接下来将要如何发展,前端将还会如何演变。这些问题清楚后,方向感明朗,真个人都充实有信心了。

书籍

落地工作也在做,为了构建良好的知识体系,书还是看了一些的,除了我的js首本《js面向对象编程》,这真是把js中的对象概念说的很清晰的一本书,很多基础还是不能只看博客,太片面,看本书会清晰很多。《javascript dom编程艺术》,但是感觉内容落后了,还是去看了阮一峰的系列博客了解了dom操作,《高性能javascript》是本收益匪浅的好书,《angular js权威教程》弥补了官网文档的零散性,从系统的角度介绍了这个框架,在我做项目时常会翻,《react 引领未来的用户界面框架》里面的demo不错,对于初学者,复杂度恰到好处。

很遗憾的是一直想系统的了解css,都没找到什么好书,《css设计指南》2天看了感觉介绍的太浅了,90%都是我知道的内容,但是不能解释我的很多疑惑,声誉不菲的《css secret》介绍的是css的一个个小技巧,还是不系统。

基础修炼

除了看书,进了🍄后,基础一直在被翻炒加强,开始自己基于原型写组件了,终于和一直相依的对象字面量方式说拜拜了,this,apply,bind,prototype也都能玩的开了。虽说还待继续深入,但是好歹也算是个jser了。

学习模式

这个还真是重要,对于新事物的学习模式,直接决定一个人的学习速度和接受新事物的能力。

我会先看官方文档,特别是react\angular这类的库,但是es6,我就没耐心看w3C的文档了,看的是阮一峰的博客。看完官方文档,并跟着demo走一遍基础用法后,可以想想自己项目开发中经常遇到的一些需求和问题,如果用这款框架,该怎么实现。然后可以去git上搜搜这个框架写的优秀的项目,拜读2个,基础就差不多了。然后最好是有项目练手,否则就自己假设项目场景,一定要从0开始写一个项目,脚手架都自己搭,虽然挫点,但是能让自己明白这一切如何工作。在写的过程中会遇到很多实际的问题,再去文档中或社区里找到答案。

感恩他人

首先要感谢的是我现在的公司-蘑菇街,一家非常有意思的公司,给了我很大的幸福感。不错的offer是对我技术的肯定,工作环境的健康舒适让我工作心情很好,各种福利更是给我大大的愉悦,还有同事们的乐观向上奋斗让我觉得很亲切~~~

也感谢前公司的信任,让我能够挑大梁做了那么多东西(当然可能是招不到其他人做。。。),让我有机会折腾实践新技术(当然也是挥洒廉价劳动力。。。)。

感谢协会的一群小伙伴,在技术的路上耳闻目染,间接的影响也让我收益匪浅,而且对计算机领域见识比较广,毕竟协会有搞安全的、渗透的、ios/andriod开发的、java/php/node后端的、linux内核/windows内核的,海阔天空,视野要广,工作后,真的觉得这些影响让我获益良多。更多的是协会精神,对技术的无限热爱。

还有协会里曾经解我困惑的plusman,廖师兄,小草,这些人都真真切切的帮助过我,解过技术疑惑。还有我的男友兼入门领路人,虽然前端的门带我入的极不专业,但是授人以渔了,教会了我学习,如何在技术的道路上不断学习。

🍄里的学长XX,XF,都是货真价实的师傅啊,真的进了🍄后,才发现有人可以解惑真的太好了,遇见这2个学长很幸运,因为他们不同于旁人,他们对技术的热爱和追求和协会小伙伴一样一样的,而且是专业的前端,眼光和见解都很专业,不仅授人以渔还能授人以鱼了,有这样的学长走在前面,真的很开心,希望自己别依赖上了。


2015,是丰富而刺激的一年,希望未来的我感谢这一年我的所作所为。