#程序要學什么?
由于我們討論的就是以編程作為職業,所以在本節中,對編程方向所要學習的內容的分類表述,也以職業方向作為分類的依據。這里我把編程可能涉及到的職業,分成了7個大的方向來表述,分別是后端、Web前端、原生移動、底層、游戲、硬件和其他(數據挖掘、運維等)。雖然我算是全棧工程師,除了第六個方向硬件之外,在十多年的工作生涯中,其他方向均有所涉獵,而又以后端、前端、底層等方向所花時間最長。話說回來,知識和技能均在日新月異,雖然我講述的內容是當下應當學習的內容,但是這些內容不可避免會隨著發展而過時,也非常希望大家能從這些內容的表述中,看到要學習的本質所在,而不是表面或者過時。
##1、后端開發方向
除非是做的不聯網的單機 PC 或者單機移動端應用,否則后端是一個永遠都繞不過去的方向。并且在所有的產品中,在進入成功和成熟的發展階段,后端對整個應用的作用是至為重要的,比如數據全部存儲在后端,安全和敏感的算法也是存儲在后端,應用的大壓力處理也是在后端。以微信為例,從界面上模仿一個一模一樣的應用,不是太難的事,但是要做到微信如此大用戶規模,還能有如此體驗的,我想這樣的團隊就鳳毛麟角了,即使如此,在2015、2016年的除夕晚上,微信紅包和消息還是出現了不可避免的卡頓和錯誤。如果你想從技術上尋求挑戰,加強對后端的學習和理解,是必不可少的。另外,由于后端學習到一定程度,要學習的內容較多,在工程上牽涉的面也比較廣,所以對人的要求和能力也有很高的要求,所以后端成為架構師是一個正常的選擇,統籌整個項目的架構往往也是由后端人員來負責。
那么后端學什么,我們把后端也分為兩個門類來闡述,一個是業務邏輯的開發后端,一個是服務和底層的后端,前者就是這里表述,而后者我們就在第4個方向上表述。
在當今業界,業務后端技術也主要分為好幾大流派。從技術上講,這三大派都無所謂誰優誰劣,評判標準還是回到我們職業規劃的路子上來,不是為學技術而學技術,是要看工作前景的。以筆者對國內互聯網的了解,區分如下:
* 第一大派(側重指互聯網行業)是 LAMP(Linux+Apache+MySQL+PHP) 或者 LNMP(Linux+Nginx+MySQL+PHP)。
* 第二大派是 JavaEE(Spring+Strust2+Mybatis+MySQL)。
* 第三大派就屬于小語種派了(可能是把 LAMP 中的 P 換成 Python,可能是 Ruby 的 ROR,或者是在互聯網領域不流行,但是在傳統軟件比較流行的 Windows + IIS + SQL Server + ASP.NET(C#) 等)。
在同一段時間之內,我們最好專門于上面其中一個,并以此能達到求職的水平。而對于不同的技術派系,對于學習的側重點也是不同的。LNMP 至今在國內互聯網比較流行,我認為有三個主要的原因:
* 一是語言本身開發效率高,與 Java 開發后應用不同,構建一個 PHP 應用的開發環境和基本框架相當快速,而且結構簡單,更新極為方便。
* 二是 PHP 技術本身學習門檻比較低,語言本身學習門檻低,無論是對于沒有經驗的小白還是數年有經驗的 C 程序員。
* 三是語言開創的模式也有意思,當年的CGI 單進程頁面模式,大部分情況下基本不用考慮內存的消耗,HTML 代碼與 PHP 代碼能混用。
* 四是語言的成長過程中有小伙伴的給力相助,這些小伙伴就是 Linux、Apache 和 MySQL。
學習 LNMP,對 PHP 語言的學習,并不是唯一的,甚至不是最重要的,即使對于初學者而言,PHP 語言語法的學習也就是一兩周的事情。所以 LNMP 的學習,是一個整體的技術體系。
首先要學習Web開發的相關技術。
* A、首先是 HTTP 協議,DNS、IP、域名等基本的概念
* B、其次學習 HTML、CSS、JavaScript 等編程技術的基礎
* C、然后學習 PHP 語言,通過結合 前端技術,來了解一個 Web 應用的構建過程,PHP 與 HTML、CSS、JavaScript 是如何互相嵌入,互相鏈接完成一個整個應用的多頁面邏輯的。
* D、學習完基本構建,然后就進入部署環節,需要了解 Linux 和 Nginx。
* E、當應用做得復雜之后,就需要加上 MySQL 數據庫,在這個過程中,需要學習 PHP 大量的函數庫,如果光學習 PHP 語言,不學習函數庫,基本上是做不了產品的。
* F、在真實的項目構建過程中,我們還需要大量地用到開發的框架,比如國內最流行的像 ThinkPHP,其他的比如 Yii、Symfony,也有一定的受眾。
* G、其他的高階部分,我們在第三節展開講述。
學完以上這些內容,并且能夠獨立地使用這些技術,開發出常見的一些應用,比如做個門戶站點、小的日志博客系統、商品交易系統,才算是成為一個合格的入門級 PHP 程序員。
第二大派是 JavaEE 方向,盡管看起來是完全不同的體系,但是在學習路徑上有很多相似之處,當然也有非常多不同之處。
A、上面描述 PHP 時所講的 A、B 兩點對于無論是 LAMP、JavaEE 還是 ROR 都是適用的,所以這屬于 Web 開發的通識技術。
B、在具體的技術方面,Java 由于其是編譯語言,又是嚴謹的面向對象語言,在學習曲線上相比 PHP 而言更加地陡峭。
C、在構建 Web 頁面的過程中,倒是差別不大。同 PHP 相對的也有 JSP,也是能混用 HTML、CSS 這些技術的。
D、但是在部署和框架等方面,復雜度就更大了。比如 PHP 的引用,一個簡單的 require 就搞定了,并且有相當多的方面的函數庫,不用外接函數庫,基本上 PHP 可以搞定大部分的應用開發,但是 JavaEE 的開發,除了用到框架庫之外,也需要用到大量其他的第三方庫
E、Java 的包版本、庫的依賴、中文問題、Struts 配置等都會讓不少新手難以舒適地接受。
F、同 Apache 相對的,JSP 也有 Tomcat、Resin 等容器的使用。但是在部署方面也相對麻煩一些,當然,在實際的生產中,不可避免用一些構建工具幫我們完成除開發外的其他過程,比如 Maven、Ant、Gradle 等
G、另外需要學習的技術,比如 Linux、MySQL,我也是推薦的,這畢竟是應用運行的基石。
學習 Java,與 PHP 不同,相對會用到比較復雜的 IDE 工具,比如 Eclipse、Netbeans 等,雖然 PHP 開發也可以在這兩個 IDE 上進行,但是這不是必選項,但是在大型的 Java 項目中,這就成了必選項,因為在運行的過程中的包依賴和管理,如果沒有 IDE,會比較痛苦,導致命令行特別長。
第三大派的技術,我就不展開說了,因為在互聯網領域相對使用非常少,但是也可以做相應的替換,比如在 C# 體系中。Linux 被換成了Windows,JSP 被換成了 ASP.NET,Apache 或者 Tomcat 被換成了 IIS,而 MySQL 被換成了 Oracle 或者 SQL Server,Eclipse 被換成了 Visual Studio。
論語言本身,C# 本身可能比 PHP 甚至 Java 都更具亮點,但是有很多事情是要看環境和機遇的。Python 和 Ruby 也是如此,語言本身的設計比 PHP 可能來得好,盡管在國外,他們的流行程度可能不亞于 PHP,但是環境已經形成,要改變絕非一日之功。另外,這些年正在興起的 Web 后端開發技術,Go、Scala 也不可小瞧,至于另外一個 Node.js,我們在后面的技能延伸部分再展開講述。
##2、Web前端開發方向
相比后端業務邏輯開發 25 年以上的歷史,Web 前端作為一個獨立的職業存在,還不到 10 年。但是它的受重視程度已經超過了后端。這主要有四個原因:
* 首先是技術本身結構的完善和復雜化,讓這個工種的獨立不但成為可能,而且成為必要。其需要的技術難度雖說沒有 PHP 這么龐雜,但是難度并不見得小。
* 二是隨著當今設備的成熟,可以在設備前端或者瀏覽器端進行更為復雜的交互,而開發所謂的富客戶端應用有了天然的環境,性能瓶頸也不再是大的問題。
* 三是技術本身有良好的跨平臺、跨終端特性,無論是移動端和還是 PC、TV 等設備,無論是在 Android 還是在 iOS,我們可以用幾乎同樣的代碼,來完成功能,所以很受歡迎。
* 四是某些超級應用,比如移動端的微信等的出現,無論是營銷,還是游戲娛樂領域,加速了對相關人才的需求。
鑒于以上四點,我們充分看好Web前端開發學習的前景和錢景。因為它不但是時下所需要的,更是代表趨勢所需要的,并且由于難度的存在,有一定的競爭門檻。
Web 前端學什么?簡單點說,就是 HTML+CSS+JavaScript,各位要說了,那這不就是后端 PHP語言學習的那一小部分基礎嘛。話是這么說,但是技術學習,有層次之分,比如在 PHP 的學習中,我們更重要的是學習 HTML 的結構、CSS 的嵌入方式、簡單樣式來進行前后端代碼的嵌入或者套頁面,在 JavaScript 方面,也只需要學習基本的 JavaScript 語法,學會使用 jQuery,學會使用 Ajax 技術來前后端進行數據交互,就達到了要求了。但是如果以前端做為職業,內容一下子就更變更深和更寬起來。
* 在 HTML 方面,前端需要了解標簽特性,需要學習 HTML5,需要學習規范,語義標簽等。
* 而在 CSS 方面,除了熟識基本屬性,像盒模型、浮動等相對高級的主題之外,CSS3 中的動畫、新增布局等也是必須掌握的。需要能根據設計師所設計的 PSD 圖片,象素級地也編寫出相應的 HTML+CSS 代碼,此之謂“切圖”。切圖還不能光簡單地使用頁面在PC瀏覽器上正常顯示 ,還得考慮多終端的顯示技術,此之謂“響應式設計”。怎么樣,內容多多了吧。
* 而在 JavaScript 方面,要學習的內容也會多起來,閉包、作用域、原型鏈、動畫特效、HTML5 中的特性,哪一個又能少呢?JavaScript 是出了名的難學的,因為其語法相當靈活,這還不要緊,JavaScript 語言,本身就處于急劇的升級過程中,你會看到,下一個版本增加的特性,不亞于新學 JavaScript。
前端學了這三個就夠了嗎?也是遠遠不夠的,因為前端也在發展,項目也越做越大。
* 一個方面,語言本身的特性像 LocalStorage、WebSocket、Canvas 隨著技術的發展需要加以利用,以獲得更加強大的功能。而一個又一個的開源開發庫的使用更是工作中必不可少的,這些開發庫又從多個層面對語言特性進行提升,底層的庫如 Underscore.js、Sugar.js,再上一層增強庫比如 jQuery、Zepto、React 等,框架級的如 Angular.js、Backbone 等,其他的工具庫像 Swfupload/WebUploader、 Ueditor、ECharts、Lightbox 等,都是工作中的利器,其他的像 Bootstrap 也更是讓我們如虎添翼。
* 從另一個方面,前端開發人員也需要用到大量的工具來管理項目,獲取庫,所以像 npm、Bower、Less、Sass 等技術也成了前端開發人員必備的。前端開發人員的 IDE 還好,但是開發和調試工具的掌握也不是那么簡單的,Chrome 開發者工具、Google Closure、PageSpeed 等的使用是必備技能。
* 第三,由于前端開發技術的流行和受眾的廣泛,這個方向的技術也在迅速地延展應用的范圍。比如使用框架Cordova、PhoneGap等相關技術開發跨平臺的混合式應用,使用React Native 開發跨平臺的原生應用。
學完了這些,那只是基本功,在前端的開發和優化中,有多達三十條以上的優化準則,每一條背后的技術、原理和改進手段,是不是也應該關注呢?所以一個好的前端開發人員,是難得煉成的。如果做像微信這樣的內部嵌入應用開發,還需要對微信自身的 API 體系和規則有所學習和了解。需要學習微信應用自有的 JSSDK 和其他的 API 規范。在它的生態體系內,就需要去遵守,這也是開發人員應該去做的。老板和產品經理,提出來的是構想和結果,而整個過程的探索和坑,是需要開發人員去走的。
##3、原生移動開發方向
在有的公司里面,把原生移動開發方向也叫前端開發方向,但是我們這里做了區分。盡管第 2 個方向 Web 前端開發方向,我們也不斷地提到移動設備和微信等,但是它是用 HTML5 跨平臺的技術實現了移動端的 WebApp 應用的開發。這種技術的特點是需要依賴于瀏覽器或者瀏覽器內核而存在。就像微信的公眾號文章,其實就是一個網頁,內嵌在微信里能閱讀,因為微信的公眾號文章閱讀器,本身就是一個瀏覽器內核。
而本節討論的技術要點不同,是原生的移動應用,所謂原生,就是能安裝在操作系統層面,是不需要一個內嵌瀏覽器,應用是使用操作系統的原生控件而實現的。
根據系統的不同,也有不同的實現方式。對于 Android 系統,就是使用 Java 來進行 Android 開發,對于 iOS 系統,就是使用 Objective-C 或者 Swift 等來進行開發,對于 Windows Phone 系統,就是使用 C# 等來進行開發。
當然,除此之外,原生應用也有跨平臺的方式,比如 C++ 語言,比如 Flash 技術中的 Adobe Air,比如 C# 的 Xamarin,比如基于 JavaScript 的 React Native。盡管有如此多的第三方選擇,不過我們還是主要討論前者。
對于原生語言開發的學習,分為如下幾個層次:
* A、首先要學習的是原生語言本身,Java、Objective-C、Swift 或者 C#。
* B、正像學習了PHP語言語法本身并不能做出實際的后臺應用一樣,光學習了這些原生語言本身也是然并卵。還需要學習大量的開發庫。這些開發庫包括但不限于以下類型,界面控件庫(拖拽方式和代碼方式)、圖形庫、動畫庫、網絡操作庫、消息通知處理庫、地圖、硬件感應器庫、事件操作庫、數據存儲庫等等。
* C、還需要學習大量的為了方便某一操作的第三方庫,比如對 JSON 和 XML 的解析、增強的網絡操作、定制好下拉刷新控件、社交網絡和廣告統計 SDK、某些特定廠商如七牛的存儲操作 SDK 等等。
* D、上面的這些內容是零散的,我們需要將其整合在一起,形成一個完整的產品,這個開發的過程,是在點的知識基礎上形成面的過程,其中包括了提升項目開發中的非編程能力。
* E、在產品實現的基礎上,在本方向的學習和實踐中,有一個東西,比第 1、2 個方向的開發來得更為迫切,就是優化。由于 PC 端和服務器端的資源,相對比較充裕,而移動應用的資源則是相對比較稀缺的,所以在實現的基礎上的優化也很關鍵。無論是代碼寫法、庫的使用、還是素材使用、帶寬占用,都需要重點關注,這樣才能達到一個新的水平。
##4、底層研發方向
底層是相對應用層開發而言的,第 1、2、3 個方向所講述的技術都是應用層開發的技術,我們所開發的內容是跟某個具體的業務邏輯直接相關或者是用戶看得見摸得著的技術。
* A、比如在后端開發方向中,我們可能需要使用 PHP 庫的 API 來調用 MySQL 數據庫,存儲用戶注冊和登錄所需要的用戶身份信息。這里面不但涉及到 PHP 數據庫 API 的使用,更涉及到用戶信息的字段、存儲等問題。
* B、在前端開發中,我們要使用響應式設計技術,在 PC 上和手機設備上美觀地顯示出用戶的個人主頁,可能是通過前端后端結合直接生成頁面,在設備上渲染,也有可能是在頁面腳本上預置好顯示域,通過 Ajax或者BigPipe 等技術從服務器端獲得取數據來組裝顯示。
* C、在原生移動開發方向中,通過網絡獲取到應用后端的用戶數據,返回回來的可能是 JSON 或者 XML 數據,然后將用戶的信息顯示在界面的文本控件或者圖片控件中。
底層研發則與此相對,是跟某個具體的業務邏輯操作關系不大,而是對一類應用都適用的一些系統底層服務,不同的業務,但是底層可能相似甚至相同。比如緩存服務、隊列服務、全文檢索服務,這類服務不被用戶所直接感受到,但是對于一個大型應用而用,是至關重要的。此類服務的開發對人的要求更高,因為本身開發的調試難度大,對資源的要求也高,穩定性更是如此。此類服務所使用的技術,同前三個方向的技術也不相同,當然,比如說像 Java 語言,是可以發揮上用場的。
同前三個方向在學習的差異在哪里呢?
* 1、這個方向上的技術,相對更新的頻率是比較低的,比如前端,HTML5、響應式設計這樣的新概念可能層出不窮。而底層的多線程、分布式文件系統、緩存算法更新的相對慢一些,即使有新的技術比如壓縮算法經常出來,但是使用老的也沒有太大影響。
* 2、對算法和數據結構的要求較高。在業務邏輯的開發中,可能調用庫的 API,對數據進行組合和處理,就達到了要求,但是底層服務,可能需要面對的有大量的數據需要存儲在內存中,我們就需要使用更為高效的數據結構進行內存存儲,比如在網絡上進行傳輸的內容,我們可能除了對內容壓縮之外,可能還盡可能采用 MessagePack 這樣的存儲格式。
* 3、對語言本身的功底要求高,對于業務邏輯開發,重要的在于功能實現。對于底層服務,除了實現之外,穩定性要求也非常關鍵。比如使用 C 或者 C++ 進行開發,尤其需要關注內存的分配與回收。有些服務在短時間內看不出來內存的消耗,比如運行一天就泄漏了幾 M 內存,但是長久積累,也必釀成大患。筆者的工作經驗中,有運行三年還正常運行的服務。可以想見對開發者的要求之高。
那么,在這個方向上學什么呢?有多種不同的語言都能完成后端服務的開發,對于現有的團隊,我們按團隊所熟悉的和擅長的技術來進行推薦,比如你們團隊有 Java 大牛,就用 Java,有 C/C++ 的牛人,就用 C/C++,有 JavaScript 大牛,Node.js 也是不錯的選擇。對于新入行的個人,我建議輕易不要以這個方向做為初始方向,除非你有良好的算法功底。
無論是 Java、C/C++、Node.js,還是 Go、Erlang、Python 等,各種語言一般都能完成后端服務,不過各自的強項有所區別。
比如 Java 可能在網絡和庫方面,相對更為豐富,但是吃內存較高,不過當前這不是太大的問題,Hadoop 生態系統中大量的服務基于 Java 而開發。
C/C++ 的運行效率相對較高,但是對人的要求也高,尤其是內存和數據解析這些環節上,需要自己干比較多的低層的活。普適面比較廣泛,無論是內存型、CPU型、多線程型計算,它都是不錯的選擇。
Node.js 的服務則多見于 API 相關的服務,或者像 Websocket、Socket.io 這樣的服務,能快速低成本地構建起服務原型,從服務原型到產品本身也容易升級。
Go、Erlang 的強大更偏向于分布式和海量并發鏈接一些。Python 則傾向于快速開發實現。
本方向適合在校專業的大學生來關注和較長時間地積累學習,不推薦新手作為職業而投入學習,尤其不適合轉行的新手,但是對于一個成熟團隊或者快速發展的團隊,則是必須去關注的。
##5、游戲開發方向
前面的四個方向,我們都可以用其中的技術,為游戲開發提供服務,大部分技術還可以發揮作用,但是本文還是將游戲部分獨立開來,因為游戲實在是一個特殊的行業。從前端到后端,從移動端到底層服務端,從美術設計到策劃運營,都有自己的特殊性。我們在這里也加以敘述。
一個游戲產品的產生,在開發階段,主要包括三個工種:程序開發、游戲策劃和美術設計,游戲策劃相當于電影和電視劇的編劇這個工種,工作內容主要包含文案對話、場景的編寫和描述、打怪或者掉寶等的數值設計、關卡經驗升級策劃等。美術設計就是我們在游戲中所能看到的界面、畫面都是他們設計出來的,主要通過2D或者3D來表現,包含了戰斗場景、人物角色、動作過程和特效設計等。
而程序開發則根據不同的產品,區分出了不同的程序開發工種。大體上分為端游、頁游和手游,首先說頁游,由于是內嵌在網頁游戲器中的游戲,所以不需要下載客戶端,在早些時候,2012 年之前吧,主要以 Flash 技術為主來進行開發,而今,HTML5 已經興起,成為頁游開發的主力技術之一。而端游則一般根據不同的桌面系統,需要開發不同的客戶端,一般以 C++ 為主要計算機語言,比如在 Windows 上運行的端游戲,Visual C++ 和 MFC 技術,是必須要掌握的技術。手游則根據不同的平臺,對基礎技術的要求不同,比如 Android 平臺,要學會基本的 Android 應用開發,iOS 平臺,學會基本的 iOS 應用開發技術。對于跨平臺的,就需要學習 HTML5 基礎開發。然后在此基礎上,進行拓展,拓展的技術之中,其中最重要的是游戲引擎技術。比如 Windows 上的端游,游戲引擎 DirectX、OpenGL 等是必學科目,由于跨平臺游戲的興起,cocos2d-x 這樣的引擎也支持桌面游戲的開發,而在頁游中,Flash 引擎、Unity 引擎,國內的 HTML5 引擎如 Egret、cocos2d-x HTML5 版,其他的如 Box2D 等都需要學習和應用。手游除了 OpenGL ES,還需要學習 cocos、cocos2d-x 和 Unity3D 等引擎。在這些引擎的學習中,所需要的語言,與基礎語言也有別。比如 DirectX、OpenGL 在端游上一般是 C++,而在 iOS 和 Android 開發中,OpenGL ES 都有相應的 Objective-C 和 Java 版本,Flash 引擎,就是 ActionScript,Unity 插件的開發使用的各自平臺的原生語言,本身場景的開發則需要 C# 語言支持。
后端的技術,同 1、4 兩個方向的差別較小,我們可以使用 PHP 提供基本的接口服務,我們也需要使用一些底層的服務來對游戲的聊天啊、高并發進行支持。在此不再展開。
我想上面這些技術的描述,已經足以讓你暈乎和望而生畏了,不要太緊張。我們總結一下。
* 1、無論端游、頁游還是手游,本身基礎平臺應用的技術是要學習的。
* 2、如果不跨平臺,就要在上面的基礎之上,學習各自平臺的游戲引擎。至于具體用到什么技術,看引擎而定。
* 3、如果跨平臺,目前頁游戲的 Flash、端游和手游的 C++ 技術,是需要學習的,也建議加以學習。
* 4、總體看來,游戲開發人員的要求相對 Web 開發、前端和原生應用開發水平而言,要求要高一些。
* 5、由于游戲行業的特殊性,工作強度和壓力也會大很多,當然如果游戲成了,收入也是可觀的。
##6、智能硬件方向
互聯網發展到今天,經歷了人和信息互聯、人和人互聯兩個大的階段,現在進入人和物,物和人,物和物互聯網的第三階段,這個階段,屬于萬物互聯的時代。這個階段,如何操控周圍設備,制造新的設備的需求得到了空前的釋放。這也得益于移動互聯網的發展。智能手機的出現,智能手機中各種自帶來的模塊和傳感器的存在,讓這種互聯提供了良好的基礎設施。所以一個新的開發人員工種出現了,其實更嚴謹地說是開發工種升級,這個升級還是混搭的。
一方面,由于一般用 App 去操控硬件設備,所以前面說的原生移動應用開發方向的技術,也是這個方向的人所需要學習的。但是另一方面,還產生了兩個小方向的分化,一個方向是應用層的,應用層的,需要對已有手機上的設備與操控、數據采集、讀取、通訊有相當的了解。比如藍牙芯片,比如陀螺儀、空氣壓力傳感器,方向傳感器,加速度、地理位置、溫度、重力傳感器等等,在應用層上對這些設備進行控制是相對比較簡單的,因為智能手機系統的開發商,無論是 Android 和 iOS,都提供了相應的 SDK 對其進行訪問和處理。另一個是相對底層的,過去也有一個開發工種,叫嵌入式或者硬件開發,偏硬件一些,一般來講,以 Linux 方向的底層編程技術居多,這塊涉及到 Linux 底層 C 開發、ARM 體系結構、Linux 的驅動、移植等內容。
在自己制作的硬件上,硬件作為數據發生或者采集端,通過不同類型的傳感器采集不同的數據,比如步行、跳躍、心跳等,轉換為數字數據,再通過藍牙等常見模塊與手機 App 的數據交換,從而實現硬件和手機的雙向控制。
如果僅僅是作為硬件產品,上面這些內容可能也足夠了,但是現在有一個新的現象是,對于智能硬件的開發,我們也不能僅限于數據收集和交換數據,還需要同社交網絡比如像微信交換數據,這就需要我們的智能硬件產品接入微信硬件開放平臺。
從上面的描述可以看出,智能硬件開發的學習可以總結如下:
* 1、如果是偏硬件底層的開發,對底層驅動、Linux C、硬件體系結構的開發和認識是本方向特有的。
* 2、如果是偏應用層的開發,首先需要學習也是原生 APP 開發的那些技術優先。
* 3、然后才是跟硬件相關的 API,API 的學習相對是比較簡單的,這原因是每一種硬件,它的操作不多,從而 API 也會比較精簡。
* 4、總結來說就是這塊的開發,對算法的要求水平并不是很高,但是對于可靠性,內存使用方面就頗為苛刻了。因為硬件的升級和資源都是比較大的問題。
##7、其他相關方向
上面這些已經包含了當前的主要開發工種,但是是否已經全了呢。也不盡然,比如運維、測試、大數據等需要一定編程開發水平的專業并沒有包含在前面的描述中,所以在這里也加以描述。
運維方向從狹義地來理解就是維護機房設施、機器設備、系統安裝、軟件升級這幾個層面,也形成了一些不同的工種,比如網絡管理員,可能偏重于網絡設備和防火墻的維護,比如系統管理員(SA),偏重于系統維護、軟件升級等,數據庫管理員(DBA)偏重于數據庫維護與優化。但是運維工作在這些年出現了兩個趨勢。一個是云計算平臺的興起,讓運維的層面減少了對機房、機器、網絡等設備的維護,另外一個方面增加了不少類型的監控服務,比如監控日志的,監控安全的,監控服務器性能的,監控域名健壯性的 DNSPod,監控應用程序性能的 OneAPM 等。第二個趨勢是 DevOps,也就是說開發和運維要在一定程度上互相跨界。做開發的要明白運維,而反過來,做運維的童鞋也需要去了解開發,當然這個開發,是業務開發。比如你運維的是 PHP 站點,那么對 PHP 本身機理了解會讓你如魚得水。
即使只做運維,運維本身也有一些需要你去了解和學習的,當然,相比開發,這個學習的內容就少多了。在互聯網公司做運維,第一個是 Shell,無論是開發監控腳本,還是自動化一些繁雜瑣碎的工作流程,Shell 都是很好的粘合劑,所以 Shell 也稱做膠水語言(Glue Language)。由于一般做運維要涉及到大量的日志分析等工作,當然這些工作 Shell,也可以完成,但是相對更專業一些的語言,Awk、Sed、Python 或者 PHP 如果能加以學習,將會讓你的日志處理和分析工作如虎添翼。
運維在一個互聯網公司中,相對職位需求是比較少的一個崗位,并且工作也相對更加繁瑣,要求7X24小時響應,工資方面也較開發低一些。
測試按不同的分類方法,需要的能力不同,比如分為黑盒測試和白盒測試,前者如果是手工測試,一般并不需要編程水平,也接觸不到代碼,但是如果是自動化測試,就需要編寫一些腳本,比如 iMacros、Selenium 這樣的插件,就是支持自動化腳本錄制、編寫的,難度比較低。而白盒測試就比較好理解了,因為是從代碼的層面去發現 BUG,并提出修正的建議,所以對編程語言的熟悉是必要的,當然需要什么,就看產品而定。如果是從功能測試、體驗測試、性能測試等類型進行區分,手工測試部分不需要代碼,自動化部分需要代碼,而壓力測試部分,像 LoadRunner 也是有專門的腳本的,命令行工具部分,只是學習命令行就 OK 了,還不到寫代碼的層面。
測試工作在比較正規的,開發模式比較成熟的團隊需求更加迫切一切,在普通的小團隊,或者產品快速開發的團隊,缺少這種角色的存在。有幾個原因,一是由于互聯網的產品更新迭代太快,可能上午發現了BUG,下午就要上線,可能來不及有一個復雜的測試流程。其實來講,產品的質量首先由開發人員把控,其次由產品人員來控制,只加給測試是不公平的,他們也是承受不起的。
最后再來說一下大數據領域,筆者在之前接觸過一些做 JavaEE 的開發人員,他們想轉到互聯網公司工作,而大部分互聯網公司并不需要純粹的 JavaEE 開發人員,所以就選了大數據領域做為一個切入點,并轉型成功。目前我們狹義地說大數據,都是指 Hadoop 生態系統,這個生態下面的軟件,大部分都使用了 Java 軟件開發,所以 Java 技能成為了從事大數據的必備技能之一。但是實際上從事大數據專業,開發的分量只占其中一部分,大部分的工作,在于構建和維護一個 Hadoop 集群,并采用其生態系統中各類不同的服務的服務來存儲(Hadoop
HBase)、處理(Sqoop、Flume)和分析數據(Hive、Pig、Manhout)。除此之外,在得到了一些結果了之后,還需要使用一些統計語言如R進行分析,最后使用Web或者移動Web App的前后端技術對結果進行展示。
關于學編程學什么這個話題的概述就講完了,至于各個方面上詳細需要學習什么,我想即使一個方向一本書也講不完,所以不再詳細展開,這里只給大家一個方向性的指引,同時也做幾點補充說明。雖然我們的話題以程序員作為討論的整體,但是大部分情況下更傾向于討論互聯網行業的程序員,因為這才是未來和方向,而不是純軟件領域。其次,互聯網行業的程序員和軟件領域的程序員存在相當大的不同。小到作息時間,比如軟件領域的程序員可能作息是下了班,基本沒有工作上的事情需要處理,而互聯網領域的程序員可能隨時需要聯機處理故障,如果出了問題,中飯不能吃,熬夜也要及時解決,而軟件領域的程序員,只要發布的時間未到,這個時間安排是不太緊急,是固定的。大到工作習慣和意識,軟件領域的程序員,可能更看重軟件工程,代碼編寫,但是不太考慮迭代,大用戶量,而互聯網領域程序員更看重實現和高性能并發。這些考慮,并無是非之分,有的只是習慣的差別。但是一旦這個角色發生切換的時候,這種意識也可相應地轉變,否則是不能合格的。