目录

项目背景

软件简介

初入团队

重写还是重构?

重写

优点

缺点

重构

优点

缺点

拆分工作任务

搭建编译环境

搭建测试环境

部署软件

代码仓库

团队知识库

新员工要来了

代码冲突

代码分支推送错了?

最后


项目背景

该软件由公司若干年前招标采购,并由供应商提供维保服务。

随着时间的流逝,由于各种复杂的原因,供应商提供的维保服务愈发显得不如人意。

糟糕的是当年只采购了单一供应商的全套解决方案,无法直接快速更换这一供应商。

经公司领导层决策,在本公司成立研发团队承担起该软件系统后续的维护和更新,在本公司研发团队能力建设起来之前继续采用现有供应商的维保服务。

软件简介

该软件用于高速公路出入口车道上。

在高速公路入口车道,识别ETC车辆并放行、或者由收费员/发卡机发放高速通行卡后发行。

在高速公路出口车道,自动进行ETC交易并放行、或者由收费员/收卡机回收高速通行卡并收取高速通行费用后放行。

初入团队

团队成立时间尚短,入职之初只有团队leader和我两人,百废待兴……

和leader沟通了项目现状,了解到以下情况:

  1. 好消息1:供应商已提供源码和部分设计文档。
  2. 好消息2:申请用于测试的工控机,不久之后就可以到货了。
  3. 好消息3:供应商提供了一个研发对接人,可向他咨询相关问题。
  4. 好消息4:现场运维人员为我司人员,可向他咨询相关问题。
  5. 坏消息1:工控机尚未安装操作系统。
  6. 坏消息2:代码编译环境尚未搭建好,还不能使用拿到的源码编译成可执行文件。
  7. 坏消息3:暂未确定是重写该软件还是基于现有代码重构。
  8. 坏消息4:暂无专职测试人员负责测试工作。

初来乍到,申请了办公电脑,安装好相关软件,就开始参考着设计文档熟悉起代码来。几天之后,对软件的功能和业务流程有了大致的了解。

接下来就得开始干活了。

一直以来,我都认为在开始干活之前得和leader就接下来的工作任务达成共识。

找到leader询问接下来该干啥,leader回答领导尚未决定后续工作如何开展,不知道是直接重写该软件还是基于现有代码进行重构。

重写还是重构?

领导未决定工作方向,对于我们来说很不利,意味着我们可能会做大量的无用功。

领导不作决策的时候,我们可以提供相关信息供领导参考,引导领导作出决策。

我建议leader把重写和重构的优缺点整理出来,供领导参考,让领导尽快作出决策,这样也方便我们开展后续工作,leader很开明欣然同意,我和leader整理好后大致如下。

重写

优点

  • 可以采用新的UI框架,实现更美观的界面。
  • 可以重新设计代码框架,不受现有代码的限制。
  • 可以一开始就进行充分的测试,保证代码的质量,减少后续维护成本。
  • ……

缺点

  • 需要大量的人力和时间,而目前人员明显严重不足。
  • 耗时过长,可能导致长时间无可发布版本。
  • 在重写的过程中,可能会有新的紧急需求或者亟待修复的bug,我们可能会面临既要重写又要维护老代码的问题。
  • ……

重构

优点

  • 可以分模块重构,可快速发布可用版本。
  • 可以及时处理紧急需求或bug。
  • 不需要配备大量人员。
  • ……

缺点

  • 无法采用新的UI框架,软件界面暂无法美化。
  • 需要深入理解晦涩难懂的老代码。
  • 暂无法更新软件框架,老代码维护成本较高。
  • ……

我和leader私下讨论之后觉得重构更符合实际,毕竟要重写这么复杂的业务代码可不是几个人一时半会儿能搞定的。

leader将整理好的信息发给了领导并建议采用重构方案,过了几天,领导回复先基于现有代码进行重构,后续再根据项目情况决定是否重写。

经过一番努力,工作方向总算是定下来了!

拆分工作任务

虽然已经决定了工作方向,但是还没有划分具体的工作任务,那接下来具体要干啥呢?

工作仅有方向是不够的,还得拆分出具体的工作任务,不然没法进行后续工作。

和leader一起梳理了接下来的工作任务:

  • 搭建代码编译环境,编译出可执行文件。
  • 在工控机上搭建测试环境,便于我们后续测试。
  • 熟悉代码,梳理重构点,制定重构里程碑,方便向领导汇报工作进度。
  • ……

