程序员,开发者or工程师
圈内对从事软件开发的同学有很多叫法,如程序员(Programmer)、开发者(Developer)、工程师(Engineer),甚至是码农,“码农”是圈内人用来自嘲的,那其他几个名词呢?表面上看起来都是做软件开发,叫什么真的重要么?
不得不说,叫什么并不重要,不论是自称还是他称,什么学历、几年工作经验也不重要,真正重要的是人所具备的能力。那么既然名称不重要?为什么还要谈论它?名称的真正意义在于能让我积极拓宽自己的视野,不断点亮自己的技能树,在职业发展的道路上不断积累、不断提升。
工程师做事的三重境界是什么?程序员、开发者、工程师这些叫法跟这三重境界又有啥关系?
第1重境界:把事情做成
把事情做成是公司对员工的基本要求,绝大多数入门同学就处在这个境界,这个境界的人可称为程序员(Programmer),对于Programmer通常需要告诉他做什么、怎么做,他所需要的是执行力和基础技能,这里的技能包括:基本的编程技能,至少会一门编程语言,对这门语言的熟悉程度至少能够让他把基本需求解决。具体到前端领域,对Programmer的要求就是需要能够使用JS、CSS、HTML,并且熟悉编辑器、浏览器来完成基本需求。
以常见的WEB端统计为例,为了研究页面关键元素的用户行为,需要对用户的部分交互添加事件统计(更常见的叫法是“埋点”),比如单击事件,表单提交事件,如果使用百度统计,在页面中埋点的方法大概如下:
aonclick=_hmt.push([_trackEvent,checkout,click]);购买/a
或者在JS中埋点:
//需要发送统计的时候
_hmt.push([_trackEvent,checkout,click]);
接下来由于业务需要,相同的统计,需要往GoogleAnalytics发一份,最简单粗暴的解决方案如下:
aonclick=_hmt.push([_trackEvent,checkout,click]);
_gaq.push([_trackEvent,checkout,click]);购买/a
JS中也需要做同样的修改:
//需要发送统计的时候
_hmt.push([_trackEvent,checkout,click]);
_gaq.push([_trackEvent,checkout,click]);
如果网站的页面规模、统计事件量小,变更埋点可能会比较轻松,但当页面和事件数量随着业务发展激增,估计程序员会埋点埋到手抽筋了。这个时候Programmer会不高兴,很可能Boss也会不高兴,因为埋点效率提不上来,并且容易出错。聪明的Programmer会发现,仅仅从表面上把问题解决貌似还不够。该如何破局?
第2重境界:把事情做好
具备什么样的能力才能把事情做好?对基本技术的熟悉程度超过(需要超过一大截)把事情做成的需要;对于业务需求有一定的前瞻性;能给出比较健壮的技术方案,能一次解决一类问题而不是一个问题,知道什么样的方案是不靠谱的,具备这些能力的人可称为开发者(Developer)。
不可否认,Developer是升级版的Programmer,相比而言,Developer大多数时候需要自行找到问题的解决方案并落地实施。通俗的说,面对具体的技术、业务问题,Developer能比Programmer顾及到更多的点,想到更多的方案。但是要实现这两个“更多”,需要的是努力、时间和经验的积累。
当然,从Programmer到Developer的进阶是可以加速的,需要压缩自己的时间在更短的时间内做更多的事情,注意这里不是把相同的事情重复N遍,如果是那样就很容易出现3年工作时间半年工作经验的尴尬。
回到上面提到的埋点方案,简单粗暴的解决方式存在什么问题?
首先,代码扩展性太差,后续如果需求方需要接入自建的统计,前端的工作量并没有减少,反而改起来会需要更加的小心翼翼;
其次,直接发送统计是否能保障精确送达,有没有可能存在漏报的情况,细心的同学肯定能想到这种风险;
最后,前端代码风格,其实不太推荐在HTML中内联书写JS事件,这就是脏代码的典型例子;
Developer会如何解决这个问题呢?先理清楚埋点代码的本质:发送统计的动作、指定统计参数,其中发送统计的动作跟需要接入的统计平台有关,确保统计到达也跟这个动作有关,这个动作跟统计参数无关,而统计参数本身跟节点的关系比较紧密,动作和参数可以解耦开。
基于这样的认知,不难设计出下面的方案,在所有需要埋点的地方约定参数的标记方式,使用data-event-*参数标记事件名称、事件类型以及额外的参数:
adata-event-name=checkoutdata-event-type=click购买/a
然后,在页面级别监听那些埋点的节点,并且恰当的时机发送统计代码,简化版如下:
//相同的参数发送给所有已接入的统计平台,如果平台不同,适配工作也在这里做
constsendEventLog=(name,type,param)={
_hmt.push([_trackEvent,name,click,param]);
_gaq.push([_trackEvent,name,click,param]);
};
//针对单击事件的处理,其他事件可以类似处理
(body).on(click,[data-event-name][data-event-type=click],function(e){
//拿到事件发生的节点
consttarget=(e.target);
//获取事件属性
constname=target.attr(data-event-name);
constparam=target.attr(data-event-param)
;if(!name){return;}
//这里如果是链接跳转,需要走单独的逻辑
sendEventLog(name,click,param);
});
上面探讨了从Programmer进阶到Developer的方法就是积累,那么怎么积累?我行动的基本法则是:做出好的东西先要知道好的东西长啥样。一方面,多读经典的书,仔细读高质量的文章,注意这里面读远比收藏重要,上哪里去找经典的书和高质量的文章?这需要建立自己的信息筛选机制;另外一方面,遇到问题要学会去搜索,找更多的解决方案,然后比较,融会贯通。
不得不承认,从Programmer进阶到Developer需要非常多的努力和积累才行,但是精进之路永无止境,下面说说第三重境界。
第3重境界:把事情做绝
能够把事情做绝的人,可以称得上是工程师(Engineer),那么到底怎么才算是把事情做绝?以统计埋点为例,能够洞悉埋点需求的本质,把日志发送和埋点标记解耦之后,将两者都做到极致。现实中埋点需求的来源通常是运营和产品经理,所有的变更基本都是由他们驱动,如果能够给他们提供工具管理页面中的埋点标记(思路关键词:XPath、微服务、浏览器插件,细节不在本文描述),就能把工程师从这种琐碎需求中解放出来去做更有意义的事情,这样也就改变了组织中不同员工间的协作方式,提高组织的效率。
想成为前端工程师,要先成为工程师。工程师应该具备怎样的能力?要回答这个问题,我们不妨仔细思考下什么是工程,WIKIPEDIA的原文如下:
Engineeringistheapplicationofmathematicsandscientific,economic,social,andpracticalknowledgeinordertoinvent,innovate,design,build,maintain,research,andimprovestructures,machines,tools,systems,