不知覺做軟體開發已經有6年了,回看自己的經曆,可以說是相當有成就感,6年中通過不斷的學習的實踐,從一個菜鳥成長為一名軟體架構師,這個過程可以說充滿樂趣。通過學習各種理論、技術、方法,並有在實踐中應用,觀察它們的效果,思考它們之間的關係,再把不同事物融合在一起,形成一個完整的能力體系,以此來挑戰更艱巨的軟體開發工作單位。
我現在是一個架構師,所以看問題喜歡從總體架構出發,所以我認為人的能力也有一個架構存在,每個的能力架構都不一樣,有的人能力架構比較合理,有的人則不那麼合理,合理的能力架構能讓較少能力元素(知識、技能、方法等)發揮出較大的作用,不合理的能力架構會浪費人的能力,讓所學無所用。
什麼樣的能力結構是比較合理的呢,這不是一個簡單的問題,這裡我根據自己的經驗總結提出一個參考模型,這個參考模型採用我們常見的分層架構模式。我認為一個軟體開發人員的能力大體應該分為四個層次:
| 最高層:過程式控制制和管理 |
| 第三層:方法、思想和理論 |
| 第二層:具體技術、語言和工具 |
| 最底層:基礎原理、基礎知識 |
層以層之間存在一定的關係,上一層必須以下一層為基礎,而上一層又反過來影響下一層。最底層是基礎原理和基本技術:包括電腦原理、電路、資料結構、資料庫原理、編譯原理、作業系統等。這些知識是很基礎的有了一定的基礎才能更好的學習其它能力
第二層是具體技術、語言和工具,包括各種程式設計語言、開發環境、資料庫、開發架構等。每顯然,一般情況下要學習第二層的內容必須要有以最底層的能力為基礎,當然也有人沒有任何基礎就能學習第二層的能力,但是一般這樣學習效果很差,知其然不知其所以然,遇到一些問題也會不知所措。另一方面第二層的學習又會反過來影響最底層的能力,它能鞏固基礎知識的學習,能暴露出你在基礎方面的不足,還能驅動你對基礎知識的學習。當我還是個程式員的時候,學習的內容主要集中在這兩個層次。
第三層是方法、思想和理論,包括物件導向思想、設計原理、設計模式、需求工程、UML等,同樣第三層的能力也要以第二層為基礎,具個例子來說,要學習物件導向的設計方法首先要學會一門物件導向語言還要會使用case工具,同時第三層的能力又會反過來影響第二層,好的方法能更好的發揮你的技術,還可以彌補技術的不足,舉幾個例子來說,設計做的好是不是寫起程式來很輕鬆,斷言、單元測試這些方法能讓代碼的品質達到前所未有的高度。
最高層是過程式控制制和管理,這個層次的能力通常涉及時間跨度和團隊協作,包括專案管理的能力,軟體過程的控制能力、版本控制的能力、需求管理的能力等。同樣這一層次的能力也要以第三層的能力為基礎,舉例來說,如果軟體沒有好的架構,那不管採用什麼過程最終都會一團糟,而良好的設計能力,再加上迭代的開發過程、嚴格的版本控制,就一定能開發出優秀的軟體。
通過這個模型我們不難看出,一個優秀的軟體開發人員各個層次的能力應該是比較均衡的,並且這些能力不應該是獨立,它們應該能組合在一起發揮出整體性的威力。
通過這個模型也可以指導我們的學習過程,一般地,我們應該先掌握下一層的能力再掌握上一層的能力,但又不能只停留在下一層。我見過不少大學生,剛開始工作就學習專案管理,還一些做項目N年的前輩,能夠把類庫倒背如流,還不知什麼是UML、什麼是內聚、藕合和粒度。我覺得這都不是好的現象,我認為能力的學習也應該採取迭代的方式,我們先要打基礎,但也不需要打一個完美的基礎,我認為打個三成就夠了,然後就可以嘗試學習上一層的的能力,可能你會掌握一成上層的能力,這時會發現基礎還打的有問題,然後再帶著你的問題來補基礎。如此反覆,當你上一層的能力也達到三成時,又可以嘗試再上層的學習。這時就把上一層當成是基礎再上一層當成是上層。如此反覆直到你爽了為止,哈哈。