在軟體開發中,追求新的技術意義大嗎?

題主情況:廣西科技大學(過二本線就能進的高校),計算機科學與技術專業,大四學生。掛科無數,但編程在這所學校算是小有名氣。不喜歡上課,喜歡自學。

最近再學習AngularJS,並且將在實訓項目中使用,我日常是用Python,前端是菜鳥,學習AngularJS遇到很多問題。我前幾天寫的一篇博客可以說明大多數問題。

以下博文,有刪改,原文鏈接:軟體開發迷思:追新與實用(AngularJS)

++++++++++

我最近準備使用AngularJs開發我的實訓項目,我的主要想法是使用前端MVC,完成前後端的完全 分離。我曾經試圖使用Jquery完成AngularJS點的MVC功能(因為當時我能找到的AngularJS 的中文資料非常有限,質量良莠不齊),我當時非常固執的想使用純REST架構,放棄了Cookie功 能,而引入了HTTP Auth。我可以說我的想法是好的。但顯然Cookie是更成熟的方案。

Jquery寫的方案是失敗的,MVC這麼龐大的東西,用OOP的PHP或者Python我或許可以,但 對於JavaScript這個我並不是很熟悉的語言來說,不是我可以駕馭的了的。於是我在開發冰雲的 時候,決定開始學習AngularJS。

我最早是想看官方文檔的,中文的文檔只有有限的1.2版本的文檔,最新穩定版本是1.4.7,我 想用新版,但據說1.3和1.4兩個版本都有很大的變化,所以我決定看了慕課網的1.3的加成,對照 原版的1.4英文文檔。

其實並不順利,理解雙向數據綁定這玩意花了我很長時間,但我最終也能體會到這麼做的便利。 但最終讓我頭痛的是路由。默認路由功能很弱,慕課網上面推薦使用的是ui-router, 我使用調試了半天,都不起作用,百度無果後,去Google,大致是從1.4開始,支持了New Router of Angular這個組件,這個組件沒有包含在1.4裡面,預計要加入不知猴年馬月才加入的2.0版本 中文有一篇」不可能不確定「翻譯改編的介紹不錯,我很心動。於是就使用了這個。

然而使用時簡直了,搞了我整整兩天最終也沒有完全搞定。雖然在搞定這個的同時我學習了很多 JavaScript的知識,對AngularJS的機制有了更好的了解,但是真的耗費了我好多精力。不要說 新的代碼,原來的代碼也沒有完全移植過來。關鍵就出現再New Router的子路由配置上,怎麼都出 錯,Google了一上午,最終的結果就是,這個New Router還在試驗階段,我要麼去GitHub上留 一個issure,要麼自己改New Router的源碼。我這時就是感覺,真的沒精力了。要是Python的 項目也就算了,JavaScript,饒了我吧。

我在想,我做軟體開發是不是太浮躁了,也許我按傳統的WEB開發,後端MVC,這個項目都做完 了,如果我用AngularJS 1.2加上ui-router也應該不會遇到這麼多的問題。但想新的技術,新的版本往往意味著新的概念,新的特性。而這些概念和特性往往都非常誘人。

究竟如何進行取捨?我有點迷惑了。

求知乎大神指點迷津。


用最新的主流技術,並嘗試理解相比它替換掉技術,改進和原因所在。

至於「用 5 到 10 年前的技術」這種說法我不是沒聽過,只不過首先這樣的項目都是在處理 5 到 10 年前就被人解決完成了的問題,往大了說 10 年前還沒有 iOS 開發呢不是(笑)前端是如此活躍的領域,倒退 10 年人們還在燒高香期待 IE 6 解放生產力,跟你現在了解的東西幾乎沒有什麼關係。

其次你在可以試錯的時候不去儘可能的犯錯,等到你必須維護一坨 PHP 代碼並賴以糊口的時候你就只有哭的事了。

所以,做足功課,如果現在在前端 MVC 上的主流前沿是 AngularJS 1.4,就不要浪費時間在 1.2 上。給自己一個時間框架,然後全力以赴去試;如果到時間了還是不能解決問題,那麼立刻放棄,用自己熟悉的技術把項目完成,然後再去在沒有項目時間壓迫的地方試驗。

不要停止腳步。


自己學習時要激進,要主動去了解最新的技術進展,以把握技術發展的脈博。

開發正式項目時,特別是商業項目則要保守,用最多人用的,坑己經被填得差不多的技術。


基本功稀鬆

看什麼都是新技術

基本功紮實

看什麼都像是新瓶裝舊酒


不止一次問過自己這個問題。

