題:
如何阻止員工將公司劫為人質?
MightyPizza
2018-06-04 01:55:05 UTC
view on stackexchange narkive permalink

我在一個團隊中工作,該團隊編寫軟件來促進公司的主要業務部門之一。我幾個月前加入團隊,發現我的團隊由於一個人而離職率很高。這個人(叫他A先生)已經在公司工作了7年,他很難與他合作,並且他一再做出錯誤的決定,故意使軟件產品不穩定,難以維護和排除故障。這樣,當出現問題時,只有他可以解決。

幾年前他離開公司是因為公司不允許他在家工作,但是他一離開,公司就不得不僱用他(並允許他工作100 %在家中),因為該軟件存在問題,沒人知道如何解決。

我的經理知道這一點,但是他說他對A先生無能為力。

我該如何解決這種情況?我想使該軟件具有現代性,可維護性和穩定性。

FYI,該軟件監視事件,對事件進行一些處理,然後採取適當的措施。 A先生:

  • 故意遠離現代軟件開發框架;
  • 用無法測試的語言編寫核心業務邏輯;
  • 將軟件組件重新設計為30個模塊,以增加複雜性和版本認證問題;並且
  • 以不可擴展的方式對其進行設計,以確保沒有HA(高可用性)功能。

更新:

關於不可測試的代碼,業務邏輯正從Java移到嵌入XML的常規腳本中。 Java代碼的單元測試已被丟棄。

關於模塊性/複雜性,每個模塊都有自己的git repo並具有自己的版本控制。現在只有A先生知道哪些版本可以兼容。您不能發布該產品的2.0版本並部署所有2.0模塊。您必鬚髮布模塊A 2.0,它將與模塊B 1.0-2.0和模塊C 1.0-1.5一起使用。對我來說,這是一個糟糕的設計,應該全部像Spring框架一樣在一個倉庫中進行版本控制(Spring 5.0表示Spring-Core-5.0,Spring-Context-5.0,Spring-Web-5.0,Spring-Security-5.0等)。 / p>

經理說他對此無能為力,因為起初A先生被放開了,但隨後出現問題時,他不得不被叫來解決。因此,沒有他就無法維護產品。

我認為這是我的問題,因為我不想放棄經理,因為他對我很好。我的第一個直覺是解決問題,而不是放棄一個問題,儘管我可以看到放棄這個問題真的很容易,而我中的一部分人卻願意這樣做。

其他人因為這個原因而離開了團隊。他,因為午餐時他是每個人都抱怨的。每當與A先生開會時,人們都會搖頭(幾個小時)。

第二次更新:

HA是高可用性的縮寫。在軟件體系結構中,這意味著以一種可以在生產環境中以冗餘方式託管/部署它的方式來開發軟件,這樣,如果一個實例發生故障,其他實例可以承擔負載,從而使停機時間為零。最終用戶甚至都不知道出了什麼問題。

關於:這似乎是正常的大型代碼庫。我不認為這是因為代碼量很大,因為該產品的功能並不豐富。這是處理數據的後端系統。其他公司也有類似的產品來滿足他們的業務需求,他們能夠使用現代的HA / Scalable選項來做到這一點,所以我不明白為什麼這個團隊需要在沒有HA / Scalability的Java 6中做到這一點。

第三次更新:

關於“所有模塊的最新版本是否一起工作?”:不一定。如果發現了錯誤,他一直在回退生產中的某些模塊,但是由於某些模塊版本不兼容,因此回滾引入了更多錯誤。如果所有模塊一起進行版本控制和發布,則可以避免所有這些情況,因為這樣可以對整個產品進行測試,並且總體上可以保證某些功能。在我工作過的其他公司/項目中,這就是他們能夠輕鬆地開發和部署更複雜的項目的原因。

@pipe:我並不陌生。在過去的10多年中,我已經在多家公司和大型項目中工作,我所看到的A先生的提議都違背了慣例和常識。這30個模塊(在單獨的存儲庫中)是他最初設置源代碼樹的方式。一個在團隊中工作了一年的聰明的開發人員,看到了兼容性問題,並推動將所有內容組合到一個倉庫中,從而創建了一個多模塊maven項目。那個開發人員已經厭倦了A先生的天性,因此他在5大IT公司之一中找到了工作。我不會命名該公司以保持匿名,但在排名前5的IT公司中,我指的是Microsoft,Google,Apple,Facebook和Amazon。因此,這個開發人員並不傻,也不稱職。他有8年的經驗。 A先生將更改恢復為原來的方式,在單獨的存儲庫中有30個模塊。因此,未添加這30個模塊來處理大型代碼庫的複雜性。放置它們以確保產品中存在兼容性問題。不必要的複雜性。

有關“為什麼這是您的問題?”的更多信息:當我與在Microsoft,Google,Amazon,Facebook,Apple工作(或有工作在其上的朋友)的開發人員交談時;有人告訴我,通常您會遇到難以合作的人。我認為這種情況是一個挑戰,無論公司多麼出色,無論在哪里工作,我都會反复面對。因此,我需要知道如何正確處理此問題,才能繼續在自己的領域中發展。

目標(用於使該問題保持在主題上):

我要問這個問題,以了解處理上述情況以實現概述的目標的最佳方法是什麼下面。我相信困難的同事是無法避免的,因此根據他人的經驗,也許我們都可以學到一些東西。

  • 根據管理層的要求,通過最小化意大利麵條代碼和不必要的複雜性來提高產品的穩定性。

  • 根據管理層的要求將其設為HA

  • 。使用現代框架和語言規範(Java 6 vs Java 8),因此新開發者可以輕鬆在市場上找到並且可以更快地投入生產。

  • 消除對單人的依賴。

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/78422/discussion-on-question-by-mightypizza-how-to-stop-an-employee-from-holding-the-C)。
該人何時退休是否已知?他們大約幾歲?這樣的信息很重要。
**主持人備註**:請僅使用評論要求澄清或建議對帖子進行改進。避免將評論用於離題討論和發布答案。任何其他不相關的評論將被刪除,恕不另行通知。
您的問題對A先生的內部動機做出了許多假設。剔除您對A先生動機的假設,僅關注事實。不用說“他故意做過有害的事情X”,而是說他已經做過X事,這是有害的。除非您有通靈能力,否則您不可能知道他故意引入錯誤或故意增加複雜性以引起問題,並且坦率地說,做到這一點的機率很小。
我意識到提倡支付贖金,但與此同時,應該花巨資進行投資,轉移到對您不利的軟件上。遷移到其他非Red Hat編寫的軟件時,只需硬著頭皮支付支持合同的費用。
十九 答案:
Kilisi
2018-06-04 03:33:25 UTC
view on stackexchange narkive permalink

