普通人进行系统架构的日常
3086
2022.05.03
2022.05.03
发布于 未知归属地

入职的时候,发现同事的代码水平的确不太稳……

  • 一个简单的问题:如果有一天,我们系统用oracle数据库更换为mysql,请问怎么处理?

    我们同事直接把读写数据库的操作固定写到业务代码里面了,代码不分层、不复用、不维护表结构(说的就是同事A,而且同事A是负责code view的人之一)

    我亲眼所见:1000行的代码,修改数据库的时候就硬生生的改了1000行……这维护起来上头啊……

    我瑟瑟发抖的和同事E去聊这件事,他不知道怎么解决!!!!!(当场我震惊了!!!!!真的!!!AE两个code view就这??)

  • 同事A和B写的代码都不维护表结构,代码不规范

  • 同事A连着3连bug被我发现,让我给他的代码兜底,我给拒了……

我那时候就摸鱼划水(因为我和他们不是一个项目组的,我和同事B是一个项目组的,我何必去得罪他们),但是觉得大事不妙。

然后发现:这个项目组一年废了一个项目,一个维护困难(这个项目组成立才一年,就把自己的项目给玩崩了……)

最后我就在和同事B、同事C、领导D的一个项目上栽了,吃了红牌被辞退了。


系统架构师

项目经理的态度:我们的同事,技术那是很过关的,这种简单的问题需要进行代码规范的约定即可实现。所以项目经理就一直致力于制定一个python代码规范。

我的想法的话,是一手牌不太行,所以需要重新摸一把(重新培训或者招聘新人)

项目经理的想法是:他手上一手王炸,只是单个出了。


所以项目经理需求很简单:

  • 问题:python没有一个统一的代码规范,所以导致代码难以维护、互相之间读不懂代码。所以一年废了一个项目,一个维护困难

  • 解决方案:领导拍板需要做一个python代码规范。

  • 交给谁?同事ABE。


按照我的想法:千古文章一大抄,抄Java的代码规范,java咋写你就咋写。java有阿里巴巴规范,有四人帮,咋说也有大型项目经验。要是不满意呢,就抄c++的我也没意见。

前人珠玉在前,为啥要重复造轮子??就我们这几只刚入门的菜鸟搞python代码规范?搞个鸡儿……

项目经理的想法震惊四座:周六周日加加班,python代码规范就能搞的很不错了……


等了大概2个周,同事E搞了一个规范:

  • 把表结构单独拆分出来(不就是pojo层嘛),然后作为底层来操作表结构

    高潮是:既然你都pojo了,那么dao层呢?同事E把dao层扔进业务代码里面了!!!

  • 在某些计算中,会生成一些人看不懂的反序列化文件,然后同事不知道啥叫做反序列化,就给他起了个核心文件( Core document)的名字……(不是说明同事菜,只是起的这个名字我不厚道的笑了……)

  • 从python的pep-8规范里面抄了大概20个规范扔了进去

  • 然后抄了hadoop的代码规范,加了bin和sbin(基调就是通过linux --> hadoop --> python)

    (首先给大家说一下,hadoop是个linux项目,官方不支持windows的……需要安装github的插件才能支持windows,用了这个规范基本上windows上就不用做了……)

所以我们的项目:shell生shell死的代码规范。我们都是写shell的大神……

然后项目经理的态度:

  • 20个太多,精简。(……你知道啥叫做代码规范么?我曾经3天看了10W字的代码规范……虽然只是速读……你这……)
  • 搞那么多配置文件很蠢,为什么不直接写在代码里面?(和同事B如出一辙的发言)
  • 配置文件不经常动,所以能不能把不经常动的放在一个文件夹下,经常动的放在一个文件夹下?

第二个同事B出现了:

  • 他又从pep-8和百度里面抄了10个规范……(大家可以百度 python 代码优化,然后他从里面抄了几个……但是我不太确定是不是)

  • 炮轰python的两个写法:

    a, b = b, a
    [x for x in range(3) for y in range(4)]

    说这两个写法影响可读性

  • 因为他的代码习惯完全不用全局变量,然后他炮轰python不定义直接用会导致空指针异常……我当场知道他是抄的……

然后被项目经理给拒了,压缩一下,5个可以嘛???



python丢日志

