大约在三个月前,也写过一篇[这样的文章](http://www.cnblogs.com/strick/p/3946475.html),最近也在忙一个项目,最近几天有时间,所以就来这里发发牢骚。
  这次要开发两个产品,为期两个月,包括两个APP和三个后台。与上次开发的项目相比,规模要大很多,功能点也要多一些,难度也要大一些。
  我负责的是整个后台的前端、部分后台逻辑、部分API接口逻辑与数据抓取分析。
## 一、雾中前进
  这是我在这个迭代期中最直观的感觉,看不到前进的方向,也看不到离终点还有多远,有一种走一步算一步的赶脚。
  每天都在忙碌,赶进度,但别人问你还剩下多少或者问你大约做了多少的时候,我却答不上来。
  为什么会这样?因为我们在开发的开始阶段没有做项目进度计划,也没有做项目的时间评估。急哄哄的上来就开干,这是我们给自己挖的第一个坑。由于没做这个计划,自然而然的也就低估了这个项目的难度,乐观的以为凭借团队里成员们丰富的开发经验,可以很顺利的完成交付。后面吃进了苦头,经常的加班、返工、修改,陷入了一个恶性循环。
:-: ![](https://img.kancloud.cn/90/10/90100f7de0ae85cfa319a4a0867c63b1_628x306.png)
## 二、原型的理解
**1)仓促的设计**
  我们这边产品部门是在原型基本定稿之后,我们才开始开发的,所以需求的变更倒不是很多。不过产品部门的原型设计是在仓促出赶出来的,所以有很多地方写的很模糊,很容易产生歧义。
**2)准备不足**
  在项目的开始阶段,没认真的看原型,没仔细的分析,后面出那么多问题,只能说自己当初太任性,怪不得产品太复杂。后面在开发的时候,遇到模糊的地方就与产品面对面的讨论,反反复复许多次,其实完全可以在项目伊始,就该注意到这些歧义点。
**3)原型大而全**
  产品的原型做的是大而全,就是想一下子吃成胖子,他们可不帮你考虑实现难度这些问题。我们没做上面的分析,没有与产品讨价还价,等于默认照单全做,这是我们给自己埋的第二个坑。在接下来的日子里,光实现功能就花了我们很多的精力与时间,做出的产品质量可想而知,肯定是漏洞百出。
**4)产品瘦身**
  最后在产品发布前不得不瘦身,将能有的功能先上,仓促的发布,非常影响大家的心情,辛辛苦苦做出的东西却被硬生生的砍掉。当初就该与产品据理力争一下,先将核心业务实现出来,然后再围绕这些核心开发出周边的一些可有可无的功能。让我们有充足的时间写出健壮代码,减少返工,少走弯路,稳稳上线,大家开开心心和和气气的,何乐而不为呢。唉.... YY一下啦。
  下图是我听到瘦身时候的感受:
:-: ![](https://img.kancloud.cn/b3/bb/b3bbeb36d646585336fde319fdcba3a3_508x297.png)
## 三、团队的建设
**1)全新组建**
  我们的团队是重新组建的,成员都是在项目中陆续加入的,十一月初的时候服务器组有4个人,IOS和Android各1人,设计1人。这是刚开始的配置,项目在开始45天后,服务器组10人,IOS有6人,Android有5人,设计有4人,团队发展迅速非常快。
**2)磨合期**
  大家都是初次合作,就需要一段磨合期,不过项目非常赶,刚进来的人,基本都是给他们介绍一下后,就马上开始,这导致很多潜在问题。例如大家都是各自开发,很多功能其实可以抽象在一起,但每个人都写了一套,也没时间做code review,只能发现一个问题改一个,类似的地方还得复查一遍,以防出现同样的问题。再比如,一开始也没怎么订代码规范,有的成员没在方法的注释中写author,等这个函数出了问题,都不知道该找谁。
**3)对产品的理解不同**
  成员都是后面陆续进来的,对产品的理解一开始都是模糊的,直接就开发,难免会走岔,返工是经常的事儿,边开发边理解产品就是我们目前的方式了。
**4)初次配合**
  服务器与客户端之间的配合也是第一次,刚开始由于接口文档没有写具体,导致两边之间出现了些沟通问题,很耗时间,刚开始是举步艰难。古语说的万事开头难,真的很有道理。后面经过各种措施,情况得到好转,成员之间的默契也越来越好。
**5)代码从0开始**
  刚开始的时候,啥也没有,大部分的工具类代码都没有,都是重新写的,这个也是挺耗时间与精力的。前端的JS脚本和CSS都是重新设计编写,写的代码肯定也不会很健壮。项目开始的时候服务器端只有4个人,我们是先编写后台,所以还得再分出一个人去做前端,人员就更加紧张了。