該如何解決這種情況?

什麼都沒有,您只呆了幾個月,這不是您的角色,而且您沒有權力

您的上級有很多資源,但是已經有7年沒有使用它們了,所以在這一點上,您只是在第二次猜測他們的原因,然後分析一位同事專注於自己的職責和任務。

評論不作進一步討論;此對話已[轉移為聊天](https://chat.stackexchange.com/rooms/78513/discussion-on-answer-by-kilisi-how-to-stop-an-employee-from-holding-the-公司)。
gnasher729
2018-06-04 02:28:38 UTC
view on stackexchange narkive permalink

僱用您所能找到的兩個或三個最聰明的開發人員。將所有代碼交給他們。讓他們驗證他們確實擁有所有代碼,以及運行該軟件所需的一切。讓他們學習代碼的功能,對其進行記錄,對其進行重構,直到他們到達可以比A先生更快解決問題的地步。所有這些顯然都不需要A的知識。

到那時,您確保您完全從公司所有資源中關閉A先生,將工作轉移給新的開發人員,並通知A先生他的工作已經完成。

我認為,用A先生的開發方法,他的代碼所做的工作量實際上比通常需要七年的開發時間要少得多,而且代碼被混淆了,但實際上並不困難,這使新手的工作容易得多。

PS。由於一些評論,我想再次強調一下:問題不僅是金錢,問題在於軟件的開發不夠完善,因為A專注於使其難以開發,而不是在改進軟件方面。軟件。

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/78563/discussion-on-answer-by-gnasher729-how-to-stop-an-employee-from-holding-the-補償)。
(+1)“問題不僅僅在於金錢,……”更糟的是:如果軟件是公司工作流程的關鍵組成部分,如果A先生離任或死亡,公司將面臨災難性的風險。OP應該問自己一個問題(實際上,管理層應該):“如果突然不再使用SW,公司可以生存嗎?它可以生存多長時間?”
由於A正在100%在家工作,因此成立一個他不為人所知的開發團隊確實非常容易-無論如何,這比他在現場要容易。
我同意@Law29的觀點-但“翻新團隊”仍然必須在通常的開發團隊之外設有辦事處。
@jennifer與否-如果整個團隊都對這個角色不屑一顧,那麼看著他的替換團隊的成長可能會導致士氣低落
您找不到三個聰明的開發人員來弄清楚他的代碼。他們太聰明了,無法勝任這份工作。而是僱用他們,讓他們寫一個替代。這是大爆炸重寫被證明是為數不多的情況之一。
同意Ben Mz。這三個caballero僅需要UI描述,定義的業務邏輯和存儲的數據的架構。因此,任何完全有能力的團隊都可以從頭開始重新構建應用程序。如果您沒有規劃這三件事,那麼您公司的問題甚至比已經描述的還要嚴重。
Jane S
2018-06-04 03:52:52 UTC
view on stackexchange narkive permalink

簡短回答:您的組織目前正處於公交因素的嚴重危險中。知識。這是巨大的風險。如果此人決定退出,或者被公共汽車撞倒,會發生什麼?如果情況恰如您所願,那麼整個公司都將消失。您需要將此問題標記為經理,這是組織風險,而不是人力資源問題。

開始讓其他人了解整個代碼,不管有沒有A先生。最好不要,因為您已經將他確定為

請記住,如果A先生不能幫助您減輕組織的風險,那麼他本人對組織是危險的,因此需要進行管理。釋放他的力量,這樣,如果他真的被公交車撞到了,那麼你們都不會無路可走。

這可能是一個任意依賴,因為沒有人告訴管理層沒有該個人就可以重做該軟件。這個人讓管理層相信他是不可替代的。
-1
@jane他之前已經被解僱,管理層將他錄用。
@JaneS,為什麼這麼消極?而不是“彩票因素”,而不是“彩票因素”。如果A先生突然贏得1億美元的彩票,該公司將遇到一些問題。有時我只說“關鍵人物風險”。
在這種情況下,我更喜歡“總線係數”。這將是OP以及公司可能發生的最好的情況。
@gnasher729僱用他回國的公司顯然沒有關注降低風險。他們錯過了解決此問題的機會,因此需要對其進行標記,因為他們下次可能不會那麼幸運。
@user2023861“總線係數”是一個行之有效的行業術語。
通過最初解僱他,再僱用他,管理層完全了解A先生帶來的風險。但是愚蠢的是,*管理*是錯誤的,因為他們沒有計劃將其影響最小化。當然,有一個危機局勢需要“付出一切代價”,但您計劃防止再次發生。這是短語“愚弄我一次,對你感到羞恥;愚弄我兩次,對我羞恥”這句話的完美例子……同時,A先生一直在笑。地平線上烏云密布,這是一場%$&*風暴正在等待發生。
-1
Sam Weaver
2018-06-04 07:29:57 UTC
view on stackexchange narkive permalink

其他答案非常好,但是我還要考慮另外一件事:

我的個人建議是考慮開始尋找其他工作場所...如果管理層沒有採取了7年的任何行動,我不確定這是您長期想要的工作場所。對我來說,這是對公司其他類型問題的警告標誌。

