剖析公司技術棧

Java團長_發表於2018-11-21

640

來源:www.cnblogs.com/wangsen/p/9329735.html

目的

主要是想從自己的角度剖析一下公司使用的一些技術棧都有哪些,都解決了哪些問題,以及幾十人團隊的日常和專案管理的方式方法。不是說他比別的團隊優秀,只是我自己想記錄一下做到心中有一個全貌,如果能給你們一點啟發我會更高興,部落格沒有太多的具體實現,只會說些問題的解決方案。


銘記

不以解決實際問題引入的技術都耍流氓,下面我們就來看看都有哪些技術棧。


前端技術棧

1. 使用css3作為頁面的樣式控制

解決頁面的渲染問題

2. 使用Html5作為頁面結構的標籤語言

解決移動端的頁面相容性問題

3. 使用seajs框架

來解決專案中模組化開發和載入的問題

4. 使用Jquery前端js框架

解決方便操作頁面元素的問題

5. 引用流行的前端外掛實現業務需求

  • 使用bootstrapValidator作為表單的驗證外掛

  • 使用bootstrap進行頁面的佈局

  • 使用layer作為彈窗外掛

  • 使用jQuery cxSelect 實現下拉選單的多級聯動

  • 使用bootstrap fileinput完成多檔案的上傳

  • 使用icheck完成對多選框的美化

  • 使用百度ueditor解決複雜內容編輯場景

6. 自定義業務外掛抽取

主要是解決系統中匯出使用的功能程式碼重複性問題。

  • 收藏功能

  • 點贊功能

  • 評論功能

  • 留言功能

  • 關注功能

  • 頁面多處個人資訊的設定

  • 頁面多處商品頁面調起支付的功能

  • 題庫的組卷系統中的試題欄



後端技術棧

1. 專案分層思想實現分散式架構

core層:與業務無關,提供基礎的能力,比如:資料庫持久,redis快取,http封裝,通用工具。

統一的core專案,提供基礎的能力

  • we-core-Db專案:mybatis的mapper的基礎上做了二次封裝

  • we-core-redis專案:基於jedis的基礎上做了二次封裝

  • we-core-web
    存放一些與web環境下使用的工具類和處理器
    自定義web環境裡使用的aop註解
    統一的異常處理器
    自定義分頁標籤的


base層:該層中的專案有且只能代表一個真實存在而且能獨立存在的核心實體對應的業務。

business層:業務層,解決多端,多專案公用的業務流程

web層:為網際網路使用者提供對外服務,在這層的每一個專案都有自己不被共享的業務。

2. 抽取獨立服務實現服務共享

  • 好多專案都會使用到很多相同的服務,我們會把它抽取成獨立的專案,先以jar包的方式提供公用。

  • 比如:簡訊服務,郵件服務,字典服務,收藏服務,關注服務,訂單服務,支付服務
    640

3. 基於jedis的基礎上做了二次封裝,實現java對redis的讀寫

應用場景:

  • 整個專案使用統一的id生成策略

  • 使用快取進行存放freemark程式碼片段的內容,解決高頻查詢資料給伺服器帶來的壓力

4. 使用maven進行專案的管理

  • 使用maven自定義骨架可以實現公司內部建立專案模板化,減少大家建立專案時的時間,建立完就能使用

  • 使用maven的聚合的特性實現多專案統一進行構建

  • 使用maven繼承的特性實現同一專案的不同maven工程的相同配置問題

  • 使用maven的屬性我們可以使用自定義變數以及訪問其他配置項值解決我們配置重複的問題

  • 使用maven幫助我們規範工程資源的的存放

  • 使用maven的依賴特性可以解決我們,jar包之間的依賴,排出依賴。

  • 使用maven倉庫的http代理可以實現讓maven幫助我們查詢,下載所需的jar包,我們只需要指定依賴的gav

  • 使用maven我們把公司自己的開發的專案釋出到nexus上供其他的專案使用

5. 使用nexus進行內網私服搭建

  • 解決jar包重複下載的問題

  • 解決公司內部專案共享的問題

  • maven倉庫以外的jar包管理

6. 使用gitlab進行專案的版本管理

  • 解決團隊多人協同開發專案的問題,我們團隊制定了使用git開發的規範流程。