快做了十年軟體開發,這個問題上,個人是偏向保守的,下面回答幾點是做了這些年的感悟,請獨立思考,判斷取捨。

  1. 我們編程最終是為了用戶,不是為了老闆,不是為了產品部門,更不是為了自己,如果程序提升了用戶使用的效率和體驗,程序才有價值,用戶不關心她用的東西是怎麼實現的,但她確實關心是否能早一點用到某個功能,某個功能穩不穩定,如果不穩定我們能多塊修復,還有,這個過程會化掉她多少時間和金錢;我說這一點的目的不是要下結論我們應該總是沿用老技術,也不是要宣揚總是去嘗試新技術,知道「什麼時候做什麼選擇」比「做了什麼選擇「一樣重要,心裡要有一個標準,知道為什麼這個時候我做了這樣的選擇,要有能說服自己的理由;選不選Angular都應該有」具體「的理由,別人說的Angular如何如何先進永遠不成為理由,最多就是個參考因素;只要環境允許,我們做技術選擇的落腳點都應該是對用戶的實際意義
  2. 有本書叫做Facts and Fallacies of Software Engineering,有幾個章節可以比較好得回答這個困然很多程序員的問題,「盲目追求新技術」帶來的隱性成本,最終變成沉沒成本

  3. 新技術有時候只是用一種不一樣的「抽象」去做同樣的事情,這時候與其把它們叫新技術,不如叫新「方法」,我還是想提醒自己用戶並不關心你的技術「方法」,一個例子就是ECMAScript這些年的進化迭代,許多新的語言功能,但事實是這些是程序員自己關心的東西,用了這些語言新功能會否提升編程的簡潔度,穩定性,性能等等還需時間來證明,但程序員社區已經趨之若鶩了,巴不得立刻進入ES6,ES7時代;我想說這些事沒有它們看上去那麼重要,我知道一定很多人不同意,但我說過了這是我個人對技術的判斷;我舉一個相反的例子,H264視頻編碼,AAC音頻編碼以及MP4格式都是存在很多年的技術,但是網路流媒體的發展給了這些老技術許多新機會,他們已經是如今互聯網多媒體的事實標準,所以儘管不是新技術,但非常值得深入了解(如果你從事這一塊),格式的統一對媒體的消費者和媒體的創作者當然是有意義的,這不僅意味著用戶端的工具會更簡單,流程更一致,用戶端需要的處理時間成本更低,還意味著她們所接觸到的視頻網站的實現的簡化,而這總是導向更好的用戶體驗,這背後的技術HTML5 video,HLS等等,都值得一併研究。說回來,這裡的觀點是新技術不一定新,老技術未必老。
  4. 不要太相信那些看起來能解決你所有問題的所謂新技術(我覺得Angular算一個)。承諾太多要麼是因為這個技術還太年輕,沒有太多人用,所以該暴露的問題沒有暴露出來,該被看到的短板,人們還一無所知;要麼是因為背後的團隊把過多注意力放到了市場,太顧及切中市場痛點而忽略了這種技術本身設計上應該有的平衡,這就跟做一個討好市場的RPG遊戲去拿遊戲里的香艷截圖去吸引用戶一樣;我想一個技術人員並不需要資深的經驗才能明白軟體開發本身的開放性和複雜性,不是一個兩個工具和技術的更新換代所能夠徹底解決的;承諾太多的技術,往往作出不切實際的設計,為了疏通邏輯在架構概念上造一堆輪子,犧牲技術使用者的學習時間,增加他們的知識負擔。這裡的觀念是,做項目的時候,強大全面的新首先意味著項目成本的增加。
  5. 大多數語言要學好幾年才能到「熟練」的程度,不要說精通了;但大多數人會在一兩年內放棄對這種語言縱深的學習,而轉而橫向拓展(很多人都這樣,包括我自己),這並不總是壞事,因為有時候橫向生髮本身就是縱向的啟發;我想說的是這個時候很多人可能意識不到自己其實並不怎麼「熟悉」自己認為熟悉的東西;比如用PHP寫Web應用,三個月半年換一個框架,但沒有試過去理解第一個框架的架構和設計意圖,編程技巧,可用性等等,到第二個框架的學習,還是重複那些老的概念,於是天天MVC,也只有MVC,表面上是研究新技術,實質卻還是老的思維框架;但如果研究下去,一個普通的Responsibility Chain的設計與應用就可以學到很多。所以這裡的觀點是,技術的「老」有時候是一種認知偏見,因為你不知道自己不知道的東西。

話題可以展開去說很多,但我想就此打住,千言萬語也最終依賴於你自己的研究和判斷,真正的回答我相信也在這裡,「你自己的研究和判斷」。

上面的觀點僅作參考。


我覺得作為技術人員,更應該focus在為什麼會出現這種新技術上。