搭建编译环境

leader处理其他事儿去了,搭建编译环境的事儿自然也就落到了我的身上。

从leader那儿了解到需要在ubuntu或者centos环境下进行编译,之前他在windows电脑上安装了虚拟机但并未编译成功。

我心想,leader能力那么强都没搞定我来搞估计也挺费劲,有没有其他办法呢?

我记得leader之前说过供应商提供了一个研发负责人,那他那儿肯定有搭建编译环境的操作手册,毕竟这么复杂的业务软件肯定不是一个人搞出来的,只要他们研发团队不止一人那肯定有相关的操作手册,只是还没有提供给我们。

我建议leader向供应商方研发负责人索要搭建编译环境的操作手册,他不给就找公司项目负责人向供应商施压。

果然,没过多久我们就拿到了搭建编译环境的操作手册,参考着手册我没费多大劲就把编译环境搭建好了,开心!

完成工作任务才是目的,能借助现有资源快速完成是最好的,比自己去折腾来得快。

拿到操作手册后才知道,编译环境是部署在容器中的,直接使用对应的Docker镜像就行了。使用这个Docker镜像很方便,从零开始配置这个Docker镜像可不是我一时半会儿能搞定的,毕竟依赖的UI框架可是个老古董了,暗自庆幸自己没有直接去啃这块不太美味的硬骨头。

供应商研发负责人提供的Docker镜像存于Docker Hub上其个人空间里,我觉得对于我们来说存在一定的风险,毕竟我们和这个供应商或者研发负责人的合作可能并不会持续太久,要是到时这个镜像没法用就尴尬了。一想到这儿我立马把这个镜像推送到了我的个人空间里,以防万一。

没过多久,leader说那个研发负责人离职了。还好留了一手,说不定哪天他就把那个我们依赖的Docker镜像给删了,到时可就尴尬了。

有些东西,得牢牢掌握在自己手里,才放心!

完善了下操作手册的细节,更新了Docker镜像地址,leader参考着新版手册成功编译出可执行文件,搞定。

接下来就是搭建测试环境了。

搭建测试环境

从leader处得知,工控机的操作系统安装ubuntu或centos都行,他之前也没弄过,让我先先试着弄一下。

我想到生产环境也需要为工控机安装操作系统,那都是谁在负责操作呢?让leader找项目负责人问了下,说是找现场运维人员。

正准备联系现场运维人员询问如何搭建测试环境,就接领导通知,让我们出差去生产环境现场熟悉相关设备和收费员操作流程。

出差后,碰上运维人员巡检,正好顺道一起带上我们,在闲聊中得知了不少有效信息:

  • 工控机有多个型号,可能属于不同厂商。
  • 工控机上使用的操作系统是经过裁剪了的,不同型号的工控机可能使用不同的操作系统。
  • 为工控机安装操作系统,通常都是直接基于现有工控机的操作系统制作系统镜像,然后使用再生龙为新工控机安装操作系统。

出差回来之前,根据工控机型号向运维人员索要了一份操作系统镜像。本来还想要一份操作手册,不过运维人员说并没有那东西。毕竟我之前没搞过这个没啥经验,为了能在遇到问题时方便咨询,加上了运维人员的微信。

在网上搜索了下再生龙的使用教程,参考着为工控机安装操作系统,没有成功。为了快速搞定,直接联系上了运维人员,在运维人员的帮助下,终于把工控机的操作系统搞定了。

自己搞不定没关系,有贵人相助最终搞定了就行!

想着为这个工控机安装操作系统还是有不少地方需要注意,就着手编写了详细的操作手册,以备后用。

环境搞好了,接下来就是把编译好的可执行文件部署上去了。

部署软件

向leader索要相关操作手册,无果。向运维人员索要相关操作手册,无果。

好在之前leader为我申请了生产环境的VPN权限,可以远程操作生产环境,还给我说了下软件的部署目录。

登录上生产环境工控机,拷贝了一份软件的部署目录到测试工控机上,果然能跑起来。很好,离成功又进了一步。

使用自己编译出来的可执行文件替换掉原有文件,运行正常,很好!

不过生产环境的工控机上电启动时就会自动运行该软件,测试工控机怎么就没有自动运行呢,还差了点什么?

