How is the work itself
总体来说,这是一个Awesome的,让我和别人都感到幸运的工作。公司的状况感觉上非常好,在移动电子商务平台市场占有率号称是全美第一,每天感觉新的项目不断的启动,每周都有新的项目上线。整个公司的人员配置也很完备,技术开发人员占全部的员工的一半,数据分析团队也占了很大的部分,设计,产品,运维,会计,行政,管理层都有明确的分工,说明公司已经非常的完善稳定。前端组一共有二十人左右,但由于项目基本是在项目组里进行,所有我跟他们平时的交流不多,就是在第一次前端组的会上见过一面,后面也没有在开过类似的会了。前端组的老大是一个呆萌的胖子,平时很少见到他,他好像也不怎么管我们,所以加了面也没啥好聊的。前几天前端组又聚了一次,在新版Frontend的发布会上,Frontend是公司内部的前端框架,由Architecture组的人写的,狗也参加的这次发布会还是出现了不少让人起哄的场面。总之技术组给人的感觉还是非常棒的,尽管交流不多,然能看出大部分都对技术很有热情,不时能听到他们讨论有Web Component,ES6这类时髦词汇。每天都在打交道的人是项目组的同事,项目组在公司被称为Pod,我们组叫Human Center Pod,有三个前端工程师,两个后端工程师,一个项目工程师(项目经理),一个产品经理。三个前端中,一个senior,一个junior,还有一个new hire是我。七个人除了senior前端,其他都在二十来岁,跟我年龄差不多,或者比我再大一点。我的大多数问题都会向坐在我右边的junior前端求问,他再这儿工作了半年,偏传统的设计型前端,对CSS更熟悉一些,但如果遇到JavaScript的难题的时候,或者Ember的问题,常常我就的找坐在他右边的senior前端了。尽管大家都很乐于帮助,也很耐心,但从技术的追求上,他们都达不到我会去敬仰的程度,他们的expertise更多是建立在对现有项目的熟悉上。另外一点可以看出的是,他们在技术的最佳实践上并没有更新最新的步伐,不如在debug上,他们用的还是console.log,也没有使用更加高效的dev tool的re-compile,breakpoint和profile功能,还包括ember-inspector。在遇到越困难的bug时会提高越多的工作效率。
除了工作,上班时他们几乎无时无刻在讲笑话。一开始我觉得听不懂可能是因为我不太熟,后来熟悉一些了能听懂了发现他们真的很会讲笑话,相比之下我的确是个无聊的人。我总是不知道该说什么怎么接话,所以我只能在哪儿傻笑,实在无解。这个时候往往就在像如果是在国内,应该不会是这样吧。
对面的哥们儿是项目经理,负责给我们分配任务,review和merge我们的代码,年纪跟我们差不多,但似乎已经在这里混的很熟了,经常四处开会,各种领导层来这儿跟他扯淡。哥们儿确实挺牛,聪明,工作专注,也有点傲慢。似乎他总给人感觉对方比自己笨。
左边的产品经理是个黑人女性,非常不典型的黑人,受过高等教育,聪明,能说会道。但对于我这个不太多话的亚洲人,她跟我交流的时候总是怪怪的显得不自然。在我的眼中,她虽然能力很强,但不是那种主导事情走向的人,她有时有自己的看法并且表现出主导场面的气势,但最后往往“略显无奈”地听从了别人的想法。不知道这是不是与她是黑人这一不可避免的事实有关,还是来自于周围技术人员在知识上对她的优势。当然了,她已经做得很好了,致使表现出了的形象与她实际的影响力有些不符。
两个后端开发就是我们笑话的辐射中心,他们俩的笑果都是极冷的,有时候一个笑话要过好久旁边的fe才笑出声来。照美国人说,他们就是那种super nerd,特别是其中的一位,看上去非常瘦小,带着眼镜,穿着随意得邋遢,人看起来很无聊不善交际,但能感觉到内心世界很丰富,经常能语出惊人。
剩下的那位就是来自中国的刚工作两个月的前端工程师,能够感觉到他的谨慎但热情,可能与他的特殊情况有关,这是他的第一份工作,还不知道如何跟同事打交道的分寸,在不知道的情况下他处于理性的选择安静,这也是他第一次试图融入美国环境,尽管来了两年,但学习中周围都是中国同学,生活在中国朋友圈中是大多数,在文化上的差异也让他选择谨慎地观察,而不是贸然地行动。尽管有不少阻力,但他保持着不错的态度,保持向周围学习,表达自己的观点,遇到问题的还算能够积极乐观的去面对。问题更多的来自于他自身,他那种积极的安静的态度不能时刻的保持,因为他毕竟不是人自然的状态,一旦久了,容易造成身心俱疲,心情糟糕,反过来影响他原先的积极乐观,从而导致一个恶心循环。这就是他目前的状态。如果我周围出现了向他这样的一位员工,我也许会主动的带着他与更多的人交流,主动询问他的意见,相信他。但现实没有那么理想化,人与人之间的关系更加微妙,少有过度的行文就会引起不必要的误会,所以人们常常选择保持一定距离,这点在美国人身上更加突出,更何况是在与一个文化差距如此之大的中国人之间。他能做的只能从自身开始,一点点的融入,改变,表达。尽可能保持好他自己的状态,相信一切会好的。
About the technology we use
技术的选择上,公司走得非常激进,后端使用nodejs,前端使用了ember,内部框架使用npm安装,代码使用github管理,最近甚至出了一套内部的Code Style。由于项目本身大部分是不断重复的,久而久之就自然而然地形成了一套内部框架,包括前端和后端的,还有一些ui库,整体的复杂度我不认为很高。项目库的复杂度来自于checkout部分ember的那部分代码,以及产品展示页面重js逻辑的差维护性的那部分代码,还有框架与自定义代码之间的冲突,主要来自于js,另外还有一些对过时设备的支持。最近我花了大量时间在安卓的4.1.2的原生浏览器的支持上,弄得心情特别差,因为往往追踪bug到最后,发现是android自己的bug没法解决,只能找一些丑陋的补丁。
非常担心的是,一直这么下去会走进一个死胡同,也许对安卓老机型的bug有了更多的了解,但花了大量时间在那些毫无意义的bug上,让自己精疲力尽,又限制了自己的知识广度,更糟糕的是把自己困在了一个孤岛上,阻断了与周围人的交流的可能性。
Problem now after two months
问题很多,其中最大的问题应该是,经过了两个月的磨合,感觉自己仿佛失去目标,也失去追逐目标的动力。值得庆幸的是我在这里还没忘记再问自己,目标是什么?我觉得第一,成为一位牛逼的前端工程师,甚至是一位牛逼的技术人员。第二,增加自己在人群中的影响力。第三,找个女朋友。
三个目标来自于三个问题,第一个技术问题显而易见,自己的技术水平太过于表面,不管是HTML,CSS还是JavaScript都没有深入到技术内部,仅仅停留在应用层面。对于HTML,我只知道它的Tag有哪些,在什么时候使用什么样的Tag,但我不准确的说出HTML的语义化是什么,HTML的DOM解析是如果进行的,HTML5的api有哪些,HTML的template是如何compile的,这些都需要对HTML有更深的了解。
CSS可能是我比较熟悉的,但我对它的熟悉程度也就停留在对一些hack和CSS3的使用上,深入的了解需要解决的问题是,CSS的选择器该如何设计,模块化CSS,CSS的性能问题(特别是页面的reflow和repaint),如何写出高质量的CSS,移动设备的优化,跨设备的支持。
JavaScript可能是最复杂的,我在上面花的时间也最多,但依然感觉自己没有掌握这门语言。问题在于对JavaScript的方法和对象的继承机制没有充分理解,导致在很多代码复用问题上显得无从下手。对JavaScript的事件机制还不是很清楚,对于事件的注册,代理,触发,时间循环还不是非常清楚。JavaScript的一些常用的模式感觉有些懵懵懂懂,特别是常用observor模式,在model-view的绑定经常使用,但对其背后的机制还不是很清楚。UI组件的开发中要注意哪些问题。框架开发要注意哪些问题。Ember的充分理解。JavaScript的高级应用,包括动态编译,Test,安全,WebSocket,Promise,ES6的新特性等问题。同时还需要对平台的理解,例如浏览器的原理,网络加载的步骤,页面渲染的步骤,浏览器缓存,异步同步多线程。此外还需对常用的工具要清楚,比如commend line,linux,test framework, dev tool, profiling, jquery core。
如果对以上都有比较深的理解,仅仅是成为了一个资深的前端工程师。要成为牛逼的技术人员,还需要涉猎更广的技术,首先是服务器端,需要知道后端开发的通用问题,例如扩展性,复用性,可维护型。使用算法提供程序的效率。服务器配置,数据库优化,多线程的机制,并行处理,操作系统,网络协议。还需要涉猎其他平台比如ios和Android开发。优秀的技术人员还需要懂得如何让更多人的人合作开发大型的项目,团队建设,版本控制。
这么多看起来似乎要一下子都学会有点不切实际,但考虑到自己的职业生涯还有四十年,我想应该会在十年之内达到的把。所有首先在两年内成为一名出色的前端工程师,在五年内达到一名优秀的技术专家,在十年内成为一名合格的技术主管。
第二个目标是增加自己的影响力,现在很大的一个问题就是在公司里我很难找到自己的存在感。