比如javascript大家不是用的好好的么,為什麼會有coffeescript、typescript出現?

比如jquery操作dom不是挺好的么,為什麼會有knockout、angularjs出現?

比如memcached不是挺好的么,為什麼會有redis出現?

而且上面所說的,看似關係不大,但其實又有關係,如果你不知道你為什麼要去用angularjs,你也一定會覺得MV(Whatever)是MV(What the fu*k),單純為了發明一種技術而推出的技術不是技術,那是商品,而你是他們的產品。因為某種需求「自然而然」產生的技術是技術,你是他們的用戶。

你們的項目越來越大,越來越慢,你難道不應該去想為什麼慢,怎麼能不慢么?

說到這兒,我想到一個故事,說MIT有幾個人閑的無聊去監聽俄羅斯衛星,後來嘗試定位俄羅斯衛星,他們也確實做到了。有一天將軍說,你們能不能用衛星定位自己?這在軍事中會非常有用。於是有了GPS。


angularjs我就看了3天就上手寫項目了…實在不懂…你在說什麼…

新技術舊技術,說白了都是一種設計模式或者開發理念,這個搞明白之後,做項目,搞開發,永遠靠的都是基本功。

切勿本末倒置。


一定要更新知識結構

否則很快成為古董!!!

學習新的技術

不會讓過去的知識顯得過時

而是為你點亮了又一盞路燈

相信我

身後的路燈,

雖然離你漸遠

其光芒一直在助你前行

遲早有一天

你會發現

你已經點亮了地圖上的所有路燈

這讓你自由馳騁

一往無前

少年,沖吧!


新的技術本質是伴隨著"重構"的,你要做一個新東西,當然用最熟練和穩定的技術,實現的差不多了,再考慮重構,web裡面的前後端分離,mvc也只是新瓶裝舊酒罷了,正如《modern operating system》裡面所說的那樣,計算機科學中各個技術發展是個迂迴的過程,一些沒有意義的舊技術可能會在某個時間點重新發光,現在的新技術也會很快過時。

我很久以前也很喜歡追新的技術,xx框架來了,趕緊學,而且只要官方有了v xx.xx.xx,就算不是stable version,也不想使用v xx,xx,xx-1,後來發現沒什麼卵用,v00.00.01裡面的feature都夠用了。

框架是"你為框架服務",這雖然對養成所謂的"best practise"有點用,但是你這樣寫出來的代碼是死的,一旦出bug很痛苦(更何況現實情況是bug層出不窮呢,那就一直非常痛苦了),即使框架開源,你在漫無邊際的源碼中找到自己的bug原因也是非常困難的。在找這些bug的過程中,雖然可以一定程度上學到一些東西,但這些東西系統性很差 ,花費很多時間來接框架的鍋是真的事倍功半。

我現在一般不會用別人的框架,而是每次重構都為自己的框架增添東西,可能自己的框架並沒有那麼flexiable,也不能應付所有的應用情景,但我每次都盡量完善它。

你還會發現,一些語言的feature,你自己不寫框架的話,可能永遠都不會用到,這對於喜歡這門語言的人是個多麼大的損失啊!

所以,我最後想說的是,自己慢慢寫一個小的框架吧,然後培育他,讓他長大。

實際項目過程對於大多數人來說真的只是一步步google,這個過程只能讓你達到你能到的最低點,但你能到的最高點,取決於你的基本功。

多看書,多寫代碼,少寫那些所謂的實際項目(特別是那些兩三個人,一個月就能做完的那種),外包更是有多遠離多遠,全棧工程師不需要追求,一層層的都弄懂,隨時完成C++-&>全棧的進化。

還有,那些說("自以為了解底層越多,程序越好")的前端工作者,我忍你們很久了。

手機快沒電了,知乎碼字都這麼費電-.-


真是夠了。

angular1.x並不算什麼新技術。剛離開一家寫react、vue的公司,加入一家寫angular的。

離開的公司用的不少輪子在github上已經用ES6重寫了,有的demo也用ES6寫了。現在回去寫angular1.4是因為它是基於ES5的,這樣不必看ES6卻維護ES5。當然離開最主要的是別的原因不合適。

選擇angular1.x做web app難道不是因為技術成熟穩健嗎?angular1.x已經有無數前人趟過坑給你填平了,ui-router文檔也是非常詳細,就這樣了你還說的好像你是第一批趟坑的一樣。

不要輕易就覺得自己已經很努力了,不然成長會很慢的。

真要玩新技術,去弄angular2啊。一般最新的技術是沒有中文文檔的,除非是中國人寫的。


