如何阻止一个员工挟持公司?
我在一个写软件的团队里工作,为公司的一个主要业务部门之一的软件编写工作。我在几个月前加入这个团队,发现团队中由于一个人的原因,导致团队中的人员流动率很高。这个人(姑且称他为A先生)在公司工作了7年,他非常难相处,而且他多次故意做出不好的决策,导致软件产品不稳定,难以维护,难以排除故障。这样一来,出了问题,只有他自己能解决,
他几年前因为公司不允许他在家工作,就离开了公司,但他一走,公司就不得不把他请回来(并允许他100%在家工作),因为软件出了问题,没有人知道怎么解决,
我的经理知道这个情况,但他说对A先生没办法,
我有什么办法解决这种情况?我想让软件现代化,可维护性和稳定性。
我想让软件监控事件,对事件做一些处理,然后采取相应的措施。A先生有:
–有目的地远离现代软件开发框架; –用无法测试的语言编写核心业务逻辑; –将软件组件重新架构成30个模块,增加复杂性和版本认证问题; –以非可扩展的方式设计,确保没有HA(高可用)能力。
更新:
关于Untestable代码,业务逻辑从Java转移到嵌入XML中的groovy脚本。
关于模块化/复杂性,每个模块都有自己的git repo,并且有自己的版本。现在只有A先生知道哪些版本是一起兼容的。你不可能发布2.0版本的产品,然后部署所有的2.0模块。你必须发布模块A的2.0版本,就必须发布模块B 1.0-2.0,模块C 1.0-1.5,这样才能兼容模块B的1.0-2.0和模块C 1.0-1.5。对我来说,这是很糟糕的设计,应该都像Spring框架一样在一个repo下发布(Spring 5.0指的是Spring-Core-5.0、Spring-Context-5.0、Spring-Web-5.0、Spring-Security-5.0等),
经理说他也没办法,因为一开始A先生被放走了,但后来问题一出,又要叫他回来解决。所以没有他,产品就无法维护。
我把这看成是我的问题,因为我不想放弃经理,因为他对我很好。而且我的第一直觉是要解决一个问题,而不是放弃,虽然我可以看到放弃这个真的很容易,我的一部分人也很想这么做,
别人因为他而离开了团队,因为在午餐的时候,大家都在抱怨他。每次和A先生开会的时候,大家都是摇头晃脑的出来(好几个小时)。
第二次更新:
HA是High-Availability的缩写。在软件体系结构中,这意味着开发软件的方式可以在生产环境中以冗余的方式进行托管/部署,因此如果一个实例出现故障,其他实例可以承担负载,从而实现零停机时间。终端用户甚至不知道出了什么问题。这似乎是正常的大型代码库。我认为这不是因为代码量大,因为产品的功能并不丰富。它是一个后端系统,是一个粉碎数据的系统。其他公司也有类似的产品来满足他们的业务需求,他们可以用现代的HA/可扩展性选项来做,所以我不明白为什么这个团队需要在没有HA/可扩展性的情况下用Java 6来做。
第3次更新:
关于'最新版本的所有模块都能一起工作吗?':不一定。他一直在prod中回滚某些模块,如果发现有bug的话,他就会回滚,但是回滚引入了更多的bug,因为某些模块版本不兼容。如果所有的模块都是版本化,一起发布的话,这些都是可以避免的,因为这样的话,整个产品都会经过测试,作为一个整体,可以保证一定的功能。在我工作过的其他公司/项目中,他们就是这样轻松地开发和部署更复杂的项目。我不是刚出校门的学生。在过去的10多年里,我在不同的公司和大型项目中工作过,我看到A先生提出的一切都违背了惯例和常识。30个模块(在独立的版本库中)是他最初设置源代码树的方式。一个聪明的开发者在团队中工作了1年,他看到了兼容性的问题,并推动将所有的东西都合并到一个版本库中,做了一个多模块的maven项目。那位开发者看腻了A先生的本性,于是他在5大IT公司中的某公司找到了一份工作。为了保密,我不会说出这家公司的名字,但我说的前5大IT公司是指微软、谷歌、苹果、Facebook和亚马逊。所以,这个 开发商不是傻子,也不是无能。他有8年的工作经验。A先生把这个变化恢复到了原来的样子,30个模块放在独立的仓库里。所以这30个模块不是为了处理复杂的大代码库而增加的。他们是为了确保prod中的兼容性问题而设置的。不必要的复杂性。
更多关于 “为什么是你的问题?"。当我和那些在微软、谷歌、亚马逊、Facebook、苹果等公司工作的开发人员交谈时,他们告诉我,你经常会发现一些人很难相处。我把这种情况看作是一种挑战,无论我在哪里工作,无论公司有多牛逼,我都会反复面对。所以,我需要知道如何正确处理这种情况,才能在我的领域里继续成长。
目标(为保持这个问题的主题):
我问这个问题是想知道怎样才能处理像上面描述的情况,才能达到下面列出的目标。我相信困难的同事是不可能避免的,所以根据别人的经验,也许我们都可以学到一些东西。
- 按照管理层的要求,通过减少面条代码和不必要的复杂性来提高产品的稳定性。