- 一月份、还在忙䟿着上线后的维护工作,每天都很忙,签很多字,测试的、上线的,现在看来毫无意义,既承担不了责任,也起不到太多监督的作用。忙来忙去,自己收获得到的也很少。12月31日那天守年终决算,晚饭后散步的时候买了一束花,元旦带回家中,新年新气象。小萌第一回生病,咳嗽不止,看着小孩子难受的样子,就觉得如果可以的话能让自己代她生病也是可以的。
- 二月份、随着上线系统的正常化,工作被分配到了运维组,一开始是拒绝的,不过后来想到反正也不会干太长时间了,于是也就不折腾了。业务运维这个东西,太简单,体力劳动,如果说要8小时满负荷的做的话,那些系统,估计三个人就够了吧,更何况稍微难一点的东西都是要让开发商做的。领导提出的开发运维划清界限,分清责任是不错,但是直接导致了运维看不了代码,开发部不了系统,所以有事就找开发商,大家乐得清闲。不过每天就是被业务的电话烦的要死,碎片化严重,实在也很难有效的把空出来的时间利用起来。只能是勉强看看书,写写Hello,World。
- 三月、四月、五月都是如上的状态。四月已有要走的心思,最初的打算是先准备一下事业单位,买了书和题来练,发现实在做不动,来不来就是一大段文字要背的,于是把重心放在了准备公务员考试上面。每天上班就是上午做一套真题卷子,下午处理一会儿业务问题,然后把卷子拿来分析一下,看看哪里还有问题。前前后后准备了有一个半月的样子,在四月份参加考试,800字的申论大作文居然因为前面耗费的时间太多而没有时间写,在考场上都觉得写的太烂了。回来后,一直处于等待结果的状态,出成绩之前一直觉得自己应该没有问题的,成绩出来之后排在第二,一共招两个,虽然分数没有拉开,但是还算可以,唯一有点意外的是这次复习申论还算是用心尽力了,但是分数依旧只有55分,可能不把字写满的问题颇多,幸好行测给力。五月份兵兵离职,大家还一起吃了散伙饭领导还一起参加,我跟乐乐蠢蠢欲动,按下不表。
- 六月份、算是比较曲折的一个月了。在日常找工作的时候发现乐山师院和职业技术学院都在招人。一边是师院的图书馆技术人员,一边是职院的专职教师,在左思右想和多方咨询之后,还是报了职院的专职教师。于是处于半离职状态的乐乐陪我去交了申请材料,人事的老师都很惊讶为什么在银行工作的人要想不开到这边来,只能回答是个人选择了。回来准备了一下试讲的内容,准备了四十分钟的内容,讲到十五分钟的时候被打断,说没有讲重点。回答了一些提问,感觉还可以吧,没有被问倒。让过两天再去考察一下专业技能,做点C语言题,就顺利通过。于是在六月底的时候通知我马上准备7月12日参加去培训。于是在商行赶紧提出离职程序,此时处于半离职状态的乐乐已半离职半个月之久了,虑不得脱。
- 七月份、已经把一切设备都移交好,将文档资料都清理移交之后,在7月6号被告知要等到7月13号才能给我安排人做移交的工作,于是我我指着离职申请上面的离职原因说,我合同11号到期,12号我肯定就不会再来了。也许合同到期的理由足够强大,最终在11号的时候,把一切交付干净,乐乐的手续也终于下来准备离开四川,回河南郑州,半离职状态的我陪他去拿行李,之前也是我送他来到租的房子里面。一路上太阳很大,我们也没说什么太煽情的话,拿完行李临出门时,看他回顾房间有没有落下东西的时候,我突然想到当年从南京回来的时候,出门这么一回望就已经隔了有8年了。但事后发生的事情来看,乐乐这个情况还是很不一样的,当然,这是后话了。7月11号,算是商行的最后一个工作日,第二天就开始参加学校的培训。后面又到了成都,参加川师的教师培训,上课,上讲台试讲,微课,接触的全是不曾了解过的东西,遇到的老师很好,指出很多的不足,不过我也没想能够在半个月的时间全改掉,知道不足,后面还可以持续改进。
- 八月份、八月初的时候顺利通过考试,拿到培训合格证书,也没有什么太困难的地方。回家来一直无事,每天就守着萌萌瞎玩。原以为八月学校会有工作安排,却不曾想一直要到九月才会有具体的事做。
- 九月份、开始上课。第一次上课的时候实在是有点紧张,不知道该从何说起,要讲的内容虽然说很熟悉也早有准备,但起承转接间还是无比的生涩。起初每次课开始的时候都像是车祸现场,慢慢进入状态后也会讲得自如一些。从讲课的情况来看也慢慢认识到这帮孩子的心思根本不在学习上面。自己也不再提出一些高的要求,讲课的内容也从一开始的天马行空回到书本上面。光是书上的内容他们都不太看得明白了,再讲些别的也是无用功。
- 十月份、国庆节搬校区,巨烂无比的新校区。上课之余的备课真正是耗尽所有时间。教案要写,PPT要做,还有各种任务。每一回心生怨念的时候就会想果然是每一行都有每一行的烦躁。
- 十一月份、十二月份、当老师的日子还是很规律的,日子就慢慢溜走,日常和几个同事一起吃饭吐槽也算乐趣。
- 二〇一八年,希望自己能有多一点提高,多读书,考个证。
先写一点背景
出于同事的工作需要,由我将他的几个片断Python代码整合成一个配置化工具,功能主要是将主机上取下的日志文件脱去其中的一部分信息。后面的过程来看,这一句话的需求,造成了不少的坑。
坑的开始
1 测试文件大小与实际文件大小差距过大
首先是提供出来的测试文件的坑:一个压缩包解压出来约5千个文件,大小在1M以内,于是第一版代码很快出来:
with open(file_path, 'r') as file_handle:
buff = file_handle.read().replace('source_string', 'replace_string')
# 写回原文件
整个程序执行了几次,自我测试没有问题之后,关上日志输出交付到应用环境执行,原本应该在20秒左右结束的程序,久久没有结果,于是查看了一下程序执行情况,内存占用在4000M以上波动,内心感受万马奔腾。打开日志输出,查找出来程序卡在某文件的处理上,定位到该文件,发现该日志文件足有2G大小,上面所示的直接读进内存处理的方法自然不可取了,于是改一版:
# 判断遇到的是一个大文件,小文件依旧整个读进内存处理
# 打开一个临时文件
with open(file_path, 'r') as file_handle:
while line in file_handle:
line.replace('source_string', 'replace_string')
# 逐行写入临时文件
# 用临时文件替换原文件
再次执行,内存占用停留在30M以内,稳定输出。另外提到一点的是,上次为了提高执行速度,在交付执行的时候关掉了日志输出,这一点很不可取,因为当程序执行的时候,一片空白,不知道情况,使用的人是很容易抓狂的,因此,这次在代码中加入了显示处理正在处理哪个文件和已处理的输出信息,虽然牺牲了一点效率,但使用友好度提升了一个档次,也是值得的。
2 文件编码 GBK与UTF-8
这个问题出现,一部份原因是自己在理解“Python 3编码是utf-8”这句话的时候产生的误解。原意指Python 3的source file是采用utf-8进行的编码,而我理解的是Python 3会默认用utf-8处理文件,其中包括了source file和打开的文件。这也就导致了前面代码中的:
open(file_path, 'r')
而不是:
open(file_path, 'r', encoding='utf-8')
而在Windows上执行时,遇上从Unix上拷贝过来的文件,就狗带了。 报错信息类似于”读取文件出错,GBK无法解析编码‘XX’”,将文件解析方式改为utf-8后,填坑结束,猜测Python是根据操作系统来决定打开文件时默认采用的解析编码的。
关于utf-8编码遇到的另一个坑是在解析配置文件的过程中,对于使用Windows记事本保存为utf-8格式的文件解析时,针对首行匹配总是失败,将配置打开成16进制显示,才恍然大悟这多出来的三字节BOM(Byte Order Mark),静静的立在那儿,中断了所有的解析代码。
3 关于并发
读取大量文件之类的IO密集性操作,第一反应就是要使用多线程或者是多进程来并发,加速程序执行,对于Python来说,要实现并发很简单,使用 multiprocessing.dummy.pool.map即可简单的实现多进程并发,并且可以根据逻辑核心数,通过修改进程池大小来调试程序的执行效率。但是——什么好处都抵不过一句但是——在之前提供的压缩包中存在的大量文件,让我以为需要操作的文件是聚集在一起的,意味着在每一层级的目录中会有大量的待操作文件,而不是在目录树的最深处,藏着一两个巨无霸。所以,当采用广度优先的并发策略——即并发处理完一级路径的所有文件后再递归下一级路径——遇到数十层目录下零零散散的一两个文件时,卒。
填坑?
考虑到该情况的总是极大文件,且文件数量极少,所以对程序运行的总时间影响并不是很大(沧海桑田也不过弹指一的瞬间),再考虑到本次批量操作文件的任务已临近终点,所以,等有需要的时候再填吧。
4 关于异常处理
其实一开始,我是不太重视异常处理的,一方面是因为这个程序比较的小,所以想当然的以为各种状态都能想得到,输入输出什么的都在考虑当中,测试过程中也未出现什么差错。 测试的归测试,实战的归实战。当执行过程中,因为各种问题报错导致运行中断的时候,除了一脸黑线以外,最要紧的就是赶紧加上异常捕获,对不影响其它操作的异常作好记录,继续把正常的运行下去。特别是对于文件操作,编码不对会异常,文件占用会异常,等等。
写在最后
最后,在修修补补中通过交付 ,完成了数万个文件的过滤操作,配置化功能基本实现(此文完全没有提到),大概后续会做成一个定时任务,按周期执行。
掉进的这些坑里面,充分的展示了:
需求完整的重要性,一句话需求导致了配置化这个重要特性返工多次。
对实际环境的全方位认识,没有全方位认识,必然导致代码实现与实际脱节,写出来的程序不能满足实际需求或是干脆完全不能用。
异常处理,实际应用中,环境的复杂性,输入要素的复杂性与罕见问题的偶发性要求一个健壮的程序必然要对这些偶发的,罕见的异常输入具备一定的处理能力。
再补充一点,使用一些集成的静态检查工具(如本例中使用到的pylint,可以在保存时对代码),可以在编码时滤除一些低级错误,提高开发效率。
最后的最后
人生苦短,我用Python.
- 1月份主要时间都在找工作,虽然是一个热门搬砖专业,但是因为地点局限在家乡,导致求职行业主要集中在银行,期间参加了各种银行笔试面试,感受最深的除了觉得成都的学校还是太分散,导致一两个小时的笔试要花掉四五个小时来坐车。剩下的还有一些有趣的经历,在所有的笔试都通过后,面试被各种雷人的题目伤害,比如农业银行的一进去,坐下来就递给大家纸板剪刀做手工艺品,更奇葩的是我所在的小组把几张A4纸裁剪贴接成一个卡包后,看到对面小组做了一个袋子,怎么说呢,在介绍思路的环节,我看着我手上的卡包和对面放大了二十倍的卡包,心里面一直都在告诉自己,大有什么用,最后也是被扔掉,但从结果来看,大还是有用的,比如顺手就可以把桌上的垃圾装走了,我却要手里捏着一坨垃圾到处找垃圾桶。最后被拒绝的原因可能是这个卡包,也有可能是我没有穿西服。 1月31号过年,我的协议还没定下来,虽然很多年没有放烟花了,但还是在老婆的陪伴下买了一个蓝色的外观不怎么好看的烟花来放,等到一整条街上迎接新年的鞭炮放完后,在门外的空地上,烟花绽放的火树,着实让自己惊艳了一番。感慨很多,不光为烟花瞬间的美丽,也为这一年光阴的流逝。
- 2月份,过完年后,13号参加商业银行的面试,期间一直收到的是没有录用的短信,一直到收到了商业银行的录取短信,仿佛带上了转运珠,各个录用电话相继到来,其中也包括了奇葩的农行来补录的。过完年后的时间,基本都是在学校准备论文了。本以为20天能够完成的东西,却发现怎么写都太简单了,问老师呢,又被告知就这样就行了,说清楚问题,解决方法就行。
- 3月份,签了三方协议,论文也终于交掉了,于是彻底的无事一身轻,基本就是每天看看书玩玩游戏,等着一切发生。
- 4月份,从交完论文,闲玩了大半个月后,开始在商行实习。至于内容,就是看书玩电脑的地点换到了办公室。这种状态一直要持续到5月。刚入银行的时候,各种迷茫,不知道各种设备术语,只好抓住每一个宣讲会上被提到的各个名词自己下来默默Google,有些压力,却也让自己很快的就能听懂大家在说什么了。
- 5月份 提交论文的终版,回学校数次。
- 6月份,接着答辩论文之前的时机,和老婆一起去了一趟江苏、上海,参加了熊勇的婚礼,见到了好久不见的同学,大家变化都不大,说话的方式还和过去一样。在无锡坐上摩天轮,看下面灯火璀璨,太湖一片漆黑。这远方的灯火和凉爽的晚风,这些曾经一起去过的地方,我都记下来,等许多年后的冬日下午,陪你慢慢聊起,那时那景,那些看过的树,飘过的云。回到学校,就是等着答辩了,听说有人挂掉,还是蛮紧张的,写了几页讲稿,但是到了自己站上去,刚开了个头,就被答辩老师跳到了问答环节,十分钟不到就结束了。所以说紧张是没用的,关键还是要勇闯。21号去重庆,在路上和赵中华、王锐一起被一帮人围殴了两分钟,没受什么伤,只是情绪有点波动。但是一顿晓宇火锅就让大家开心起来。6月底,正式毕业。
- 7月份,回来玩了几天之后,从11号开始去上海参加入职培训,近乎全封闭的环境,全天上课,实在没什么意思,估计效果也很有限。
- 8月份,开始正式在银行上班,工作就是跟着罗中文学银行业务,自己在柜员和管理员的角色间切换,学习开发。工作笔记上记录了每天起床的时间,开始坚持6点半起床来看书。
- 9月份,工作如旧,不过已经可以自行开发实现一些业务功能。9月底,核心项目启动,开了一周会,几乎听不懂。
- 10月份和11月份在疗养院度过,每天的生活倒是很规律,做的工作虽然不累,但是时间很长,主要的精力都花在每晚对当天测试情况的总结上面。
- 12月份,回到行里上班,自己看书学习。起床时间提前到6点。以前自己也无法早起,现在已经养成习惯,就算是冬天也不觉得有什么难受挣扎之类,闹铃一响很自然的就起床了。每天晚上也能很快的睡着,生活规律,就能精神充沛。
总的来说这一年里,主要的目标都是完成了的,顺利毕业,参加工作,虽然也有波折,有低落,但一直有父母、爱人的支持和安慰,是最好的动力。读了一些书,却不求甚解,想要做的事很多,却没有着手。希望在2015年里,自己能够有所提高,多读一些书,多写一些文字,把想要做的事情一步步做起来。