08-12年 山东信息总公司

08年

初入信总的时候,主营的 山东毕业生高校就业信息网官网 已经开发完成了, 错过了这个大型系统的建设还是挺遗憾的(这个项目用到了sun的小机,到离开信总都没能上去摸一把);

实习期间就被分配到了齐鲁银行,在银行科技部挨着机房的办公室里面监控OA的运行情况(win平台RiseNet+websphere+oracle)+页面+小需求直接修改+数据库直接调整数据等等琐碎工作

  • 为什么要监控运行情况,因为当时的windows 2000 server问题非常多,websphere & oracle 运行在上面动不动就内存跑满没法回收,这个问题直到后来把环境都迁移到了redhat上面才彻底解决
  • 日常页面小调整(jsp)
  • 流程走错了,有数据状态不对等等情况 直接改数据库

对于一个刚实习的人上面这些东西开始我全都不会,现在还记得有天高老师(技术总监,对我帮助影响很大)甩我一堆文档然后给了个任务说

1
2
3
4
5
"你去把RiseNet在你本地用weblogic跑起来,然后改其中一个页面巴拉巴拉巴拉",
"好啊"
"咦,你弄过RiseNet和weblogic嘛?"
"没有,我连你说的weblogic怎么拼都不知道,但是难道还不会学嘛?"
"可以可以,好好看这些文档,不会的问XXX"

我觉的我从那天开始才算入了门,所以我现在最讨厌的就是社畜三问(我不会,我没做过,怎么做)

从齐鲁银行蹲了几个月(大概3,4个)后,转正–>配了个笔记本(dell XPS1530 这机器夏天真的烫)就被拉走去章丘封闭了…

大概封闭了有10个月左右,项目是开发OA的管理端,功能模仿novell ldap(齐鲁银行RiseNet就是用的这个做统一认证…)的RBAC后台管理系统+cms后台,项目技术栈 oracle,struts2,spring,freemarker,xslt(这东西火了一小阵子,有段时间csdn,暴雪战网都是用这个生成的页面,不过实在是太难用了…),Adobe Flex(就是后来大火的开心农场用的flex)

项目开始高老师也是一样扔了一堆flex文档(全英文)和一个已经初步搭好的架子,就直接开工了,那时候google虽然还在,但是flex还没开始火起来,文章/资料基本是找不到的,除了啃api和自己debug调试没有别的学习路径,大概用了不到一周就上手开始开发; 工作内容大概是用flex实现组织结构,人员,用户组管理,权限-功能点配置,站点-栏目,栏目字段属性配置等等

封闭虽然很辛苦,但是成长确实快,完成了从菜鸟升级到初级开发的阶段

09年

封闭回来后,给齐鲁银行OA升级环境,websphere->weblogic, oracle(win)-oracleRAC(linux),都是在高老师的指导下进行的,也是在那时起被教育了对待生产环境要慎重,慎重,慎重,再慎重,在生产环境上做任何操作一定要想清楚自己在干什么,这个操作如果有问题能不能回退,在测试环境中预习过了吗; 我后来跟单位的运维新人也是这么讲,碰上任何情况,在生产上操作也不要急,敲你的回车之前,一定要停下来再看一遍再想一想

搞完银行的升级回来继续打造封闭时的产品,这次是给系统增加工作流模块,先是从市面上选了几个工作流引擎,最后选中的是jbpm,当时版本号还是0.x; 这回没封闭但是开始了半年多的9106;我负责完成的功能有flex端上传from表单,java解析表单生成配置,flex编辑配置,java根据配置生成数据库表(支持一对多,多对多),flex绘制jbpm流程图,这个功能放到现在来看也是个难点,当时给两点间的线的一端绘制一个箭头连数学课本都拿出来了….;从这个项目开始正式参与Java开发,当然flex的水平也是愈发的成熟,在 csdn 当年的月榜(id:gundamff) 为了拿到专家标志 刷了几个月的分 刷分的时候也很有收获,因为想让别人把分给你 你的答案要讲的清楚,明白,看似短短几句话,可能得自己研究测试好久(不过后来结贴不结分的太多了就退圈了)

这个工作流项目,是首次完整参与了设计,开发,测试,验收全过程,亲眼看着一堆概念一天天的变成实物 真的是超有成就感(验收完成那天真的是感觉nothing inpossible)

