
在程式開發的世界裡,各路前輩們為了提高所謂的編碼速度,搞出了各式各樣的代碼生成器,來避免所謂的重複的人為機械地粘貼和複制代碼,以此來提高生産力。
早幾年前,我可能會認為這樣的做法真得有用,特别是在編碼速度上。
是的,有時候代碼生成器是可以幫助我們開發者生成模闆化的,規範化的,大批量的機器代碼。
但許多人就将它當做了程式開發的利器,沒有代碼生成器完全沒法寫代碼了,也沒辦法工作了。
覺得自己會用幾款代碼生成器好像很牛的樣子。得意的在老闆們,或是不懂技術的技術經理們面前炫耀:“XXX們,你看我的工作效率多高,你們的需求,你們想要的功能我隻需要簡單的代碼生成就可以快速地搞定。”。
這種做法就好比别人把一頭宰好并切好的牛肉放到你面前,再問你:“把這些牛肉放進冰箱需要幾步?”
答案你也許知道了吧?沒錯,三步。
1.打開冰箱門;
2.放牛肉進冰箱;
3.關上冰箱門
很簡單是吧?
那麼,如果别人給你的是一整頭牛,而不是切好的牛肉,再問讓你把這頭牛放進冰箱,你又怎麼辦呢?
上面的這個案例其實與開發者(特别是初級開發者)使用代碼生成器有着同樣的道理。
使用代碼生成器的時候,這生成器就好比切好的牛肉,開發者在使用時不關心代碼生成器的底層是如何封裝的,也不知道内部邏輯是如何處理的。就好比不知道也不用關心那頭牛是怎樣被宰的,如何解剖的一樣。
庖丁解牛是怎麼來的?是屠夫們經過反複的實踐,掌握了牛的結構、經絡之後達到的一種境界。
在開發的世界裡也是同理。
我見過不少開發者(絕大多數是.NET開發者,因為筆者主要專注.NET的開發)都是習慣并喜歡使用代碼生成器來生成項目,甚至整個解決方案都能為他們生成就最完美了。
他們中有些人已經有5,6年或者7,8年的開發經驗,不再是初學者了,但卻還在用着傳統的某某的代碼生成器生成着傳統的三層架的解決方案,在前端UI代碼中充斥着各種DataTable和DataSet,各種if...else...邏輯判斷,各種SQL語句拼接。。。
不知道看到此處的你是否正經曆着相同的處境或者是經曆過相同的場景?
也許你說:”我不是這樣的開發者啊。“
那麼作為熱衷于開發的我感到很欣慰了,但這樣的朋友應該不在多數,不然國内的.NET開發環境不會成如今這個要死不活的樣。我的觀點準确嗎?
究其原因,不外乎是這樣的:
在早年前,很多接觸程式開發(本文主要是C#)的人中,都是看中網際網路的高薪而加入到開發者這個大軍中的,他們為的是錢途,而不是前途。他們不是真正意義上喜歡,或者說是熱愛程式設計。
他們的骨子裡或者根本就隻是把程式開發當作多賺點錢的捷徑。
他們在想:”我就在程式界裡混幾年,等資曆老了,有個幾年的開發經驗或者是不停地跳槽,薪水自然就會不斷地往上漲。等混到了30歲,就有資格做進階工程師,做項目經理,做項目主管了。有沒有過硬的技術都不重要的。“
是以,如你,我,他所見到的如今的國内開發環境,真正熱愛程式設計這份事業的,願意深入研究技術的人很少,因為他們的目的根本不在于此。
他們隻想通過簡單的代碼生成器來”賺快錢“,他們在程式設計界裡呆了幾年之後,還是不知道C#的面向對象程式設計思想,不知道泛型是什麼,更沒聽說過反射,委托,事件,不知道還有設計模式,領域驅動設計。。。反正他們就知道有個叫“代碼生成器”的東東。甚至還驚訝地問:”原來C#還有這麼些啊?“
試想一下,如果代碼生成器都能搞定我們的程式設計工作,那像Microsoft,Google,百度,阿裡,騰訊等等這樣的以技術為驅動的科技公司為什麼不直接寫一堆代碼生成器就好了,何必每年養成千上萬的開發者呢?
再說得具體一些,比如我們使用某某代碼生成器來生成三層架構(這是很多C#初學者在入門或者開發生涯的前幾年中最熟悉的套路),這個架構中包含三層:實體層,BLL,以及DAL。
随着一個項目需求的不斷變更,你的資料表結構是不是也會變更。那麼,問題是不是來了,每次變更表結構,你是不是需要重新生成這三層的代碼,然後把原來的代碼替換掉。
如果你在這三層的任意一層中添加了自己的代碼,替換時是不是又會遇到問題呢?
那你有沒有想過,有沒有辦法能解決這些問題呢,而不是一味地抱着代碼生成器過日子。代碼變更完,對應修改UI中的邏輯判斷後就萬事大吉。
筆者描述了這麼多,想表達的是(特别是對于C#初學者來說):剛入門或者初級階段,更多地要手寫代碼,多熟悉.NET Framework中的類庫,老是想着:“代碼生成器能幫我搞定的”是學不到真正的進階程式設計知識和技術的。
如果你執拗地喜歡利用傳統的代碼生成器去解決你項目中大部分工作,那麼恭喜你,你入錯行了,請趁早離開以免被坑得越來越深,因為你不熱愛這個事業,你遲早也會走的,這樣隻會浪費你的寶貴的青春。
結束語
如果選擇了.NET這條路,請用心,認真對待,因為這是你的事業,你的付出也會得到回報。
----------------------------------------------------
專注Web和.NET開發,對前沿技術有深厚的興趣~~~