[TSG開發紀錄檔4]演演算法元件、個人編寫的庫檔案如何封裝成DLL,如何更好地對接軟體開發?

2023-07-15 18:00:32

寫在前面

這個內容確實是我有點疏忽了,我以為做演演算法的同事應該多少對這方面會有點了解的。但是我想了一下我剛畢業的時候,確實對這方面的理解不深,查了很多資料才勉強搞懂什麼意思,也是後來隨著工程學習的愈加深入,才漸漸瞭解了在C++開發中動態連結庫的重要性及如何編寫。

一般在說一個標準時,我喜歡從兩個角度出發:為什麼,怎麼做。

一、為什麼

這裡問的是為什麼要把自己的演演算法元件打包成C++動態連結庫。
事實上,我不僅需要你作為一名開發,寫出來的程式碼需要打包成一個DLL的動態連結庫,而不是直接提供工程檔案,或者直接提供 .h檔案和.cpp檔案?其實主要從以下幾個角度出發:

  1. 程式碼保護:通過提供動態連結庫,您可以隱藏演演算法的原始碼和實現細節,從而更好地保護您的智慧財產權。其他人只能使用動態連結庫提供的介面來呼叫演演算法,而無法檢視或修改演演算法的實現。

    這個對於大夥來說其實不那麼重要,因為作為軟體開發我不夠關心演演算法是怎麼寫的,但是這個世界不好說是不是小人多,也許今天你把演演算法交給他了,明天他就拿到github上開源說是自己寫的了。

  2. 程式碼封裝:動態連結庫允許您將演演算法封裝為一個單獨的實體,從而提供一個清晰的介面和功能集。其他開發人員可以直接使用庫提供的函數,而無需關心演演算法的內部實現。

    這麼說吧,前面的開發並不關心你演演算法程式碼是怎麼實現的,你這樣將一坨程式碼粗暴的插入到軟體中是非常不合適的,因為這會導致測試上的拖沓,試想一下,當程式崩潰時,測試員/程式設計師如果追到你的程式碼裡面去,這時候你說你的程式碼在本地實現很好啊,這時候你和軟體開發雙方該如何面對彼此?是不是非常尷尬?因為錯誤確實是在你的程式碼中發生的,但是確實是在他的程式裡才會發生這種問題,你自己本地執行就不會發生這種問題,這下你們兩個人就扯不清了!會嚴重拖慢測試進度和開發進度,而這樣的問題會在你短暫的職業生涯中瘋狂地折磨你的精神,直到永遠,因為和演演算法對接的那個軟體開發大概率也不會關心演演算法是怎麼寫的,他在乎他自己(悲。

  3. 版本控制:通過提供動態連結庫,您可以更輕鬆地進行版本控制。如果您對演演算法進行了更新或修復,只需提供更新的動態連結庫即可,而不需要重新編譯依賴於該演演算法的其他程式碼。

    試想一下,你現在手上有一個演演算法Calculation1,你交到軟體A的時候是v1.0.1版本,交的是.h和.cpp檔案,你交過去之後軟體開發要對你的程式碼做好一番修改(這幾乎是必然的)之後才能順利插入到軟體中去。

    時過境遷,多年後,你的演演算法要被另一款軟體使用了,而這個軟體B的時候可能你的演演算法已經提供了非常完備的計算方法,計算的能力也獲得了巨大進步,已經是v2.14.10版本了,這個時候你再同樣的將.h和.cpp檔案插入到軟體中。

    突然,維護A軟體的同志驚奇地發現,原來Calculation1演演算法從一開始就有巨大的問題,是一直依靠記憶體溢位或者什麼莫名其妙的bug才能正常執行的。你非常驚訝,但想了一下自己應屆的水平,確實,寫出這種程式碼是人之常情。於是你瀟灑的一批把v2.14.10交給了軟體開發。

    也許是作為一名演演算法開發完全不需要遵守開閉原則或者其他設計模式(雖然我建議每一位演演算法都去看一下,這坨v2.14.10完全用不了,那邊需求又來得很急,最終你和開發爭不過只能重寫Calculation1,你越看這個程式碼越生氣,自己當年怎麼就寫出坨這麼個東西,看了半天,決定重寫。但是甲方的催促已經駕到你的脖子上了,你只能在喪鐘一般的微信報警中熬夜通宵重寫完這個演演算法,裝上軟體一編譯,滿螢幕的依賴錯誤,輸出的結果不符合預期,輸入經常會報錯。你扶額看著這一攤究極爛攤子。天亮的時候必須給甲方一個答覆,而你的答覆是...

  4. 跨語言相容性:動態連結庫可以被多種程式語言呼叫和使用。通過提供動態連結庫,您可以使演演算法在不同的程式語言和平臺上可用和可呼叫。

    事實上,我們希望所有的演演算法都提供統一C介面的動態連結庫。因為我們都知道演演算法是確定的,而語言是不確定的。什麼意思呢?就是這個專案部會經歷很多東西,也許他會從C#到Qt,再從Qt到C#,再到GO,再到VB,再到Rust,再到Ruby,甚至到前端,到什麼亂七八糟的C++ 114514版本,規範和當年的完全不同了————

    但是呢?哪怕是核彈轟炸了東京,你的動態連結庫從點雲中解算出淨空的演演算法仍然是正確的。如果我們說TSD這個軟體是一坨屎,那麼點雲解算演演算法就是這坨屎聖代上的神聖櫻桃,值得永遠傳承下去,而不是瘋狂地重寫迭代。

它就永遠存在 懂我的意思嗎,就算是公司炸了,公司重建了,公司上市了,公司退市了,世界崩塌了,世界重啟了,我死了,我出生了,我懷孕了,我墮胎了,我又出生了,如果你寫的是C介面的動態連結庫,那麼它就永遠存在.

所以為了大家的心裡更健康一點,請寫類C介面,哪怕是COM元件呢?

看完以上四點,想必你已經明白為什麼要把程式碼封裝成動態連結庫了吧?

這既是為了你好,也是為了那個軟體開發好。當然瞭如果你從入職開始就考慮好什麼時候跑路,請聯絡我