10年

这一年部门用产品为底,做了几个项目(毕竟蹲家里研发产品不赚钱呀),其中带了几新人接手了 省立医院的项目 “山东远程医疗网” (第一次当项目经理第一次带小弟两件快乐的事情加在一起碰上分管副院长这种刺头…..),首次体会到了甲方的恐怖(院长是可以任性妄为,无理取闹,大嗓门骂人的谁让人家是甲方),印象最深刻的是首页上有个院方的logo他们原版是个白底红字,让我们重新设计,我们美工第一是白底红字改了下图案,BOSS大怒,喷我干活敷衍,改成白底绿字,被喷绿色不好看,红底白字,”医院弄这么红不吉利”(这是原话…)….一个Logo折腾了十几版,拍桌子骂了我5,6回,最后用的是第一版……….;还是说回项目本身,项目并不难,对外是一个cms,对内包括各种管理功能,最核心的是对接许多三方的设备或者系统,好在大部分都是在前端用ActiveXObject对接的,少部分走的webservice(xfire);

这个项目虽然进行的困难,但是完成时的成就感一点没少,验收时直接医生用系统对接汶川的手术间,在线指导手术(首先还是医院买的硬件牛鼻),最主要的收获对项目管理有的认识,到后来公司有人去考pmp证书(我当时选的去考oracle ocp 现在后悔死了),他们回来给我们分享课件,才慢慢了解到敏捷/迭代等等概念

ps: 这里有篇:个人项目管理经验总结 是后来给新人做培训的时候写在内网confluence上的

年末用自己家产品给齐鲁银行的某几个支行实施了支行的OA系统

期间银行内的一些小需求小功能也是带着小朋友们去做的

年末接的项目是 山东省教师资格证考试报名系统 ,这个项目是小年那天开始的,那天公司几乎没人了…要求是初10上线,到初15总共有10万人进行注册报名,线下缴费,后续功能有自动排考场(算法稍微有点复杂),打印准考证,考场总表,房表,桌号表,最后成绩导入,汇总,生成编号,打印合格证.其实后续功能都还好(除了那些不能说的小纸条),最难的在于在过年期间准备好能应对10人在线的环境+开发足够坚挺的注册报名等前期功能,最开始的时候这个项目我是拒绝的,时间太赶了又对并发有不小的要求,感觉风险太大了,这时候还是高老师力排众议(“你们放心干,出问题有我”)把事情接下来了;闲话不说,说一下项目是怎么实施的吧.用了5台服务器,2个跑apache,2个weblogic跑机器,每个weblogic上面部署了2个节点的程序,剩下2个跑oracleRAC,程序的话还是用的自家产品,并发 压力可能会大的方法加了ehcache缓存

最终这个项目也顺利完成了,第一周报名的并发峰值也就2K左右(报名的第一天和最后一天),给我最大的教训就是,从此以后我再也没说过 “XXX做不了”,都能做!

人所有的拖沓都是代表他并非真正热爱,你所有的畏难不自信都表示你不想付出努力.

11年

从这年开始高老师离职了(先创业,后去了美国),部门里面各式各样的疑难杂症渐渐的交给我来处理了,凡是只能靠自己了之后处理各式各样问题的经验也越来越多(直到现在也常有朋友的项目碰到难题喊我帮忙瞅瞅的(有偿的居多))

这年做自己用JavaMail+apacheJames给齐鲁银行上了一套邮件系统,用JavaMail库直接开发,兼容中文的时候还是有些难得,记得当时用的jdk7 javaMail包里面对中文的处理还有bug,还给sun提交了个修复

PS: 当时测试各种极端情况时,微软的outlook是兼容性最好的, 其他的google,163,qq邮箱什么的总会有处理不了的时候

年中的时候做了青岛毕业生就业信息网,当时另一个同事负责的带的项目,需求搞的一坨糟(问题出在市场人员),然后我同时有两个项目一起干,我记得最忙的一个月青岛项目天天9106,12点以后再去齐鲁银行跟他们另一个项目组联调接口到下半夜,这个项目完成以后开发分了极少极少的奖金,不负责的市场人员分的极多极多…..,这是导致下一年离职的直接 原因