7. 使用jenkins/hudson實現專案的自動化部署

  • 解決專案自動化構建,釋出,回滾等問題

  • 定時構建及時發現專案中的問題

  • 實現一鍵釋出縮短髮布的時間
    自動構建和釋出的大致流程:

  • 從gitlab上拉取最新的程式碼

  • 使用maven進行構建專案

  • 將構建完成的專案使用scp複製到指定伺服器中

  • 並通過遠端呼叫指定伺服器的指令碼進行專案的釋出

8. 使用mysql進行資料儲存

  • 這個不用多解釋。

9. 使用Spring+SpringMvc+Mybitas

  • 使用經典的ssm作為平臺的MVC框架, 處理http請求,處理業務邏輯,訪問資料庫。

10. 使用hibernateValidator

  • 實現後端接收到的引數進行引數的合法性驗證,像非空,最小,最大,範圍等

11. 使用spring mvc的攔截器

  • 實現專案內的許可權控制,比如:sso許可權驗證,角色的驗證,支付的驗證等

12. 使用spring mvc的AOP

  • 實現多處相同程式碼抽取出來使用AOP的方式進行公用,比如:json檢視的固定格式返回

13. 使用logback

  • 作為架構的日誌框架

14. 使用flying-saucer+itext+freemark

  • 解決專案中pdf的應用場景,比如:學生下載的准考證,測試報告等。

15. 使用JavaMail技術

  • 實現郵件的傳送服務

16. 使用TestNg+H2

  • 實現進行單元化測試,保證程式碼質量

17. 使用Cookie+Redis

  • 實現平臺的單點登入

18. 實現SpringMvc提供的HandlerExceptionResolver介面

  • 使用spring提供HandlerExceptionResolver實現全站統一異常處理
    包括:業務異常,登入超時異常,其他異常。

19. 實現SpringMvc提供的ServletContextAware介面

可以實現專案啟動時新增一些操作。

  • 初始化freemarker的配置

  • 初始化專案全域性共享的靜態變數(域名,檔案儲存目錄等)

20. 使用Quartz

  • 實現定時任務的處理

21. 使用網路爬蟲技術Jsoup

  • 解決爬取其他網站的資料資訊問題

22. 使用Qdcode

  • 解決生成二維碼的功能

23. 使用jsp的自定義標籤

  • 解決全站分頁的實現

24. 使用阿里的Druid

  • 作為連線資料庫的連線池

25. 使用spring的Ioc容器解決物件的依賴注入

  • 使用Ioc實現指定特定介面的實現類以應對業務實現的變化

  • 使用ioc實現業務中需要的配置注入,防止引數值寫死

26. 使用CXF或者Axis

  • 實現通過WebService和第三方進行對接

27. 結合自定義註解+反射

  • 實現對方法訪問的控制以及新增額外業務邏輯

  • 比如:個人資訊在多個請求Controller中都需要填充

28. 使用Mybatis框架

  • 解決資料持久化的問題

  • 引入開源的:Mybatis的Mapper介面的方式實現支援單表的curd,避免寫更多的重複程式碼

  • 引入pagehelper解決mybatis的分頁問題

  • 使用Mybatis的Interceptor實現sql的列印功能

29. 使用Jsp,Freemark

  • 作為檢視層的處理技術

30. 使用Freemark+字串替換實現自定義vt標籤

  • 自定義檢視標籤主要為了解決像字典那種欄位不斷需要跨表查詢的問題。

31. 自定義json檢視

  • 自定義json檢視是為了實現規定json返回的統一格式。

32. 使用El表示式和jstl標籤庫

  • 解決訪問model中的資料以及頁面上顯示的邏輯處理

33. 使用自定義註解實現某些功能的標註

  • 在處理json返回值的時候可以在標註一下@Void就表示不需要包裹

  • 在sso攔截許可權的時候可以標註一下方法是否需要攔截

  • 在多個Controller裡都需要設定使用者資訊到頁面的時候,我們可以利用Aop+Annotation的方式實現



伺服器環境

  • 內網測試環境與線上執行環境統一更多保證上線成功
    系統版本
    軟體版本
    使用指令碼一件安裝

  • 使用nginx做代理服務
    實現動靜分離
    實現ip訪問的限制
    根據http的請求資訊實現轉發其他請求

  • 使用redis做業務快取

  • 使用tomcat做web容器

  • 使用JDK8作為jdk版本

  • 使用mysql作為資料庫

  • 使用mount的方式做靜態資源的掛載



團隊管理篇

管理的理念:倡導自主管理,學習,進步,開放,分享

