有言在先
一個團隊的文化氛圍往往決定了團隊的作戰方式,發展方向。對于技術團隊工程師文化濃厚是非常容易吸引人的,當然更吸引人才。這是很多團隊都想要的,但是文化的積累是非常困難的。首先技術團隊都得做業務,業務往往會占住很多時間,精力會分散,容易疲憊。其次一些技術使用或者開發的內容往往被封鎖在一個小圈子里,想學習的人接觸不到,即使進行技術分享,也不能深入底層,往往草草了事,看似提高的技術的氛圍,其實因時間久了,慢慢也就麻木了,容易喪失技術的引力。
關于如何建立工程師文化,可以談一下我們的經驗
我們會用很多的時間來開發業務,而業務也的確是我們工作的重點,完全不能拋開業務空談技術進步,這種技術的意義其實就是紙上談兵,最佳的方式是快速學習快速實踐,允許試錯,逐步優化,其實我們發現最好的點就是如何把業務和技術結合起來,通過技術降低業務的難度,從而提高學習的時間。分享技術,讓代碼和思想都能得到升華
工具化,框架化
我們團隊內部會每天早上開站立會,除了每日說明下昨日和今日工作情況,另外還會討論收集下目前工作中的難點和最耽誤時間的工作部分。然后后面一部分工作的內容就是如何通過技術來簡化這部分工作,通過團隊討論加自我驅動,不斷思考如何創新,優化目前的業務,讓開發變得更簡單,讓人員有更多的時間去深入技術底層。
每天我們消耗很大的精力來線上查看日志,來確定生產的問題,當初程序還很簡單,只是兩臺服務器做了負載均衡,查看日志還算簡單,幾個linux命令一組合便可以輕松檢索出日志,但是隨著業務增長,服務器開始變多,項目也逐漸變成服務化,分布式化,請求不一定會分散的服務器變多,日志變多更難查找,排序等都是問題,我們現在迫不及待的需要一個日志工具,把日志各臺機器上匯總到一臺機器上,然后通過grep命令來查找我們想要的日志內容。
但是問題隨之而來就是通過grep會越來越復雜,比如日志所在的文件夾過多,日志又經過壓縮導致命令執行起來效率并不是很高,而且對于大段大段的有上下文的日志,不能很好的展示,所以我們就是建立一個索引,這樣方便我們用web展示,另外經過我們的優化結合業務場景,日志的展示效果也得到突破,基本原來查日志需要半個小時到1個小時的時間,現在基本1分鐘搞定。
另外基于這套日志系統,圍繞日志內容,我們開辟出了報警系統,統計系統。日志系統研發過程中,需要學習和研究很多的技術細節,并持續優化和改進,現在發現我們的同步日志有時候會出現不穩定的情況,索引創建的也越來越大,需要將日志計劃向比較成熟的ELK上靠攏,研究其長處,并結合我們的系統持續發揮日志系統的特長。
開發中會使用很多成熟的開源項目,我們會結合業務使用場景對其進行擴展優化,讓框架適應我們,而不是我們去適應框架。針對一些比較復雜的業務也會自己開發框架,以便簡化了業務開發流程。日志中記錄業務id,是個很普通到不能再普通的需求,但是業務需要在所有日志每一行記錄一下業務id,甚至異常堆棧的每一行都有業務id,我們擴展了logback,以便開發人員根本不在意打印的日志內容是不是帶換行符,都可以在每一行的行首自動加入業務id。
針對一些流程模塊比較復用的業務,我們開發了模塊自動組合調度框架,可以將原本需要在業務中寫死的調度關系,抽象到XML中,通過在XML中簡單配置,就可以實現節點功能的組合,并提供循環,條件判斷等簡單邏輯。
這其中很多想法,都是團隊成員在業務開發中逐步提出的,并充分利用工作間隙開發出來,目前看來這些工作反而提高工作效率,也降低了工作強度。
適時的重構
一個項目運行久了,經過業務需求的迭代,經過很多名開發人員的變更,總會產生一些讓人不太滿意的代碼,要么來源于對某些業務理解的不太深,要么來源于對一些緊急變更的后遺癥,我們在團隊內部總是強調,盡量避免湊活,追求性能極致,追求簡單美,往往遇到這種情況,我們會適時的引入重構,避免破窗效應,讓一個項目越來越雜亂。
重構其實不僅可以重新梳理下我們的業務場景,梳理我們代碼的邏輯,讓其更貼合業務,更重要的是可以讓開發人員有機會再次設計我們的系統,結合一些更好的開源項目和技術,提升團隊的技術氛圍。
每一次重構其實對于一個項目來說都是無比艱難的決定,上有新業務的需求,下有重構的使命,時間緊迫,希望得到很好的效果,壓力都會比較大。但是就是這種環境很容易鍛煉人,使人飛速成長,通力合作,團隊也會得到很好的磨練。
1.首先我們考慮先要梳理項目的痛點,重構其實更重要是解決現在的實際問題。
日志混亂:記錄的自定義格式千奇百怪,關鍵入參和返回結果打印不全,生產運維困難,不能很快的找到一個業務流程,需要在上下文中篩選。
缺少數據字典:導致每個名詞的定義各有不同,但字面意思相近,變量千奇百怪,不方便維護。
新業務添加復雜:相近的業務代碼,沒有抽象,導致新增要通過復制粘貼,然后調整差異的地方,導致開發工作量大,bug頻出。
工具類多:每個人都各自添加各自的,其他人不知如何使用。
廢棄代碼多:廢棄代碼不知道是否有用,方法寫了,看不到引用的地方,不想刪也不敢刪。
代碼由于業務的不斷改進,邏輯已經不再那么清晰。
……
2.提出更高要求,例如提高項目承載能力,應對更大業務需求。
制定明確的開發規則,例如同層之間不允許互相調用,日志的打印細則。
明確接口,SQL的含義,避免模棱兩可的情況出現,更能精確的優化。
頻繁請求的熱數據考慮加入緩存及更新機制。
合理的優化框架,讓業務代碼更加純粹。
根據上面的總結匯總設計重構方案,并制定開發計劃,白天開發,晚上review代碼,總結調整方案。引入新的技術和新的理念。新技術對于程序員來說是有很大吸引力的,化被動學習為主動學習,技術氣氛濃厚。新的理念的引入,化解了很多舊有問題,改變了舊有開發方式,讓業務代碼更簡單。最重要的代碼再次回到開發人員的掌控中。
強化的技術氛圍
其實前面介紹的工具化,框架化和實時重構,本質上其實是簡化了我們的運維成本,同時也提高了大家對技術的鉆研興趣,用學習的技術解決實際的生產問題。另外還有挺重要一點就是平時工作中多鼓勵大家鉆研技術,鼓勵刨根問題,鼓勵知識共享。鼓勵思維創新,鼓勵組建技術小組,攻克技術難點。開展黑客馬拉松,強調競爭,合理獎賞。另外在工作之外,會組織一些游戲競賽,一來放松心情緩解疲勞,一來團隊合作增加彼此了解。
經驗總結
其實工程師文化就是一種放松的,自我驅動的技術文化,在這種文化下,通過成員的自我創新,通過技術手段,降低工作強度,優化業務數據,將技術與生產的需要相結合,并做到極致,從而使人在這個環境中得到飛速成長,團隊也飛速進步。工具化,框架化強調DRY原則,避免重復,提高工作效率。實時重構避免代碼質量惡化,重新設計提升代碼品質。技術氛圍創造來良好的環境,促進工程師文化持久留存,人人受益,團隊才會受益。