从一名技术开发人员到实施人员的蜕变,从不同的角度看待同一个问题,或许会有不一样的结果。这里记录一下最近一个项目实施的案例,非常有感触!
一. 项目情况简介
本次项目是给一个国外生产型企业做仓库方面的系统,其中有一个功能就是给仓库做一个电子看板。所谓的电子看板就是在一个大屏幕上显示仓库进料和出料的情况,在大屏幕上显示指定数量的单号信息,就和医院的叫号系统一样,每行数据不停的向上滚动。
上面这个功能其实非常简单,就是查询相应的数据在屏幕上显示即可. 仓库每天可能收到20多个订单的进料单据,系统将单据分为三个状态: 待收货,收货中,收货完成
待收货,收货中的订单要在屏幕上轮番显示,但是屏幕最多只能显示6行订单,其余的隐藏,当第一行滚动消失,第二行替补上去,隐藏第一行显示。效果图如下:
整体数据往上滚动,当1 数据消失,3数据在最下面显示。
二. 不同的开发人员如何去实现这个功能
(1)A 开发人员想法:
使用WinForm 或者 WPF去实现一个这样的效果,特别是WPF实现的效果非常炫。最主要的是WinForm或者WPF对元素坐标的控制非常好,要使得内容移动只需要将其他的坐标处理移动就好了,然后加上一个线程或者定时器完全可以搞定。
(2)B 开发人员的想法:
最好使用Web页面来实现,然后使用投影或者外接显示器投到大屏幕。 Web实现的方式非常简单,网上还有现成的案例,只需要修改样式,颜色等就可以了,最关键的是web中可以使用jQuery,实现这样的效果一点都不难。
(3)C 开发人员:
机场那个啥都是使用的LED屏幕,使用这个高端大气上档次,只要我们提供相应的数据,然后找一个LED屏供应商将数据显示就可以了。
从以上三个人来看,对于同一个功能的实现都有着不同的看法,千万不要认为这三种方案有什么问题,其实三种方案都能够实现客户所要的效果。
说明问题:一个问题的解决肯定不是没有办法或者只有唯一一种办法。 以前我做程序的时候想问题也就局限在自己的思维逻辑中,除了这个就不会有什么更好的办法去解决。
三. 三个技术人员的方案
先说A开发人员: 在功能正式开发之前让A做了一个简单的Demo, 但是做了几天A还是停留在界面元素的控制上,而且文字的移动效果也不理想,跟别说后面的漂亮还要动态的去读取数据等其他的操作了。 其实A对WinForm和WPF技术不是太了解,他只是想通过这个来加强一下自己的技能。 A的方案有点在于:界面元素的坐标可以严格控制,这样在处理元素的移动的时候比较容易实现,缺点:因为界面的元素太多,而且内容在不断的变化,所以最终页不知道具体要处理哪个,理不清头绪了。
再说B开发人员: 使用Web界面然后投影到屏上,我曾经作为技术人员,我也比较认可这种实现方式。 要实现这样的一个效果其实也不是难事,jQuery中有动画处理的函数,实现起来应该比较容易,而且网络上有先天性的资源,可以解决一个大问题,看似非常完美的方案。事实上最终也是让B来开发实现的。
C开发人员: C的想法有点脱离技术层面的考虑,A和B都直接提到了用什么编程技术,而C不是这样的。所以说C的想法如果放到程序猿的眼中比较另类,但是C的确是最符合客户索要的最直接解决方案,因为客户不懂什么WinForm,WPF,jQuery。 但是C的方案没有得到认可,对于重新安装一个LED屏来说又是一笔开销,而且客户已经有现成的屏幕了[俗称电视机]。
在第一次跟客户谈这个问题的解决方案的时候,我是比较认可C的想法的,刚才也已经说了C最能直接让客户理解和接受,客户明白LED屏是怎么回事,不知道什么是WinForm,WPF,jQuery。 但是后来又否认了C的想法,问题要从客户实际出发,利用好自己现有的资源和客户的资源这个才是最重要的。首先公司的技术擅长的是Web方面的开发,而且客户已经有闲置的屏幕,如果做LED还需要其他外部供应商。A的方案直接就枪毙了,首先给人的感觉就是技术方案不可行。
问题说明:
(1) 善于利用现有的资源(技术,人员,硬件,软件,客户), 软件项目不只是将代码写完没有BUG就完事了,写代码只是一个项目中非常少的一部分。
(2) 项目的开发要以实施为基准,一切的开发要以实施客户使用为前提,当然如何开发是实施和技术之间是可以协调的,不存在一个压倒另外一个说法。
(3) 开发人员的思维过于局限,或者说没有真正去理解客户的想法。
(4) 愚蠢的给客户说你要告诉我明确的需求我才能给你开发。[这是我以前经常干的事情,从做了实施之后明白:客户根本就不清楚自己的需求是什么,你要做的事情是帮客户理清楚需求并且给他解决,否则你直接去做码农,码畜好了,你对客户来说有什么价值]
(5) 网络是工具,不是玩具,要善用网络工具。
四. 技术问题
开始制定好以B的方案来解决这个问题,而且在正式开发之前B已经做好了一个Demo,说明技术问题已经解决了,要做的事如何完善这个东西。
(1) 页面加载的数据行数不定,可能是3,4行,也可能超过10. 但是要求是如果超过6行数据,界面上显示6行,然后循环滚动
(2) 界面的数据要从后台动态去读取,并且定时更新
(3) 读取订单的数据不能直接到数据库读取
(4) 数据导出到Excel,然后人工去维护Excel中订单状态
因为功能的实现是使用jQuery方式来实现的,写了一个jQuery方法来处理这个效果,简单代码如下:
var items = []; //定义一个数组 var currentIndex = limit; //当前要移除的对象索引 var total = 0; //显示元素的所有个数 var height = $(this).find('> li:first').height(); //获得每个条目的高度\ //将所有的元素存入数组中 $(this).find('> li').each(function (i, item) { items.push(item); }); total = items.length;//计算如上数组的长度 $(this).parent().css({ height: height * limit }); $(this).find('> li').filter(':gt(' + (limit - 1) + ')').remove(); var listItem = $(this); function Sky() { $(listItem).find('> li').filter(':lt(' + (limit) + ')').css({ opacity: 1, height: height }); $(listItem).find('> li').filter(':gt(' + (limit - 1) + ')').remove(); var $insert = $(items[currentIndex]).css({ height: 0, opacity: 0 }); $(listItem).append($insert); $(listItem).find("li:first").animate({ opacity: 0 }, 1000).animate({ height: 0 }, 1000, function () { $(this).remove(); }); $insert.animate({ height: height }, 1000).animate({ opacity: 1 }, 1000); currentIndex++; if (currentIndex >= total) { currentIndex = 0; } setTimeout(Sky, interval) }