工作五年,后面四年重复着第一年的活儿?

转自:http://www.barretlee.com/blog/2016/07/21/donnot-repeat-yourself/

当我们沉浸在旺盛的需求之中时,整个人便会成为一台工作的机器,切着类似的页面,写着同样的逻辑,重复着昨天或者上个月做的事情,时间久了,觉得腻味,没有什么创新,也没有明显的成长。用一句通俗的话来讲:工作五年,后面四年重复着第一年的活儿。

很多人尝试跳出这个怪圈,不过基于环境压力和思维受阻,最后又不得不选择放弃。今天想通过介绍如何高效有保障地开发一个无线页面来帮助大家找到突破口。

日常开发状态

很多无线页面的开发有两种模式,一种是后台输出 JSON 数据,前端根据数据来渲染页面(同步模式);第二种是前端异步加载后端数据然后渲染(异步模式)。当然,两种模式夹杂在一起也是存在的,这种情况一般会有一个由前端控制的中间层提供同步数据和异步数据。为了减少前后端的沟通成本,往往采用第二种模式。

拿到设计稿后,与后端同学约定接口格式,让后端同学尽快提供 mock 数据,如果提供不了,便自己构造测试数据。接着回到自己的工位上切图,切图过程中会解决好响应式问题和兼容性问题,待到后端产出真实数据时,更换 JS 中的接口地址,联调 ok 便发布页面,大功告成!

整个流程很顺畅,这对一个工作了三四年的程序员来说,没有任何压力便完成甚至提前完成了任务。但是,回过头来想一想,整个开发过程中我们留下了什么?沉淀了什么?

放慢节奏,我们再走一遍流程

对于上面的开发流程,先提出几个常见的问题:

  • 你是如何良好处理大、中、小等各型号手机的适配问题的?Media Query?等比布局?
  • 模块如何渲染,模板和接口数据如何拼装?字符串拼接?正则替换?模板引擎?
  • 本地、预发和线上三套环境,如何进行无痕切换?
  • 如果开发时接口有变动,线上数据暂未产出,本地 mock 接口如何快速响应?
  • 如何解决异步 JSONP 接口的安全问题?JSONP 接口请求异常、超时、失败等情况如何处理?
  • 页面中的 Slide 和 Tab 逻辑如何写?复制之前写过的代码?找一个好用的组件?
  • 图片的懒加载处理如何控制?脚本的懒执行如何控制?
  • 首屏加载页面空白体验如何优化?
  • 页面回退 Session 和 Token 失效如何处理?

上面提出的几个问题,列的不全面。有一些可能是你经常碰到的,甚至有了成熟的解决方案,而也有一些问题可能是你从未考虑过的。

我们把整个前端开发流程做简单切割:切图、获取数据、渲染、事件绑定、数据统计、页面优化、监控。这种切割很暴力,也比较粗糙,不过它不妨碍我们在下面讨论,作为前端工程师,除了完成日常需求外,还要做什么?还能做什么?

切图

隐约还记得三年前,我接了一个无线页面的外包活儿,页面的结构很简单,但我做的很糟糕。为了适配不同尺寸的机型,我写了无数 Media Query,加上当时采用的 em 作单位,很多细节位置都没控制好。

回到现在,已经有了很通用、主流的方案——使用 rem,动态计算 html 标签的 font-size,思路很简单,但是存在不少的坑,和一些较难理解的概念,Google 搜索下 lib-flexible 能够找到这些问题以及解决方案。不过我们切图时还可以思考一些其他的问题:

  • 各类静态资源(image/css/js/font)如何放置?新建各种文件夹?
  • 是否还是修改代码再刷新页面的调试手段?考虑过 liveload?
  • CSS 复用率如何?跨项目的复用率呢?使用预处理语言封装基类?
  • 还在心算从 px 折算为 rem?用计算器算?
  • 身旁放 20 台机器测试页面兼容性?

以上问题,没有哪一个会让人特别苦恼,但是堆积起来,却让我们的开发效率和开发体验落后了好几个档次。这些问题并非无解,我们可以尝试着帮助同事和团队找到问题的答案,比如:

  • 统一团队的本地构建环境,初始化一个工程目录的脚手架
  • 统一打包脚本,实时编译和预览
  • 封装预处理基类,屏蔽 rem 计算,比如编译时自动转换 px 为 rem
  • 构建云测平台,云端测试各种机型兼容性,打开网页输入网址即可批量测试

有些解决方案只需要几行脚本就能搞定,而有一些可能需要投入时间和精力。

获取数据

本地、预发、线上三套环境,如何做到环境的顺滑切换?我在百度的时候,团队最常用的方案就是:

  • 线上测试,本地反向代理到预发或者线上环境;
  • 本地测试,则使用 apache 开启服务提供 mock 接口

可一旦与后端约定的接口有变动,本地 mock 数据也要跟着一起变动。这个问题有什么好的处理方案?在团队中,好的方案一定不是几行文字的提示或指引,而是通过流程和监控来控制!

