文档章节

程序猿,该自私一点

z
 zengzexin27
发布于 2016/07/12 16:55
字数 2631
阅读 34
收藏 0
点赞 0
评论 1

       这个问题的思考,起源于楼主的工作,楼主所在的办公室,出了个由于表结构修改,导致程序出错的问题,看到了用户发来的邮件,说起了2014年的事情,楼主想到了陈年往事。遥想当年,楼主就是那个事情的男猪脚之一,此处省略1024个字(为什么是1024,我不解释,程序猿都懂的)。。。。。触景生情,潸然泪下。楼主认为这个字段,绝对是亚马逊的那只蝴蝶,会引起德州的一场龙卷风。

        

        楼主在忧伤的时候,不禁想到,如果楼主这次还是主角,楼主能全身而退?答案是不行,楼主就妄下结论,如果每个人碰到同样的问题,都会有同样的错误,那么这个问题,就与个人能力无关,不是某个人的问题,是整个开发体系的问题。同时,楼主不禁大惊失色,心生恐惧,还有多少只蝴蝶在翩翩起舞,只是没引起风暴。楼主的第一反应是抓蝴蝶,这个想法让楼主更加惊悚,楼主发现现在竟然没能力抓蝴蝶,根本不知道蝴蝶在哪里,系统啥时候出问题,或早或晚,全凭运气。

       

        楼主虽然愚钝,但是还是明白人,知道软件开发是个很严谨的东西,将系统的稳定性寄托在运气上,是不科学的。楼主负责的X具系统,目前的架构,非常薄弱,无法适应业务的发展,不大好维护,容易出问题了。用户提出修改程序,楼主或多或少会有抵触心理,为什么有这种心理,因为 楼主心里没底。 楼主都没信心了,怎么能给用户信心。 楼主想要重建信心,这种信心不是基于主观的想法,觉得这个模块有问题,那个模块没问题的,而是要有技术做保证。

 

               

        楼主想到这里,开始开朗起来了,程序猿是有选择的,程序猿可以给用户做程序,同样的,也可以给自己做程序,差别在于,为用户写的程序,会让你的明天更忙(道理很简单,因为你要维护),为自己写的程序,你的明天会更轻松,程序在帮你减轻工作的负担。楼主也在想,这么做是很有意义的,一个人如果不能对自己好,那怎么对别人好咯,因此,楼主得出结论,最先进,最好用,最稳定的程序要用在自己身上,这样才能帮助自己做出好的程序。但比较逗逼的是,楼主现在几乎还是刀耕火种,好在楼主从来都是懂得安慰自己的,没事,现在落后,说明还有很大的提升空间嘛,楼主没你们先进,但楼主可以上升的空间比你们大。

        

        问题又来了,程序猿该给自己什么程序。能想到要做的东西很多。楼主想到了“时间常有,时间优先”这句话。因此,楼主觉得,什么事情让你变得忙,就先去解决什么。楼主整理了一下最近碰到的一些问题,归结起来,楼主平常工作,只会做开发,运维做的不好,导致维护工作一直在蚕食楼主的时间。

        楼主觉得,运维的话,需要建设一套运维体系,这套体系可以做到预防故障,发现故障,处理故障:

1、数据是源头,数据库对象发生变化,是很频繁的事情,要建立数据库对象发生变化的订阅机制,主要是为了知道数据库对象修改的影响范围。吼吼~摁不死蝴蝶,但不能让你乱飞。就像关注微信公众号一样,有新消息就看看,比如你订阅了哪些数据库对象,这些对象发生变化后,自动会有个提醒,避免刚才说的问题,数据必须坚持先订阅后使用的原则,在底层管住数据。这件事情不难,建个表存元数据,再建个从表保存订阅关系的信息,定期比较表中的数据和生产数据库,有发生变化,给订阅的人发消息就好了。

但是接下来几条就比较难做了,

2、从源头预防错误数据进入数据库,我的方案是,部署自动化数据校验框架,在数据存盘的时候进行有效性校核,为了不增加业务代码的复杂度,这个校核是以拦截器的形式存在,独立于业务代码的,采用配置的方式,在数据发生变化时先进行校验。

