學技術我們其實在學什麼?

yubang發表於2017-03-23

  很多同學曾經問我,該學習什麼技術,怎麼樣去學習技術?其實每當我聽到這個問題,我是無比糾結。這是一個無法回答的大問題,這種話題可以吹上幾年,並且每個人都是獨特的,方法只能借鑑不可複製也。下面說說個人學技術的一些感悟,也許全都是錯的,但是我就是要寫出來。(不喜歡看長文章的同學請直接看結尾總結那段即可)

 

  一、學習技術的目的

  我們學習技術往往是帶有功利心的,哪怕你用技術來玩,也是一種目的嘛。所以,每當你問別人,該學習什麼技術的時候。先問一下自己想要做什麼。舉一個例子,一個上了大學java課程的同學跑過來問我,我應該如何學習,要學什麼東西?

  我會反問他一個問題,你以後想去開發安卓亦或者是開發網站,還是說想搞遊戲。只要他回答出這個問題,我也知道如何回答了,假設這個同學選擇了網站開發。

  我會說,你想辦法用java實現我用瀏覽器看到hellow world!這幾個單詞,在實現之前就別問我要學什麼。因為我告訴這同學,你要學servlet,filter,listener,接著學ssh框架,學習資料庫,學nosql,學模板引擎,我相信他會拋更多的問題並且被嚇呆了。

  如果這同學抱著解決問題的心態學習,一切迎刃而解(不得不感謝當年沒有一個人帶我,讓我自學變得現在這麼擁有這麼野路子的技術)。

  我們要明白一件事情,我們要學習的技術都是為了解決特定的問題。我們來看看一個java工程師為什麼會學習那些技術,下面用上面出現的同學A舉例(不喜歡看故事的請跳開下面的小故事,這個故事僅僅是說技術僅僅是為了解決問題)。

  1、同學A聽了我說的話,寫出了hello world!然後我叫他,訪問各種url,輸出不同的內容。他學習如何用xml配置servlet。然後他為了現實接收html的表單資料,就去學習如何接收get和post引數。為了識別使用者登入資訊,又知道了要學習session。為了動態輸出html頁面,又學會了jsp。

  2、同學A學會最簡單的jsp之後(頁面混雜java程式碼,迴圈輸出字串等),然後發現print字串太噁心,然後發現jstl標籤可以不用寫print字串,整個頁面優雅了。

  3、同學A又遇上一個問題,他很多頁面在未登入的情況下,要跳轉到登入頁面,然後他只好每個函式寫一個if處理。寫多了,人都受不了,這個時候,發現filter可以一個函式處理,趕緊去學一下,完美。

  4、同學A又拋問題了,他說要統計當前線上使用者數,咋辦呢?一查資料,原來listener可以監聽session建立和刪除。那麼全域性一個計數器,事件觸發修改計數完美。

  5、同學A遇到一些需要儲存使用者資料的地方,然後屁顛屁顛的跑去學習如何使用如何運算元據庫。

  6、同學A這個時候,又來騷擾我了。他問為什麼很多企業招聘要ssh框架,為什麼要用這些框架呢,又要怎麼學?首先,我們來看看struct2提供了什麼功能(搜尋引擎搜一下就知道了)?過濾器,國際化,更強悍的標籤。再看看hibernate,讓我們不用寫sql了,可以防止sql注入。最後看看spring,什麼IOC,AOP。我們該怎麼學呢?我們只需要出於安全性,方便性,可維護性的目的用這些技術實現我們要實現的需求即可,用不到的,不用急著學習。

  故事到此為止。。。

  二、我怎麼知道有什麼好技術啊?

  看了上面這個又長又不好看的小故事,也許你會忍不住罵我,我怎麼知道有什麼好技術來更好的實現需求呀!別急給三個路子你瞧瞧:

  1、請跟一個商業專案從開始做到一個階段完成(請參與團隊開發那種,要商業性質的或著面向使用者的)。

  相信我,一次下來你就已經可以應付絕大部分工作了。為什麼我不叫你自己搭一個部落格,自己折騰幾個課程設計來學習呢?因為那些只是玩具,相信你也不會有多大動力寫,也不跟實際掛鉤。

  面對使用者的專案,你可以真實接觸到錯綜複雜的情形,才能經歷真正的需求。之所以選擇團隊開發,因為可以給一個機會學習別人會的技能嘛(本人就是因為隊友使用docker,rabbitmq等,從而才知道有這種東西)。

  2、請看別人總結的技術圖譜,站在巨人的肩膀上嘛,網路一大堆總結,如何尋找就看自己機緣巧合了。

  3、問一些前輩,瞭解一些有用技巧(我雖然不是前輩,但是我做過架構,帶過技術團隊,並且樂於分享,前提你私信我或者是我微信好友)。

  三、不要為了用技術而學使用技術

  我的一個非技術師兄曾教導我:切勿為了炫技而使用技術。請記住:

技術是為了解決問題的

  例如,我們搞活動,需要提供一個簡單不變的宣傳頁面給運營。本來我們簡單寫一個html靜態頁面即可。但是,我們為了炫技。上vue,上ssh框架做一個管理後臺給運營修改頁面。我的天,這樣子既拖工期,又浪費精力。

  我們再看看一些高階一點點的技術,例如非同步處理,使用訊息中介軟體(rabbitmq,kafka等)。我們真的要用到這些技術嗎?同步真的就無法解決效能問題嗎?訊息中介軟體就不能簡單的redis代替嗎?

  很多人吐槽企業的系統技術渣,用的是十年前的技術。但是請看看,他們的系統是不是執行得十分平穩。你用新的技術,往往出了問題,社群都還沒有給出解決方案呢。

  總之一句話,用什麼技術,學什麼技術請按實際需求出發,我們需要的是最簡單最高效的實現方法。

  四、學技術前請看看他的發展史

  很多人在看技術書的時候,看到歷史就跳開了,也包括我。但是這種做法讓我們多走了彎路,別以為那些書寫寫歷史是為了湊字數,我們讀歷史可以知道它為何會出現,因為存在即合理(就像我寫文章,只要你有所收穫,這件事情就是合理的)。

  例如,我們看看資料庫技術的發展歷史。我們就明白為什麼要用資料庫,為什麼要使用某種資料庫引擎,主從技術何時使用等等。

  當我們知道技術是為了技術什麼問題而生的時候,我們就知道我們把它用於何處,所以我們經常問的一句話是,該技術適用場景是什麼?而缺點又是什麼?

  五、理解技術的原理比學會使用重要

  就像當你瞭解http協議之後,你就明白cookie是怎麼工作,你也知道單點登入是如何實現,也懂得瀏覽器快取的各種實現方式。

  當你知道了原生js,你就明白jquery能做的東西,不會jquery也可以實現。自己也可以造一套像vue那樣子的前端框架。

  我的一個建議是:請嘗試造輪子,只有造輪子才會真正理解技術的原理,別被那些不要重複造輪子的言論欺騙了,看看大公司們造了多少輪子。如果你淪為只會用輪子的人,某一天用得特不爽的輪子,你也只能含著淚來用。

  六、技術要廣瞭解,而精一門即可

  我們來看看浮躁的前端領域,反正我是怕了,前端為何要學這麼多東西?es5,es6是什麼玩意?vue,React ,Angular 又是什麼?webpack,grunt 等。然後還有less,scss。當然前端還在學nodejs,厲害呀,全棧工程師。

  人精力是有限的,上面那堆東西肯定有人都玩得很熟,但是這種技術人有多少呢?作為一個普通人,可以瞭解每一種技術的入門用法,熟練掌握一種用於日常開發即可。

  請記住,它們僅僅是你拿來解決問題,掙錢養家的工具而已(我會php,java,golang,會vue,也會linux,redis,mongodb,mysql,rabbitmq,docker,特別會python和伺服器部署,所以別人願意把我作為技術顧問,雖然我寫文章不太行,但是解決技術問題還是挺溜的)。

  七、不要以為閱讀收藏了一堆網上的熱門文章就能提高技術

  看100篇文章還不如實踐一次,別以為看了什麼高併發架構文章,看了什麼前端最佳實踐,你就可以寫出多麼優美的系統,反正一到實際就會發現文章僅供參考。再說收藏文章這一事情,收藏真的只是收藏,看看你收藏的文章多久沒回顧就知道了。

  正確的做法是,閱讀文章後做總結,最好是有機會實踐。看了本文也一樣,你就吸收你認為有用的觀點就好,別的請忽略。

  普通人跟大牛的差別是,大牛凌晨兩點還在技術攻關,普通人可能在愉快的玩著遊戲。

  八、學技術我們其實在學什麼這個問題的答案

  • 請為了解決問題而尋找一種技術,且為了解決問題而學習
  • 技術永遠是一種工具,請讓業務驅動你學習技術
  • 請學會造輪子,如果不造輪子請確保你有改輪子的能力
  • 請學會技術的底層原理,這也是為什麼大牛對於什麼技術都手到拿來的原因
  • 閱讀技術文章或者技術書籍之後請總結,然後嘗試實踐之。
  • 所謂的高階技術就是低階技術組裝而成,所以請學會底層技術。

  總結:

  學技術就是學習解決問題的方法,入門跟大神的區別僅僅在快速想到解決方案的效率(本文完)

相關文章