不可能從外面知道,但是這名員工是否可能以其他方式將公司劫為人質?他們會把頭埋在沙子裡這麼長時間聽起來有些不真實。
@l0b0-可能它們被欺騙了,並一直處於黑暗中。但最終,管理層要么希望解決此問題,要么他們希望事情繼續進行。如果他們希望它繼續下去,則由OP決定是否要在這樣的地方工作。
該網站上的每個問題都可以回答“開始尋找另一份工作”。
當我進入我的職業生涯(很久以前)時,我被告知排名第一的規則是:“在任何行業中,沒有人是必不可少的”。我同意這個答案,因為負責問題中描述的混亂的管理層已經有7年沒有遵循此規則了。因此,我認為此答案是OP的一種選擇。
selbie
2018-06-04 04:03:55 UTC
view on stackexchange narkive permalink

他反复做出了錯誤的決定,目的是使軟件產品不穩定,難以維護和排除故障

所以您的團隊為什麼要讓這些“錯誤的決定”越過設計審查還是代碼審查?如果您沒有代碼審查流程,甚至沒有設計審查流程,請長期倡導。

但是在那之前,您需要了解的所有信息都在Joel on Software博客文章中: 當你只是一個咕unt的時候就把事情做好

並且他有一個特別的標註來處理bozos:文件錯誤。按照Spolsky的說法:

作為咕gr,您的目標是將損害最小化,也就是遏制。在某個時候,這些天才之一將花費兩週的時間來編寫一些令人難以置信的糟糕到永遠無法工作的代碼。您很想花15分鐘的時間從頭開始正確地重寫內容。抵制誘惑。您有一個絕好的機會來消除這種白痴,持續了幾個月。只需根據他們的代碼報告錯誤即可。他們別無選擇,只能繼續努力幾個月,直到找不到更多錯誤為止。在那幾個月裡,他們無法在其他任何地方造成任何損害。

否則,作為團隊的新員工,您的目標應該是建立自己的卓越聲譽。 >

根據經理對代碼審查的“動手方式”,OP也可以向經理提及A先生的代碼被拒絕多少次,只要沒有以批判的方式說出來即可。提出問題可以幫助經理“自己考慮”,這可能導致經理擺脫A先生的原因,而“錯誤”不會落在OP上。例如:“我一直在查看A先生的拉動請求,以進一步了解應用程序。在部署/接受之前,代碼審查有這麼多拒絕是正常的嗎?”
到目前為止,該團隊尚未對他提出質疑,因為到目前為止,他擁有0-3年經驗的人員。現在有我和另一個剛加入的傢伙,我們有10年左右的經驗。當我們向他提問時,他只是說這就是他想要的方式,否則他會屈服,例如:“為什麼要將git歷史弄得一團糟?”他說,當有人拒絕更改git commit而不是像普通人那樣多次提交時。他希望開發人員更改git commit。
@MightyPizza ...好的,現在有一些具體說明。我確定他是對的,您需要聽聽他的聲音。我敢打賭,他建議您在提交之前將提交壓縮為一次提交(處於已知的工作狀態)。git fetch / git rebase(從不執行git pull),並且壁球在推送之前提交,以便100%的時間合併。他是對的。當您編寫代碼審查提交時,您不希望它包含一個隨機序列,即當您整天重新調整master的基礎時進行一堆小的提交,其中只有最後一個實際生成。查看1個已知已測試/構建的提交。
(這與更改歷史記錄不同。當每個人都推送1次提交時,原始鏈接的提交列表將增加1。您重寫了提交,以便您的推送也推送了1個原子提交,工作提交和經過測試的提交。多次提交,它們都必須全部通過測試並構建。壓縮掉損壞的內容,因為這就像半途看到事務一樣。)
@Rob他的方法存在的問題是他要求開發人員進行更改提交,然後將其推送到遠程,然後繼續進行相同的更改,修改本地提交,然後強制推送到遠程(因為現在是常規操作)由於之前的推送,推送將失敗)。對我來說,那是錯誤的。作為常規編碼的一部分進行強制推送似乎很糟糕。壁球部分,我同意。我這樣做沒有任何問題。這是提交和強制推送的修改,我對此並不滿意。有什麼想法嗎?
-1
有些工具甚至會迫使您進行擠壓/變基。我們絕對必須使用Gerrit(一種Google工具)。壓縮的要點是這些提交從未離開過您的計算機,因此這不是歷史的更改。您只是將更改堆疊在最新的原始提交之上,因此您看起來像是在處理先前的公共提交。在我的上一份工作中,沒有人會接受其他任何方式的提交,這是對的。
強制推送:git fetch;git rebase。在您的分支上工作,壓縮提交並推送。單個提交在整體上是被接受還是被拒絕,因為您沒有提出彼此依賴的一連串提交。如果您獲取並重新設置了基準,則您的推送將在100%的時間中快進。您將永遠不會看到合併衝突。如果有人在您重新設定基准後立即推送,請提取/重新設定基準,然後再次推送。如果您以這種方式工作,您幾乎永遠不會遇到合併難題。只有強行推入將是您的分支機構,當它被拒絕時將進行審查。
@MightyPizza為什麼您會對這種方法有疑問?這就是首先擁有VCS的全部意義。如果本地存儲庫由於某種原因損壞或丟失,該怎麼辦?分佈式VCS的優點是,您可以在代碼完全準備好之前進行小的本地提交,因此,如果一種方法不起作用,則不必重寫所有內容。定期將代碼更改推送到遠程分支,可以保護您不必從頭開始編寫整個代碼,還可以讓其他人使用您的部分代碼而不必等到代碼完全完成。
@MaskedMan也許我沒有正確解釋這種情況。A先生要求每張票有一次提交,並且如果需要多個提交作為檢查點,他希望修改最初的提交並強制執行。鑑於我要求在票證分支上頻繁提交並與南瓜合併以最大程度地減少提交歷史。無需推力。那不好嗎?您是說不經常進行修改和強行推送比頻繁進行提交和合併南瓜更好(不強行推送)嗎?
@MightyPizza您的意思是強行推動master / integration / feature分支嗎?然後,您說對了,在那裡強行推銷是完全錯誤的。我以為這意味著強行推動“自己的”遠程分支機構,對不起,我誤解了。
@MaskedMan不用擔心。A先生要求對遠程功能分支進行強制推送。
walen
2018-06-04 14:32:56 UTC
view on stackexchange narkive permalink