这里提到的获取数据,细想之下可不是什么轻松的事情。有很多问题需要思考:

  • 如何保障 JSONP 数据的安全问题?refer 限制?token 验证?
  • 数据来源很多,如何减少页面的请求数量?让后端合并数据?如果是多个团队提供数据呢?
  • 如何控制需求变化导致的接口格式变化?
  • 如何处理接口的不稳定问题?
  • 如何处理超时问题?
  • 如何产生容灾数据?如何获取容灾数据?
  • 如何控制数据缓存?如前端控制缓存一分钟?
  • 如何对接口做监控?
  • 如何减少数据的重复请求问题?

以上每个问题都有很多处理方案,而这些问题不仅仅是自己会遇到,身边的同事也会遇到。如果可以站在团队的角度去思考问题,很多思路会比较容易涌现出来,比如:

  • 构建一个平台,用于接口格式约定,通过约定好的格式,系统自动生成 mock 数据,用于本地开发,后端也必须遵循这个接口约定,任何接口的变动,mock 数据自动变动
  • 构建一个平台,让不规范的数据进入这个平台,规范化输出,前端只考虑规范化的接口提示和解析,同时该平台产出数据的备份接口
  • 前端添加一个请求 Hub,当页面有很多请求出来时,合并请求统一发出,当数据回来时,统一储存和过滤

数据是最容易出问题的地方,每一个接口请求都需要一大堆的逻辑处理异常。倘若接口格式、开发流程和前端模式都可以规范化,我们需要做的就剩下套公式,这种高效你能否想象?

渲染

大胆地揣测下大家在写一个模块的时候,跟我一样也是这么划分的函数:

var Module = function() {
  this.init();
};

// 初始化
Module.prototype.init = function() {
  this.fetchData(function() {
    // do something
  });
};

// 绑定事件
Module.prototype.bindEvent = function() {
  // ...
};

// 获取数据
Module.prototype.fetchData = function(cb) {
  var self = this;
  ajax({}).then(function(data) {
    self.renderData(data);
  }).catch(function() {
    self._fetchDataFailed();
  }).fin(function() {
    cb && cb();
  });
};

// 渲染数据
Module.prototype.renderData = function(data) {
  data = this._resolveData(data);
  // ...
  this.bindEvent();
};

// 处理数据
Module.prototype._resolveData = function() {
  // ...
};

// 加载失败
Module.prototype._fetchDataFailed = function() {
  // ...
};

在代码中写大量的字符串模板不管一个模块有多么简单,它基本都会包含以上步骤,倘若没有用函数隔离每步操作的意图,代码会显得十分散乱。我经常看到,有同学把「渲染」这一块的代码被放到「获取数据」甚至是「初始化」中,这种程序结构显然是不合理的。同时,也经常会看到渲染时,

  • 写一个工具函数,解析字符串模块中的循环逻辑
  • 使用 replace 函数正则替换字符串变量
  • 使用 innerHTML 函数插入拼装好的字符串
  • 在渲染模块中添加大量逻辑

以上,没有哪一种是不正确的,我也没有对哪一种写法开喷的意图。但是至少我们可以在多次编程经验中提炼出一些有价值的内容:

  • 团队统一的模板引擎,并且提供模块的离线编译,提高线上运行效率
  • 提供安全机制,保障插入的数据不会产生安全问题
  • 严格编程范式,分离视图和逻辑层,把数据处理好了再送入模板

有一个可执行的编码规范,加上适当合理的 Code Review,整个团队代码便会如出一辙。

后续操作

本想写成一篇长文,把每个环节可以综合考虑的问题都提出来,不过本文的目的,只是表述一些观点,期望大家在编程的时候,有更多基于团队的思考,针对具体问题提出一些通用的解决方案。比如下面,再提出几个问题:

  • 首屏加载白屏问题,如何处理?本地缓存?等待提示?假数据?同步输出?
  • 如何减少页面的请求?资源内敛?如何做到自动内敛所有的资源?
  • 页面报错的统计如何做?做了之后如何分析?分析之后如何推动线上错误减少?
  • 页面发布时如何自动回归检测?点下链接看看是否 404?打开控制台看看是否有报错?滚屏看看图片是否加载正确?

以上问题,都有相当成熟的解决方案,那你们团队呢?

小结

当发现工作做起来索然无味的时候,我脑海中蹦出来的第一个念头是:最近是不是有点放纵了?

我喜欢用编程解决问题,只要是重复的事情,我一定会想尽办法简化,然后交给机器去做。我希望今年可以用程序解决更多的问题。

时间: 2024-10-13 08:24:37

工作五年,后面四年重复着第一年的活儿?的相关文章

Linux运维 第五阶段(四) corosync&pacemaker

