剖析公司技術棧

來源: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包的方式提供公用。
  • 比如:短信服務,郵件服務,字典服務,收藏服務,關注服務,訂單服務,支付服務

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讓團隊的各種產出都固化起來

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

大概的目錄:

5. 進行結對編程

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

6. 提倡和要求讀書

  • 團隊新人會推薦一波入夥必讀書籍:
  • 要求每天早上留出時間去讀書,並每週安排人做每週一書的分享

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作爲截圖工具
  • 使用屏幕錄像專家作爲錄屏工具
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章