大部分主流編程語言都誕生於上個世紀,代碼包的分發範圍在當時僅限於小規模的團體,例如公司內部或者單個軟件項目內部,這種分發規模 只要內部有良好的代碼約定就不會致使模塊依賴衝突,但今天咱們已經普遍運用github社區來分發軟件代碼包,分發的規模已經跨越國界跟種族以及不一樣的語言,這在當時是沒法想象的。python
例如現現在依然很是流行的C語言,就存在經典的函數命名衝突的問題,在小規模團體內部能夠經過約定函數命名前綴來避免編譯時的衝突。C++在後續引入了命名空間解決了這一問題git
C++編譯器版本衆多,又有不少公司或者團體採用二進制閉源發佈代碼,又致使了二進制ABI依賴問題, 在今天你依舊能夠看到golang swift這些新興的編譯型的語言都是依賴源碼編譯的,由於它們大多各自語言的各個版本之間的並非二進制兼容的,例如X86 就有fastcall stdcall 等等函數調用約定,以前我翻了一下golang的內部實現,發現go語言在內部又搞了本身一套匯編調用約定,在go使用標準的C函數庫的時候還須要作一些轉換。github
動態語言天生就有的毛病,全部的調用都是在運行時才能確認被調用的模塊的位置以及代碼,由於在動態語言中,並不像C/C++那樣在編譯期有大量的靜態檢查,固然你要是喜歡用C/C++的void * ,上帝也無法拯救你。golang
例如 aa.bb.cc 這種版本號,cc表明bugfix的版本,
大多時候出現這種依賴衝突,人工仲裁選擇使用高版本便可,而bb表明大的改動,可能存在接口不兼容的狀況,
這個時候就要對依賴進行代碼檢查,確保Java動態連接調用沒有問題才能上線使用。
固然不少公司內部的包並不存在版本語義化管理的規範,這個時候你只能祈求上帝,編寫你依賴模塊的那個老哥,沒有修改外部接口編程
在微服務下,以我我的的觀察,大部分公司的微服務接口,可能只採用了簡單的人肉管理,並且微服務大多都是跨部門維護接口的狀況,這個時候若是溝通不順暢,更容易出現問題。固然跨服務的RPC調用大多都是熱點代碼,若是出現問題,大多很容易被暴露出來。swift