要比目前的答案說得更清楚...

您的問題

沒人知道如何解決它。

您的解決方案

  • 了解如何自行修復。

有,現在公司不再需要其他人了。

這具有有趣的動態。通過承擔理解混淆的廢話的任務,那個傢伙不再是唯一擁有這種知識的人。向經理解釋,您正在這樣做(可能最初是在您自己的時間),目的是專門傳播機構知識,這顯示了主動性,良好的意識,並最終為您提供了一個機會,以取代這個多年來一直在提供有毒的發展環境的個人。如果他們不喜歡您這樣做,請立即退出。顯然這是一個糟糕的環境
我喜歡這個答案,因為這是將此類軟件推向更光明未來的唯一途徑。多年來,該公司誠實地學到了兩件事:1)A先生開發了使事情保持運轉的軟件。2)由於他們不夠優秀而離開了無數新手。
這就是答案。如果他們重新僱用了那個人,那麼該應用程序就是搖錢樹。如果沒有其他人可以從事此工作,那麼他們也無法聲稱知道一種更好的方法。他們實際上需要成功地建立一個更好的系統來了解這一點。
除非_learning_ it(\ *咳嗽\ * _deobfuscating_ it)需要比現在立即僱用他更大的投資...當系統用處最終消失時,希望管理層能夠吸取教訓並已經有適當的團隊來編寫和編寫可讀的代碼在新系統中...
ctrl-alt-delor
2018-06-04 17:59:20 UTC
view on stackexchange narkive permalink

將其張貼在牆上:(您必須更改一些名稱和位置)。

幾年前,我花了一周時間在在美國中西部的一家製造公司。在星期五的下午,一切都結束了。 DP經理已經安排了該課程,並用預算支付了這筆費用,他請我進入他的辦公室。 “你怎麼看?”他問。他要我告訴他我對他的工作和他的員工的印象。 “很好。”我說。 “那裡有一些好人。”程序設計課程是艱苦的工作;我很疲憊;員工評估諮詢會額外收費。無論如何,我知道他真的很想告訴我他自己的想法。

“你對弗雷德有什麼看法?”他問。我們都認為弗雷德很棒。” “他很聰明,”我說。 “他對方法不是很熱情,但是他對編程了解很多。” “是的,” DP經理說。他在椅子上轉過身來面對牆上那張巨大的流程圖:大約五張大號行式打印機紙,也許是200個符號,數百條連接線。 “弗雷德做到了。這是我們每週薪水總額的總和。除了弗雷德,其他人都聽不懂。”他的聲音沉靜地靜下來。 “弗雷德告訴我他不確定自己是否理解。”

“棒極了。”我恭敬地喃喃自語。我清楚地知道了照片。弗雷德(Fred)作為科學怪人(Frankenstein),弗雷德(Fred)是無法控制的怪物流程圖的傑出創造者。 “但是簡呢?”我說。 “我認為簡非常出色。她很快就掌握了程序設計思想。”

“是的,” DP經理說。簡(Jane)以很高的聲譽來到我們這裡。我們以為她會像弗雷德一樣出色。但是她還沒有真正證明自己。我們給了她一些我們認為很難解決的問題,但是當她說完這些問題時,這些問題一點也不難。大多數結果都非常簡單。她還沒有真正證明自己-如果您明白我的意思了?”

“我明白他的意思了。”

—從書中摘錄軟件要求&規範— Michel Jackson(值得一讀)。

通常的含義是“我明白他的意思了。”是“我同意他在說什麼。”。但是,這裡諷刺地使用它,其含義與“他的推理方式錯誤”相反。
我了解作者在說什麼。簡幾乎是可以肯定的,但簡直是典型的經理人風格。經理認為造成難以理解的怪獸的人很棒,畢竟他們理解了這樣一個複雜的問題。現實情況是,真正優秀的開發人員有訣竅,可以將復雜的項目轉換為相對簡單的解決方案。我最初的評論只是提出一個建議,以改善您的答案,因為我喜歡您的答案,但是我認為許多人會在沒有您明確指出要點的情況下遺漏要點。
@Dunk如果您有建議,則將其添加到答案中。或作為評論。
搞笑:D是的,繼續並將其張貼在牆上!
@ctrl-alt-delor也可以表示:“他們的公司/行業重視將羊毛拉到客戶的眼中,而不是做好工作。”這是完全開放的解釋。
哇!這確實適用於我的團隊。我的經理今天告訴我,他珍視A先生,因為當事情發生時,他會修理它們並節省時間。我的經理不在乎的是為什麼事情一開始就被打破。
-1
@MightyPizza從未將惡意歸咎於惡意,更容易將其歸因於愚蠢。以我的經驗,這不是一個有意識的決定。通常,獎勵只是跟隨著獎勵(這是他過去獲得的獎勵;這是他的雇主所重視的)。
感謝您的回答。我記得這個故事,但不記得它來自哪本書。
抱歉,但IMO管理層無法理解。如果到目前為止他們還不了解風險,那麼這種描述就很難使他們抓住。他們還將認為弗雷德(Fred)是一個聰明的人,簡(Jane)。好吧,她只做了那些簡單的任務,沒有證明自己,對嗎?;-)
@ctrl-alt-delor是的,但請注意模式。我曾與一個從來沒有被發現過會導致他可以解決的系統問題或導致OT的變化的人合作,但是多年來我學會了發現問題。當他被問及為什麼系統的某些部分採用這種方式時,尤其是防守。現在事後看來,這是顯而易見的。除非您發現它們可能會破壞整個系統的問題,否則不要以為是紅手。有些人創造自己的獎勵。
我要說的是@Underverse,您無法分辨(動機是什麼)。這不是關於沒有證據不足或沒有證據定罪(儘管這也很重要)。意識到不良的訓練會導致相同的症狀。https://www.youtube.com/watch?v=BJYsregPlM4
Philip Kendall
2018-06-04 02:13:19 UTC
view on stackexchange narkive permalink