这年还给齐鲁银行搞了oracle 10G dataGuard做数据同步,这个是有点难的,因为dataGuard本身是oracle的收费服务,所以文档和说明都非常少, 网上能找到的文章大多错误百出,知其然不知其所以然,所以搞得非常痛苦;从此以后就基本不碰闭源项目/产品了,因为无论你水平如何,闭源的玩意搞不了就是搞不了,木有办法

年底时参加了公司资助的oracle ocp学习考试(山东瀚高),只是没想到没几年就开始搞去IOE化…..

12年

这年基本都在交接工作,帮他们做些规划,解决他们碰到的问题之类的了;大概3,4月份就离职了

12年 家里蹲的几个月

闲时玩玩andorid

大概从11年开始玩andorid手机,那时候的安卓生态就是没有生态,记得那时想找个可以用的文件管理器都木的有,所以平常就自己写了些小工具在自己朋友圈里面传着用,对了 11年初的时候还差点去了小米,这就是另一个故事了,感兴趣可以联系我讲出来玩玩;

离职宅在家里总得有收入吧,一边找工作,一边呐就弄些有用没用的app发谷歌市场骗点下载量

也曾有过创业的梦想

当时有个点子(现在也有),成立个工作室,只负责系统的调研,需求分析,架构规划,原型设计,开发中的质保,后期验收(说白了就是一个项目除了开发不干其他的都帮甲方干了),只需要相对少量行业内的资深领域专家即可,目的是给没有任何IT经验/能力的甲方爸爸提供支持,码字你找哪家写都行,但是理念和设计一定给你做到位7.,P .,CV,保证业内任何人来了都挑不出毛病来. 国外是有这种公司的,国内可能因为环境的原因没有发展出来

12年 至今 山东新世纪网络教育有限公司

12年-14年

12年下半年,受到新世纪领导(副总)的邀请,过来暂时(????)帮帮忙…

前因: 因为之前的教师资格证报名项目就是这位领导找到我们做的,大家当时合作的很好,所以有困难时想到了我,具体是什么困难呐? 这里就得介绍下业务了…

简单说, 山东教师教育网隶属山东省教育厅教师工作处是教育部认定的“国培计划”教师远程培训机构、山东省教育厅认定的省级教师教育培训机构,山东省省级教师教育综合服务门户网站。

项目难点在于每年暑期的教师研修是一场全省百万级别短时间内集中访问的,而且在开始几年,下级单位行政领导们会进行近乎病态的攀比(某某市/县/校的评论/作业/进度一定要比其他市/县/校高),省里面大领导们又把每项活动的时间节点控制的及其严格,就导致了某些时间段里面,个别场景的压力堪比电商秒杀. 举个例子

领导要求 某学习活动必须7月1日9:00-12:00点才能进行,那么下面各级领导们就会要求所有的教师在8:30 一起登录,9:00开始就疯狂刷各种指标; 这里跟秒杀不同的是,秒杀是有库存限制的,库存空了压力就没了,而这里的业务场景简直就是为了搞死系统设计的……

12年刚来的时候呐 公司已有的开发团队使用.net开发的平台已经实际使用了4年了,并且稳定性也是逐年提高的(碰上峰值要死还是会死的…),但是公司大领导决定另行启动一套队伍,使用java+成熟的开源社区方案对系统进行重构;大领导以外包的方式找了个北京的团队接手开发,副总安排我以甲方技术负责人的身份介入开发全过程,从济南带了2个哥们就去北京住了10几个月; 其中过程的艰辛在此不提,有机会可以面聊; 这种层层转包的方式有多坑我想过来人都知道…..;总之 用了将近一年的成本拿出来一份我并不满意的成果;但是在大领导一意孤行下项目还是得做; 项目的架构和选型等基本都是我拿出来的(层层转包给北京的团队时已经变成了做个CMS了…,还好我提前自己就搭好了主体框架);

还是单纯的说一下技术吧,项目使用前后分离(当时这么设计的并不常见),项目分模块运行,容器选的apache+weblogic集群

前端

- easyui
- requireJs

后端

- springMVC
- JPA
- ehcache

数据库

- couchbase
- oracleRAC

