【心得体悟】第一次带团队 - 技术篇
前情提要
接了一个任务,升级 Python 2 到Python 3,主要有三个难点:
- 自己单独开一个小队伍,带两个新人上手该项目。角色有所转变,从冲锋陷阵,变成统筹指挥。
- Python 脚本总共有约100+个,有一些是常用的,有一些是不常用的甚至是不用的。需要一个个进行分析。工作量大。
- Python 2 -> Python 3 升级中可能遇到的坑。
上一篇 讲了带团队的一些心得。这一篇主要说技术上的难点。
分析脚本生效性
首先第一个问题:100多个脚本,是不是每一个都是生效的?有没有一些已经过时了,不用了的?
很明显,如果已经过时了的,我们就不用花费时间和精力去更新了。
为了回答这个问题,有两个思路:
- 逐一查看每一个脚本,从其功能判断,是否还在被使用。(相当于是
Brute-force search
) - 寻找脚本被调用的地方,如果某一个脚本不再被调用了,那么基本可以确定已经过时了。(类似于
GC
的原理)
实际操作的时候,我先使用了方法2,快速缩小范围,在一天内总结出一个列表。以便让后续人员跟进。
然后,我使用了方法1,在接下来的一周左右,利用空闲时间见缝插针地对脚本进行分析。平均下来一天看十几个脚本左右,强度还可以。
检索脚本调用情况
值得一提的是,在寻找脚本被调用情况的时候,我遇到了难题:任务量太大,太繁琐。
- 在测试环境,我们的脚本是人工调用的。 -> 这个可以凭经验和文档得到。没有问题。
- 在生产环境,我们的脚本是通过
AutoSys
调用的。 -> 这个需要通过一个非常老旧的 UI 检索得到。
AutoSys
是一个商业产品,用来做 job scheduler ,负责 application 的启停调度等。
具体可以参看以下的两个链接:
- https://www.broadcom.com/products/software/automation/autosys
- https://www.autosysguide.com/autosys-jil-tutorial/
我们公司基于 AutoSys
这套工具自己做了一个 UI ,但是这个 UI 非常的不好用, query 起来很费劲。如果要一个一个 query ,查询上百次,那简直让人头皮发麻。
而且,关键问题在于,这个 UI 只支持 job_name
-> script_name
的检索,而不支持反向的 script_name
-> job_name
检索。而我需要做的,恰恰就是反向检索。
于是我开始想办法了。
首先,AutoSys
既然是成熟的商业产品,应该是支持类似的检索的。(否则也太 low 了)
其次,这些 job, script 等信息,一定是存在了某个地方,而且很有可能是文件格式。(我在 DB 中从来没有看到相关的表)
所以,一定有办法,只不过我还不知道。
遇事不决读文档,我上 AutoSys
的官网 仔仔细细地 读了一遍文档。终于发现了解决办法!
登录目标 server ,运行通过如下命令,可以抓取到需要的信息,然后再 grep 一下就搞定啦!
-- query job details, including scripts
autorep -J %JOB_PATTERN% -q > ~/my_job_detail.txt
-- query job status, actively used or not
autorep -J %JOB_PATTERN% -d > ~/my_job_status.txt
OK!
Python 升级中的注意事项
1.python
-> python3
2.需要对一些第三方 lib 包进行升级,比如 sqlalchemy
3.一些常规模块的路径发生了变化,比如:
from email.MIMEMultipart import MIMEMultipart
->
from email.mime.multipart import MIMEMultipart
4.一些自定义模块的引用路径需要特定指明,比如:
import custom_utils
->
from . import custom_utils
5.方法调用时的括号不能省略
print 'hello' -> print('hello')
6.String 和 Binary data 是两种不同格式的数据,需要使用 decode 相互转化。
stdout = execute(command)
->
stdout = execute(command).decode()
7.一些功能模块不再适用,需要适用新的功能,如 os.listdir(path)
-> glob.glob(path)
8.对于模糊定义的 list ,在循环的时候需要 cast 一下转成 list 。
for k in somelist.keys():...
->
for k in list(somelist.keys()):...
9.缩进 indension 需要注意,是用 tab 还是 space ,要统一。