答案很簡單:解僱他。您可能需要在短期內支付一筆不小的數目的金錢來修復他所造成的混亂,但是A先生並不比世界上任何人都聰明-別人能夠在短期內維護軟件,並在長期內使其變得更好。

確實。而且這是一項短期投資,最終會帶來大量的長期利益,甚至有可能包括財務上的收益(高額營業額很昂貴!)
拒絕的理由很簡單:即使是世界上最聰明的人也不能在幾個月內完成幾年的工作,*特別是如果負責人似乎對混淆代碼,建立陷阱或使用有既得利益隱藏的編譯器工具*。**這個傢伙已經被解雇了!**首先,真正聰明的傢伙沒有在樹上生長,您需要識別它們,它們非常昂貴。其次,正如gnasher729所指出的那樣,首先請專家看看情況真有多糟,而不必讓A知道,然後才決定可以做什麼。
確實。前面已經提到了“總線係數”。風險已經存在,成為公共汽車更有趣。讓他過去(當然是像徵性的!),然後繼續經營公司
如果您解僱他,該公司會在6點鐘的消息中顯示嚴重影響100多個國家/地區的企業。
@MightyPizza-如果他決定離開或被公共汽車撞到,情況相同。他們需要應對的局面是不可持續的
@ThorstenS。是的我同意!我曾經不得不改進一位由計算機語言學家撰寫的軟件,這是要離開公司到國外的大學任職。這個人在他的領域是個“天才”,但是卻是一個可憐的程序員(嗯,我想說一個可憐的軟件工程師)。SW是一個〜10kLOC +的怪物PERL準整體腳本!它奏效了,但是一團糟(他沒有試圖混淆任何東西)。經過1個月的分析和反饋,我寫下了SW的規範之後,我決定完全用Java重寫它!...
@ThorstenS。...是的,最初會有一些麻煩,但是清理值得付出努力,而初始版本需要3個月的工作(僅包含核心功能)。在第一個發行版之後,添加其他功能和新功能真是輕而易舉。如果我頑固地嘗試改善原始腳本,那我將掉進一個骯髒而又長的兔子洞!
我想知道,僅僅還清A先生是否會更便宜。讓他無所適從,在接下來的兩年的業餘時間裡做項目,要視他消除自己的總線因素並提供必要的文檔以從頭開始運行代碼。
coteyr
2018-06-04 12:08:53 UTC
view on stackexchange narkive permalink

有一個需要考慮的觀點。

公司喜歡這種方式。如果他們沒有7年,那麼很長一段時間才能讓它持續下去。

作為開發人員,我們往往會忘記,編寫好的或精巧的代碼不是我們的工作。將產品變為現實是我們的工作。編寫好的代碼只會使過程變得更好,但是您可以使用完全廢話的代碼來製作一款很棒的產品。

公司支持他的決定,甚至僱用了他。他們“喜歡”他和他的做事方式。即使您設法以某種方式將他解僱,也不太可能更改此設置。他們可能會選一個新的人來當“傢伙”,然後整個過程重新開始。

經營公司不是您的工作。該公司已做出選擇。你需要做你的。向那個傢伙學習(他已經做過7年,必須做正確的事情)或繼續前進。

“ ...但是您可以使用完全廢話的代碼來製作出非常出色的產品。”它不會持續太久了。
從長遠來看,該公司仍將不得不面對總線因素的問題。如果A先生下次失踪,該公司可能未準備好應對該事件的影響。儘管該公司可能已經在計劃做某事,或者至少成立了一個基金來應對這種情況的最終後果。
@jpmc26如果“真棒”的唯一定義是“有利可圖的”,則它可能會保持真棒足夠長時間,尤其是如果產品/服務僅存在於進入壁壘較高的市場中時。
根據我的經驗,@jpmc26的代碼質量很差,與產品的接受程度無關。例如,我給您Civ5。您實際上可以在渲染地圖時看到可怕的嵌套巨人for loop。但是它仍然有利可圖。
AFAIK的大多數主要銀行仍在具有30多年曆史的COBOL處理帳戶等的大型機上運行。-我要說數十億美元的利潤報告非常棒嗎?
我完全同意。您還可以編寫非常出色的代碼,不會賺錢;我建議將此類代碼始終側重於SE純度而不是執行客戶想要的操作。唯一重要的是該產品可以賺錢。
-1
@Rob ...當然,OP不負責管理,但是經理很少了解技術主題。優秀的管理人員讚賞能夠指出公司工作流程/流程效率低下的員工,因為他們可以幫助他們進行管理工作。
Rui F Ribeiro
2018-06-04 12:36:31 UTC
view on stackexchange narkive permalink

無論好壞,沒有或沒有人是不可替代的。 (有些可能比其他更多,但仍然有)如果人們知道解決方案,則可以開始對其進行逆向工程。

過去,我在您的鞋子上穿了兩次以上。在與您最相似的情況下,“ A先生”早已不復存在,但是,我有一個整體解決方案在電纜公司的後端工作,那裡我沒有本地開發庫的源代碼,如果沒有的話我當時是該行業的新秀。

我幾乎以一種模塊化的方法來攻擊它,看看現有的代碼,缺少它的逆向工程,並編寫具有更好功能和速度的模塊,這些模塊可以依次替換核心任務。在進入下一個模塊之前,我已經完善了每個模塊。幾個月後,我殺死了以前的應用程序。

不可替代的想法被誇大了。

