編程之路難之又難啊
\\\插播一條:
自己在今年整理一套單片機單片機相關論文800余篇
論文製作思維導圖
原理圖+源代碼+開題報告+正文+外文資料
想要的同學私信找我。
《微信小程序入門與實戰》這門課程在慕課上線快20天了。陸陸續續收到不少好評,得到了同學們認可,心裡還是很開心的,這種喜悅和當年創業時通宵上線一個新版本一樣,成就感滿滿。後面也會在課程中加入一些諸如如何在小程序中使用ES6、LESS和SASS等小知識,使課程更加飽滿和豐富。
這篇文章篇幅會比較長。我並沒有打算把它寫成雞湯,它更像是我這些年對編程、對管理、對市場的一次總結與回顧。如果這篇文章,能讓每個讀他的人有那麼一點點兒收穫,那就值得。我很懶,很少捨得花時間寫這麼長的文字,既然它很長,那麼請允許我占用一點兒篇幅來向一些人做一個致謝。
首先要嚮慕課的教學老師——性感小齙牙以及慕課的教學團隊,致謝。小程序9月22日公測(最早時候,開發工具騰訊還不開放,還要破解才能用。),我大概在9月27日完成了課程這個demo的第一版。最開始做這個項目並不是為了出課程,而是想從技術和商業的角度分析和預測一下小程序。文章閱讀量不錯,很多TMT媒體都轉載了這篇《換一個角度,再來看看小程序的發展與開發》。我自己編寫小程序的過程中,確實覺得很簡單,但踩了不少的坑,我整理的問題記錄差不多有30多條,多半官方在後來都修復了。我不能說本課程是最好的小程序學習課程,但它確實是最好的踩坑指南,將幫助同學們節約很多時間(其實我一直覺得這是視頻課程最大的價值)。商業價值,我並不是太關心,但站在學習的角度,我意識到了小程序是絕好的前端入門平台。隨後便開始和慕課老師討論這門課程。我並不想做官方文檔的搬運工,所以決定上來就做實戰,把API都融合到項目里,用項目貫穿整個課程。為了保證課程的質量和小程序接口的穩定性,我們一直等到11月3日小程序正式公測後,才開始課程的設計、研發、錄製(是的,不只是編程,課程同樣需要研發)。做視頻真的非常的耗時間,產出1個小時的視頻差不多需要12個左右的時間。前期需要構思、設計,考慮如何把知識點巧妙的串接到項目中;中期要錄製,一小段一小段的錄,錄不好就要重錄(舌頭打捲兒了重錄、這段沒講透徹重錄、電話響了重錄、外賣來了重錄、有狗叫了要重錄、小齙牙不滿意了要重錄。。。)。然後就是慕課要花大量時間精剪、後期處理,教學經理們並不比我們輕鬆。這門課程的順利上線,有一半兒功勞要歸功於慕課的教學團隊。這個時代,能靜下心來做內容的團隊真的不多,這也是我選慕課做課程的最主要原因。
其次要向課程群里的好幾位同學致謝。他們經常在我沒看到群消息的時候,主動幫我解答其他同學的問題,讓課程群一直保持著一個不錯的活躍度與回答率。除了圖中的,還有很多同學。甚至有同學把我課程的筆記都整理了出來,分享給大家。
做這門課程的初衷,倒不是像很多文章吹噓的那樣小程序多麼多麼有前景,秒天秒地秒App。實踐才是檢驗真理的唯一標準,小程序的未來還需要持續觀察,畢竟現在才公測,應用市場還沒開放。我不會因為做了這個課程就使勁兒吹這個東西有多好,技術人就要站在技術的角度來分析問題,小程序未來如何,每個開發者都應該有自己的分辨力。我做這門課程一半是想做一個非常好的小程序入門課程。我常以為萬事開頭難,編程尤其如此,一旦入門,那提升與進階都只是時間的累積問題。但怕就怕在折騰了很久,結果是「從入門到放棄」。所以,不要輕視入門課程的價值,它往往比高級進階課程更重要,更加難以講解。很多時候我們認為課程里一個知識點很簡單,那是因為我們已經有了一定的編程經驗,但對於入門學習者來說,卻並沒有任何的相關經驗。比如,我們講Java的註解或者Python的裝飾器,我們就不能說:這個概念很好理解,它和C#里的元屬性一樣。雖然他們在概念和設計模式上都一樣,常用來做AOP,但我們卻不能在入門級課程里這麼類比。不能類比,就像作文里比喻句被禁用,講課的難度提升了無數個等級。
另外一半是因為,我認為小程序是絕好的入門前端的平台,非常適合兩類開發者:1類是沒有任何編程經驗又想進入前端領域的開發者;2類是伺服器開發者想轉做前端或者想學習一下前端的知識。
學習前端,最難的不是JavaScript語言本身,而是有太多的框架要學習,最基本的JQuery必須會,NG、Vue、React三者選其一、Grunt也要會。這任何一門技術的學習成本都遠遠的超過了小程序的學習成本。小程序由於比較封閉,不支持DOM元素,大量的已有庫都是不可以使用的,也沒有必要使用,這就減少了初學者很大的學習壓力。而小程序里的很多思想比如數據綁定、模塊兒化的JS、模板編程,同現在主流的MVVM框架異曲同工。由小程序入門去前端,再反向進階大前端,是比較好的路徑,學習曲線會相當平滑。
對於已經有很好前端基礎的同學,我建議不要把小程序看成是一個什麼新技術,他不是iOS和Android,你就把小程序就當做是一個普通的Javascript框架(但實際上它是一個平台),就像你學習AngularJS、React、Vue、JQuery一樣。我認為這種心態很划算,花學習其他框架四分之一的學習成本,就能掌握一個可以開發出接近於原生App體驗的技術。即使你不是從事微信開發,你的公司也沒有微信的業務(但現在的公司沒幾個能和微信脫邊兒的吧),那麼自己沒事兒快速做做小項目、實踐一下自己的小想法、創業初期拿來過度、做做原型給客戶先看看、接一些外包的單子,小程序非常合適,很多業務都沒有必要動不動就操起iOS和Android的大刀,用用輕巧靈便的小程序足矣。
好了,硬廣就不打了,我們還是來說說編程那些事兒。
給這篇文章定個基調,它不是雞湯,無論我的建議如何,都是從客觀上分析現在的市場與環境,談的是趨勢和現實,並不代表絕對。總有那麼一小波人,可以逆流而上,不走尋常路也可以「驚起一灘鷗鷺」。但那畢竟是少數,這不僅需要努力還需要一定的運氣加持。我們按照常理來出牌,規劃出一條穩定的線路學習編程。而中間如果有奇遇,那更是錦上添花,而如果沒有也大可不比慌張。
編程需要理性,選擇也需要理性。但無數的先驅事例告訴我們,最終的選擇往往都是非理性的。如果人人都能理性的思考問題並且做出選擇,那麼白起、岳飛不會冤死、大明王朝不會覆滅、諾基a亞手機依然長青,當年的校內網也不會一落千丈,凡客和陳年也還可以安安穩穩的賣他的白襯衫。喜好和性格才是決定選擇的最本質原因。所以,本文內容僅供參考,真正的選擇請遵從自己的內心,喜歡就是最好的理由,沒有道理。有不同意見的同學,也請不要在意,一笑而過。
我看到課程群里有很多還在上大學的同學已經開始不斷的學習編程,讓我不禁回想我當年上大學的時候都在做什麼,除了通宵遊戲、整天踢球、混學生會,對編程最有意義的高等數學、統計學、線性代數完全沒有聽過課。從大學開始學習的同學,你們需要的是堅持。等工作幾年後你就會有體會,為什麼當初大學的時候先人一步的去練習編程、實現是那麼的重要。網際網路的一年時間,真的是足夠改變太多。什麼是成功,對於這世上絕大多數人,不是先定一個小目標賺它一個億,而是你永遠先人一步,上學的時候做別人工作時候的事情,工作前兩年做別人工作四五年該做的事情。
我大學時也幫老師做過一些小項目,當時也會一些C++,但真正做東西的時候用的是dephi,傳奇的Borland公司死掉後,Dephi這個優秀的語言也漸漸淡出了人們的視野。當時大概是09年還處於桌面時代與Web時代的交接點,C#是唯一可以替代Dephi的語言。於是就開始做C#,這一做就是5年。中間陸陸續續的做了Flex和Silverlight,在當年這種富客戶端技術盛行的年代,我依然堅信Javascript這種由ECMA開放組織控制的語言才會笑到最後。當然,當年我只是堅信Javascript不會死掉,但我沒想到,JS會發展的這麼好,甚至有了Node.js這種伺服器技術。
假設你是一個沒有任何編程經驗的0基礎初學者,你肯定會問我第一門語言學什麼好呢?
我的推薦是:Java。無論你是準備做前端還是伺服器還是移動端,我都推薦你第一門語言學習Java。說到語言選擇,我們引用一張TIOBE 2016年10月的程式語言排行榜:
我們從其中提煉一些常見的主流程式語言:
?C、C++、Objective-C
?Java、C#
?PHP、Python、Ruby、Go、Swift
?Javascript、Lua
第一行中的C類語言,是最為典型的編譯型語言。這些語言運行速度快,性能好。但談到進修嘛,不舉薦,除非你準備以後從事系統級別的研發或者iOS開發。這些語言語法艱澀不夠現代化,概念較多,不利於上手進修,很容易讓人望而卻步。特別是OC。
第二行 Java和C#兩大典型的工業型設計語言(Java和C#都不算嚴格意義上的編譯型語言),他們牢牢的占據著企業應用開發市場。這兩哥們兒相愛相殺很多年,C#不斷借鑒Java社區的思想假如MVC、ORM,推出了http://ASP.NET?MVC、http://ASP.NET?Web API、EnityFrameWork,而Java不斷的借鑒C#語法的優勢,假如Lambda表達式。從語言層面講,C#要強於Java,更簡略更自然更容易了解,而Java愈加的古典與傳統,遵循著編程里很多典型的設計思想。但Java在框架創新力上我認為是要強於.Net的,且社區的創新力與活躍程度也要高於.Net。微軟有很多很好的東西,假如說SignalR,一個做實時應用的框架,能夠用長連接和WebSocket兼容各個瀏覽器。當年我們創業時,做了一個類似於國外很出名的Sass應用Slack,選擇的核心框架就是SignalR,當時NodeJS還很不成熟,SignalR簡直是唯一的選擇。只可惜微軟的東西在國內太不招開發者待見~~~。但我說我的編程根底和思想全是C#給的,這一點兒都不誇大。
第三行根本屬於解釋性(函數式)語言。隨著網際網路的火熱,這些語言風生水起,火熱程度已經大大的超過了Java和.Net(大家要知道Java和.Net不僅僅是用來做Web的,甚至他們誕生的時候Web還不那麼時興)。這些語言代表著Web開發的另外一個陣營,他們以快捷開發著稱。很多同學喜愛拿PHP作為入門級的語言,我並不舉薦,開發的確簡略,內置了大量的全局函數,但面向對象的概念很弱。Python比較特殊,也是我最喜愛的語言,既有腳本類語言的特點,又有很強的面
【文章福利】:小編整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件裡面,有需要的可以自行添加哦!~點擊綠色通訊軟體搜索wujidanpianji加入(需要自取)
向對象的特性。
第四行腳本類語言。Javascript已經快一統江湖了吧。Lua雖然份額低,但大量的遊戲腳本、插件都是用Lua來開發。著名的Redis也是使用Lua來做擴展。
那這麼多語言,為什麼選擇Java。第一是因為編程的基本思想和思路非常重要,也就是我們說的基礎要紮實,現在程式語言太多,很容易讓人迷茫。而Java是一個經典的語言,其語法的設計即經典又現代化,並且它很全面,其他語言有的Java里有,其他語言沒有的Java里也會有,比如大家津津樂道的NodeJS特性異步非阻塞 IO,Java一樣可以很好的實現。但是當處理CPU密集型操作的時候,NodeJS就無能為力了,因為它的場景是用來處理大量IO操作的。其次是因為,面向對象的應用始終是新手和老手之間的區別。OO的3個特性無數人倒背如流,但沒有幾個能正在的在實際項目中很流暢的應用OO的。面向對象是什麼,是自然世界在計算機里的映射和延伸,不是我們學到幾個概念就能叫會面向對象了,這需要大量的實踐和體會。這是一道兒坎兒,需要不斷的思考,才能有所提高。選擇Java作為入門語言對以後深入理解面向對象非常有幫助。但像Javascript、PHP這些函數式語言,也有面向對象的概念,並且也可以實現絕大多數面向對象的特性,但這個實現並不是那麼的自然,是為了「面向對象」而「面向對象」。這一點在JS里尤其顯著,利用Prototype可以實現絕大多數的面向對象的特性,但既不優雅,也不容易理解(當然ES6的出現解決了部分這樣的問題)。函數式本身就和OO是兩個世界的東西,它有它的寫法和模式,不應該強行的去OO。所以函數式語言的學習,我建議是在對經典OO掌握之後,再去學習他們。
再者推薦Java是因為,Java的學習資源太、太、太豐富了,成套的極其詳細的視頻教程到處都有,還是免費的。不信你看慕課的實戰課里有涉及到Java的嗎(Android不算!),沒有,為什麼?因為Java的視頻教程已經出爛了,什麼基礎的、實戰的、Web的、桌面的、遊戲的滿大街都是,出這個肯定沒有NodeJS、Python好賣。
其實,說到入門語言,C#比Java更加合適,但國內C#的市場小,機會少,很多人是瞧不起C#的,理由是.Net不開源。。。市場小、發展受限是真的,C#目前在國內主要是很多傳統企業、外包企業和政府項目會選擇C#,網際網路公司選擇C#的真的是少之又少。國內可能上海.Net的氛圍還不錯吧。但說到不開源,這個就很搞笑了,Java開源有幾個人又去讀過源碼,很多人連開源是什麼意思都沒搞清楚,幾種開源協議GPL、BSD、MIT是什麼也不都知道,談什麼開源。何況Java也不是全部都開源,只是標準的那一部分開源。開不開源真的不重要,跟我們屁關係都沒有,對初學者來說就更無關緊要了。開源最主要的是能夠擁有一個良好的社區氛圍,Java社區一直比.Net更有創新力原因就是在於它開源。但在國內,大多數開發者都是只索取不貢獻的,開源對個人提升來說就更無關緊要了。推薦Java而不是C#的原因還是在於未來的發展上,C#在很多網際網路公司眼裡你會和不會沒什麼區別,你說你有5年C#開發經驗,1年Java經驗,很多網際網路公司是直接忽略掉你這5年C#經驗的。不過,微軟現在也開始擁抱開源了,.Net Core、VSCode、Win10 Bash就是一種態度。
當然也不是說你現在是做.Net的就跳坑裡了,如果你一門語言很精通,我相信你學習其他的語言也不是難事。我也做了差不多5年的C#,但未來發展的路徑確實比Java要窄很多,至少在國內是這樣。京東早年是.Net結構,後來還是全部更迭為Java。現在絕大多數公司早期創業時,都會選擇使用PHP,後期再替換為Java,比如淘寶的技術演進就是趨於這樣的一個替換過程。淘寶早年的PHP代碼還是從國外買的。目前我知道的國內用.Net的網際網路公司,貌似就是攜程、當當網和CSDN。早年經常用C#寫代碼,當時也沒什麼語言之間好和壞的概念,純粹就是覺得VisualStudio真好用。
講了些題外話,我們接著說Java。那麼學習Java要學到什麼程度?那看你以後打算做什麼方向。如果你只打算做前端方向,那麼把Java的高級語法和特性學完即可,要能夠理解面向對象、同步異步、多線程、並發模型、反射、正則、線程的同步與線程鎖,但你不需要學習任何一個Java框架。Spring、Jersey、Hibernate、Structs都不需要去學習。
如果你打算做伺服器方向,那麼Java你是必須精通!精通!再精通!經典的SSH(Spring、Structs、Hibernate)、AOP切面編程、Maven這些你都需要精通,還要去找一個標準的Restful API框架,這裡我推薦Jersey。除此之外如果你想做伺服器,那麼Java虛擬機(JVM)的相關知識一定要精通,關於這方面的知識很多求快的同學都不會放在心上,但我可以說這方面的知識非常非常重要,如果你不了解這些知識,編程之路越往後,就越難做,很多問題你將以一種似是而非的方式來理解,因為你不了解代碼在底層的運行原理,你的代碼bug量會比其他基礎好的同學多很多。JVM原理也是大公司校招的時候必會涉及到的經典面筆試題。
關於數據結構和算法要不要精通,這個講起來挺長,我們放到後面再說。我認為不需要急於去學習數據結構,沒有幾年的工作經歷,數據結構對你來說和中學語文課本一樣,過目就忘,你也不知道這些東西學了干撒?考試?這到是個不錯的理由。
這裡還有一個建議就是,學習語言的時候,特別是0基礎開發者,不要去使用任何的IDE工具,比如Eclipse或者Intellij,使用簡單的文本編輯器比如VSCode(我不推薦NotePadd++這種太簡單的,沒有必要),然後自己手動的去引入類庫、編譯、執行代碼。麻煩是麻煩了點兒,但日復一日的重複這些操作,就像有如神助一樣,受益頗深。當然我說的是在學習階段,去公司做項目還是老老實實的用IDE吧,學習和做項目是兩回事兒,別人不會因為你用記事本寫項目就對你刮目相看,公司永遠把工作效率放在第一位。技術不是運營和銷售,但技術同樣可以通過提高研發效率來為公司獲取利潤。編程這東西,只要有時間,每個人都能慢慢磨出來,我們又不是去做航母、衛星、人工智慧,我們寫的絕大多數代碼,都不是開天闢地的,你都能在網上搜索到。那區分一個優秀的開發者和一個普通的開發者的關鍵點就是寫代碼的效率。
如果你還在上學,完全可以先不慌不忙的認認真真的先把Java學好。不要看著什麼火就學什麼,也不要擔心我學這個語言會不會淘汰啊(小程序才公測,就有同學問我,會淘汰嗎。。。後面我們在說關於小程序的事兒)。前面我提到的語言,你只要不是點子太低碰到像Dephi這種。。。基本上10年內不會衰敗。就算運氣不好,學的.Net,哪天微軟被納德拉玩掛了,那還有開源社區會接管.Net的。而且學好我說的Java,你再去學其他的語言,真的輕輕鬆鬆(我說的是學好,會編程 !=學好)。
第一門語言的選擇,還是看你自己。你是想就在這個行業混口飯吃,還是想深耕於編程這個職業,如果是想混口飯吃,那麼XX天精通X語言,非常適合你。而如果是想在編程的領域裡做出點兒成就,對於未來有很強的規劃,那麼還是老老實實的學Java吧,不ao,挺好,我們公司後台也是java寫的。