我们的需求很简单,就是用 phantom 映射 pc 端的页面到手机端操作,考虑到目标系统是 IE5+兼容,而且大量的垃圾代码,以及一点都没有的 ajax 操作,所以这个设计也是没什么,毕竟日访问量也就万级别,而且内网+私有机房,资源都不是问题。
我们假设某个审批有 3 步:
A 、打开单子,看一眼有什么内容,当然作为脚本这里需要检查一下某些标志元素是否出现,来判断是不是这个人的审批步骤
B 、选择下一步的流程,这在手机上是一个新页面
C 、选择下一步谁来审批,这在手机上是新页面,在 PC 端也是新页面不过是 B 步的一个弹窗罢了
如果整个架构是有状态的,手机端最多也执行三步就够了,但是实际上这个做架构的不知道当时脑袋进水了还是什么问题,做了一个无状态的设计,这个设计把 A+B+C 变成了 A+A+B+A+B+C 六步,具体是这样
1 、打开单子,向用户返回单据详情,输入审批意见,这个时候后台把审批意见存到临时数据里
2 、用户在手机上单击“审批”按钮,此时服务器请求上面的 B 步骤,并填入 1 中的审批意见
3 、用户在手机上选择流程,下一步也存到临时数据里
4 、服务器扔掉 1 的状态,重新开启一个 A 的页面,输入审批意见,模拟用户进入流程页面,填入流程,并打开选人页面,返回所有可选的人
5 、用户在手机上选人,下一位审批者也存入临时数据
6 、服务器扔掉 4 的状态,重新开启 A 的页面,输入意见、下一步流程、审批人、点击确定
7 、手机端收到成功信息
那么现在做这个架构的人在深圳某著名互联网公司,我一般很少在背后议论人,但是你作为负责人,搞出这么一个脑残的东西来,实在是忍无可忍,如果这个操作有五步,那么服务器要执行 1+2+3+4+5=15 步,一下就是三倍的负载开销,别说骂了,干死的心都有。那么多资源干嘛用的,用户在操作的时候在后台给他保存一个 phantom 的进程又能浪费多少资源。。。非要搞无状态。
至于代码,我们来分享一下不涉及秘密的纯功能函数,这个需求很简单,有一个字符串
AAA ( BBB ) YYYY-MM-DD hh:mm:ss ,其中 AAA 和 BBB 表示纯中英文不含符号的字符串, BBB 的括号是全角括号,后面是一个时间,假设这个格式为 F ,给定字符串:
F1->F2->F3->F4
希望得到[{AAA,BBB,H},{AAA,BBB,H}].length=4 ,其中 json 为简写,那么他们是怎么做的呢?
var lzgc=[];
var all = $('#sometextbox').text();
$($('#sometextbox').text().split('->>')).each(function(i){
//alert('split '+i);
var a=all.split('->>')[i];
var lz = {};
if(a.indexOf(')') > 0){
var temp = a.split('(')[0];
if(temp.indexOf('/') > 0){
lz.who = temp.split('/')[0];
}else{
lz.who = temp;
}
lz.what = a.split('(')[1].split(')')[0];
var time = a.split(')')[1];
lz.when = time.split(':')[0] + ':'+time.split(':')[1];
//lz.when = time.split(' ')[0];
lz.when = lz.when.replace('(','').replace(')','');
lzgc[i]=lz;
}
//alert(i+' fenkai '+a);
});
代码请自行格式化。。。
1
xiamx 2016-06-17 11:42:47 +08:00
所以楼主你有空打了这么多字,为什么不去 Fix it...
|
3
tjxjj 2016-06-17 12:17:56 +08:00
资源不是问题,那就使劲用呗,到时再优化下(一般就是推翻重做了,重新开发个 app 都不是啥事)
这都不是啥事,经历了国企的软件开发,那才叫黑暗 |
4
murmur OP @tjxjj 是 基本上如果架构烂了就没有优化的可能都是推翻重做 问题是推翻也得有钱才能推翻啊。。。没钱推翻这么烂还要维护才是坠痛苦的
|
5
BSD 2016-06-17 12:27:16 +08:00 1
我所见到的程序员们面对这一质疑,一般都是回一句:“那么多计算资源(CPU/RAM)买的就是拿来用的,不用就是浪费!”
|
6
satifanie 2016-06-17 12:32:04 +08:00
我只想说,这种让人恶心的想吐。万人坑。 怎么不提,他们当初开发调试都没有的,盲写代码的段子呢。
|
7
Cu635 2016-06-17 12:51:04 +08:00
|
8
FrankHB 2016-06-17 13:10:32 +08:00
@BSD ——“不是你买的闭嘴。”
不过说实话,其实和程序员也没太大关系…… 就是作为最终用户买的也该自裁,很多市场就是被这坨逗比代婊了主流配置而搞烂的。合着真正搞对需求的用户计算成本的时候反而还得迁就这种惯坏逗比用户的行情花冤枉钱才叫正义了? |
9
jatesun 2016-06-17 13:14:51 +08:00 via iPhone
这要是以后出点啥问题要改代码就有点玩了
|
10
ma125125t 2016-06-17 13:36:20 +08:00
如果你能明白这个道理,你的上级比你更清楚。
不改至少还能正常运作,要是改出问题你还想不想混了。 |
12
thinkif 2016-06-17 13:46:30 +08:00
Quick And Dirty ,一般还都会说先跑通然后再重构之类的,然后就没有然后了
|
13
ren2881971 2016-06-17 14:02:48 +08:00
@BSD +1
|
14
talent 2016-06-17 14:10:11 +08:00
默语君,会不会待会儿出现一个《我就是那个深圳某著名互联网公司做架构的人》的帖子...
|
15
learnshare 2016-06-17 14:12:28 +08:00
我以前会手动 copy 一份代码,改改名字,然后给新客户启动一个服务
|
16
bk201 2016-06-17 14:37:29 +08:00
看着吃力
|
17
fyooo 2016-06-17 17:10:41 +08:00 1
IE5+兼容??? 可怜的娃啊
|
18
samael 2016-06-17 17:17:59 +08:00 3
|
20
broadliyn 2016-06-17 23:39:50 +08:00 1
哈哈,其实刚开始我刚进公司写代码的时候,也发现很多项目里有好多坑。
做的一个后台内容管理系统,因为没有专业的前端所以开发这个系统的界面部分也是后端做的,那 js 代码,,怎么说呢,写的非常乱、杂,一看就是专门写服务端的人写的(虽然我也不是个专业前端的,但是至少 js 还是有专门实践过一段实践的)。写一个小的界面组件,写两 function ,一个 div display:none ,然后包进 jquery , jsp:include 进来,最让人郁闷的是 http header 里塞了一堆的 js 、 css ,然后所有界面都 include ,导致这个后台体验不算好,也一直想提使用一些 vue.JS 之类轻量级的框架,不过因为以前没啥话语权也就没多说什么了,原先怎么写的,我也就照着写,力求不造坑。但是随着项目的迭代,发现如果继续按照原来那样写,后边就根本没法维护,后来忍不住最近终于提出我的想法了,不过开会的时候其他个别的想法的是学习成本高、项目使用不稳定。。。(其实言下之意就是:能用就行,不想折腾那么多,学新东西太费劲)。如果说服务端上个新框架啥的,这个肯定是需要考量的,但是对于前段界面框架这种把稳定性挂钩在一起我就感觉无力吐槽了,就好比你跟我说 jQuery 上了会不会不稳定一样。。前端框架在易用性、可选择性上来说比什么 mybatis 、 hibernate 、 spring 什么要高多了。又不像换个语言框架把服务器弄蹦了跑不起来。 对于重构这块,就我工作这两年下,体会还是比较深的。我最感叹的一点就是,人与人之间的追求都是不同的,有的人是为了完成功能完成任务,而有的人会尽善尽美,你很难说这两种是对还是错。之前我觉得自己也算是尽量做好一件事的人吧。但是有时候真的,想去做好这件事很难,明明这地方代码写的不好,你又总不好意思动他代码,动了出问题了容易把锅吸到自己头上,所以有时候为了不去碰这个坑,反而往往自己绕着弯搞了另外一堆坑,有时候我都为因为将来接手我代码的人感到自愧。。怕他们说我代码写的烂。。。。因此在一个没有代码规范,没有代码 review ,为了完成功能不去想着程序可扩展性、健壮性的情形下,实在是很头疼,以至于我现在维护原来的代码的时候,也是怎么快点完成就怎么写,因为那堆代码真的有时候自己改着都觉得满满的挫折感,很痛苦写完就不想再看一遍,完全没有自己以前写代码的那种成就感。 |
21
ryd994 2016-06-17 23:41:17 +08:00 via Android
惨了,这样的需求,我下意识觉得不用 regex 做不出来
|
22
mengzhuo 2016-06-17 23:44:31 +08:00
深圳某著名……难道是我厂……
|
23
ZhaiSoul 2016-06-18 00:25:48 +08:00
重点……不是 IE5+兼容吗……
|
24
coolair 2016-06-18 00:32:32 +08:00 via Android
企业?审批?太极?东软?浪潮?
|
25
afxcn 2016-06-18 00:39:59 +08:00 via iPad
做自己能做的,改变自己能改变的。
|
26
msg7086 2016-06-18 05:41:31 +08:00
@xiamx lol 公司里的 bug 不是你想 fix 就能 fix 。
我这 git branch 里堆了二十多个 fix/refactor/optimize ,然而 supervisor 不批你就不能 merge 。 |
27
murmur OP @ZhaiSoul 其实 IE5+没想象中的那么难,就是丑而已,所有需要复杂样式的东西都用图片做(反正企业应用就不缺带宽),稍微复杂一点的功能直接下发策略把网站加白名单,调用各种 script object/activex 就可以了,排版大量的表格,也就是退回 div 之前那个年代
|
28
visonme 2016-06-18 09:56:43 +08:00
多少能理解楼主看到这种系统设计后的心情。
曾经的喔也有改变世界的想法,后来发现做好自己的事情就可以了 |
29
renzhn 2016-06-18 10:07:09 +08:00
让我想起以前给学校正方教务系统做移动端 API 时也是这么做的,比如我需要给移动端提供查选课的接口,服务端需要模拟登录教务系统=>点击选课=>选择课程=>选择老师。我提供的所有接口都是无状态的,甚至客户端每次要提交教务系统的账号和密码。为什么要这样?因为 It just works! 在服务端重用会话的确能减少开销,但是服务端和客户端会话并不同步,还会带来别的问题。这种模拟登录的方式本来就很低效,不指望对性能有很高的要求,能用就好
|
30
xbb7766 2016-06-18 11:27:21 +08:00 via Android
能想出这种流程的也是国宝级了😱估计是多年累积的代码,懒得重构,反正可以用,谁重构谁就可能背锅。这就是为毛某些贵的要死的商业软件会那么慢。
重点是: IE5+!!!比尔盖子简直要感动到泪崩了。 |
31
daysv 2016-06-18 11:32:12 +08:00
选择做产品的好处就体现出来了
|
32
zaishanfeng 2016-06-18 11:48:28 +08:00 via Android
呵呵 ie5+你还呆在那干嘛 自己约的炮 含泪也要打玩
|
33
murmur OP @zaishanfeng ...看我补充,这是对接外部系统,我们自己开发的系统是 IE8+兼容就可以
|
34
ncwhale 2016-06-18 16:56:54 +08:00
哦,好强大的系统喵~完全看不懂在干嘛喵~反正服务器资源有,就随便用好了喵~
|
35
tinyproxy 2016-06-19 08:45:53 +08:00 via iPad
就没人提,一个好的产品经理很重要么
|