:-: ![](https://img.kancloud.cn/a3/fb/a3fb38290af78f80eb08346c832a9212_330x201.png)
## 四、与产品的沟通
**1)认识层面不一样**
  一个大问题,开发人员与产品设计的理解总是不在一个频道上面。例如原型上面的一个功能,我们按照对原型的理解开发好了,给产品的看要么不是这样做,要么又漏掉了一些细节。有时候在与产品的人讨论过后,我们在开发后也会出现类似的问题。后面就采取措施,每次讨论就要产品把要修改的地方发邮件出来,有根有据的,出了问题也能找到在哪块做岔了。
**2)情绪作怪**
  情绪也是个大问题,功能多,时间紧,经常返工,这无形中就给了我们很多压力。有时候在与产品部讨论功能的时候,他们让我改这改那,心中会有种潜在的排斥心理,就是不想配合你,有时甚至会有点怒火,果然还是年轻气盛。经常会听到站在对方角度看问题,就能理解对方,说起来容易,做起来好难。
**3)站的角度不同**
  产品设计人员不懂开发,经常是要实现一个功能,但对我们开发来说却不会那么简单。原型上面就有很多这种耗时间的功能,托我们开发的进度,在我看来完全可以在迭代的第二期完成,把核心功能做做扎实,把大流程跑通,大家都方便。产品设计的人是完美主义,我们程序开发是现实主义。
**4)没做短期交付**
  我感觉应该每个礼拜都给产品看个demo展示,如果有业务错误就能马上纠正,不用等到后面再花大力气修复。也能让产品的人知道项目进行到什么程度了,让他们心里有底,让他们能早点做补救措施的决定,别到了后面几天才想到抢救。不过做起来还是挺麻烦的,给他们看代码肯定不行的,他们要看的是能操纵的东西,要有血有肉,开始的阶段没数据没页面,流程也跑不起来。得想办法给他们一个能看的懂的东西。
  开发的过程中,我经常会向下图那样凌乱:
:-: ![](https://img.kancloud.cn/ae/4c/ae4cb48f09588f7b5f24c428313a2399_346x430.png)
## 五、抓数据
  为了丰满页面,需要大量的外部数据,只有通过抓取其他网站的数据才能获得。抓数据这块有很多坑,踩了好多个。刚开始是自己抓,我在上一篇[《用PHP抓取页面并分析》](http://www.cnblogs.com/strick/p/4055283.html)写了点分享。后面时间不够,公司就花钱让外面的人抓了,本以为会轻松很多,没想到还是有很多坑。
**1)反复抓取**
  刚开始产品的说要以XXX网的数据为准,我们就按照指令去那边抓。后面又说以YYY网的为准,那我们就重新把那个网站的数据抓下来。最后告诉我们说,要以他们自己的一套数据为标准,将抓来的数据和那套数据做个映射关系。一下子感觉好坑,但是没有让产品写抓取数据的规范说明,只能自己认栽啦。这样几个来回让我们非常厌恶抓数据了。
**2)分析数据**
  后面让第三方来抓,为了图简单,我们把给抓数据的人定了数据库表,想到时候就直接倒进来。后面在分析数据的时候,缺了很多字段,这些信息都抓取不到,有些数据还是错误的。这些毛胚数据完全不能用,只能再写脚本纠正,有些需要人工校对,先把数据导出成execl,让产品的人整理,再把整理后的execl给我们开发,我们再编写不同的脚本导入到数据库中。反反复复好多次,脚本也写了一个又一个,为这个操碎了心。
**3)条理不清晰**
  在还没有跑通正常流程前,就匆匆忙忙的把抓来的数据放到数据库中,直接导致客户端各种问题,不是图片显示不了就是信息没有或者就是直接报错。客户端的APP迟迟不能给产品看,就是因为数据太渣根本没法用。后面将这些数据清掉,走正常流程,从我们的后台录入,录入一些完整的数据,在客户端显示,效果非常明显,客户端的流程顺畅的跑起来了。