處理遺留物也不是一件容易的事,也許您的同事是出於慣性或因為他不知道該怎麼做。

那麼,當經理們為提供新功能而竭盡全力時,這總是很困難的。開發人員知道真正需要的是停止並重構代碼庫。但是如何說服經理?
有時,在上面的示例中,每個月末都有定期崩潰的情況,實際上沒有其他選擇。絕對是更好的。
Artelius
2018-06-04 09:09:33 UTC
view on stackexchange narkive permalink

從業務的角度來看,基本上有兩種解決方案:

  1. 以增量方式進行過渡,換句話說,只需使用一小部分功能,然後將其重新實現為高標準,然後將它在生產中,然後繼續逐步進行,直到舊系統完全停用為止。
  2. 完全構建一個新系統,然後一次或逐步過渡到新系統,例如在上面開始新的客戶,然後逐漸將舊客戶轉移到它。新系統不必像最初那樣具有舊系統的功能。它的賣點可以是更低的價格,更快的支持等。
  3. ol>

    選擇1的優點在於,它不需要大量的前期投資,新代碼經過了實地測試逐漸而不是一次全部地花錢,並且您開始及早看到收益(因為企業花費更少的時間和金錢來維護舊系統中不再活動的部分)。

    但是,缺點是新系統的結構可能會受到舊系統結構的強烈影響,在某些情況下,要替換非常混亂的系統的某些部分確實很困難。有時需要一些創造力-如果其他所有方法都失敗了,則新代碼可以模擬舊系統上的按鍵和按鈕點擊!但是與舊系統的接口可能會產生大量工作,因此最好只使用選項2。

    無論哪種方式,都有 可以完成。問題是,它將花費多少,並且將節省多少?嘗試估算上述每個選項將有助於確定選擇哪個選項(如果有)。這將取決於功能要求,現有系統的結構以及企業是否願意花錢/預先使用信貸來節省未來。

我不會太擔心您的第一個不利條件。由於[Conway的法律](https://en.wikipedia.org/wiki/Conway%27s_law),無論A先生是否打算這樣做,都可能已經構建了該應用程序來反映公司的結構。OP的解決方案甚至也可能是從頭開始構建的。當然,如果它反映了(1個)團隊的結構,則它可能會編譯為一個整體,在這種情況下,無論如何,選項1可能是站不住腳的方法。綜上所述,OP至少不能通過直接方法本身無法做到。他需要管理層的支持。
Dan
2018-06-05 19:07:00 UTC
view on stackexchange narkive permalink

作為軟件團隊的成員,您的工作不是管理公司及其員工。

您的工作編寫優秀的軟件。因此,您可以擔心軟件而不是人員。

您看到了軟件的問題,從您的問題中看來,您似乎有解決問題的想法。將這些想法帶給您的經理並為之奮鬥。可以簡化測試的模式。”

現在,很可能是:

A。這是公司不願投資的一項大任務,因為他們沒有看到需要。

B。 A先生會反對這些東西,因為他年紀更大,所以會被傾聽。

如果發生這種情況,那麼您會盡力做好工作並被扼殺。是時候尋找新工作了。

如果工作順利,他們會聽你的話,那麼你就簽了很多工作。

您要么是大三,要么從未與這樣的人一起工作過。
@BЈовић如果您分享一些特定的東西來支持它,那麼您的意見至少對我來說是有意義的。沒有事實的觀點是不可行的。
@employee-X我很不幸無法與問題中描述的類似人一起實際工作。他永遠是最聰明的人,其他人都是愚蠢的。他也是不可替代的,因為不得不維持他的泥球。我的經理還說他什麼也不能做。但是團隊的其餘部分卻沒有繼續前進,而是使這個傢伙陷入了地獄。他離開時真是太好了:)
DigitalBlade969
2018-06-06 10:18:07 UTC
view on stackexchange narkive permalink

您不能在這種情況背後隱含意圖。

故意遠離現代軟件開發框架

他可能最適應什麼他最了解嗎?

我在一些大公司工作,這些公司的流水線是古老的和全新的代碼的拼湊而成,並且某些代碼段“有效”並且從未被使用過。長期以來,沒有人真正了解他們的工作方式,因此他們只是添加了新功能來適應不斷變化的需求。他們的管道始終處於活動狀態,因此任何重大部署都可能帶來災難性的後果(即非常昂貴的工作和交貨中斷),因此他們迴避了

這是個壞習慣,會導致基礎設施未優化,但實際上卻有其優點。

您可以做些什麼,特別是如果您需要做很多工作或全部代碼:如果沒有適當的文檔,則建議創建一個(如果您知道自己是精打細算並有時間)或詢問是否應該採取某種措施來加快工作進度。

機會是,沒有上層人士會看到在這方面花費資源的好處,而您的嘗試可能看起來像是啊,新人認為可以改變世界,

不幸的是,公司結構會抵制突然的變化,而現代化則是逐步消除阻力或逐步實施阻力的問題,除非您能證明自己的“革命性變革將帶來

即使他惡意地這樣做是為了保住工作,我也不認為你有責任擺脫困境,尤其是當你的直接上司是知道了。

你會怎麼做?

看到您的經理決定不追究他可能不想與您或不與您同上司進行交談的事情時,是與您的經理交談還是與他的經理交談,或者不與他的高層管理人員交談,還是與有問題的同事交談?

如果您在沒有他的情況下與他的上司談話,您就有疏遠他的風險。

與同事交談最肯定會帶來非常糟糕的工作之後,他肯定會否認任何指控。

cybernard
2018-06-06 21:41:46 UTC
view on stackexchange narkive permalink

解決此問題的唯一方法是取消控制權先生。

首先獲得管理層批准。

