我是如何在毕业不久只用1年就升为开发组长的

故事的开篇



把时钟拨回到9年前,那是2010年的10月份,李大胖入职了新公司,在公司本部呆了一个多月,就被发往客户单位进行驻场开发。

公司给客户做的系统,需要不断的二次开发和维护,所以直接去客户单位比较利于工作的进行。

一个周五的下午,经理把我叫到办公室,说到:“下周你就去客户现场吧,我们有些同事在那里,那里是有门禁的,需要有人接你才行”。

然后就把一个同事的手机号给了我,说到了就给他打电话,他会接你。就暂且把这位同事称作“阿兵”吧。

此时刚刚毕业1年多点儿,不过好在客户单位也不太远。


什么是甲方



周一的早上,我坐公交车来到了客户单位。大门口虽有保安,不过可以随意出入。我就进去来到了枢纽楼下面,掏出手机拨打经理给我的号码。

不一会下来一个人,就是阿兵,个头不太高,大概1米7多一点儿,人很随和。他带着我刷了门禁,乘电梯来到了15楼。

周围是一圈办公室,中间是个很大的大厅。跟网吧似的,放着一排排的桌子、凳子和台式机。

里面坐的大部分人都和我一样,是别的公司的,来这里为客户服务的。我就坐到了阿兵的边上,由于我刚来,用的还是客户单位的电脑。

不一会阿兵说要带我去见客户,就是负责我们公司相关业务的那个对接人。估计公司已经提前告诉客户了,今天要来一个新的开发。

我们来到了客户的工位,也是这个大厅里,不过在另一个角落。客户是个女的,30多岁,个子很矮。我们坐到她旁边,听她讲着。

初到一个新环境,我习惯性地抬头环顾四周,不料被客户发现了,她直接怼了过来:“看什么看,我是让你来干活的,还是瞎看的”。

我没有吭声,只是不敢再乱看了,心想客户脾气这么暴。估计是她在讲解,我没有认真听,她觉得是不尊重她吧。我当时是这样认为的。

事后阿兵跟我说,人家是甲方,牛逼的很,我们只不过是给人家服务而已。以前我也只是知道在签合同的时候有甲方乙方。

今天我算是领略了什么是甲方,甲方就是爷。乙方TMD就是孙子,即使不是,也得给我装成孙子。

事实证明我的理解没错,在接下来的日子里,我们一群1米7、8的血气方刚的大老爷们被这个不到1米6的客户无数次的批评,体无完肤,连头都抬不起来。真的就像是灰太狼遇到了红太郎,就差上平底锅了。

PS:我没有批判甲方的意思,只是我们运气不好,遇到的客户脾气不太好而已。相信绝大多数甲方和乙方都成了好朋友,毕竟买卖不在友情在,抬头不见低头见。

客户单位当时还是比较偏僻的,周围没有卖饭的,不过人家单位有食堂。中午阿兵请我在食堂吃了一顿饭,一般码农都不善言谈,也不太会跟别人客气,所以当时我连一句谢谢都没说。

在此我想对他说声,“谢谢”,虽然已经迟到了9年。


找到原因了



没有培训,没有文档,阿兵大概给我讲了讲项目,又做了些必要的演示,然后我就开始自己慢慢熟悉、消化。

不久,来了一个需求,没有需求文档,是客户口头说的,说完就走了。阿兵就开始干了。

如果没有特别说明,就是一周时间开发完成并上线。因为周二、周四是例行上线日,我们项目组是周四上。

此后客户没再来找阿兵,阿兵也没去找过客户。

在周四的晚上,阿兵首先把新开发的需求打好包,然后停掉tomcat,把老的包备份出去,把新的包添加进来,然后启动tomcat。接着自己测试一下,走一遍流程,发现没有问题。最后给客户发邮件,表明上线成功了。然后就回家了。

第二天刚上班不一会,客户就气冲冲的跑了过来,对着阿兵就吼:“你做的什么东西呀,不是我要的啊,你要我说多少遍需求你才能明白呢”。

很显然,阿兵没有真正明白客户想要的,做的东西不对。看来一场暴风骤雨是跑不掉了。

此后,这种戏码经常性的不断上演,我渐渐的似乎明白了。

我想没有哪个人愿意在一见面就给对方一顿痛批的。我想客户在家里也一定是一个贤妻良母、小鸟依人(这真的是我想的)。

为什么她面对我们的时候就跟老虎似的。因为我们团队在现场做的东西老是出问题(当然其它团队也出问题),渐渐的就恶化了跟我们的关系。久而久之她对我们整个公司的所有团队态度都不好。

