IT治理的七条死路

                               
  信息化建设历程中,不要理所当然地认为“车到山前必有路”。就如同并非天下所有的疾病都能被医治一样,IT治理也会有自己的“死胡同”,我们必须要学会避免错走进去。

  当糖尿病遭遇肝硬化

  曾经听说,当糖尿病和肝病出现在一个患者身上时,医生是最头疼的——糖尿病人必须严格控制糖的摄入,但肝病病人则需要食用足够的糖分,病人在进食用药时难免顾此失彼,要么影响糖尿病的治疗,要么坏了肝病的康复进程。所以,当糖尿病遭遇肝硬化时,无异于给病人带到一个非常痛苦的境地。

  IT领域这样悲伤的困局也不少见。不知有多少企业的信息网络,在稀里糊涂部署上之后就越改越乱,因为上面跑着不容中断的应用系统,永远无法停网彻底清理一次,直到网络几近崩溃的那一天;不知有多少用户定制开发软件时,自打开发出来就注定落个补丁缠身的下场,当被补丁糊满全身时已然无法呼吸,最终轰然倒下;不知有多少立志做好服务管理的管理者,抱着洋ITIL踌躇满志地重塑自己的服务流程,最终越服务落的埋怨越多,越ITIL自己越累,最后让轰轰烈烈引进的这个BSI“最佳实践”名存实亡。

  看来,当企业同时得了“IT糖尿病”和“IT肝硬化”时,要么等着推倒重来,要么只好忍耐着停滞不前——就像有的企业,不管客户怎么抱怨,它的IT系统总也改善不了、升级不好。而且这般带病工作,好似强行让病人在岗坚持苦干,牺牲在岗位上不说,接班的人从哪里临时来找呢?

  IT不一定能被治理

  IT治理是个时髦的词,但管理者必须清醒地知道,IT治理只是一种手段,并不是一种必然有效的方法、必然有投入回报的劳动。如果时间不妥、地点不当,IT治理甚至恰恰会成为费力不讨好、花钱打水漂的拙劣行为。

  很多病人喜欢“妙手回春”、“药到病除”的广告,总是期待神医出现,相信是病总有治疗的办法——扁鹊见桓侯,不是桓侯病重的每个阶段,神医秦越人都有不同方法治疗么?貌似只要有口气儿在,啥时候下手治疗都不晚。当下中国社会,各种治病养生的书越来越畅销,各色医疗广告总会有人相信,结果有的人确实治好了病,有的人却会大呼上当。

  IT治理也是一样。用户也在找“IT扁鹊”,不管系统痼疾积攒到何等程度,都期待着有亡羊补牢的机会。聘了黑头发、白头发、黄头发的土洋各色顾问,培训、评估、访谈、做方案,上制度、上平台、上人力,外国字、繁体字的PPT、DOC满天飞,一会儿BSI、一会儿ISO,总之是大把撒钱。有的用户确实从此得到改观,但有的用户却越陷越深、越治越乱。

  其实,“IT不一定能被治理”是IT治理决策者、实施者首先应该明白的道理,否则失败的种子从开始时就已然埋下,后面工作的成效根本无从谈起。防止走进“IT治理死胡同”,首先应辨清“死胡同”的构造,理清IT治理死路的诱因,进而学会避免进入死胡同,掌握防范治理失败的方法。

  IT治理的死胡同

  糖尿病遭遇肝硬化虽说可怕,但两病同发可以置人死地的情况是客观规律,是可以事先掌握并且及早预防的。IT治理中的“死胡同”大抵也是这样,细细分析可以梳理出部分有规律的诱因。结合笔者IT治理的实践经验,将IT“死胡同”的诱因归为以下七种:

  规划不科学:任何一个管理者都知道规划的重要性,没有规划的IT项目前景难料,但规划不科学往往还不如不规划。能导致“死胡同”的规划往往不是顾此失彼,就是只着眼于局部,稍不留神便会埋下祸根。

  上了单行道:高速路好歹隔行一段距离还容你调头,但汽车上了IT治理的单行道,就再也没法回头了。这就好像是肾衰,肌酐的增长根本不可逆,发展到尿毒症的阶段就只有透析了。比如企业如果一开始没有把内网IP地址等的基础配置规划好,等到发现有问题时,想改动调整时已经很难下手了。

  疏于做管控:好的规划或许是成功的一半,但之后的一半路程未必就不是盛极而衰的死路。因为疏于管控而一步步走错,或许会由量变走到质变,把一个本来可以治理好的IT体系带进“死胡同”。

  重技轻管理:IT治理的本质是“治理”而非“IT”,管理者如果过分地看重自己引进了什么先进的IT治理平台、新型管理系统,那就本末倒置了。IT管理中,买平台购系统只是在“搭台”,依托平台、系统做好适合自身的一系列管理才是“唱戏”。那些以为遵照先进平台中固化的流程表格做下去就算引进了先进管理的想法更是不科学,针对不同对象的管理对策一定是各异的,买来的平台怎么能帮你定好唱戏的剧本呢?所以,重技术轻管理有时也是把IT治理引进死胡同的重要原因。

  治理无根基:好的愿望不一定能带来好的结果,有心来治理却不一定有合适的企业文化支持。有些机构用户根本没有IT管控的执行力与大氛围,管理者有再大的决心、再好的规划,也无法贯彻。因此用一样的治理方法应对不同的客观环境,很有可能失败。

  重技轻管理:IT治理的本质是“治理”而非“IT”,管理者如果过分地看重自己引进了什么先进的IT治理平台、新型管理系统,那就本末倒置了。IT管理中,买平台购系统只是在“搭台”,依托平台、系统做好适合自身的一系列管理才是“唱戏”。那些以为遵照先进平台中固化的流程表格做下去就算引进了先进管理的想法更是不科学,针对不同对象的管理对策一定是各异的,买来的平台怎么能帮你定好唱戏的剧本呢?所以,重技术、轻管理有时也是把IT治理引进死胡同的重要原因。

  时空生变数:三十年河东,三十年河西,此刻的IT治理良方,到了明天或异地,可能就不再奏效。有些用户抱着最佳实践的圣经或是曾经成功的经验,依然走进死胡同。此刻先进的技术,几年后就可能与新需求、新技术发生冲突,变成前进的壁垒。

  破坏后治理:人类环境保护中最忌讳“先破坏后治理”,此刻靠破坏环境赢得一千元GDP,日后修补烂摊子可能要花一万元甚至更多。同理,IT治理中为了提高效率仓促把系统赶制上线,将来收拾烂摊子时很可能无从下手。

  以上是笔者整理的能导致IT“死胡同”的几点常见原因,但就像医院里每天都有病人因为疑难杂症病故一样,相当多的IT死胡同都是源自极为复杂、难以理清的原因。所以,对IT死胡同的研究是一个长期的课题,要不断积累经验,才能对这个问题把握得更准。

  如何避开死胡同

  研究该怎么做是学问,研究不该怎么做更是科学。除了注意把上文提到的七项诱因扼杀下去外,笔者还列出了以下五点防范的建议。

  研究不佳实践:除了研究“最佳实践”,更要研究“不佳实践”。以史为鉴的过程中,不能光学做得好的,也要学着避免那些做得差的。相比少量的“最佳实践”,学习为数众多的“不佳实践”要耗费管理者更多的时间精力,但这个工作是必须的,外部咨询师也要在这方面做足功课。

  往前看往远看:在规划和建设中多一些前瞻性眼光,才能防止IT项目随着时间变化出现破坏系统健康发展的内部矛盾。想做到往前看、往远看,管理者必须对技术发展趋势、管理发展潮流有准确的把握。如果说IT厂商需要对技术有100%的掌握,那么用户的技术人员掌握50%就够了,而用户的管理层只需30%—但这30%,却都是登高望远的前瞻性见解,大有学问。

  基础务必打牢:基础平台是IT开发运行的基石,在建设之初,必须细心设计、严谨实施。如果这一阶段偷了懒,事后想修改都很难,不是花钱能解决的。

  自适应易调整:时间空间的变化不能完全预知,想避开所有的死胡同,就必须构建自适应的IT架构。IT系统越是模块化、松耦合,将来调整时越好动作,哪怕钻进了死胡同兴许也能及时跑出来。

  建设兼顾全局:大团队进行IT建设时常会分解任务,无论规划还是建设,都分解到各个小团队中,但这样常会让工作有失全局观。比如开发团队在建设中可能不会详细考虑未来运维的压力,让自己手头的功能满足了业务需求,但软件对系统性能损耗很大、网络带宽挤占惊人、代码安全漏洞百出。想避免这样的死胡同,管理者必须一开始就从全局角度规划,并在建设中不断从全局角度来审视监督。

  以上是对IT治理“死胡同”的一些讨论,我们必须正视“死胡同”,解析清问题成因,积极克服避免,减少有关损失。学会最佳实践前,要弄清不该怎么实践,万不可钻进“死胡同”——好不容易和公司领导层争取来的IT预算如果花失败,下次就不好再张口要了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于栈的简单迷宫问题求解程序,包括所有路径和最短路径的求解: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAXROW 5 // 迷宫的行数 #define MAXCOL 5 // 迷宫的列数 // 迷宫地图 int maze[MAXROW][MAXCOL] = { {0, 1, 0, 0, 0}, {0, 1, 0, 1, 0}, {0, 0, 0, 0, 0}, {0, 1, 1, 1, 0}, {0, 0, 0, 1, 0} }; // 定义坐标结构体 typedef struct { int row; int col; } Position; // 定义栈结构体 typedef struct { Position pos; int dir; } Element; Element stack[MAXROW * MAXCOL]; // 栈的最大容量 int top = -1; // 栈顶指针 // 入栈操作 void push(Position pos, int dir) { top++; stack[top].pos = pos; stack[top].dir = dir; } // 出栈操作 void pop() { top--; } // 判断栈是否为空 bool isEmpty() { return top == -1; } // 判断当前位置是否为出口位置 bool isExit(Position pos) { return pos.row == MAXROW - 1 && pos.col == MAXCOL - 1; } // 判断当前位置是否为通路 bool isPath(Position pos) { if (pos.row < 0 || pos.row >= MAXROW || pos.col < 0 || pos.col >= MAXCOL) { return false; } return maze[pos.row][pos.col] == 0; } // 查找迷宫所有路径 void findAllPaths(Position start) { push(start, -1); // 将起点入栈,-1表示无方向可走 while (!isEmpty()) { Element element = stack[top]; // 获取栈顶元素 Position pos = element.pos; int dir = element.dir; if (isExit(pos)) { // 到达终点,打印路径 printf("Path: "); for (int i = 0; i <= top; i++) { printf("(%d,%d) ", stack[i].pos.row, stack[i].pos.col); } printf("\n"); pop(); // 弹出栈顶元素,继续寻找其他路径 continue; } if (dir < 3) { // 方向控制变量dir表示当前位置能够继续走到的方向,0表示东,1表示南,2表示西,3表示北,-1表示无方向可走 Position nextPos; switch (dir) { case 0: // 向东 nextPos.row = pos.row; nextPos.col = pos.col + 1; break; case 1: // 向南 nextPos.row = pos.row + 1; nextPos.col = pos.col; break; case 2: // 向西 nextPos.row = pos.row; nextPos.col = pos.col - 1; break; case 3: // 向北 nextPos.row = pos.row - 1; nextPos.col = pos.col; break; } if (isPath(nextPos)) { // 下一个位置为通路,入栈 push(nextPos, -1); maze[nextPos.row][nextPos.col] = 1; // 标记为已访问 element.dir++; // 当前位置的方向控制变量加1 stack[top] = element; // 更新栈顶元素 continue; } } pop(); // 当前位置无法继续走,弹出栈顶元素 } } // 查找迷宫最短路径 void findShortestPath(Position start) { push(start, -1); while (!isEmpty()) { Element element = stack[top]; Position pos = element.pos; int dir = element.dir; if (isExit(pos)) { printf("Shortest Path: "); for (int i = 0; i <= top; i++) { printf("(%d,%d) ", stack[i].pos.row, stack[i].pos.col); } printf("\n"); return; } if (dir < 3) { Position nextPos; switch (dir) { case 0: nextPos.row = pos.row; nextPos.col = pos.col + 1; break; case 1: nextPos.row = pos.row + 1; nextPos.col = pos.col; break; case 2: nextPos.row = pos.row; nextPos.col = pos.col - 1; break; case 3: nextPos.row = pos.row - 1; nextPos.col = pos.col; break; } if (isPath(nextPos)) { push(nextPos, -1); maze[nextPos.row][nextPos.col] = 1; element.dir++; stack[top] = element; continue; } } pop(); } } int main() { Position start = {0, 0}; // 起点位置 findAllPaths(start); // 查找所有路径 printf("\n"); findShortestPath(start); // 查找最短路径 return 0; } ``` 上述程序中,我们使用了一个栈来保存每个已访问的位置及其能够继续走到的方向,从而实现了迷宫所有路径和最短路径的查找。在程序中,我们使用-1表示无方向可走,0表示向东,1表示向南,2表示向西,3表示向北。当一个位置的方向控制变量为3时,表示已经尝试了所有方向但是都无法继续走下去,此时需要弹出栈顶元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值