我們來講一個故事,一位旅行者路過一個烈日下的工地,所有人都在那兒汗流浹背地搬磚。
旅行者問第一個人在干什么,那人頭也沒抬地回答:“我在搬磚。”
旅行者問第二個人在干什么,這個匆匆抬起頭認真地說:“我在砌墻。”
旅行者問第三個人在干什么的時候,那個人臉上充滿了光彩,很自信地說:“我在蓋圣瑪利亞大教堂。”這個故事是不是像極了我們從事軟件開發工作的不同階段的不同狀態。每當聽到從程序員到架構師的書或者文章時,我們總是充滿好奇,想從其中獲取一些觀點亦或是技能點,接下來我們就詳細講講一下,如何從程序員走向架構師。
首先我們定一個基準點:架構師只是功底深厚的程序員,千萬不要成為不會寫代碼的架構師。
架構師應該是立足于技術和業務之間的中間角色或者平衡點, 在針對業務深刻理解的基礎上,針對業務中存在諸多變數,挑選適合的技術架構和技術方案。可以這樣說,一個架構師工作的好壞決定了整個開發項目的成敗。
開篇的基準點:架構師只是功底深厚的程序員;
程序員從初級、中級、高級再到架構師,是一個不斷經驗積累的過程,但是在這過程中我們常常很迷茫,不僅僅是面對技術繁雜的無力感,更重要的是因為長期埋沒于代碼世界的浩大的分工體系中,無法看清從業務到系統架構的價值鏈條,無法清楚定位自己在分工體系的位置,處理不好自身與技術、業務的關系所致。所以在程序員生涯中除了技術實力以外,其它軟實力也不容忽視。如:主動學習、積累經驗、控制注意力、超越自我。
卓越的程序員
對于一個卓越的程序員來說,編程技能毋庸置疑是很重要的。但是,除了基本的編程開發能力,其他方面的能力也是體現一個程序員的能力的很重要因素。比如,問題排查能力、線上運維能力、項目管理能力、協調溝通能力等。
我們先看IT市場對于一個不同階段的程序員的要求:
初級開發工程師
職位要求
綜述:主動性,積極主動,能夠主動了解相關業務需求,在上級的領導和監督下定期完成量化的工作要求;
項目管理:不需要項目管理的能力,具備管理簡單模塊開發任務的時間點。
-
開發語言技能及架構能力:
- 能獨立處理和解決所負責的任務;
- 根據開發進度和任務分配,完成相應模塊軟件的設計、開發、編程任務;
- 進行程序單元、功能的測試,查出軟件存在的缺陷并保證其質量;
業務理解:根據產品需求PRD理解簡單模塊的業務流程,根據業務流程書寫相應的開發流程,能夠根據自己的理解評估模塊開發的時間點。
影響:能影響同級開發人員,得到項目組認可。
中級開發工程師
職位要求
綜述:獨立性,根據項目具體要求、承擔開發任務,按計劃完成任務目標。
項目管理:具備有一定初級難度的項目(如鏈路較短\模塊復雜較低\風險較小\發布周期不緊)的PM的經驗和能力。
-
開發語言技能及架構能力:
- 理解產品文檔,參與需求評審、需求分析、系統設計;
- 負責確保項目的進度和質量;
- 整理和提交相關設計文檔,對負責的功能模塊有自測習慣;
- 對所負責的模塊有維護責任,有問題及時解決。
業務理解:熟悉自己負責的業務模塊,對業務模塊的流程有獨立的思考,產品設計時能給出合理有效的方案建議;
-
影響:
- 能影響項目的成員,是團隊內公認的主力成員之一;
- 加分項:有良好的分享習慣。
高級開發工程師
職位要求
綜述:自主性,獨當一面,能獨立主導和推動項目及任務,在專業領域具備輔導他人的能力
項目管理:具備有一定中等復雜度的項目(如鏈路較長、模塊復雜度較高、風險較大、發布周期較緊、技術驅動等)的PM經驗和能力。
-
開發語言技能及架構能力:
- 能獨立解決問題,能夠負責重要業務模塊的需求分析及設計實現。
- 熟悉設計原則,能夠在日常編碼工作中恰當使用,優化原有設計(有實例支撐);
- 熟悉編程語言、編碼規范、安全規范,具備性能意識,代碼具備高可讀性;
- 了解常用框架背后的原理。
-
業務理解:
- 熟悉自己直接負責的業務,對業務產品具有獨立溝通,完善業務需求;并識別方案的風險能力;關注自己參與項目的業務數據;
- 能夠在所負責的業務及產品上有獨立的見解,能提出合理的建議,更有效的解決業務問題;
-
影響:
- 影響項目組或產品線的成員,是項目組或產品線公認的主力人員;范圍:團隊內。
- 加分項:具備輔導他人的能力和技能,有良好的分享習慣。
根據上面的招聘需求,我們來看看作為一個開發工程師從初級到架構師,需要哪些技能和非技能的積累,下面我們就從技能和非技能來總結。
一、技術技能樹
二、業務自測
一般的研發流程
在上面職級要求中,對于初級開發工程師的要求就是得到項目組的認可,如何得到項目組的認可呢?不管哪個職級的公司成員,首先要對自己做出的事情負責,上面的流程中發現一個問題,功能開發結束提測后,測試成員進行測試的時候,發現功能不能正常運行,無法開展測試工作。這自然是不合理的,會影響測試成員對研發成員的信任、還會影響測試成員的工作積極性,信任就類似刷信用卡,當你的信用值逐次降低,其他成員就很難相信你,演化到最后就是不愿意和你合作,他們認為你是一個不靠譜的人。
當然這個問題很容易解決,只要研發這個環節中增加自測流程即可。
優化后流程
關于研發自測這個環節為什么我們開始沒有加上?這是因為,我們一般認為研發人員對自己開發的模塊進行自測,是應該的,用研發術語來講是默認的,不需要另行強調。程序猿的工作是團隊協作中的一環,和環上的所有人一樣,都應該對自己所做的工作負責,這樣對于環上的其他人才是公平的、有效的,團隊的整體效率才能提高。
為了讓研發成員能進行測試,我們還有些問題需要解決:
- 測試用例范圍問題
- 被測試環境和測試執行環境的復雜性問題
- 測試數據準備的問題
- 測試執行與集成問題
- 失敗測試用例歸屬問題
這些問題我們就不展開說了,但是業務自測是作為一個開發工程師必要的職業素養。
三、解決問題能力
解決問題能力不是天生的,自然得靠后天的經驗積累。我們工作中會遇到各種各樣的問題,比如需要去跟蹤調試產品所產生的bug,又比如說使用第三方組件所遇到的一些問題,再比如說使用一些插件或者IDE所產生的一些編譯問題。這個時候第一反應不是去別人那里尋求幫助,而是自己嘗試去看去解決問題。
當遇到阻塞性問題的時候,需要立即排查并處理。由于是線上的環境,我們在排查問題會有一定的難度,但依舊有一定的方法可尋,一般按照如下步驟進行。
日志查看
從日志中查看到報錯的信息,依據這些信息進行問題排查,比如什么時間、什么人、操作了什么、觸發了什么、產生了什么結果。
代碼檢查
在日志無法排查問題的情況下,需要通過代碼來定位。這需要對代碼有一定的熟悉程度,可以知道用戶的操作是由哪里的代碼執行的,然后對該塊代碼進行檢查。代碼檢查的時候需要著重檢查一些邏輯分支語句,同時可以借助一些工具,例如:FindBugs,Alibaba Code Guidelines等。另外,還需要關注一下觸發器之類的隱蔽代碼。
遠程調試
由于代碼是靜態的,而代碼執行是動態的。靜態代碼的檢查可能并不能檢查出問題,而需要通過線上的環境、數據一并進行檢查。這時,可以在不影響線上用戶使用的情況下,遠程斷點調試程序。
本地調試
有的系統可能并不方便進行遠程調試,那么可以嘗試把線上的全部數據(或者關鍵歷史數據)拷貝下來,在本地環境使用線上環境的數據庫,進行調試。斷點調試是比較直觀的一種檢查錯誤的方式,通過異常信息的日志,能確定到指定的代碼行,并結合線上的數據,很容易發現問題。
四、學會提問
問問題的能力是一個人的修養,學會提問是一個人成長的必經之路。尤其是軟件行業的從業者,要保持對技術的鉆研精神,不做伸手黨,問出水平,問出修養!
有禮貌
畢竟誰也沒有義務幫你解決;
問對的人
選擇相關主題的板塊,不要多次發布相同問題!
主題清晰
問了讓別人不用看描述就知道問題類型和背景,github一般都會對issue做tag標記的。
- 較差的標題:保存,老實提示系統異常。
- 較好的標題:在firefox中保存時導致系統異常的兼容性問題求解。
描述要準確
描述機器環境(os,機器配置,版本信息);描述自己的排查方向和相關現象;描述問題的觸發背景(升級了什么組件/改了什么);提供復現方法。
描述要客觀
不要加主觀判斷;
描述目標
不是中間的某個步驟step;可能你的方向偏了,實現目標根本就不需要實現這個step
想提高自己解決問題的能力,首先得學會如何提問。給自己提問或者向別人尋求幫助時。
五、總結
我們日常遇到的問題就類似打怪升級一樣,你解決的問題越多你的能力就會越強,經驗自然也會越來越豐富。但人的腦袋不可能記住所有事情,將自己遇到的問題沉淀下來對以后自己查閱也有很大的幫助,就不必每次都要去Google,自己也能夠有一個索引庫。經常自己總結,也能夠提高自己的寫作能力,以后寫文章、ppt總結提煉自然也難不倒你了,也是一舉兩得的事情。還有你以后求職面試過程中,提及自己這方面的能力的時候,也能夠為自己面試加分哦。
一個人能產生多大價值取決于他的影響力有多大,之前看到有人在我們內部論壇提問說提高影響力有什么用?你看看馬云就能知道有什么用了,他說一句話比你說上百句都管用,畢竟人家的影響力在那里。我們程序員做知識經驗的傳承,不僅能夠提高你自身的影響力,還能夠幫助你提升邏輯思維能力,因為你需要去總結提煉,你需要將問題梳理清楚,并且要將知識點描述得能夠讓別人更容易接受。你的經驗雖然是你自己的,但如果你的經驗能夠幫助到別人,那你的價值就不一樣了。
讀者福利
分享免費學習資料
針對于Java程序員,我這邊準備免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
為什么某些人會一直比你優秀,是因為他本身就很優秀還一直在持續努力變得更優秀,而你是不是還在滿足于現狀內心在竊喜!希望讀到這的您能點個小贊和關注下我,以后還會更新技術干貨,謝謝您的支持!
資料領取方式:加入Java技術交流群963944895
,點擊加入群聊,私信管理員即可免費領取