经过观察,发现部署目录下有一个软件启动脚本,在生产环境中搜索了下该启动脚本,发现会在系统启动时运行的一个脚本中调用该启动脚本从而启动软件。

参考生产环境,在测试工控机中完成相关配置,重启测试工控机,软件自动运行,搞定!

编写文档记录部署软件操作手册,软件运行环境简介(部署目录、如何实现的开机自启动、如何查看运行日志)。

环境搞定了,接下来就可以着手重构了。

代码仓库

快要下班的时候leader让我更新下代码,他将供应商最近修改的代码提交到了我们自己的git仓库中。我问着急吗,leader说这事儿着啥急,明天更新也没啥,眼看着快下班了晚上还有点事儿我也就没去更新代码。

第二天来公司后,更新代码时提示无法连接服务器。问运维同事是服务器跪了吗,运维同事说服务器正常的。

等leader来公司后我向他反映代码无法更新了,leader说昨晚下班把电脑关了,代码仓库之前只有他一个人用,现在是放在他自己电脑上的。

考虑到后续可能还会出现相同的问题,我向leader提议将代码托管到公司的GitLab服务器上,leader也觉得有这个必要欣然应允。

找运维同事分配好GitLab账号,建立好分组和仓库,将代码上传到了GitLab仓库中。

多人共用的资源,一定得存在公司提供的服务器上。

熟悉老代码时,突然想起找leader索要一份设计文档,leader说之前不是发过给你吗。去翻聊天记录发现之前的确是已经发过给我,我这啥记性!

既然已经发过给我,而我又觉得这文档之后会用到,我怎么就没记起来呢?

还是得找个地方把所有的资料统一存放起来才行啊,之前忙活其他事儿一直没空搞,现在可以开始建设团队知识库了。

团队知识库

当然了,首先还是得和leader先沟通好,leader觉得这个主意不错,唯一的要求就是敏感信息只能存放在公司的服务器上。

我将自己整理的可选方案拿给leader看:

  1. 使用 Git + 传统文档(Word、Excel、PDF 等) + Markdown。

    优点:将文档保存在公司内网,文档安全和机密性有保证。Markdown 编写效率比传统文档高。支持传统文档。支持离线编写。文档冲突后能快速解决。

    缺点:在线编写效率不如商业公司提供的文档库(例如:语雀)。

  2. 使用 Git + 传统文档(Word、Excel、PDF 等)。

    优点:将文档保存在公司内网,文档安全和机密性有保证。支持离线编写。

    缺点:传统文档对于多人协作编写支持不够友好,出现冲突时解决起来很麻烦。

  3. 使用商业公司提供的在线文档库(例如:语雀)。

    优点:对于多人协作编写支持十分友好,编写效率高,支持版本管理。

    缺点:部分文档属于机密信息,托管在商业公司存在泄漏风险。不支持离线编写。

  4. 使用禅道文档功能。

    优点:将文档保存在公司内网,文档安全和机密性有保证。支持在线协作。

    缺点:编写效率低。不支持离线编写。

leader看过之后,决定采用第 1 种方式,即使用 Git + 传统文档(Word、Excel、PDF 等) + Markdown 的方式来搭建本团队的文档知识库,这样可以最大程度上保证文档的安全性。

Markdown 官方教程

定下方案之后我在GitLab上建立好文档仓库,随后和leader一起对现有资料按类型划分目录并上传到GitLab文档仓库中。

我觉得,对于一个团队来说,能力备份和知识传承是至关重要的!

有一天leader拿了几份简历给我看,说是在招新员工。过了一段时间之后,leader说我们组要来新员工了,开心!

新员工要来了

回想起自己刚入职时踩了不少坑,时不时就去麻烦leader,觉得有必要让后面入职的新员工尽量避免踩相同的坑。这样可以加快新员工融入团队的速度,也可以节约老员工的时间。

和leader沟通了我的想法之后俩人一拍即合,我就开始基于现有的知识库开干了:

  • 办公环境:申请办公电脑、WiFi、网络安全知识、常用办公软件。
  • VPN的申请和使用。
  • 日报、工时分配表填写。
  • 代码库、文档库、蓝湖、禅道。
  • 业务入门:推荐阅读文档、代码导读。
  • 开发测试环境:如何搭建编译环境、如何使用测试环境。
  • ……

新员工入职后不久,leader说我们可以开始重构代码了。

