從學校到公司,玩具到產品
我是一名碼農,而且是位java碼農,至少幾年內一直會是。同時,我是位攻城獅。
在實驗室時寫代碼,做工程時候培養的想法和思路是封建的,狹隘的。實驗室做項目,連基本的版本管理工具SVN都不會有,所以不會有周期性的迭代,更不會有code review,不會有測試(包括你自己開發時候在build項目時候的測試以及之後的測試)。你隻要做老師給你布置的那塊任務而不用參與過多的設計,你的代碼是寫在自己本地的而不用考慮不同環境平台的遷移,你的項目可能就是個java project或者web project,你的項目可以跑出結果就可以了而其他方麵老師都關心不大。
至少在一個小公司裏,要開發產品,最簡單流程是怎樣的?最簡單的場景:公司把代碼托管在github上,公司有台服務器,你寫的是新的模塊。流程:你有一個安裝了maven和git插件的Eclipse,你構建maven項目,並配置好項目的依賴,包括第三方庫,你的測試是基於junit庫的,也在maven裏配置好。你本機和公司的github庫以及服務器putty都通過ssh設置好了key,你寫完代碼後,commit後push到git上。在服務器那邊有一個CI,比如是jenkins(或者Hudson),公司已經幫你把jenkins搞定,你隻要用google帳號登錄,在jenkins裏寫幾行shell,讓它自動獲取git端最新的代碼並進行mvn install,在這個過程中你已經不用管任何環境的問題。你自己的測試代碼成功通過,你的項目構建成功。這隻是最簡單一步。雖然java稱是“一次編寫,到處運行”,但是不同環境下跑代碼還是有很多很傻逼的問題。比如:1. Eclipse上默認編碼是GBK,你可能每次建成項目之後都要在properties裏把編碼改成UTF-8,同時,你在搞輸入輸出流,或者getBytes()的時候,都要寫好參數"UTF-8",保證沒有問題。2. java main函數是不返回值的,而Linux shell下main類跑完沒跑完,最後都是給出一個0,後果就是它並不知道你的main類執行結果是否正常停止,除非聲明了Throw Exception,返回值會非0,提示程序不是正常停止的,所以該throw出來的就不能try catch掉。
我們再看看別的。google公司在開發Android的時候貢獻出來的一個附加產品:Gerrit。這裏插一句,不論公司是做什麼產品,做的是什麼規模的產品,哪怕你就是個做網站的,你的網站都沒什麼PV的,內部都會有一套夠複雜夠專業的項目開發和管理流程,涉及到很多主流工具,而很多公司會有自己內部一套私有的工具,大公司甚至可以最後開源出這套工具,而變革一個開發時代,衝擊整個業界。Gerrit 是一個基於 Web 的代碼評審和項目管理的工具,麵向基於 Git 版本控製係統的項目,Eclipse和Android的管理開發都使用了它。google gerrit eclipse或者gerrit android,就可以找到Gerrit上是怎麼做Code Review的。授權的開發者在向這樣大的開源項目提供代碼或補丁的時候,CI結果,提交失敗與否,diff內容,CR內容都一目了然,改革了項目開發流程,所有授權人員都可以在web上進行CR。授權開發者有很多是公司內部的團隊,可能公司聘你就是讓你幹這事的。如果想被授權,好像你隻需要得到所有授權者裏的三票,大部分人可能都會棄權,但如果有一位反對就不行。再拿Android舉個例子,Android的git庫好像已經達到百多個git倉庫了,使用了100+的開源項目,所以每個版本的編譯都有明細記錄,任何一個子項目的版本有出入,你就不可能編譯出一個Android4.x版本。安卓所依賴的CM也使用Gerrit做開發管理。
可悲的是,在學校裏,我從來沒想過一個真正大型的項目是怎麼開發的,這個問題想都沒想過,更別說去google下。我一年前說我想做架構師,幼稚的是我依然停留在隻關注技術細節,依然在關注業界什麼受關注最多,什麼最火,隨波逐流。
以上所說的,就是想指出一些應該具備的認知,無論是否在學校裏。現在注重的可能還是技術細節,功能實現,但更重要的方麵是對整體架構的把握,不然靠時間升完職,就再也爬不上去了。真正的高手,一定會具備以下幾點:整體架構的把握大於技術細節實現;熟練掌握項目管理和開發的各種平台、工具;解決問題能力;看清什麼是最實用的技術,什麼能真正解決問題,不管你現在炒的是什麼概念,你搞的是什麼方向,你用的是什麼語言。
最後更新:2017-04-04 07:03:18