:-: ![](https://img.kancloud.cn/00/b8/00b85597c3ebdf83231c67ed02372cbf_441x301.png)
  想做好一件事情,绝对需要付出很多精力脑力。前面我提到的很多问题,其实都有很多方法可以对付它们,或者在它们暴露之前就可以扼杀在摇篮中。如果有丰富的经验应该已经一早就能意识到前面有多少坑了。开发经验很有用,解决实际问题的能力很重要。以后还得多积累积累,做到临危不乱,沉着应对,谈笑间樯橹灰飞烟灭。
*****
> 已建立一个微信前端交流群,如要进群,请先加微信号freedom20180706或扫描下面的二维码,请求中需注明“看云加群”,在通过请求后就会把你拉进来。还搜集整理了一套[面试资料](https://github.com/pwstrick/daily),欢迎阅读。
![](https://box.kancloud.cn/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200)
- ES6
- 1、let和const
- 2、扩展运算符和剩余参数
- 3、解构
- 4、模板字面量
- 5、对象字面量的扩展
- 6、Symbol
- 7、代码模块化
- 8、数字
- 9、字符串
- 10、正则表达式
- 11、对象
- 12、数组
- 13、类型化数组
- 14、函数
- 15、箭头函数和尾调用优化
- 16、Set
- 17、Map
- 18、迭代器
- 19、生成器
- 20、类
- 21、类的继承
- 22、Promise
- 23、Promise的静态方法和应用
- 24、代理和反射
- HTML
- 1、SVG
- 2、WebRTC基础实践
- 3、WebRTC视频通话
- 4、Web音视频基础
- CSS进阶
- 1、CSS基础拾遗
- 2、伪类和伪元素
- 3、CSS属性拾遗
- 4、浮动形状
- 5、渐变
- 6、滤镜
- 7、合成
- 8、裁剪和遮罩
- 9、网格布局
- 10、CSS方法论
- 11、管理后台响应式改造
- React
- 1、函数式编程
- 2、JSX
- 3、组件
- 4、生命周期
- 5、React和DOM
- 6、事件
- 7、表单
- 8、样式
- 9、组件通信
- 10、高阶组件
- 11、Redux基础
- 12、Redux中间件
- 13、React Router
- 14、测试框架
- 15、React Hooks
- 16、React源码分析
- 利器
- 1、npm
- 2、Babel
- 3、webpack基础
- 4、webpack进阶
- 5、Git
- 6、Fiddler
- 7、自制脚手架
- 8、VSCode插件研发
- 9、WebView中的页面调试方法
- Vue.js
- 1、数据绑定
- 2、指令
- 3、样式和表单
- 4、组件
- 5、组件通信
- 6、内容分发
- 7、渲染函数和JSX
- 8、Vue Router
- 9、Vuex
- TypeScript
- 1、数据类型
- 2、接口
- 3、类
- 4、泛型
- 5、类型兼容性
- 6、高级类型
- 7、命名空间
- 8、装饰器
- Node.js
- 1、Buffer、流和EventEmitter
- 2、文件系统和网络
- 3、命令行工具
- 4、自建前端监控系统
- 5、定时任务的调试
- 6、自制短链系统
- 7、定时任务的进化史
- 8、通用接口
- 9、微前端实践
- 10、接口日志查询
- 11、E2E测试
- 12、BFF
- 13、MySQL归档
- 14、压力测试
- 15、活动规则引擎
- 16、活动配置化
- 17、UmiJS版本升级
- 18、半吊子的可视化搭建系统
- 19、KOA源码分析(上)
- 20、KOA源码分析(下)
- 21、花10分钟入门Node.js
- 22、Node环境升级日志
- 23、Worker threads
- 24、低代码
- 25、Web自动化测试
- 26、接口拦截和页面回放实验
- 27、接口管理
- 28、Cypress自动化测试实践
- 29、基于Electron的开播助手
- Node.js精进
- 1、模块化
- 2、异步编程
- 3、流
- 4、事件触发器
- 5、HTTP
- 6、文件
- 7、日志
- 8、错误处理
- 9、性能监控(上)
- 10、性能监控(下)
- 11、Socket.IO
- 12、ElasticSearch
- 监控系统
- 1、SDK
- 2、存储和分析
- 3、性能监控
- 4、内存泄漏
- 5、小程序
- 6、较长的白屏时间
- 7、页面奔溃
- 8、shin-monitor源码分析
- 前端性能精进
- 1、优化方法论之测量
- 2、优化方法论之分析
- 3、浏览器之图像
- 4、浏览器之呈现
- 5、浏览器之JavaScript
- 6、网络
- 7、构建
- 前端体验优化
- 1、概述
- 2、基建
- 3、后端
- 4、数据
- 5、后台
- Web优化
- 1、CSS优化
- 2、JavaScript优化
- 3、图像和网络
- 4、用户体验和工具
- 5、网站优化
- 6、优化闭环实践
- 数据结构与算法
- 1、链表
- 2、栈、队列、散列表和位运算
- 3、二叉树
- 4、二分查找
- 5、回溯算法
- 6、贪心算法
- 7、分治算法
- 8、动态规划
- 程序员之路
- 大学
- 2011年
- 2012年
- 2013年
- 2014年
- 项目反思
- 前端基础学习分享
- 2015年
- 再一次项目反思
- 然并卵
- PC网站CSS分享
- 2016年
- 制造自己的榫卯
- PrimusUI
- 2017年
- 工匠精神
- 2018年
- 2019年
- 前端学习之路分享
- 2020年
- 2021年
- 2022年
- 2023年
- 日志
- 2020