目的
主要是想從自己的角度剖析一下公司使用的一些技術棧都有哪些,都解決了哪些問題,
以及幾十人團隊的日常和項目管理的方式方法。不是說他比別的團隊優秀,只是我自己想記錄一下做到心中有一個全貌,
如果能給你們一點啟發我會更高興,博客沒有太多的具體實現,只會說些問題的解決方案。
銘記
不以解決實際問題引入的技術都耍流氓,下面我們就來看看都有哪些技術棧。
前端技術棧
使用css3作為頁面的樣式控制
解決頁面的渲染問題
使用Html5作為頁面結構的標簽語言
解決移動端的頁面兼容性問題
使用seajs框架
來解決項目中模塊化開發和加載的問題
使用Jquery前端js框架
解決方便操作頁面元素的問題
引用流行的前端插件實現業務需求
- 使用bootstrapValidator作為表單的驗證插件
- 使用bootstrap進行頁面的布局
- 使用layer作為彈窗插件
- 使用jQuery cxSelect 實現下拉列表的多級聯動
- 使用bootstrap fileinput完成多文件的上傳
- 使用icheck完成對多選框的美化
- 使用百度ueditor解決復雜內容編輯場景
自定義業務插件抽取
主要是解決系統中導出使用的功能代碼重復性問題。
- 收藏功能
- 點贊功能
- 評論功能
- 留言功能
- 關注功能
- 頁面多處個人信息的設置
- 頁面多處商品頁面調起支付的功能
- 題庫的組卷系統中的試題欄
后端技術棧
項目分層思想實現分布式架構
core層:
與業務無關,提供基礎的能力,比如:數據庫持久,redis緩存,http封裝,通用工具。
統一的core項目,提供基礎的能力
- we-core-Db項目:mybatis的mapper的基礎上做了二次封裝
- we-core-redis項目:基於jedis的基礎上做了二次封裝
- we-core-web
存放一些與web環境下使用的工具類和處理器
自定義web環境里使用的aop注解
統一的異常處理器
自定義分頁標簽的
base層:
該層中的項目有且只能代表一個真實存在而且能獨立存在的核心實體對應的業務。
business層:
業務層,解決多端,多項目公用的業務流程
web層:
為互聯網用戶提供對外服務,在這層的每一個項目都有自己不被共享的業務
更多細節可以訪問另外一篇博客:公司分層思想的演化歷程
抽取獨立服務實現服務共享
- 好多項目都會使用到很多相同的服務,我們會把它抽取成獨立的項目,先以jar包的方式提供公用。
- 比如:短信服務,郵件服務,字典服務,收藏服務,關注服務,訂單服務,支付服務
基於jedis的基礎上做了二次封裝,實現java對redis的讀寫
應用場景:
- 整個項目使用統一的id生成策略
- 使用緩存進行存放freemark代碼片段的內容,解決高頻查詢數據給服務器帶來的壓力
使用maven進行項目的管理
- 使用maven自定義骨架可以實現公司內部創建項目模板化,減少大家創建項目時的時間,創建完就能使用
- 使用maven的聚合的特性實現多項目統一進行構建
- 使用maven繼承的特性實現同一項目的不同maven工程的相同配置問題
- 使用maven的屬性我們可以使用自定義變量以及訪問其他配置項值解決我們配置重復的問題
- 使用maven幫助我們規范工程資源的的存放
- 使用maven的依賴特性可以解決我們,jar包之間的依賴,排出依賴。
- 使用maven倉庫的http代理可以實現讓maven幫助我們查找,下載所需的jar包,我們只需要指定依賴的gav
- 使用maven我們把公司自己的開發的項目發布到nexus上供其他的項目使用
使用nexus進行內網私服搭建
- 解決jar包重復下載的問題
- 解決公司內部項目共享的問題
- maven倉庫以外的jar包管理
使用gitlab進行項目的版本管理
- 解決團隊多人協同開發項目的問題
我們團隊制定了使用git開發的規范流程:git分支在團隊中的使用
使用jenkins/hudson實現項目的自動化部署
- 解決項目自動化構建,發布,回滾等問題
- 定時構建及時發現項目中的問題
- 實現一鍵發布縮短發布的時間
自動構建和發布的大致流程: - 從gitlab上拉取最新的代碼
- 使用maven進行構建項目
- 將構建完成的項目使用scp復制到指定服務器中
- 並通過遠程調用指定服務器的腳本進行項目的發布
使用mysql進行數據存儲
- 這個不用多解釋。
使用Spring+SpringMvc+Mybitas
- 使用經典的ssm作為平台的MVC框架, 處理http請求,處理業務邏輯,訪問數據庫。
使用hibernateValidator
- 實現后端接收到的參數進行參數的合法性驗證,像非空,最小,最大,范圍等
使用spring mvc的攔截器
- 實現項目內的權限控制,比如:sso權限驗證,角色的驗證,支付的驗證等
使用spring mvc的AOP
- 實現多處相同代碼抽取出來使用AOP的方式進行公用,比如:json視圖的固定格式返回
使用logback
- 作為架構的日志框架
使用flying-saucer+itext+freemark
- 解決項目中pdf的應用場景,比如:學生下載的准考證,測試報告等。
具體可以參考java生成pdf
使用JavaMail技術
- 實現郵件的發送服務
使用TestNg+H2
- 實現進行單元化測試,保證代碼質量
使用Cookie+Redis
- 實現平台的單點登錄
實現SpringMvc提供的HandlerExceptionResolver接口
- 使用spring提供HandlerExceptionResolver實現全站統一異常處理
包括:業務異常,登錄超時異常,其他異常。
實現SpringMvc提供的ServletContextAware接口,
可以實現項目啟動時添加一些操作。
- 初始化freemarker的配置
- 初始化項目全局共享的靜態變量(域名,文件存儲目錄等)
使用Quartz
- 實現定時任務的處理
使用網絡爬蟲技術Jsoup
- 解決爬取其他網站的數據信息問題
使用Qdcode
- 解決生成二維碼的功能
使用jsp的自定義標簽
- 解決全站分頁的實現
使用阿里的Druid
- 作為連接數據庫的連接池
使用spring的Ioc容器解決對象的依賴注入
- 使用Ioc實現指定特定接口的實現類以應對業務實現的變化
- 使用ioc實現業務中需要的配置注入,防止參數值寫死
使用CXF或者Axis
- 實現通過WebService和第三方進行對接
- 有關webService的自己總結的博客:
- 根據wsdl生成服務端代碼
結合自定義注解+反射
- 實現對方法訪問的控制以及添加額外業務邏輯
- 比如:個人信息在多個請求Controller中都需要填充
使用Mybatis框架
- 解決數據持久化的問題
- 引入開源的:Mybatis的Mapper接口的方式實現支持單表的curd,避免寫更多的重復代碼
- 引入pagehelper解決mybatis的分頁問題
- 使用Mybatis的Interceptor實現sql的打印功能
使用Jsp,Freemark
- 作為視圖層的處理技術
使用Freemark+字符串替換實現自定義vt標簽
- 自定義視圖標簽主要為了解決像字典那種字段不斷需要跨表查詢的問題。
- 團隊自定義的視圖標簽的具體實現可以參考:
- 自定義視圖標簽
自定義json視圖
- 自定義json視圖是為了實現規定json返回的統一格式,具體實現參考:
- 自定義spring mvc的json視圖
使用El表達式和jstl標簽庫
- 解決訪問model中的數據以及頁面上顯示的邏輯處理
使用自定義注解實現某些功能的標注
- 在處理json返回值的時候可以在標注一下@Void就表示不需要包裹
- 在sso攔截權限的時候可以標注一下方法是否需要攔截
- 在多個Controller里都需要設置用戶信息到頁面的時候,
我們可以利用Aop+Annotation的方式實現
服務器環境
- 內網測試環境與線上運行環境統一更多保證上線成功
系統版本
軟件版本
使用腳本一件安裝 - 使用nginx做代理服務
實現動靜分離
實現ip訪問的限制
根據http的請求信息實現轉發其他請求 - 使用redis做業務緩存
- 使用tomcat做web容器
- 使用JDK8作為jdk版本
- 使用mysql作為數據庫
- 使用mount的方式做靜態資源的掛載
團隊管理篇
管理的理念:倡導自主管理,學習,進步,開放,分享
推行java開發規范統一團隊編碼風格
- 解決人員流動帶來的業務梳理的難度
- 提升同志們的編碼水平,做一個有追求coder
大致包括一下幾個部分: - 項目命名規范
- 項目產出標准化規范
- 開發規范
- 前后端接口規范
- java編碼規范
- url定義規范
可以參考如何定義好一個符合規范的url
推行數據庫操作規范,保證數據庫的整潔
- 禁用存儲過程
- 命名規范
- 字段類型
- 每次由於業務的變化需要升級sql語句,需要保存記錄,在內網測試完成才可以線上執行
使用Workdtile作為團隊的項目,任務管理工具
- 項目的資料,產出,會議,重要的時間節點,分享都放在這上面
- 可以讓項目組成員更加注重自己的時間管理,任務管理,提高計划的能力
- 會培訓如何寫計划,寫計划是否可行,是否有問題都會有兄弟們給你指出
搭建內網wiki讓團隊的各種產出都固化起來
解決團隊文檔多人編輯,以及知識的固化。
大概的目錄:
進行結對編程
- 有新人補充為了快速上手業務和熟悉技術架構,采用老人帶新人進行一對一的結對編程,
既可以讓新人快速融進這個團隊,也可以讓老人對自己的知識再一次進行加深和固化。
提倡和要求讀書
- 團隊新人會推薦一波入伙必讀書籍:
- 要求每天早上留出時間去讀書,並每周安排人做每周一書的分享
編碼習慣要求
上午要求對自己要做的事情進行詳細規划,並寫出具體的實施步驟寫到xmind上,
和別人進行溝通驗證自己的思路是否正確,下午進行編碼實現。
項目一周定期至少兩天進行成果演示,
- 對於做的快和好的同學進行鼓勵,刷存在感
- 對於做的慢的同學,幫助他解決問題,找出原因,指定擅長的人進行解決
- 對於整個產品而言可以及時驗證是否符合業務的需求,對完整性進行要求
項目開發周期內對項目的主要成員進行相互的CodeReview
- 根據團隊的開發規范去驗證編碼是否存在問題
既可以熟悉規范,也可以起到大家編碼行為一致。 - 傳遞好的編碼習慣和風格
- 討論和驗證業務的編碼實現是否正確和合理
每日工作計划
- 說清楚今天要做什么,預計達到什么目的
- 有沒有遇到什么困難,需要誰的幫助
- 有沒有個人的原因的潛在風險
- 是否需要協調資源
這個是我們具體的實施方案:每日工作計划
軟件構建篇(項目管理)
這里的軟件構建指的是做項目的整個流程和步驟,這是我們一起總結出來的。
項目立項
- 保證項目的難度系數在可控范圍內。
- 確定項目的量級能夠符合實際的項目周期。
- 確定項目的周期(起止點)。
- 確定項目需求的終稿,明確做的業務邊界。
- 准備資源做項目(人)。
- 創建worktile項目。
- 將項目資源進行歸放到項目標准文檔產出。
- 做出讓需求方認可的project。
- 召開項目立項會議。
可以參考一下:確定產品可執行性
需求分析
- 讓產品講解項目信息以及原型,了解項目背景,這個項目要解決的是什么問題
- 根據項目原型梳理出系統的流程圖
根據產品原型如何抽取主流程 - 拿着流程圖和產品進行講述,確認流程理解一致
- 抽取項目中包含領域知識的名詞列表,使用一句話能夠描述清楚
- 與產品進行溝通,將自己的描述和產品進行check,保證描述的是正確的
- 抽取項目的用例,寫到worktile項目中,確保能夠覆蓋全部需求
- 將用例進行分配人,標時間,拆用例,排順序以便嚴格按照用例進行開發。
- 具有復雜的業務,算法的用例和產品進行確認,保證用例描述了產品的需求
可以參考:
使用用例覆蓋需求和指導代碼實現
詳細需求分析的節奏
系統設計
- 對名詞列表進行去重,合並,歸類處理,為抽取類圖作准備。
使用面向對象抽取領域名詞 - 根據上一步處理后的名詞列表畫出系統的類圖(類,屬性,注釋)。
- 根據產品原型驗證原型中出現的名詞是否都已經覆蓋(查漏補缺)。
- 根據產品原型中的需求,流程確定類與類之間的關系,畫出類的關系圖。
根據產品原型結合主流程抽取類,屬性以及關系 - 根據產品的需求分析,抽取出對象的方法和偽代碼。【暫時掛起】
- 對復雜的業務進行系統設計。
- 基於項目的分層對系統的服務進行划分部署。
- 根據產品原型中跳轉的頁面,對URL進行規划,出一份完整的URL列表。
產品研發
- 根據分層服務部署圖創建base,bussiness,web層eclipse項目。
- 創建base,bussiness,web層中對應的實體,注釋,service。
- 創建數據庫,使用建表的程序生成數據庫表格。
- 配置nginx,配置host,配置jetty保證能夠使用域名訪問成功。
- 根據編碼規范參照URL列表將項目中對應的物理文件創建出來。
- 參照項目用例的實現步驟使用編程語言翻譯成代碼敲出來。
- 每天對編寫的代碼進行codeReview,保證代碼符合規范。
- 在本地進行充分的自測,保證每一個用例是完整正確的。
- 每天定點進行團隊內部演示已經開發完的用例,記錄發現的問題,保證用例完整
產品測試
- 合並代碼到master上。
- 添加項目到自動化集成項目中去。
- 同步一份外網全新的數據到內網數據庫中,保證和線上的數據環境一致。
- 在內網數據庫里執行sql的升級日志。
- 修改內網服務器配置(nginx,tomcat等)。
- 通知業務,需求方進行項目的內網測試,並修改他們發現的bug。
- 測試業務的流程(只關注流程),修改測出的bug。
- 根據項目的用例測試每一個功能,修改測出的bug。
- 測試頁面的兼容,交互,樣式等,修改測出的bug。
- 沒有影響用戶使用的重大bug前提下,並且業務,需求方認可就可以發布上線。
- 解析域名到代理服務器上。
- 重復執行4-9的步驟
- 得到需求和業務方的肯定(交付)之后,並且系統穩定運行一段時間之后,項目宣布結項。
項目總結
- 按照項目的標准產出補齊缺失的的文檔。
- 每一個人使用xmind列出在這個項目中的收獲。
- 項目負責人組織大家一起討論每個人的收獲列表,整理出可以補充完善團隊流程和技術的列表。
- 根據上一步的列表,安排上人,排上時間進行固化,總結,在團隊內進行推廣。
- 每一個人使用xmind列出你在做的過程中耗時長,復雜度高,重復性高的地方。
- 項目負責人組織大家一起整理出是由團隊的機制,流程,技術等不足導致的問題列表。
- 根據上一步的列表,為每一個問題安排上負責人以項目的方式解決這個問題。
- 邀產品(需求方)演示項目的主要用例和主流程,確認無誤后方可進行內測階段。
團隊使用工具
使用Eclipse和Idea
作為團隊開發的IDE,前期使用的Eclipse作為團隊的IDE,后期為了解決eclipse運行慢和不斷出現的異常,也為了迎合潮流決定轉投Idea
不管是什么IDE我們都強調統一:
- 統一的版本
- 統一個插件配置
- 統一的特性設置
字體
提示
代碼模板
。。。 - 必須要掌握的快捷鍵,全隊都得熟悉
使用花生殼或者ngrok
實現內網穿透技術,解決微信支付或者接口的調試工作,
可以看一下我的另外一篇博客:使用ngrok進行內網穿透