共 2835 字,读完需 5 分钟。写作本文的目的:构建自己关于前端工程师成长过程的认知模型,从自己的视角来分析 Programmer、Developer、Enginner 的能力结构与工程师成长过程的关联,并分享出来给大家,期望能对入门的前端同学有所借鉴和启发。需要提前说明的是,文中用到的工程师的不同叫法并不是要给工程师分类或者贴标签,因为工程师的成长过程是连续的,喜欢钻牛角尖的同学请自行绕路。

程序员 or 工程师

圈内对从事软件开发的同学有很多叫法,如程序员(Programmer)、开发者(Developer)、工程师(Engineer),甚至是码农,“码农”是圈内人用来自嘲的,那其他几个名词呢?表面上看起来都是做软件开发,叫什么真的重要么?

不得不说,叫什么并不重要,不论是自称还是他称,什么学历、几年工作经验也不重要,真正重要的是人所具备的能力。那么既然名称不重要?为什么还要谈论它?名称的真正意义在于能让我积极拓宽自己的视野,不断点亮自己的技能树,在职业发展的道路上不断积累、不断提升。

工程师做事的三重境界是什么?程序员、开发者、工程师这些叫法跟这三重境界又有啥关系?

第 1 重境界:把事情做成

把事情做成是公司对员工的基本要求,绝大多数入门同学就处在这个境界,这个境界的人可称为程序员(Programmer),对于 Programmer 通常需要告诉他做什么、怎么做,他所需要的是执行力和基础技能,这里的技能包括:基本的编程技能,至少会一门编程语言,对这门语言的熟悉程度至少能够让他把基本需求解决。具体到前端领域,对 Programmer 的要求就是需要能够使用 JS、CSS、HTML,并且熟悉编辑器、浏览器来完成基本需求。

以常见的 WEB 端统计为例,为了研究页面关键元素的用户行为,需要对用户的部分交互添加事件统计(更常见的叫法是“埋点”),比如单击事件,表单提交事件,如果使用百度统计,在页面中埋点的方法大概如下:

<a onclick="_hmt.push(['_trackEvent', 'checkout', 'click']);">购买</a>

或者在 JS 中埋点:

// 需要发送统计的时候
_hmt.push(['_trackEvent', 'checkout', 'click']);

接下来由于业务需要,相同的统计,需要往 Google Analytics 发一份,最简单粗暴的解决方案如下:

<a onclick="_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-* 参数标记事件名称、事件类型以及额外的参数:

<a data-event-name='checkout' data-event-type='click'>购买</a>

然后,在页面级别监听那些埋点的节点,并且恰当的时机发送统计代码,简化版如下:

// 相同的参数发送给所有已接入的统计平台,如果平台不同,适配工作也在这里做
const sendEventLog = (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) {// 拿到事件发生的节点const target = $(e.target);// 获取事件属性const name = target.attr('data-event-name');const param = target.attr('data-event-param') || '';if (!name) {return;}// 这里如果是链接跳转,需要走单独的逻辑sendEventLog(name, 'click', param);
});

上面探讨了从 Programmer 进阶到 Developer 的方法就是积累,那么怎么积累?我行动的基本法则是:做出好的东西先要知道好的东西长啥样。一方面,多读经典的书,仔细读高质量的文章,注意这里面读远比收藏重要,上哪里去找经典的书和高质量的文章?这需要建立自己的信息筛选机制;另外一方面,遇到问题要学会去搜索,找更多的解决方案,然后比较,融会贯通。

不得不承认,从 Programmer 进阶到 Developer 需要非常多的努力和积累才行,但是精进之路永无止境,下面说说第三重境界。

第 3 重境界:把事情做绝

能够把事情做绝的人,可以称得上是工程师(Engineer),那么到底怎么才算是把事情做绝?以统计埋点为例,能够洞悉埋点需求的本质,把日志发送和埋点标记解耦之后,将两者都做到极致。现实中埋点需求的来源通常是运营和产品经理,所有的变更基本都是由他们驱动,如果能够给他们提供工具管理页面中的埋点标记(思路关键词:XPath、微服务、浏览器插件,细节不在本文描述),就能把工程师从这种琐碎需求中解放出来去做更有意义的事情,这样也就改变了组织中不同员工间的协作方式,提高组织的效率。

想成为前端工程师,要先成为工程师。工程师应该具备怎样的能力?要回答这个问题,我们不妨仔细思考下什么是工程,WIKIPEDIA的原文如下:

Engineering is the application of mathematics and scientific, economic, social, and practical knowledge in order to invent, innovate, design, build, maintain, research, and improve structures, machines, tools, systems, components, materials, processes, solutions, and organizations.

简单说,工程就是运用知识去设计、创建、维护、改进工具、系统、流程和组织的过程,而工程师是推动这个过程的最主要角色。

工程师,首先要具备很强的学习能力,能掌握完整的知识体系,知识的来源并不重要,可以来自于自学,也可以来自于学校,以及生产实践的总结,只局限于一门编程语言或特定的几个工具是远远不够的,让一个工程师切换到新语言不会有什么障碍,扎实的计算机科学基础是基石。具体到前端领域,基本的数据结构和算法、设计模式和变成范式、网络、JS、CSS、浏览器、性能、设计,软件质量、可维护性、可扩展性,软件工程化(构建、部署、运维、监控)。

工程师,还要具备良好的抽象思维能力,有了抽象思维能力就能够快速建立起系统运行机制的思维模型,也能把现实世界的业务问题转化为了恰当的模型,然后用技术去解决。具体到前端领域,比如前端应用的典型信息架构,状态机、栈、队列这些数据结构在前端的应用。