由于对数据库的拆分被乙方团队的DBA(清华应届生)同学阻止,这个项目最后经过了几个月没白没黑的压力测试(请的省信息中心的压测团队,价格不菲),最终最好的场景(业务简单的那些)TPS:2W左右,复杂场景跑不过1W(8K+); 这个成绩在我看来是不及格的,上线必死; 这段时间里面, 我深入接触了压测的各个环节,性能调优,高负载的各种解决方案和设计思路,心中对于这个系统应该设计成什么样子已经有了计划; 本打算把项目糊弄着验收了,然后踢走外包团队,然后按照计划改造系统,逐步替换线上模块的方式稳步推进; 大家都知道的…计划赶不上变化;

由于我一直对新平台(做完压测后大领导一意孤行的要将其上线)功能性能不太认可的态度,大领导直接空降了个哥们领导整个团队玩命的推进作死计划……我呐…则进入了几个月的被架空状态被保护了起来…,这也给了我自己进行学习的时间和机会

时间慢慢来到了13年年中,期间新平台由于各种问题,只在个别的地区性质的项目中进行试用,效果也并不理想,原因不详(不想在这里详说), 最终这个耗费大几百万,层层转包后给了乙方团队几十万的项目终于惊动了厅级领导, 然后就是拨乱反正,该走的走该留的留, 骗钱混日子的走了,想证明自己一展身手的留下了;留下的人面对一团乱麻,决心从头开始; 用了几个月的时间,从新论证需求,设计,技术,部署等方案;这样时间就来到了14年;

其实这2年间, 我工作的并不痛快,但是不论技术还是理论,不论三观还是阅历都有巨大的变化; 我还是要感谢一下在那段时间跟我站在一起的朋友和同事们

14年-2020

这里先说一下13年底,我们最终拿出来的设计方案吧

软件架构:

前端:

    * angularjs
    * <font style="color:#172B4D;">Bootstrap</font>
    * <font style="color:#172B4D;">RxJS</font>