1. 推行java開發規範統一團隊編碼風格

解決人員流動帶來的業務梳理的難度,提升同志們的編碼水平,做一個有追求coder,大致包括以下幾個部分:

  • 專案命名規範

  • 專案產出標準化規範

  • 開發規範

  • 前後端介面規範

  • java編碼規範

  • url定義規範

2. 推行資料庫操作規範,保證資料庫的整潔

  • 禁用儲存過程

  • 命名規範

  • 欄位型別

  • 每次由於業務的變化需要升級sql語句,需要儲存記錄,在內網測試完成才可以線上執行

3. 使用Workdtile作為團隊的專案,任務管理工具

  • 專案的資料,產出,會議,重要的時間節點,分享都放在這上面

  • 可以讓專案組成員更加註重自己的時間管理,任務管理,提高計劃的能力

  • 會培訓如何寫計劃,寫計劃是否可行,是否有問題都會有兄弟們給你指出

4. 搭建內網wiki讓團隊的各種產出都固化起來

解決團隊文件多人編輯,以及知識的固化。

大概的目錄:

640

5. 進行結對程式設計

  • 有新人補充為了快速上手業務和熟悉技術架構,採用老人帶新人進行一對一的結對程式設計,既可以讓新人快速融進這個團隊,也可以讓老人對自己的知識再一次進行加深和固化。

6. 提倡和要求讀書

  • 團隊新人會推薦一波入夥必讀書籍: 

640

  • 要求每天早上留出時間去讀書,並每週安排人做每週一書的分享

7. 編碼習慣要求

上午要求對自己要做的事情進行詳細規劃,並寫出具體的實施步驟寫到xmind上,和別人進行溝通驗證自己的思路是否正確,下午進行編碼實現。

8. 專案一週定期至少兩天進行成果演示

  • 對於做的快和好的同學進行鼓勵,刷存在感

  • 對於做的慢的同學,幫助他解決問題,找出原因,指定擅長的人進行解決

  • 對於整個產品而言可以及時驗證是否符合業務的需求,對完整性進行要求

9. 專案開發週期內對專案的主要成員進行相互的CodeReview

  • 根據團隊的開發規範去驗證編碼是否存在問題
    既可以熟悉規範,也可以起到大家編碼行為一致。

  • 傳遞好的編碼習慣和風格

  • 討論和驗證業務的編碼實現是否正確和合理

10. 每日工作計劃

  • 說清楚今天要做什麼,預計達到什麼目的

  • 有沒有遇到什麼困難,需要誰的幫助

  • 有沒有個人的原因的潛在風險

  • 是否需要協調資源
    這個是我們具體的實施方案:每日工作計劃



軟體構建篇(專案管理)

這裡的軟體構建指的是做專案的整個流程和步驟,這是我們一起總結出來的。

1. 專案立項

  • 保證專案的難度係數在可控範圍內。

  • 確定專案的量級能夠符合實際的專案週期。

  • 確定專案的週期(起止點)。

  • 確定專案需求的終稿,明確做的業務邊界。

  • 準備資源做專案(人)。

  • 建立worktile專案。

  • 將專案資源進行歸放到專案標準文件產出。

  • 做出讓需求方認可的project。

  • 召開專案立項會議。

2. 需求分析

  • 讓產品講解專案資訊以及原型,瞭解專案背景,這個專案要解決的是什麼問題

  • 根據專案原型梳理出系統的流程圖

  • 拿著流程圖和產品進行講述,確認流程理解一致

  • 抽取專案中包含領域知識的名詞列表,使用一句話能夠描述清楚

  • 與產品進行溝通,將自己的描述和產品進行check,保證描述的是正確的

  • 抽取專案的用例,寫到worktile專案中,確保能夠覆蓋全部需求

  • 將用例進行分配人,標時間,拆用例,排順序以便嚴格按照用例進行開發。

  • 具有複雜的業務,演算法的用例和產品進行確認,保證用例描述了產品的需求

3. 系統設計

  • 對名詞列表進行去重,合併,歸類處理,為抽取類圖作準備。

  • 根據上一步處理後的名詞列表畫出系統的類圖(類,屬性,註釋)。

  • 根據產品原型驗證原型中出現的名詞是否都已經覆蓋(查漏補缺)。

  • 根據產品原型中的需求,流程確定類與類之間的關係,畫出類的關係圖。

  • 根據產品的需求分析,抽取出物件的方法和虛擬碼。【暫時掛起】

  • 對複雜的業務進行系統設計。

  • 基於專案的分層對系統的服務進行劃分部署。

  • 根據產品原型中跳轉的頁面,對URL進行規劃,出一份完整的URL列表。