毕竟是多人协作开发,还是得有个编码规范的,一起制定了编码规范并约定严格遵守。

没过几天就出现新的问题了,合并代码时出现代码冲突了,而新员工不太熟悉Git操作感觉有点吃力。

很多事儿都没法一蹴而就,遇到没能提前避免的问题,冲上去解决了就行。

代码冲突

由于我使用Git时间很长,很熟悉相关的操作,leader让我协助解决下,没费多大功夫就搞定了。

仔细分析了代码冲突的原因:

  1. 虽然已划分模块,每个人负责的模块并不重复,但模块间耦合比较严重,还是会出现两人同时修改同一文件的问题。
  2. 由于人少,之前并未制定分支管理规范,提交和推送都在同一个开发分支上进行。
  3. 每个人使用的编辑器不一样或者编辑器的设置不一样,导致代码格式化的标准不一样。

对于第1个问题,短时间内没法解决,就暂时不管了。

对于第2个问题,我建议采用我前一家公司所使用的分支管理规范,leader说太复杂了目前没那么多人也没那么复杂的使用场景。后来我基于gitflow为团队定制了一套简化版的分支管理规范,和leader沟通了几次之后就定下来了。

对于第3个问题,我认为要是所有人都使用相同的代码编辑器并且采用相同的标准进行格式化就行了,由于我们的源代码是用C语言编写的,最终采用了 VSCode + Clang-Format 的方案,将 Clang-Format 格式化配置文件保存在代码仓库中,每个人只需要安装好这个插件再指定下插件的可执行文件位置就行了,搞定!

至于新员工对于Git操作不熟的问题,我采取了下列几项措施:

  1. 让新员工多操作,不懂就上网搜,搞不定再找我。
  2. 让新员工在进行可能出现代码冲突的操作之前提交到自己的分支上并推送到服务器。
  3. 处理冲突时让他自己操作,我在旁边指导,传授使用 VSCode 和 Sourcetree 快速处理冲突的技巧。

新员工也很给力,让我帮忙处理了两三次后就能自己一个人搞定了。

代码分支推送错了?

代码分支规范里明确规定了不能直接推送到开发分支,需要通过Merge Request合并,怎么还有人直接往这个分支推送代码啊!

不好意思,没注意到,推送错分支了,下次不会了。

我信你个鬼!其实不是我不信你,我自己有时候也会推送错,这TM就尴尬了!

跑到GitLab上去研究了下仓库的设置,把相关分支保护了起来,所有人都不准直接推送,当然也包括我,就是这么狠!

人都有疏忽大意的时候,可以借助工具来帮我们避免部分错误。

最后

工作这么多年,也没怎么写过博客,虽然在每个公司都或多或少写过一些文档,不过也都没有发布到博客平台的想法。突然心血来潮,觉得自己也可以分享下自己的工作经历,说不定能对别人能有所帮助,毕竟自己之前也从其他人的博客获益颇多。

本文所述不能说是完全属实,为了便于阅读,部分描述可能与实际不符,不过绝大部分描述都是真实的。

虽然一路上少不了磕磕绊绊,遇到问题时有时也会满口芬芳。不过后来想想,要是没问题公司招我来干啥!

前路漫漫,不过这个项目总算慢慢地进入了正轨。

文章写完了,项目还在继续:CI/CD、单元测试……

