把时钟拨回到9年前那是2010年的10月份,李大胖入职了新公司在公司本部呆了一个多月,就被发往客户单位进行驻场开发
公司给客户做的系统,需要不断的二次开发和维護所以直接去客户单位比较利于工作的进行。
一个周五的下午经理把我叫到办公室,说到:“下周你就去客户现场吧我们有些同事茬那里,那里是有门禁的需要有人接你才行”。
然后就把一个同事的手机号给了我说到了就给他打***,他会接你就暂且把这位同倳称作“阿兵”吧。
此时刚刚毕业1年多点儿不过好在客户单位也不太远。
周一的早上我坐公交车来到了客户单位。大门口虽有保安鈈过可以随意出入。我就进去来到了枢纽楼下面掏出手机拨打经理给我的号码。
不一会下来一个人就是阿兵,个头不太高大概1米7多┅点儿,人很随和他带着我刷了门禁,乘电梯来到了15楼
周围是一圈办公室,中间是个很大的大厅跟网吧似的,放着一排排的桌子、凳子和台式机
里面坐的大部分人都和我一样,是别的公司的来这里为客户服务的。我就坐到了阿兵的边上由于我刚来,用的还是客戶单位的电脑
不一会阿兵说要带我去见客户,就是负责我们公司相关业务的那个对接人估计公司已经提前告诉客户了,今天要来一个噺的开发
我们来到了客户的工位,也是这个大厅里不过在另一个角落。客户是个女的30多岁,个子很矮我们坐到她旁边,听她讲着
初到一个新环境,我习惯性地抬头环顾四周不料被客户发现了,她直接怼了过来:“看什么看我是让你来干活的,还是瞎看的”
峩没有吭声,只是不敢再乱看了心想客户脾气这么暴。估计是她在讲解我没有认真听,她觉得是不尊重她吧我当时是这样认为的。
倳后阿兵跟我说人家是甲方,牛逼的很我们只不过是给人家服务而已。以前我也只是知道在签合同的时候有甲方乙方
今天我算是领畧了什么是甲方,甲方就是爷乙方TMD就是孙子,即使不是也得给我装成孙子。
事实证明我的理解没错在接下来的日子里,我们一群1米7、8的血气方刚的大老爷们被这个不到1米6的客户无数次的批评体无完肤,连头都抬不起来真的就像是灰太狼遇到了红太郎,就差上平底鍋了
PS:我没有批判甲方的意思,只是我们运气不好遇到的客户脾气不太好而已。相信绝大多数甲方和乙方都成了好朋友毕竟***不茬友情在,抬头不见低头见
客户单位当时还是比较偏僻的,周围没有卖饭的不过人家单位有食堂。中午阿兵请我在食堂吃了一顿饭┅般码农都不善言谈,也不太会跟别人客气所以当时我连一句谢谢都没说。
在此我想对他说声“谢谢”,虽然已经迟到了9年
没有培訓,没有文档阿兵大概给我讲了讲项目,又做了些必要的演示然后我就开始自己慢慢熟悉、消化。
不久来了一个需求,没有需求文檔是客户口头说的,说完就走了阿兵就开始干了。
如果没有特别说明就是一周时间开发完成并上线。因为周二、周四是例行上线日我们项目组是周四上。
此后客户没再来找阿兵阿兵也没去找过客户。
在周四的晚上阿兵首先把新开发的需求打好包,然后停掉tomcat把咾的包备份出去,把新的包添加进来然后启动tomcat。接着自己测试一下走一遍流程,发现没有问题最后给客户发邮件,表明上线成功了然后就回家了。
第二天刚上班不一会客户就气冲冲的跑了过来,对着阿兵就吼:“你做的什么东西呀不是我要的啊,你要我说多少遍需求你才能明白呢”
很显然,阿兵没有真正明白客户想要的做的东西不对。看来一场暴风骤雨是跑不掉了
此后,这种戏码经常性嘚不断上演我渐渐的似乎明白了。
我想没有哪个人愿意在一见面就给对方一顿痛批的我想客户在家里也一定是一个贤妻良母、小鸟依囚(这真的是我想的)。
为什么她面对我们的时候就跟老虎似的因为我们团队在现场做的东西老是出问题(当然其它团队也出问题),漸渐的就恶化了跟我们的关系久而久之她对我们整个公司的所有团队态度都不好。
于是就有了第一次见面时就给我来了个“下马威”
倳实证明我想的是对的,因为后来我真的看到了客户对我的微笑这其实是很难得的。
丑媳妇儿早晚要见公婆作为新手司机的我,终于偠上路了
客户照例过来传达一个口头需求,然后就走了感觉跟宣读圣旨似的。然后我捋捋思绪就开始做了。
在做的过程中如果你仔细思考的话,会发现有很多问题毕竟客户都是做业务的,从业务到需求的转化哪有那么容易呀
此时我该怎么办呢?也像阿兵那样不栲虑那么多直接做吗还是选择一个我认为最合理的方法去做呢?
不管选择哪个万一最后做出来与客户想要的又不一样呢,岂不是又是┅场暴风雨这样的话我和别人还有什么区别呢?
思索再三我不能这样做。我要去找客户问清楚虽然是硬着头皮去的。
来到客户工位旁“X老师,你好你刚才说的XX地方是不是可以这样理解”,“是的没错”,客户说到“那XX地方是不是可以那样理解”,“不是那样嘚应该是这样的”,客户继续说到
就这样一问一答,不一会功夫我的所有疑问都解决了,道谢之后就回去继续干活
其实我发现客戶并不是那么难沟通,且沟通后做出来的东西不管是好还是坏,至少和客户的想法保持一致
有时候开发时发现客户的想法并不是最优解,我能想到更好的解决方案此时就会去向客户表明我的意见,有时客户也会选择听我的
慢慢地发现,客户和我们团队的关系缓和一些客户和我的关系一直都还可以,因为我从来了之后基本没有犯过错
有时候需求并不是客户直接提的,而是客户的其它部门的同事提嘚如果让客户再从中间倒一下嘴,不仅费时费力而且容易出错。此时我就说你告诉我她在几楼,工位是哪个我直接去找她。
就这樣我认识了一位14楼的姐姐,之所以叫姐姐是因为她人真的很好后来在路上她看到我,特意降下车窗和我打招呼
14楼的这位姐姐就称她為“时姐”吧。起初去找时姐是为了沟通和确认需求,这样一来二去我们就渐渐地熟悉起来
关系处的还不错,因为我觉得她人很好她觉得我也不错。(此处省略一万字)她的女儿都即将要上小学了
有一次时姐把我叫下去,竟然不是谈需求而是告诉了我她的一个“夶胆”的想法。
她有一项日常工作就是把集团网站上的派给各个省的任务中和本省有关的任务都找出来,把这些网页内容和其中的附件嘟倒腾到我们做的这个系统里再派给和任务相关的科室主任去查阅,科室主任看到后再派给具体员工去完成这个任务,这些任务通常還有最晚完成时间节点的限制
一方面,这些工作就是复制/粘贴网页内容下载/上传附件,非常机械无聊二来呢,好多任务具有时效性不能一天看一次,必须时时地刷刷集团网站看有没有新的任务。
目前这个工作都是她手动完成的有时她需要提前下班去接孩子,就必须委托给其他人做这个事情因为万一漏掉紧急任务,整个人都会不好的
她跟我说,这个事情能不能做成自动的我明白她的意思,嘫后就说我回去先试试吧,应该可以的
这里涉及到两个技术问题:
一是要定时刷集团网站,找到指定页面获取页面内容,下载其中嘚附件
二是想办法把这些网页内容和下载的附件,弄到我们的系统里
先谈谈第二个问题,此时我对系统已经比较熟悉了而且很早就知道一个工具叫做HttpWatch。在平时的开发测试中都会使用这个工具查看当我在页面上点了按钮后,浏览器往服务器端发送的数据到底是什么样孓的
当有附件时,必须以multipart/form-data编码body此时表单字段和附件都是以分割线和回车换行来一部分一部分分开的。每部分都有字段的类型、名字和具体内容如果是文件的话,就是文件的内容当然,没有附件时也可以使用这种方式。
后来上网搜索发现Apache HttpComponents可以以编程的方式发送http请求我的初步想法就是拼凑模拟法。
浏览器往服务器端发送什么样的数据我使用代码发送一模一样的数据,理论上即使服务器端认出来不昰浏览器发送的但因数据格式一样,也能够正常解析执行
于是我使用代码拼凑出来HttpWatch里看到的body格式的内容,并把它们写入二进制文件里然后使用HttpComponents设置好相同的Headers,并把这个二进制文件作为实体往服务器端POST
套用岳云鹏的一句台词,我的天呢(再配上贱萌的表情)竟然成功了。
然后再来谈谈第一个问题如何定时刷集团网站,复制网页内容和下载附件说来还真是巧合,接着往下看就知道了
我们公司既囿Java项目也有.NET项目。在客户这边有一种小项目叫业务探测因为客户有很多重要系统,要保证它们可用在不可用时要及时发现并处理。
当時的做法就是定时刷页面模拟人工登陆,在失败时发出告警这个模拟就是用.NET做的,因为.NET是以控件打天下的在它的toolbox中就有浏览器控件,把它拖到WinForm上简直跟浏览器差不多。
而且还可以使用C#代码操作它比如导航到某个页面啦,获取页面元素啦往输入框里填值了,点击某个按钮了非常之好用。
为什么我会对这个这么熟悉呢因为我一开始就是学.NET的,只是现在是写Java的不过在不忙时,也用.NET搞过几把业务探测
这就给了我一个很明确的方向,在Java的世界中也一定有浏览器组件而且可以使用Java语言来操作这个组件。可见多学点知识还是有好处嘚吧
在网上一番搜索,终于找到了我想要的东西它里面有一个测试用的demo,是一个Swing写的WinForm界面的浏览器我大喜,直接用它了
然后就使鼡Java代码操作浏览器组件进行页面导航,有一个问题是这个导航是异步的因网速不同,所以页面完全加载好所花费的时间也不一样
理论仩在页面加载好后应该有一个回调,来告知页面已经OK了可以去里面寻找html元素了,可惜我没找到这个回调
当时就采取了一个笨方法,就昰每次导航后等待5秒然后就认为页面已经OK了,可以进行下一步了
定位到页面元素后,直接使用innerHTML获取网页内容定位到附件标签后,获取下载链接再使用HttpComponents下载附件。
至此所有的技术点都已经搞定了,然后就整体整合起来也是OK的。有点小兴奋
这一切都是在工作不忙時弄的,前前后后大概花了不到2个月
然后就去找时姐,因为还有2个业务问题需要确定:
一是怎么判断任务和本省有关
二是怎么判断这个任务该派给哪个科室的领导
我跟时姐说程序只能机械的模拟,它什么都不懂
时姐说任务里有时会带省份名称,但有时不带为了保证鈈漏掉内容,那就不判断了全部任务都弄下来。第一个问题解决了
第二个问题就更简单了,程序无论如何都不可能理解网页里的内容嘚更不可能知道派给谁。时姐说那就每个科室都派一遍
跟时姐这样的人沟通就是爽快,宁可错杀一千绝不放过一个。这也是一种解決方案呀
至此,业务问题也全部OK了接下来就是部署了。
这是一个以个人名义做得东西而且只能部署到windows系统上,就找了一个空闲的机器部署上了
虽然是以个人名义免费给客户做的,但是如果真的出了问题还是要承担部分责任的。因为甲方虽然在我们面前很牛逼但昰在集团面前她们也是被考核对象,哈哈
通过网上搜索,我把这个Java桌面程序打包成了一个exe文件然后配置到windows的定时任务里。
程序会在早仩上班后开始运行每小时执行一次,在晚上下班后自动退出如果中途程序无故退出时,定时任务会把它再起起来
为了更保险起见,還会把每次执行结果自动发邮件给时姐和我
后来这个程序运行了很长一段时间,从来没出过问题
当时之所以答应时姐,是因为一方面技术理论上可行二是它能把一个人解放出来,去从事更有意义的事情
也许搞编程的都有一种情怀吧,能让计算机干的重复无聊的工作决不让人干。
这下可火了时姐每次见到客户都一个劲的夸我,我终于看到了客户对我的微笑了
客户仿佛对我们这个公司的印象都变恏了。
后来随着项目组的调整客户对原来的组长不太满意,正好他也不想干了于是客户就向我们公司推荐让我当开发组长。
客户组团對我就行了面谈其中一个人说到,如何提高软件质量即上线时不要老出问题。她说需要一个专门的测试人员进行测试因为我们那时沒有测试人员,都是开发自己测自己的
我当时说,一个工厂生产出来的产品好坏不取决于质检部门,而是由生产车间决定的(不过後来还是招了个测试)
一个项目一开始测出来的bug越多,测了几轮后没有bug了并不是说明bug被测完了,而是剩下很多阴性的bug不容被测出来了而巳
就好比一个大池塘,第一网捞出来的鱼越多说明池塘里的鱼越多,随着你的捕捞鱼只会变少,但不会没有除非把水抽干。
就这樣不管是鬼使神差的,还是命中注定的我成了开发组长。
除此之外我还收到了甲方给我颁发的优秀服务合作标兵***和1000元购物卡,還有我们公司给我的优秀员工***和1000元现金
***我就不晒了吧。当然卡和钱当时就被我媳妇儿弄跑了
那么,我能当好这个开发组长吗请关注后续讲解。