3、程序实在控制不住,比如分布式事务,由于分布式事务的数据一致性和系统可用性,两者必须舍弃一个,比较主流的做法是放弃数据一致性,用最终一致性取代强一致性。因此,是不可能通过事务来控制数据的一致性,就只能主动寻找错误数据,做一个框架,抽取通用的数据检查规则,部署自动化的数据检查任务,每天跑任务,降低错误数据在系统的停留时间,进而反推程序的问题,及早发现问题。

4、以上都防不住,系统还是发生故障了,就要处理故障了,这方面设备处值得我们学习,他们是这样管理工具的,机坪上的工具设备发生故障后,如果工具没法马上移走,库房保管员,会去挂红牌,避免有人使用故障工具。对我们来说,错的程序不用没太大事,最坏的结果就是业务人员骂几句,起码不影响数据。一用事情就大了。某个模块出现故障后,首先要能告知用户该模块有的故障,以及故障的影响范围,其次要有一个熔断机制,出现符合熔断条件的情况,就自动停用掉,告知业务人员该模块开发人员在维护,还有大概可以使用的时间点。

5、最后是关于如何恢复故障导致的错误数据,我们在恢复数据的时候不能太依赖于数据库备份,数据库备份这种不是很靠谱的东西,有的有有的没有,要建立数据回退机制。我想到了一个逆向操作的方法,在程序每次执行sql语句的时候,同时自动生成逆向的语句,例如执行删除的时候生成插入语句,执行插入的时候生成删除语句,执行更新的时候,生成相反的更新语句,用于回退数据,事务无非包括增删改三种语句,一个事务对应着一个逆向事务。

        总结一下,运维在整个软件开发体系中,应该是在一个非常重要的位置,但在实际工作中,没有得到相符的重视程度。楼主也是这样的,没有足够重视,系统用代码堆出来,而不是设计出来,缺乏良好的架构和对业务收放自如的扩展性,X具系统做了两期,回过头来看,业务是做到行业领先,那技术呢,依旧落后,现在看着这系统也挺无奈的,想要把技术拉回正轨要经历非常曲折的路线,我希望在我身上发生的教训,不要出现在其他人身上。

        

        

        借用一个很形象的成语,叫做“围魏救赵”,开发就像进攻,运维就像防守,你看你都打到赵国了,但是魏国的首都守不住了,还是得回来。我认为以我们现有系统的规模,运维应该重于架构和开发,随着系统规模越来越大,重要性也将跟着提高,投入精力在架构和开发,倒不如老老实实搞好运维,这种投入很有价值,可以让我们和用户对我们的系统更加有信心,这也是系统建设提速的基础。

 

---------------------------------------------未来的分界线----------------------------------------------

        虽然楼主觉得遗留系统的改造很困难,工作量很大,但是楼主很乐观,多年的经验告诉楼主软件的发展规律。好的架构、平台是买不回来的,也不是找几个开源的软件拼凑一下就能拼凑成的,也是设计不出来的,而是长期演变才落地生根的。

        当你面对技术系统无可奈何的时候,请不要抱怨现在的系统设计如何如何不合理,技术如何如何落后。就算,你现在在全新的项目中实践最牛逼的架构,但是经过技术革新,人员变迁,这套架构也会慢慢落伍,这时候系统将会成为遗留系统,那时候处境和现在没多大差别,一样会碰到遗留系统的问题。只有具备对遗留系统架构进行演化和技术升级的能力,才有能力保持系统在技术上持续具备竞争力。

        关于遗留系统改造,不一定要亲身实践,也可以从别的项目中寻找经验,比如XMS系统升级,这件事情很有代表性,XMS系统的业务很强大,系统也很庞大,为什么会以推倒重建这种方式升级,千里之堤毁于蚁穴,XMS系统即将没了,楼主觉得应该找找这个蚁穴在哪里,是一个还是好几个,是不是系统没了蚁穴就跟着没了,这些蚁穴是否只存在于系统层面,其他层面上有没有,如果还有,是坐视不管,等着下一次决堤还是想想应对的办法。