高速公路出入口车道软件相关推荐

  1. 启悦高速公路噪音测试软件,启悦基础隔音,新手第一次发贴,有不足之处请见谅[已完更]...

    隔音,就是降噪,声学上来讲,分为两种方式,一种是主动降噪,一种是被动降噪 一.主动降噪 汽车上的主动降噪,叫做ANC系统,例如:思铂睿.林肯.锐界,一般出现在比较高端的车上,因为这个领域涉及到军事,例 ...

  2. 启悦高速公路噪音测试软件,提了启悦一段时间,车主把真实的用车感受和优缺点分享出来!...

    空间够,配置良心,省油耐用! 这些地方让我不太满意:手动偶尔倒档难挂入,离合器偏高,半切入状态短,不过给油也就不会熄火,后备箱盖子不好扣需要用力才能关上座椅不舒服,长时间驾驶腰很累,找不到合适的坐姿! ...

  3. 视觉无人机进行高速公路违章检测—高速公路交通法规之应急车道

    由于课题需要,利用视觉无人机进行高速公路违章检测,根据法规, 机动车在高速公路上行驶,不得有下列行为: 1.倒车.逆行.穿越中央分隔带掉头或者在车道内停车. 2.在匝道.加速车道或者减速车道上超车. ...

  4. 基于视觉的车道线识别技术在智能车导航中的应用研究

    密级:公开 摘  要 摘  要 室外移动机器人的研究是机器人研究领域的重要分支,同时也是备受关注的热点领域.面向高速公路等结构化道路的室外移动机器人研究已成为现阶段民用交通运输领域移动机器人研究的主流 ...

  5. 高速不按规定车道行驶_提醒!这些车辆不按规定车道行驶将被记3分,还会抓拍曝光...

    想问一下老司机 假期走在高速路 有没有遇到这种情况 大货车客车并排行驶 速度慢,又无法超车 开货车上高速都得靠右行驶 面对部分不遵守的老司机 广东交警将出动严查 让五一出行的小伙伴们 安安全全稳妥地开 ...

  6. javascript2秒后再执行_停车后5秒,车祸发生了!高速公路上你别再这样做了!| 一线微观...

    近日,济青北线发生一起交通事故, 一辆行驶在超车道的商务车, 在匝道口附近突然刹车减速并停车, 不到5秒钟的时间, 后方一辆轿车躲闪不及, 在采取紧急避险措施之后, 还是撞上了这辆突然停车的商务车, ...

  7. python获取数组中大于某一阈值的那些索引值_使用Python+OpenCV进行实时车道检测...

    大约十年前,当谷歌还在试验一辆原型车的时候,我想到了自己的第一辆自动驾驶汽车,当时我立刻被这个想法迷住了.不可否认的是,我必须等待一段时间,直到这些概念向社区开放,现在看来等待确实是值得的!我最近试验 ...

  8. 车辆占用应急车道识别抓拍系统 opencv

    车辆占用应急车道识别抓拍系统通过opencv+python人工智能识别技术,对高速公路应急车道进行不间断实时监测,当监测到应急车道上有车辆违规占用时,立即告警提醒后台人员及时处理避.OpenCV的全称 ...

  9. 全球及中国高速公路行业未来建设规划与十四五盈利前景分析报告2022版

    全球及中国高速公路行业未来建设规划与十四五盈利前景分析报告2022版 HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS-- [修订日期]:2021年11月 ...

最新文章

  1. 选IDC房时,用脚本截取丢失包和rtt的值作比对
  2. 探索JAVA并发 - 悲观锁和乐观锁
  3. mysql 触发器介绍
  4. NYOJ 585 取石子(六)
  5. 互联网公司忽悠员工的黑话
  6. Lesson_7 上课笔记_1 ----static关键字和导包
  7. hive的udf,udaf,udtf各自依賴兩種class(转载+分析整理)
  8. php获取当前时间戳方法
  9. 计算机网络互联网技术实验报告,2013计算机网络技术与应用.实验报告01
  10. 谈谈我的程序人生程序生涯-飞鸽传书
  11. python server酱_用Python抢到回家的车票,so easy
  12. macbook excel导入html,mac版本怎么把网页数据导入Excel
  13. 信息流广告投放分析实战案例!
  14. 阿里云 服务网格 ASM
  15. 史玉柱:打造爆款消费品7大人性洞察,8个操作方法
  16. tp5和微信小程序联接mqtt订阅及发布
  17. 嵌入式Linux(二)汇编LED驱动实验
  18. 30硕士毕业,工作一年的码农,看不到前景,未来怎么办?要不要转行?
  19. 强迫症终结版 - 蹩脚梨视频下载器(很菜勿喷)
  20. linux下的php编辑器

热门文章

  1. centos 查看端口是否通_Centos6查看端口占用情况和开启端口命令
  2. 如何正确使用OPcache优化系统性能
  3. 时间源服务器(NTP授时服务器)应用安防监控系统
  4. Squire编辑器源码解读
  5. 开机时显示专用计算机,win7开机弹出“系统属性,由于启动计算机时出现了页面文件配置问题”如何解决...
  6. 实验4  视图的创建与使用
  7. elementui 校验不可以输入空格
  8. python+pywinauto+lackey实现pc端exe自动化
  9. linux下的ehci控制器调试
  10. 抖音小店无货源不吃香了?这个项目的红利期结束了?