Linux运维 第五阶段(四)corosync&pacemaker 一.相关概念: 补充 { what is high Availability? A=MTBF/(MTBF+MTTR) MTBF(mean time betweenfailures平均无故障时间) MTTR(mean time to repair平均修复时间) two ways improve availability? increase MTBF to very large values reduce MTTR to very

Linux20180423五周第四次课(4月23日)

五周第四次课(4月23日) 8.6 管道符和作业控制8.7/8.8 shell变量8.9 环境变量配置文件扩展bashrc和bash_profile的区别 http://ask.apelearn.com/question/7719简易审计系统: http://www.68idc.cn/help/server/linux/2014042190951.html关于PROMPT_COMMAND环境变量的含义 http://www.linuxnote.org/prompt_command-environ

工作五年的UI设计师,现在混的怎么样?不看是你的损失

很多刚入门UI设计师的小白都担心自己的前途到底怎么样,自己工作了几年有没有晋升的空间.毕竟很多人都不想要在基层工作一辈子,都想要往管理层发展.关于这个问题我自己也查了很多资料,看了很多UI设计师的故事,五年时间说长不长,说短不短,这段时间足够形成自己的设计逻辑架构,可以完成许多还不错的商业作品,甚至在许多人眼中是值得学习的大神.五年工作经验对于设计师来说是非常重要的积累期,五年后UI设计师将会走上不同的道路. 五年后一部分UI设计师通过自己的努力,不断地积累,成为了公司的设计总监.这部分人数量比

二十五、防止表单重复提交

二十五.防止表单重复提交 防止表单重复提交: 有两种方式: 利用重定向<result type = "redirect"/> 使用拦截器 编写jsp页面 <s:form action="regist"> ????????<s:textfield name="name" label="姓名"></s:textfield> ????????<s:token/> ?????

工作一年零四个月总结

到今天为止,刚好工作一年零四个月.其实真正入职产业部八个月,在这八个月里:前面三个月是做标书:5月份是在跟踪安徽覆冰项目,在这个过程中,主要的感觉就是把一个好好的甲方当成了乙方:六七月份主要忙于排除安徽覆冰装置的掉线问题,同时参与覆冰装置研发:八月份至今一直加班比较多,主要的工作是深圳局的电缆护层环流研发及PCB板的加工跟踪,在此期间还参与冀北视频项目研发,湖南电科院覆冰项目研发. 在此过程中,我学会了在与供应商或者客户沟通中迅速掌握核心信息的能力.与供应商沟通时,应横向比较各个厂家的实力,分析

五周第四次课(1月11日) 8.6 管道符和作业控制 8.7/shell变量 8.8 shell变量 8.9 环境变量配置文件

五周第四次课(1月11日)8.6 管道符和作业控制8.7/shell变量8.8 shell变量8.9 环境变量配置文件扩展bashrc和bash_profile的区别 http://ask.apelearn.com/question/7719 简易审计系统: http://www.68idc.cn/help/server/linux/2014042190951.html 关于PROMPT_COMMAND环境变量的含义 http://www.linuxnote.org/prompt_command

写在工作五周年纪念日

无论何时,请深爱陪伴在你身边的人,请努力去做自己喜欢的事情,请保持一颗坚强的心:当黑暗笼罩大地的时候你具有面对恐怖的勇气:当阳光出现在天际的那一刻,你能够享受温暖. 开始 2009 年的今天,我正式进入公司开始实习.尽管相隔五年,此刻想起来却一一在目,初出校门的农村孩子,面对陌生环境,对一切都充满好奇.然而天生的乡土气息使得自己没有什么胆量去发现周围的新鲜事物,只是循规蹈矩按照公司的实习流程一步一步认真的执行.那一刻,心中是一种从未有过的满足,尽量让自己表现得是个合格员工.每件事情都是小心翼翼,

工作中任务管理的四个原则和四个技能

这是前一阵给团队培训,提高团队工作绩效时写的. 四个原则: l 瓶颈性任务最优先解决原则 l 高不确定性的任务优先解决原则 l 前置性原则 l 复杂多变任务的处理原则 瓶颈性任务最优先解决原则 比如说,上面这个任务分解,B.C.F这条线是瓶颈线.是最优先解决的线. 高不确定性的任务优先解决原则 满足下列两条之一的任务是高不确定性任务: · 困难的.没有实现方案的: · 无法预估完成期限的: 还是以上面那张图为例子,假设A任务是高不确定性的任务,它可能无法解决,可能解决需要很长时间.它很可能比我们

工作五年以上的 UI 设计师都在干什么?

30 岁,现在坐标北京,从毕业至今都一直在做设计.目前从业超过了五年,也没打算离开设计这个行业.即便有一天不再从事设计专职的岗位,也仍然会在生活中,或者一些份外的工作中做「设计师」的角色,因为设计已成为我的一种习惯及思维方式,不断让生活变得更美好. ? 回到问题本身,刚入行时我也有过类似的疑问,UI(User Interface)设计师的出路是什么?或者说不得不转型的时间上限是什么?当时得到的很多答案是转行做产品经理,于是很多同学干脆直接选择做了产品经理,而我还是懵懵懂懂选择了设计岗位. 几年后