------------------------------------------------结束的分割线---------------------------------------------------------------

        

 

 

© 著作权归作者所有

共有 人打赏支持
z

zengzexin27

粉丝 0
博文 15
码字总数 14529
作品 0
厦门
程序员
加载中

评论(1)

z
zengzexin27
非常感谢建文,在结束后,给我一个关于oracle的undo和redo的建议,是一个方向,可以更好地理解如何做取消和重做
职场最要命的两种心态:自我和自私

电影里演的职场,都是满级大号在新手村,而现实中,全是小号进了史诗副本…… 你为什么混的稀碎? 年轻人初入职场,一定要警惕六个字,“我以为”和“我觉得”。完全从自我感受出发去判断周遭...

明哥聊求职 ⋅ 06/06 ⋅ 0

悠然乱弹:程序猿(媛)们应该这样解读段子

段子手是写成上面的样子的,作为一个程序猿(媛),我们的绝对不能一笑而过,而应该从程序猿(媛)们的视角进行不一样的解读: 从老王的角度看:欠下的总要换的,你以为别人不知道你捣得鬼,...

悠悠然然 ⋅ 2015/08/27 ⋅ 1

如何管理程序猿

我有幸承担管理着这个实验室里大部分的团队,这些团队绝大部分都是由自诩为程序猿(并以此为自豪)的人组成。 目前,正如众所周知的现状,程序猿们和公司里的规章制度有时候走不到一起。然而,...

oschina ⋅ 2013/02/01 ⋅ 49

论程序媛的自我修养(男程序员勿入)

虽然说现在《嘀嗒嘀嗒》的文章写得依然一般,但是还是积聚了很多可爱而善良的读者,所以每篇文章阅读量什么的对于一个新人来说已经是出乎意料的高了。因着我写公众号是池哥(就是 MacTalk 的...

oschina ⋅ 2016/04/20 ⋅ 40

我的男朋友是名程序员,而非程序猿

自创图片 我的男朋友是一名程序员。就是大家所理解的那种天天敲键盘的那种码农。 对于所谓的程序猿,民间流传着这样一种说法,钱多、话少、死得早!还有就是致命的普遍低情商。 当然,我觉得...

ZYR_ ⋅ 2017/11/23 ⋅ 0

焦虑?压力大?看程序猿的解压大法

1 最近感觉工作生活事事不顺,压力好大怎么办? 这个问题,你要是拿去问普通人,得到的回答可能是: 看开点啦,人生不如意事常八九,哪个不是这样过来的? 要是拿去问文艺青年,他们也许会说...

梦履薄冰 ⋅ 2017/12/08 ⋅ 0

程序员和女神异地恋

咳咳,介绍一下,我是一名在公司里简单而又普通的程序猿。 1. 我和我的女神是在初中的时候认识的,准确的说她是我的同桌。初三我们因为成绩差不多被安排坐同桌,一下子就从只是见面打招呼的同...

一个没羞没臊的程序员 ⋅ 2017/08/16 ⋅ 0

【严肃调查】程序猿能不能坚持五分钟??

我发现很多人对程序员都有误解。比如:外界经常调侃我们发际线太高;大部分都找不到对象;性生活全靠撸!最近,百度做了一个调查彻底给程序猿正名。调查涉及到性生活频率、最近一次性生活等方...

uzv80px5v412ne ⋅ 2017/12/01 ⋅ 0

为什么阿里程序猿纷纷在内网晒代码?

大家知道,阿里有两万多名可爱的程序员。 他们也没什么别的爱好,就是多才多艺了一点:这帮阿里程序猿在改变世界前 要先撼动歌坛 就是热心肠了一点:阿里有个程序员,因为闯红灯上新闻了 虽然...

阿里云云栖社区 ⋅ 04/26 ⋅ 0

初生程序猿-入门篇

我是一个应届生,也是一个前端开发,算上实习期不到6个月的工龄,最近公司新项目未落实,久项目基本完成,手头上基本上没有什么工作,每天就是看博客或者教程混混日子,也多了时间想想自己做...

JasonWild ⋅ 2017/09/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 31分钟前 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部