python的logger官方库不太行。

python的官方库是这么说的:


    The logging module is intended to be thread-safe without any special work needing to be done by its clients. It achieves this though using threading locks; there is one lock to serialize access to the module's shared data, and each handler also creates a lock to serialize access to its underlying I/O.

    If you are implementing asynchronous signal handlers using the signal module, you may not be able to use logging from within such handlers. This is because lock implementations in the threading module are not always re-entrant, and so cannot be invoked from such signal handlers.

简单说下人话:(大家可以不信啊,https://docs.python.org/zh-cn/3/library/logging.html#thread-safety 官方截取的)

  • 线程安全、加锁,使用的是不可重入锁
  • 由于不可重入,所以多线程丢XX日志

网上有一些解决方案,不过代码量很吓人:(这还是个最简单的多线程实现……)https://www.csdn.net/tags/MtjakgwsOTk3NS1ibG9n.html

java的官方日志库也很垃圾,但是java有log4j和log4j2啊(虽然暴雷是吧,但至少是有的),python没有。

我的想法很纯洁:我们都用python了,搞啥多线程嘛,起步多进程。内存高点是高点,消耗高点是高点,至少没有bug,实在搞不定了就要服务器。

为啥不想解决呢?就一句话:如果官方能解决用得着我们这些小菜鸟忙来忙去的嘛??人家估计是真的没辙……你解决了直接合并到python官方库才叫nb


同事不这么想,同事E重写了logger函数,我根本看不懂、也维护不了。


你想啊:

  • 首先logger得确定是多线程环境,如果单线程给一个单线程的句柄,多线程就给多个句柄。

  • 一次定义,不管是多线程还是多进程统统可靠。

我哪有那能力啊……


我给同事E提:python有个louru。

然后结论就是:可靠不??

这个我知道个J8……人家java有apache顶级项目维护着log4g2还XX暴雷,我就得为loguru背书啊?

的确你问的没问题,你让我咋回答你嘛??


python保密

java字节码文件可以反编译,大家都知道。

比如说:假如有个黑客登录到用户服务器,然后拿到代码以后反编译,然后拿去卖钱不就完蛋了?所以需要做反编译。


而python这种纯解释语言也要求进行编译操作生成字节码!!

然后:你觉得第三方插件支持pyc文件嘛?不支持!!!


最后,大聪明同事A提出了解决方案:

mv *.pyc *.py

跑通了……

给大家一个说法:python字节码互相不通用,python8生成的字节码python9打不开,反之亦然

反正:java要做的事情,我们python一个都不能少……


防火墙之灾

首先说一下之前工作(不是上一份工作),就是:

  • 用户提供数据和资源,我们是数据接收方
  • 用户的领导是我们的甲方

我们的服务器对于公网是开放的。

  • 用户对我们提出需求,需要我们登录到用户的服务器上去采集信息

我们就给了IP和防火墙,让用户负责打通防火墙


我那时候比较年轻,不知道我们业务有多困难,然后就等了大概20天,走各种流程各种审批,等来了一个好消息:防火墙打通了!!!

验证不通,最后的结果是:两层防火墙!!!

  • 项目经理的态度就:我们根本不知道有多少层防火墙啊!让端口联通是你们的责任
  • 用户那边:我也不知道防火墙在什么地方啊??我不懂技术,领导给我安排了这个任务我根本不知道啊?
  • 项目经理:那么就去问啊??我这边根本不知道你们内部有多少问题啊??

又等了大概一个月,第二道防火墙终于通了。

来回就是2个月。



防火墙之灾2

这个故事更有意思,我就不说是哪位项目经理了。

项目经理是个菜鸟,他有一个问题:不知道啥叫做端口,也不知道啥叫做防火墙。

按照上一个故事的逻辑,防火墙开端口,那基本上是层层审批、层层担责;第二个问题是:没有几个人懂如何开防火墙!!!

所以开发开发完成以后需要开启防火墙操作。


这时候,项目经理拿出了教条主义:

  • 你开防火墙,那么你为什么不提供一个文档,让用户自己去开防火墙呢?你文档提供了问题不就解决了??

  • 举个例子qq微信,人家为啥不需要开防火墙呢??(那mysql也走80、443端口是吧???)

当场就把开发干懵逼了。


评论 (16)