製作全新的git。

  1. 導入商品,並商定起點。

  2. 從此處開始,然後將代碼提交。

  3. 根本不給Mr. A訪問權限(甚至不告訴他它存在)

  4. Port Mr A.更改為您自己的存儲庫,或重寫。

  5. 讓A先生為他的回購交易做任何他想做的事,因為你不會使用它。

  6. 製作偽造的代碼更改使它看起來好像有必要(如果有必要的話)向他隱藏您的新回購協議。 li> ol>

    您需要做出一個關鍵的決定,以保留或放棄模塊策略。模塊不一定是不好的模塊,您需要使它們保持同步並保持正常運行。

    這將是很多工作,因為您必須重新編寫許多現有代碼。

    另一個好處是,代碼最終將產生足夠大的差異,以致他將無法再聲明其代碼。對他來說完全陌生。

想到“代碼凍結”一詞。如果A先生不斷引入新的變化,那麼您的項目將永遠落後。為了使其能夠替換它,管理層需要告訴A先生凍結其代碼,使其超出最小和緊急的錯誤修復範圍。那就是列表中缺少的“零點”。然後,當您的項目準備推出時,您可以完全替換A先生的現有代碼庫。
還要注意一件事:如果A先生認為自己的控制權已被取消,並且如前所述那樣狡猾,A先生將簡單地辭職或威脅要辭職。該計劃需要應急。再次,代碼凍結和最小的錯誤修復,直到需要替換為止。
@cybernard:“好,商定的起點”。問題是,A先生有時間和經驗,要確保沒有其他人知道這個起點,甚至要確保沒有這樣的起點(如果他不希望這個起點存在)。
-1
@cybernard,但似乎始終都在出現緊急問題,因此長期問題很難考慮。
@mathreadler是否進行任何審核以監視A先生所做的更改,以查看A先生是否沒有添加代碼以允許發生這些“緊急”情況?同樣,這裡是一個全新的回購源。他無法再破壞它,您就可以開始放鬆意大利麵條了。我個人認為A.先生已經計劃了幾個月的提前準備,以便他可以看著您轉動方向盤並一直笑到銀行。您應該讓“智能開發人員”接管,解僱A先生,然後再整理。我敢打賭,您的問題現在已經解決了。否則,您將成為永久人質。
@mathreadler除非您想要真正真實的東西。讓某人假裝退出,憤怒地走出門,尤其是在A.先生在附近的時候。現在,他/她可以在家中或其他地方工作以重寫所有代碼,或者開始新的存儲庫並開始撤消A先生所做的事情。僅在代碼準備好或準備就緒時,才向經理報告。
@mathreadler(虛假)宣布您的客戶正在接受安全審計,這是由某些行業法律/法規/或其他法規強制實施的。您的代碼必須通過審核,否則他們將您拒之門外。現在,A先生遇到了一個真正的問題,java 6不會通過要求,如果您倒閉,他也不會要求任何東西。您可能需要客戶的幫助才能使其看起來真實。或-您的主要客戶要求您對獨立公司的安全性進行自我審核。如果您的代碼在6個月內沒有通過,它們將轉到其他地方。
Mark Lapasa
2018-06-04 09:58:19 UTC
view on stackexchange narkive permalink

@MightyPizza-您正在浪費時間。去另一家擁有光明和美好未來的公司工作。僅當這家公司是您的最後一站時,您才應該花很多精力解決這個問題。

這是您絕對可以獲得的最佳答案。

“我要使軟件現代化,可維護和穩定。”

做到這一點的最佳方法是在第一天,第一行代碼,不能和別人的垃圾堆在一起。

如果最好的方法是在第一天,那麼從第二天開始,您的軟件可能會停止“現代化,可維護和穩定”。
哦,我什至無法正確閱讀。晚了。但要注意的是,編寫現代+可維護的代碼更容易,而又不會遺留任何傳統開銷。穩定隨著時間而來。
-1
哦,要處理如此多的遺留問題,逐步,無中斷地塑造出新的現代產品,重寫何時/什麼時候需要什麼以及重構的方式……好吧,每個(專業)開發人員每天要做的事情(即使有他自己的遺留代碼,他兩年前也寫過了)
那讓我想起了:[您不應該做的事情](https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/)...
@AdrianoRepetti +其他:我不知道為什麼要投反對票,但我不是在提倡與公司呆在一起進行重寫。我提倡汲取教訓,如您所描述的那樣,去取得增長而不是維持短期利益。 每天MightyPizza嘗試解決此問題的時間都會減少一天,在此他可以飛行而不是停飛。
拒絕投票(我沒有這樣做)可能部分是由於這個相當傲慢的說法:_這是您要使用的絕對最佳答案get _....這不是建設性的,它減少了此處其他答案的努力。..
沒有拒絕投票,但我同意cale_b,無論如何,這不是IMO值得學習的東西,在開發人員的生活中,總是會有遺留代碼(除非使用非常短的單發項目,否則您將永遠不會獲得有關基礎的經驗)可維護性),並且學習如何處理它非常重要(因為您今天編寫的代碼明天將成為舊代碼)。
我要寫一個答案,但是最好的答案已經在這裡。+1。
rackandboneman
2018-06-07 03:37:05 UTC
view on stackexchange narkive permalink

請注意,作為非經理,這並不一定要解決您的問題(除了按照說明進行操作(作為解決方案的一部分已決定)之外)。

還,切勿盲目地將“我們希望問題XY解決”解釋為“ ...因為問題XY”。

也請注意,一旦您採取任何主動行動(即使獲得批准)來改變情況,您正在參與公司政治。在公司政治中,沒有“沒有個人議程的無辜創新者,我們不能為意料之外的後果負責”的事情。

如果這樣做,請 / em>個人議程,並以任一種方式承擔後果。

Jeremy French
2018-06-11 20:53:56 UTC
view on stackexchange narkive permalink

要讓他在該職位上停留很長時間,就表明企業正在有意識或無意識地使用 Hanlon的剃須刀

從不將惡意歸因於惡意

聽起來很難找到實際的惡意案例,只是隨著時間的流逝,事情變得不太順利。實際上,看起來A先生已經讓人們嘗試更改某些東西,然後在出現問題時英勇地將其修復。