于是就有了第一次见面时就给我来了个“下马威”。

事实证明我想的是对的,因为后来我真的看到了客户对我的微笑,这其实是很难得的。


我要改变吗



丑媳妇儿早晚要见公婆。作为新手司机的我,终于要上路了。

客户照例过来传达一个口头需求,然后就走了。感觉跟宣读圣旨似的。然后我捋捋思绪,就开始做了。

在做的过程中,如果你仔细思考的话,会发现有很多问题。毕竟客户都是做业务的,从业务到需求的转化哪有那么容易呀。

此时我该怎么办呢?也像阿兵那样不考虑那么多直接做吗,还是选择一个我认为最合理的方法去做呢?

不管选择哪个,万一最后做出来与客户想要的又不一样呢,岂不是又是一场暴风雨。这样的话我和别人还有什么区别呢?

思索再三,我不能这样做。我要去找客户问清楚,虽然是硬着头皮去的。

来到客户工位旁,“X老师,你好,你刚才说的XX地方是不是可以这样理解”,“是的,没错”,客户说到。“那XX地方是不是可以那样理解”,“不是那样的,应该是这样的”,客户继续说到。

就这样一问一答,不一会功夫,我的所有疑问都解决了,道谢之后就回去继续干活。

其实我发现客户并不是那么难沟通,且沟通后做出来的东西,不管是好还是坏,至少和客户的想法保持一致。

有时候开发时发现客户的想法并不是最优解,我能想到更好的解决方案,此时就会去向客户表明我的意见,有时客户也会选择听我的。

慢慢地发现,客户和我们团队的关系缓和一些。客户和我的关系一直都还可以,因为我从来了之后基本没有犯过错。

有时候需求并不是客户直接提的,而是客户的其它部门的同事提的,如果让客户再从中间倒一下嘴,不仅费时费力,而且容易出错。此时我就说,你告诉我她在几楼,工位是哪个,我直接去找她。

就这样,我认识了一位14楼的姐姐,之所以叫姐姐是因为她人真的很好,后来在路上她看到我,特意降下车窗和我打招呼。


更大的挑战



14楼的这位姐姐就称她为“时姐”吧。起初去找时姐,是为了沟通和确认需求,这样一来二去我们就渐渐地熟悉起来。

关系处的还不错,因为我觉得她人很好,她觉得我也不错。(此处省略一万字)她的女儿都即将要上小学了。

有一次时姐把我叫下去,竟然不是谈需求,而是告诉了我她的一个“大胆”的想法。

她有一项日常工作,就是把集团网站上的派给各个省的任务中和本省有关的任务都找出来,把这些网页内容和其中的附件都倒腾到我们做的这个系统里,再派给和任务相关的科室主任去查阅,科室主任看到后,再派给具体员工去完成这个任务,这些任务通常还有最晚完成时间节点的限制。

一方面,这些工作就是复制/粘贴网页内容,下载/上传附件,非常机械无聊。二来呢,好多任务具有时效性,不能一天看一次,必须时时地刷刷集团网站,看有没有新的任务。

目前这个工作都是她手动完成的,有时她需要提前下班去接孩子,就必须委托给其他人做这个事情,因为万一漏掉紧急任务,整个人都会不好的。

她跟我说,这个事情能不能做成自动的?我明白她的意思,然后就说,我回去先试试吧,应该可以的。

这里涉及到两个技术问题:

一是要定时刷集团网站,找到指定页面,获取页面内容,下载其中的附件。

二是想办法把这些网页内容和下载的附件,弄到我们的系统里。

先谈谈第二个问题,此时我对系统已经比较熟悉了,而且很早就知道一个工具叫做HttpWatch。在平时的开发测试中,都会使用这个工具查看当我在页面上点了按钮后,浏览器往服务器端发送的数据到底是什么样子的。

因为经常看,所以对这个比较熟悉。当没有附件时,默认使用application/x-www-form-urlencoded编码body,表单字段都是以key/value对的形式发送的。

当有附件时,必须以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元现金。

证书我就不晒了吧。当然卡和钱当时就被我媳妇儿弄跑了。

那么,我能当好这个开发组长吗,请关注后续讲解。

 

如果觉得好看,请点个赞吧,或留下你的精彩评论。



(完)


更多精彩故事请关注“编程新说”


用独特的视角说技术

posted on 2019-02-15 00:36  编程新说(李新杰)  阅读(7405)  评论(77编辑  收藏  举报