后端:

    * <font style="color:#172B4D;">Spring 4.x</font>
    * Springboot 1.x
    * 我设计开发的缓存框架(基于aop拦截+注解),与[autoloadcache](https://github.com/qiujiayu/AutoLoadCache)<font style="color:#263238;">的类似(后来出现了</font>AutoLoadCache后,这块代码整体提供给了该作者<font style="color:#263238;">)</font>
    * 共同设计的认证体系,与目前(2020年)流行的jwt类似,为了性能去掉了后端维持的session,省去了session同步的各种问题,改为前端持有一个编码后的json对象,编码后的值可以在Java端和nginx端(lua脚本)解码
    * 我开发设计的分布式配置管理组件,基于zookeeper实时同步更新spring配置,比disconf早了几年出来
    * mybatis 从性能和易用性两者间找了个折中的方案
    * dubbo 是的,14年我们就在生产环境中大量应用了dubbo
    * hazelcast 内存网格数据库,当年用hazelcast + mongoDB来应对高并发的OLTP场景
    * druid,国产连接池的忠实用户,Ps: c3p0|dbcp都是辣鸡
        + 虽然这么说 druid的文档和代码也一般般, 有兴趣的自己去看看github上面的issues
    * kafka,使用mq+mysql来应对OLAP场景

中间件:

    * <font style="color:#172B4D;">mysql, 响应去IOE化, 抛弃了单个庞大的oracleRAC,对业务垂直分割后改为数个mysql集群(2写4读,1写1读,1写2读等)</font>
    * <font style="color:#172B4D;">couchbase,缓存, 缓存是解决读压力的不二法宝,当然你还得解决好上了缓存后的各种问题(一致性,缓存穿透等等等等,这都是我后来才知道的坑)</font>
    * <font style="color:#172B4D;">redis,配合程序+</font><font style="color:#172B4D;">openResty可以玩出各种花样,性能还贼高,缺点就是不能搞太复杂的逻辑</font>
    * <font style="color:#172B4D;">openResty,nginx的性能比apache强太多太多了,支持</font><font style="color:#172B4D;">openResty的nginx简直无所不能(除了在上面开发不太友好),可以看</font>[这篇](https://www.yuque.com/xiangkongyue/abh4xu/dviduv)<font style="color:#172B4D;">最后的实际应用</font>
    * kafka,异步,队列,批量处理 是应对高并发写的三板斧,当然了现实中没有银弹,该碰上的分布式事务,稳定性等问题日后也都没落下
    * fastDFS,还是为了<font style="color:#172B4D;">响应去IOE化, </font><font style="color:#172B4D;">openResty上自行编译上</font>fastDFS模块和upload模块,上传的性能只有带宽是瓶颈!
    * solr cloud, 没什么好说的个人不喜欢elsearch

可以看到,当时的技术选项与设计 基本都是后来网上说烂了的标准方案, 但是在13年,是没有人/文章告诉我们该怎么做的, 所以在实践中还是踩了许许多多的坑.

14年暑期上线虽然顶住了没有挂机,但是并发上来卡顿,高延时的情况有不少,然后问题最严重的就是之前没有想到或者说没有重视的分布式事务问题, 为了性能,我们把可能高并发的业务都拆分了读写两种结构,比如写结构可能直接走hz+mongo,读结构走mq+mysql,这是允许出现读延时的场景,不允许读延时的就都走redis之类的方案; 这些方案看上去很美,但实际上没有一致性的检查的话,就是一场灾难;

15年 总结了经验,根据14年的实际数据(监控来的各种指标),调整了部分场景的设计和方案, 比如原来估计并发会很高的交作业部分其实并发才一千+,设计不合理的业务也进行了修改,比如:全省教师一起上来飙评论数(实际所有人都是复制黏贴的一句话),能把redis限流器跑死…; 整体上剔除了hz+mongodb,保留了kafka+mysql的方案;

16-17年整体重构了业务模块,模块切的更细; 整体升级技术框架,技术栈基本不变的前提下,依赖的类库/框架等等都做了全面的升级重构,看似不难的工作还是耗费了团队很多时间的, 因为拆分的模块越多,升级的成本就越高,这里暂时就不细说了; 同时响应上级的要求,2年间开发了不少新的业务;最终系统整体包括:

1. <font style="color:#172B4D;">账户中心,id.qlteacher.com,认证权限,三方oauth支持</font>
2. 教师继续管理,teacher.qlteacher.com,教师信息库
3. 课程库管理,course.qlteacher.com,通用模块,提供课程服务
4. 研修平台, 主要业务平台,负责组织和进行研修任务
5. 工作坊, fang.qlteacher.com,教师自由组织的学习园地
6. 骨干系统
7. 一师一课平台, 对接国家一师一课平台,负责每年一次的全省一师一课活动
8. 教师个人空间/博客/教师圈
9. 问卷/考试
10. 门户
11. 分布式资源转换服务,支持多地多级文件转换同步

18年, 除了基础的技术升级之外,接了个外包的运维工作, 就是 http://www.5teacher.com/ 以下简称t5; t5的开发/运维团队在北京,我们接收的时候大概10-20人,据称t5虽然盈利,但是开发团队成本太高,所以t5老板计划把技术整体外包,裁掉自己的所有技术人员, 然后我们去了3个人一周时间把系统的代码,运维,发布等等全部接手; 回到济南后又用了几个月的时间把环境和代码通通整理完毕,中间修复了bug无数; 一个哥们负责IOS两个app,一个哥们负责日常的硬件/软件/流量巡检,我一个人负责所有的后端程序(5个左右的主程序)+android两个app+数据库+日常破案; 其中的技术细节这里不便详述,毕竟是目前依然在线上运营盈利的,可以面谈

算下来就是3个人用了原来团队1/10不到的成本,更多更好的完成了工作;简直神奇

2020-至今

2020

2020年10月从新世纪离职了, 原因也很简单, 能在教师网上面玩到的技术,框架,套路, 都已经玩了8年了, 业务没有大的变动, 技术上能折腾的空间基本都玩过了, 然后有了娃以后心态也发生了一些变化, 简单说就是 我先去外面看看

所以换到了北京国科恒通

入职第一周 我连上生产环境的那一刹那我是崩溃的, 我第一反应是 “玛德 坏了 被领导忽悠了 是今天就走还是混一个月走?”

生产环境的服务 居然 0 优化 0 配置, 完全是默认安装的centos7状态 这尼玛完全是搞笑的吧 我搞私活都比这搞得漂亮几百倍啊 java程序完全裸跑的 0 jvm配置 你们确定这是生产环境??? 这尼玛的mysql , redis, kafka也都是默认按照运行的, 操蛋

这TMD就有点意思了 我TMD的这次要挑战一下自己 看我能不能把这么一套瞎几把胡来的作坊式团队给它整明白咯 整不明白我还不走了

国科不亡 天理难容