工程师,还要具备良好的沟通能力,沟通能力的好坏决定了你是否能准确理解需求的本质,是否能把自己的的设计方案清晰的展示给同事,而沟通的形式就不那么重要了,可以是书面文字,可以是白板、思维导图,甚至是动画演示。

工程师,还要具备平衡取舍能力,知道在哪些地方只需要做成,哪些地方需要做好,哪些地方要做绝,因为工程的要义就是取舍,在商业和技术之间寻求平衡点,这往往是很多人所忽视的能力。

冰冻三尺非一日之寒,成长为靠谱的前端工程师也不能一蹴而就,需要长时间的积累和沉淀,而到达这个境界之后就结束了么?绝对不是,阻碍人前进的最大障碍就是他的心智,还是那句话,精进永无止境。

One More Thing

本文作者王仕军,商业转载请联系作者获得授权,非商业转载请注明出处。如果你觉得本文对你有帮助,请点赞!如果对文中的内容有任何疑问,欢迎留言讨论。想知道我接下来会写些什么?欢迎订阅我的掘金专栏或知乎专栏:《前端周刊:让你在前端领域跟上时代的脚步》。

Happy Hacking

前端工程师做事的三重境界:我的进阶之路相关推荐

  1. web前端工程师进阶学习线路图

    目前前端市场的人才结构以初级web前端工程师居多,因此由入行到进阶的成长曲线已经成为大多数前端工程师的发展目标.在提升阶段对于知识和技能掌握,我们需要从梳理好的知识架构中选择更深一层次的技术进行学习, ...

  2. 新型前端开发工程师的三个境界 后端开发工程师如何快速转前端

    初入软件开发这一行时,当时还没有前后端分离这个概念,所有的开发工程师既能写html,也能写后台服务,随着技术的发展,前后端分离成为趋势,目前团队不少人能熟悉的写java后台服务,却难以hold住前端页 ...

  3. 软件测试人员的三重境界

    测试的第一重境界:围着Bug转 "意 识决定行动,行动决定结果"是管理学中众所周知的名言.做测试的前几年,笔者并没有这个意识,也没有主动地去思考过这个问题,但随着一个个项目任务.一 ...

  4. [转]测试的三重境界

    测试的第一重境界:围着Bug转 "意 识决定行动,行动决定结果"是管理学中众所周知的名言. 测试的第一重境界:围着Bug转 "意 识决定行动,行动决定结果"是管 ...

  5. 网站性能优化的三重境界

    这篇文章是关于网站性能优化体验的,性能优化是一个复杂的话题,牵涉的东西非常多,我只是按照我的理解列出了性能优化整个过程中需要考虑的种种因素.点到为止,包含的内容以浅显的介绍为主,如果你有见解能告知我那 ...

  6. 电商前端工程师:国内WEB前端开发经验之路

    一直想写这篇"十日谈",聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是" ...

  7. 前端工程师的成长之路

    一直想写这篇"十日谈",聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是" ...

  8. 2022 年前端工程师学习路线图(完整版)

    前端发展越来越快,每天都有数不胜数的技术发布. 想要入门前端却没有一条较为理想的路径? 在这个世界里兜兜转转了很久还是感觉在外围搬砖? 那么你可能需要这份技术学习路线图! 我们把学习前端分为三重境界: ...

  9. 美团第一位前端工程师竟是转行程序员!关于他的10年技术生涯

    从饭否到美团,潘魏增用十年的技术生涯,诠释了"长期有耐心"这句话的含义.在他看来,长期有耐心,其实也是延迟满足感.对从事的行业来讲,我们要把眼光放得更长远一些,十年后才有回报的生意 ...

最新文章

  1. Python如何优化列表接口进行分页
  2. javascript中常用数组函数
  3. (转)更新Java final常量后,请重新编译你的class
  4. C#中Monitor和Lock的用法区别
  5. [FY20 创新人才班 ASE] 第 1 次作业成绩
  6. Python 为何能成最强编程语言?!
  7. sudo su 和sudo -s的区别
  8. [译] 为什么需要在 React 类组件中为事件处理程序绑定 this
  9. git可视化管理工具sourcetree
  10. WPF框架下,窗体的嵌套显示
  11. 数据库建表语句的使用及简单实战
  12. 360怎样修改wifi服务器地址,360安全路由器IP地址设置的具体操作方法介绍
  13. ceph RBD块存储常规操作
  14. 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...
  15. 自建数据库与云数据库RDS性能优势与优缺点对比
  16. oracle 分组统计效率,Oracle 分组求和函数(rollup、cube、grouping sets)
  17. java根据内容生成二维码并保存到本地
  18. oracle税务运维脚本练习,荣欣Linux运维+Oracle DBA初级+高级全套实战训练
  19. C语言里栈和堆的区别整理
  20. 联想台式修复计算机,联想台式电脑如何一键恢复出厂设置

热门文章

  1. foreach+php+四维数组,怎么在PHP中利用foreach对多维数组进行遍历
  2. linux 内核协议栈 ip_rcv_finish,Linux内核协议栈学习笔记(二)--netfilter框架
  3. kotlin编译失败_关于应用Kotlin后的编译速度问题
  4. 谷歌为什登不上去github_同声传译被攻陷!谷歌发布Translatotron直接语音翻译系统...
  5. 热更新_UnityXlua热更新
  6. java检测安卓程序退出_java – 退出应用程序时的Android停止服务
  7. 电脑鼠标失控自己乱点_在这款沙盒游戏里,你只需要乱点鼠标就能成为建筑艺术家...
  8. python运行界面黑色_在Python中使用open执行轮廓检测后,如何使图像的背景变黑?...
  9. ribbon 配置 动态更新_SpringCloud实战三-Ribbon
  10. kfaka storm写入mysql_基于Storm+Kafka+Zookeeper锁+Memcached+mysql架构全方位系统Storm项目案例实战...