您還應該考慮A先生可能正在遭受 Dunning –克魯格效應,因為他看不到自己在做什麼,這是錯誤的。

可能是他曾經很好,但是停止學習並停止嘗試。誰知道。首先要考慮的是,無論他多么生氣,您都必須像對待他一樣不是惡意代理。

您的問題似乎是假設他只是為了工作安全,並拒絕更新內容以嵌入此內容。您可能是正確的,但您不能以此為基礎與他打交道。

我敢肯定,您的一些好主意是因為“我們嘗試過一次,由於X而無法正常工作”。從業務角度來看,這是有道理的,他們冒著無法解決的風險,所以為什麼要再次嘗試。

您說的是您的目標。

我想使軟件現代化,可維護和穩定。

讓我們分解一下這個問題根據業務需要

1。現代

現代沒有隱含的業務價值。無論如何,這都是有爭議的。您說Java 8,其他人則說Rust或Golag是現代的。只要支持系統,更新它就沒有很大的價值。

2。可維護

這也可能很難爭論。 A先生將堅持認為,這是可以維持的。您可能會爭辯說,維護成本將大幅度降低,以證明對框架進行全面更改是合理的。穩定

您說您想使系統成為HA,但您也說它

該軟件監視事件,對事件進行一些處理,然後然後採取適當的措施。

聽起來好像不需要HA。

那該怎麼辦?

您的系統聽起來像

大泥球 >

一個大泥漿球是一個隨意構造的,蔓延的,馬虎的,風管帶和捆紮線的意大利麵條代碼叢林。這些系統顯示出毫無節制的增長跡象,並且反復進行了適當的維修。

要解決這個問題,如果開發者不合作,則將非常沮喪,並且可能毫無結果。聽起來好像很多其他人都嘗試過並且失敗了。

您可以做的就是規避它:

  • 如果您無法使系統HA,請使用消息總線系統或類似的方法,如果系統出現故障,您就可以通過這種方式捕獲消息,您不會丟失數據。
  • 如果您不能編寫單元測試,請編寫系統測試。這些不那麼整潔,但是它們將允許在系統上進行測試
  • 下一次需要執行某些操作時,它將開始將其構建到一個獨立的子系統中,該子系統可以偵聽消息總線並自行執行動作。
  • 如果您可以開始影響某些下游影響(例如封裝所採取的動作),則將其置於子系統中。

有一些論點。在微服務上支持主觀整體,但是它假定整體是經過精心設計的。在您的情況下,該系統可以作為精心設計的整體使用,但是如果設計不當,則需要將其拆分。

看起來像是一篇很好的文章,從以下內容開始:

更常見的方法是從整體開始,逐漸剝離邊緣的微服務。這種方法可以在微服務體系結構的核心部分保留大量的整體組件,但是隨著大多數新開發發生在微服務體系中,而整體組件則相對靜止。

與A先生一起,不要告訴他您正在更換系統,而是在“提高可靠性”或增加冗餘。如果您抨擊他所做的事情,他將使您更加難以實現目標。

您可能會覺得自己使系統變得更加複雜。的確如此,但如果要長期前進,這是必要的。

gachiemchiep
2018-06-25 13:29:57 UTC
view on stackexchange narkive permalink

為什麼每個人都想解僱A先生?我認為他在這裡沒有做錯任何事情。軟件開發不是要使用很酷的工具或框架來製作新東西。這是使穩定的東西“起作用”。您的公司愛A先生,對他的工作感到滿意。

有意地遠離現代軟件開發框架

您的系統目前處於穩定狀態,那麼為什麼團隊甚至需要使用Scrum或敏捷之類的現代軟件開發框架?

用無法測試的語言編寫核心業務邏輯

是否要求必須自動測試核心業務邏輯?

將軟件組件重新架構為30個模塊,以增加複雜性和版本認證問題

此實現對您的公司造成了多少成本?

以不可擴展的方式對其進行設計,以確保沒有HA(高可用性)功能

仍然是同樣的問題-這種實施使您的公司付出了多少成本?

在我看來,您在此處寫下的所有內容只是對他的投訴。如果他做了很多“糟糕”的事情,系統本身在第一年就會崩潰,而他不可能在您的公司呆那麼久。

“是否有必須自動測試核心業務邏輯的要求”是。**總是**。它驗證代碼中的任何更改是否不會破壞現有用例。它驗證代碼是否按預期工作,並按預期失敗。企業軟件開發是您踏上混亂之旅的路線圖。
(...續)這個問題表明,產品中經常存在版本不兼容的問題,而且沒人知道哪些版本相互兼容。單元測試將使其易於發現
重要的是,這個問題並沒有給我一個清楚的數字,即“ A先生造成了多少損失”。這個問題中的所有細節只能導致“阿先生減慢了開發過程”。如果MrA的工作滿足了所有成本,時間和質量要求,那就沒問題了。
嗯...。我不確定您是否閱讀了整個問題。這裡的主要問題是軟件高度不穩定。我們不斷斷電,每次都要召喚他來節省一天。如果由於非標準的原因實施了該軟件,因此新員工在6到12個月後離開,則可以理解。它也不是可伸縮的,它很慢,需要的內存要多得多。使用現代框架將解決所有這些問題。
我知道A先生確實使您的系統具有非常低的質量標準。但我的意思是:即使A先生的工作質量很差,如果他不製造錯誤,而這些錯誤會花費您公司大量的資金來修復,那完全沒問題。如果可以解決他們的問題,所有在那裡的經理都希望添加更多服務器或Ram。因此,我不認為“需要更多的內存來工作”根本不是問題,對此感到抱歉。
torogiant
2018-06-10 04:47:56 UTC
view on stackexchange narkive permalink

很簡單,企業必須向他提供豐厚的加薪,以記錄軟件的當前狀態以及所有未記錄的知識,然後解僱他。或者,他們僱用一家技術諮詢公司來記錄所有內容,他會在牆上看到這些文字,最後離開。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...