angular的話,你要用路由幹什麼?我覺得angular本身的路由功能應該很強了呀?如果你設不對的話,很可能是因為你的web service介面定義沒有完全符合HTTP 1.1標準吧?或者有可能如果你看看編譯原理就能找到一些可以繞過bug的方式了?

至於語言學習本身,我覺得語言可以說是貪多嚼不爛的典型,尤其python這種傳統的OO語言和Javascript這種功能型語言可以說是風馬牛不相及的(對於初學者而言)。所以我覺得先把其中一門大體吃透再去學下一門比較好。

不過不論如何,大四能做到這些東西還是很厲害的。堅持下去的話你一定會做的比大多數人好的多。


別問別人爽不爽,要問自己疼不疼

你不覺得疼你用新技術來做什麼?先就自己想做的定義問題,然後看看根據自己現有的知識要怎麼解決,如果能解決就開始動手,如果動手覺得工作量大/繁瑣/心塞,這就是疼了,這時候看看別人怎麼解決這個,過渡就很平滑,學習成本就很低。如果一直不疼,那你沒事找什麼事?


生產環境下還是要慎用新技術(雖然我個人很喜歡將新技術用到生產中,但是前提是已經對新技術有較深掌握)。個人學習的話,新技術提供了編程界一些最新的思想,學習了的話不無好處。


妾以為,你這是單純追求新技術,而不是按實際需求出發選擇技術。

不過,對於樓主這類項目,本身也是學習的過程,你學到東西比實際快速完成項目重要多了。

從lz的描述來看,我覺得,lz實在不算浮躁的。

PS,有些"新"技術並不一定好,有些是在不合適的領域用更冗餘的方法實現其他領域很簡單的功能。


恕我愚鈍,不懂你用Python 跟你學AngularJS有什麼衝突。你不會js,你就算用jquery還是會遇到很多問題。另外,能在你愛的事上提交issue ,對大多數程序員來說應該是一件美好的事吧。


少年,你這麼喜歡華麗的東西,不如跟我學裝逼吧。


追求新技術是不是有意義?

你知道所謂新技術shadow dom可以增加效率么? 據說angular2 比 1減少30%渲染所需時間。雖然沒有人算過~~

追求新技術的意義肯定是在某一方面有重大進步。 為了以後更方便~更快捷~更強大

————

樓主最後問是不是要用mvc 還是angular 1.2或者1.4。

你要是以後目標後端 後台大牛mvc 足夠了。 沒需求上angluar.js

如果是以後找前台工作。明顯你需要angular。不要過度在乎1.2還是1.4的問題。 反正你總是要升級的。 今天不做你也是明天做。 學學1.2也沒壞處。


我覺得好像是步子邁得太大了,所以有點兒不適應而已。

angularjs不是直接學的東西,先從js和dom開始,然後是ajax、json,再是jq之類的庫,最後才是angular這些框架級別的東西。另外angular這類比較新的東西,就別指望中文資料了。

沒啥好辦法,要不就硬著頭皮用現在的辦法做完,要不就退回去用最熟悉的辦法解決問題。自己決定。

但我想說的是,盡量利用年輕的時間學習英語和計算機類的基礎知識吧。編程小有名氣,但是掛科無數,意味著有些軟體工程經驗,但基礎薄弱。

別像我一樣,三十多了才想起來學計算機導論……(苦笑)


兩方面

1,做項目來說,沒必要追求最新技術,一般使用5到10年前的技術(廣義上的項目解決方案,比如lamp)比較好,nosql, hadoop很火?不好意思,不夠成熟的東西我們不想放到線上。

2,個人學習。 sql 無聊不?無聊。那就用 nosql, hadoop。

既然還是個學生,最不缺的便是時間,趁年輕趕緊折騰去,未來淘汰 sql 的重任就交給你了。python 記得升級到3.5, java 記得升級到 8, jquery 記得用2.x.x, angular 記得用......我好像沒關注過它的版本...

ps: 所謂5至10年前的技術指項目解決方案,比如著名的後端LAMP+前端html/css/js, 並不是狹義的指某個語言新的框架,某個框架新的版本等。現在有純 js 渲染的框架,整個網站全部繪製在canvas里,這種技術大概就在我認為的沒有5至10年的發展,不要放到線上的範疇。


偏個題,樓主好好學下英文吧


技術應該服務於項目,千萬別反過來。


推薦閱讀:

尾遞歸究竟是好是壞?
Google MapReduce中的map和reduce與函數式編程中的map,reduce有何異同?
GitHub 上出眾的程序員有哪些?
non-trivial 怎樣翻譯?
如何優雅地將程序設計語言的名字翻譯成漢語?

TAG:程序員 | 軟體開發 | Python | 編程 | AngularJS |