4. 產品研發

  • 根據分層服務部署圖建立base,bussiness,web層eclipse專案。

  • 建立base,bussiness,web層中對應的實體,註釋,service。

  • 建立資料庫,使用建表的程式生成資料庫表格。

  • 配置nginx,配置host,配置jetty保證能夠使用域名訪問成功。

  • 根據編碼規範參照URL列表將專案中對應的物理檔案建立出來。

  • 參照專案用例的實現步驟使用程式語言翻譯成程式碼敲出來。

  • 每天對編寫的程式碼進行codeReview,保證程式碼符合規範。

  • 在本地進行充分的自測,保證每一個用例是完整正確的。

  • 每天定點進行團隊內部演示已經開發完的用例,記錄發現的問題,保證用例完整

5. 產品測試

  • 合併程式碼到master上。

  • 新增專案到自動化整合專案中去。

  • 同步一份外網全新的資料到內網資料庫中,保證和線上的資料環境一致。

  • 在內網資料庫裡執行sql的升級日誌。

  • 修改內網伺服器配置(nginx,tomcat等)。

  • 通知業務,需求方進行專案的內網測試,並修改他們發現的bug。

  • 測試業務的流程(只關注流程),修改測出的bug。

  • 根據專案的用例測試每一個功能,修改測出的bug。

  • 測試頁面的相容,互動,樣式等,修改測出的bug。

  • 沒有影響使用者使用的重大bug前提下,並且業務,需求方認可就可以釋出上線。

  • 解析域名到代理伺服器上。

  • 重複執行4-9的步驟

  • 得到需求和業務方的肯定(交付)之後,並且系統穩定執行一段時間之後,專案宣佈結項。

6. 專案總結

  • 按照專案的標準產出補齊缺失的的文件。

  • 每一個人使用xmind列出在這個專案中的收穫。

  • 專案負責人組織大家一起討論每個人的收穫列表,整理出可以補充完善團隊流程和技術的列表。

  • 根據上一步的列表,安排上人,排上時間進行固化,總結,在團隊內進行推廣。

  • 每一個人使用xmind列出你在做的過程中耗時長,複雜度高,重複性高的地方。

  • 專案負責人組織大家一起整理出是由團隊的機制,流程,技術等不足導致的問題列表。

  • 根據上一步的列表,為每一個問題安排上負責人以專案的方式解決這個問題。

  • 邀產品(需求方)演示專案的主要用例和主流程,確認無誤後方可進行內測階段。



團隊使用工具

1. 使用Eclipse和Idea

作為團隊開發的IDE,前期使用的Eclipse作為團隊的IDE,後期為了解決eclipse執行慢和不斷出現的異常,也為了迎合潮流決定轉投Idea,不管是什麼IDE我們都強調統一:

  • 統一的版本

  • 統一個外掛配置

  • 統一的特性設定
    字型
    提示
    程式碼模板
    ......

  • 必須要掌握的快捷鍵,全隊都得熟悉

2. 使用花生殼或者ngrok

實現內網穿透技術,解決微信支付或者介面的除錯工作。

3. 推薦團隊使用的其他工具

  • 使用xmind作為思維導圖工具

  • 使用Everything作為檔案的搜尋文具

  • 使用為知筆記作為知識管理工具

  • 使用Notepad++作為高階編輯器

  • 使用Postman作為後臺介面測試工具

  • 使用SecureCRT作為連線linux伺服器的工具

  • 使用navicat作為連線資料庫的客戶端工具

  • 使用jetty作為web開發的容器

  • 使用SourceTree作為Git客戶端管理工具

  • 使用Powerdesigner作為建模工具

  • 使用Visio作為流程圖製作工具

  • 使用lantern作為vpn工具

  • 使用Teamviews作為電腦遠端控制的工具

  • 使用jd-gui作為java反編譯的工具

  • 使用ffmpeg作為視訊處理的工具

  • 使用Snipaste作為截圖工具

  • 使用螢幕錄影專家作為錄屏工具

PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉發。

(完)

640?

Java團長

專注於Java乾貨分享

640

掃描上方二維碼獲取更多Java乾貨

相關文章