#技術方向的選擇
在前面的章節中,已經了解了知識學習的生理原理、學習方法之后,在下面的三個小節中,我將和大家一起探討作為程序員所要學習的內容,編程到底學什么?合適學些什么?
下面的部分分為3個小節,第1小節從技術趨勢、個人條件、職業目標等方面來分析什么樣的技術是合適的我們學習的。第2小節,分成了7個部分,以技術崗位為依據,介紹了今下編程各個可能的技術方向。第3個小節探討在方向選擇的基礎上,如何進行技術方向的延伸和升級。并討論了如何成為全棧工程師和架構師的話題。
##選擇方向
人之為人,做任何事情都是有目標和意義的,編寫程序所需要的學習也不例外,所學的內容,得從我們學習的出發點談起。
技術五花八門,以語言為例,就有C、C++、PHP、Java、Python、Ruby等,這些年Go、Swift、Scala也在興起。種類也繁多,比如有瀏覽器前端的開發技術,服務器端的開發技術,大數據技術等,近些年又興起了云計算、VR等,在每一個領域,程序員的工作雖然都簡單地呼之為“編程”。但是這一個簡單的詞語之下,可能存在相當大的差別。因為即使是編程,也包羅甚廣,牽扯到多個不同的技術方向、編程語言,進而由不同的技術方向、編程語言演化成了多種不同的職位。在每一個職位上,想成為專家,都至少要以3-5年以上的積累,按著《異類》的觀點,要想在一個行業成為專家,必須有10000小時的積累。所以回過頭來說,即使是在技術領域,想精于所有的內容,不太可能,哪怕是一個垂直領域,也不容易。既然不能全部來學,那首先學什么就要依據我們的目標而定了。
那什么是目標,怎么定目標呢?目標說得正式一點就是你的規劃,甚至是職業規劃。因為我們的大多數學習肯定都不是為學而學,應該想自己在學習了這門或者這類技術之后成一個什么樣的人,如果你真只是興趣來看看,本書估計也不是你想看的。這個目標會引導你來學習,不至于失去方向,也不至于被一些相干不相干的東西所誘惑。下面的闡述,我們首先來講如何定目標,然后再探討有關于技術的學習,討論也圍繞不同的目標而展開,對于初學者,選取其中一個目標來參考學習即可。
有人說,人的一生有7次機會,對你的人生路徑進行選擇,這個選擇,大多是關于職業和成長的選擇,而這每一步選擇都至關重要,除了大的像高考、娶妻這樣的選擇之外,還有的小的像學什么編程方向、在哪里定居這樣的選擇。所以我們在面對程序員學什么這個話題的時候,不是一上來就抱著技術書開始啃了。這樣的話,只會導致你關注當下,而忘記了你要前進的方向,有一句話說得好,方向比努力更重要,如果方向不對,努力也是白費的,并且越努力越白費,不是么?
而如何選擇方向,這個得從兩個大方面來說,第一個是大勢,大勢指的是國家大勢、產業大勢、技術趨勢。第二個是個人的情況。個人的情況則是指個人的背景技能、知識以及興趣、身體等方面,也包括家庭成長環境和相應經濟狀況,對于個人成長的期望。大勢決定了應該選擇的方向,個人決定了你是否適合于這一行,決定了你有多少資本付出。
###大勢
在人類的歷史進程中,科學技術是推動社會發展的重要引擎,每一次的技術革新,人類發展都向前邁一大步,小到鐵具發明、馬蹬出現,拓展了人類能力的邊界,大到蒸汽機、電力的出現,造就了一次又一次的工業革命,互聯網時代,這是第三次工業革命,技術更成為第一生產力。但是正如歷史發展所表明,技術會隨著發展更新換代、迭代演進,有的永遠進了博物館,有的則一代又一代煥發光芒。在這長久的演進的過程中,每一種技術都有人追隨,每一種技術也許都有過浪潮之巔的輝煌,也許都有過谷底的迷茫。相比歷史的演進,人的生命是多么地短暫,渺小,在這種對比的過程中,我們選擇哪種技術來追隨,就成了一個需要慎之又慎的問題。所以本節,我們就探討趨勢,以讓我們的選擇是緊跟趨勢,此之謂“識時務者為俊杰”。
####國家大勢
為什么把國家大勢寫在前面呢?因為產業和行業都是受國家政策引導的,國家是最大的環境因素,所以先需要認清的是國家政策和發展方向。比如比特幣行業受到國內的管制較為嚴格,如果想以比特幣為職業方向,研究比特幣技術,是有相當風險的。當然,興趣除外。正向的比如這些年創業,在國家這些層面得到了充分的重視,那么,在加入一個成熟的上市公司和一個快速發展中的創業公司而言,后者的投資回報率可能更大。所以,去關注重點行業的創業公司缺乏什么樣的人才,自己做什么樣的準備。
那現在的國家大勢是什么呢?個人提一些看法,希望能對大家認清這塊有所幫助。
* A、中國到目前,已不再是人口過剩和高速增長了,而是勞動人口在減少和經濟增長速度減緩了
* B、大量行業存在產能過剩,存在大量不能適應經濟發展和轉型的就業人口
* C、大學里培養出來的人才,滿足不了社會的需求。
* 所以可以看到相應的國家政策是:
* A、放開二胎了,延遲退休(要增加適齡勞動人口)了
* B、GDP的目標變成范圍(不能光追求一個數字)了
* C、要從刺激消費,變成供給側改革(這個的意思是說產能過剩,不單單由于消費需求被壓制,更大的原因是供給過剩)了
* D、要重視職業教育(之前是向人口數量要產出,現在要向人口質量要產出)了
如此等等,都是國家大勢下國家政策的體現。
####產業大勢
了解完了國家政策,那么該進入什么樣的大行業呢?勿庸置疑,本書是討論程序員學習,肯定我們關注的也是程序員所能工作的行業,整個IT產業都有程序員能發揮作用的地方,那么是不是IT行業所有細分領域都值得我們去呢?肯定不是!比如信息化行業,軟件行業,相比同互聯網結合聯密的互聯網+行業,后者更值得我們去,舉個例子,做鋼鐵信息化的公司與鋼鐵產業互聯網的代表公司找鋼網相比,后者更值得我們去關注。
下面講幾個可能正在轉變的趨勢。
* A、現在經濟處于轉型升級時期,各行各業都向互聯網轉型升級,產業互聯網的轉型大潮興起了幾年,尚未進入高潮,還有的是機會。
* B、不能向人口數量要產出了,要向人口質量要產出了,而人民生活水平提高,而第二胎也放開了,所以無論從幼教到興趣教育到職業教育,都會有不錯的機會。
* C、企業不能像過去那么粗放經營了,所以提高企業效能的手段都會產生價值,這就是近年B2B的SaaS逐漸興起的原因。
* D、PC端的軟件產業,比如ERP,管理系統,都會面臨著向移動端的升級,君不見,釘釘、易快報等移動端辦公軟件崛起得非同尋常?
* E、嵌入式行業也面臨結合互聯網和社交的再一級升級,這就是萬物互聯(IOT)的時代。如果選擇行業,這些是我們應該關注的。
* F、還有一些行業,也正在興起,比如機器人、人工智能、VR、AR,雖然行業早期進入有風險,但是代表了未來,而不是代表沒落。
在選擇行業和專業時,我們需要去關注這些領域,而不是光從自己目前所知所學出發,另外最好結合已有的優勢,比如你在大學學的是一些相對來講需要調整轉型的專業,比如治金專業,你想進入互聯網行業,可以考慮治金行業轉型升級的機會,兩不相擾。
####技術趨勢
光就編程技術而言,發展到今天也分為了幾大體系,分別來做一個簡單的了解,對這些體系的分類,是從各種不同的設備的開發應用上講的。
* 1、操作系統和底層服務開發
這部分一般是C/C++ 占據了絕大部分市場,比如 Linux、Unix 操作系統、Nginx 服務器都是用 C 寫的,而 MySQL 大量的代碼基于C++ ,另外一些適合后端開發的語言,寫底層服務也不在少數,比如Java、Go 等,像Docker是Go語言的項目,而Hadoop 則大部分代碼基于 Java。 另外少部分服務,也基于Python、Node.js 等來編寫,因為能快速地做出可用的原型。像Websocket 之類協議的服務器。
* 2、桌面端應用開發
三大桌面操作系統,Windows、Mac OSX、Linux 都有自己的開發技術和體系。其中 Windows 上的桌面應用開發,如果是Windows 原生的應用,大多集于微軟自身的技術,包括 Visual C++(主要語言為C++,但是需要大量使用 Windows 上的SDK 和MFC 庫)、Visual C#(編程語言為C#)、Visual Basic(編程語言為Basic) 等,當然也有一些相對沒落的第三方開發工具,比如C++ Builder(主經編程語言為C++,同樣有自己核心的VCL庫)和Delphi(語言為 Object Pascal)
等。在Mac OSX 上,主流的當然是蘋果官方的 Objective-C,后面會逐步地演進到推薦使用 Swift,開發的 IDE 也是官方的 Xcode。在 Linux 中, QT 和 GTK 開發是主流手段。QT一般是用C++語言,而GTK本身是C所寫,編寫桌面應用時調用它可以使用多種編程語言。比如C++,PHP, Guile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel等。當然,話說回來,這些開發技術,并不是說在領域內嚴格地限定,比如C#,在Linux、Mac OSX 上有著名的Mono 開源項目,可以使用C#開發桌面應用,GTK 也同樣移植到了Linux 之外的系統之中。這里也不得不提一下Java,Java 本身有自己的圖形庫Swing 和 AWT ,所以使用Java 能編寫跨三大平臺的桌面應用。
* 3、瀏覽器端應用開發
同桌面端系統各自一家獨大,甚至占山為王不同,瀏覽器由于生在互聯網這么一個天生開放分享的環境之上,所以從21世紀初,大家追求的目標,就是標準化。相關的技術,HTML、CSS、JavaScript 都是標準化的技術。只是各個瀏覽器對版本的兼容,實現,稍有不同而已。在早期階段,開發跨瀏覽器的應用還需要經常有一些所謂的Hack,而今,基本上寫好頁面代碼,各個瀏覽器就通用了,只是在不同的設備類型之間存在適配和兼容。加上有一些更為便捷的開發框架,比如jQuery、支持響應式設計 的Bootstrap,讓頁面開發變成一件幸福的事兒。瀏覽器端應用開發,除了流行的這些技術之外,Flash 技術等也有一定的市場,不過隨著HTML5 時代的到來,其將逐漸退出歷史舞臺。HTML5 是HTML的一個升級版,但是常規地認識,HTML5是一個技術的綜合稱呼,其中包括HTML第5版、CSS3 和 JavaScript的增強。
* 4、后端業務邏輯開發
上面介紹的第1點是服務器端底層技術,這些技術是公用的、底層的,并且即使前端的業務和形態發展,后端和底層并不會有太大的變化。無論是針對手機應用的后端,還是網站后端,數據庫、負載均衡等這些技術,都是一樣的。并無太大的不同。而除了這些底層技術之外,還需要有實現后端業務邏輯的技術。這些技術直接和底層服務,如數據庫和緩存直接通信,并生成響應請求給到前端,供瀏覽器和App調用。選擇做后端業務開發,有大量的語言和技術可供選擇,比如Java、PHP、C#、Ruby、Python等都可以,每個都有自己的特點和適應環境,但是作為一個選擇,不能僅從語言或者技術本身的適應性和特點出來,還有很多需要參考的因素,比如技術成熟、生態體系等等。
* 5、客戶端開發
隨著移動互聯網的興起,尤其是社交、游戲、O2O一波又一波,加上國家極力倡導全民創業、萬眾創新,更是讓客戶端開發高潮迭起。所以客戶端的技術人員也是供不應求。正像桌面開發三大平臺一樣,客戶端開發也有三大移動平臺,Linux 系的Android系統,Mac OSX 系統的iOS系統,Windows 系的Windows Phone開發。這屬于原生應用開發,各個平臺各寫一套對于低成本的開發和嘗試并不是一個特別好的選擇,所以混合式應用開發以及各種跨平臺開發技術就應運而生,并且越來越流行。
以上簡要介紹了五種開發技術,現在我們分析一下各個方面技術的發展趨勢和可能的前景。
操作系統和底層開發,永遠都是技術中較為頂尖的一塊,這塊一方面,對于編程功底需要有比較強的要求,所有開發的成果,也并不是那么直接地能為用戶所用。所以需要的是底子比較好,對C、C++等底層語言掌握到位的人。一般轉行的程序員,或者非科班出身,想進入這個領域難度比較大,要進入這行,半年甚至一年的學習和訓練都是遠遠不夠的。當然,絕不是說不可以,如果你愿意投入,耐得住寂寞,又對計算機邏輯、算法,有比較好的悟性和掌握,這也是可以來做的。但是我們又需要考慮到另外一點,就是這塊,作為職業的話,這塊的需求和前景永遠都在,不過要的人是比較少的,在一個大型的互聯網公司里,做核心開發的人員,可能占工程師人數也不會超過10%,對人的水平要求也比較高。當然,薪資水平也是排在前列的,盡管不是最高的。
桌面系統開發盡管是一個需要的領域,但是這是一個市場份額急劇縮小的領域。有的還是原來的一些通用軟件,很難有一個新的桌面軟件,從無到有然后迅速占領大量市場份額了,即使有,也必須有其他的服務來考慮,比如云端服務,像Slack、有道云筆記。桌面軟件有其好處,比如安裝在用戶桌面上,軟件權限更多,起動速度更快。但是軟件更新不即時、安裝麻煩是其永久的硬傷。對于初學者而言,進入這塊的門檻不低,需要學語言本身,需要學習各個平臺自己的庫,而桌面軟件相對來講邏輯也比較復雜,又加之是一個縮小的市場,所以不建議進入,因為大部分的中小型互聯網公司,根本不會有桌面開發的業務,要想做桌面開發,只能去少許大公司的桌面軟件部分,比如QQ客戶端、微信客戶端、安全軟件、壓縮軟件等或者傳統軟件公司。又因為大部分的操作都已經Web化和移動化了,在瀏覽器和移動設備端就能實現,比如像ERP、項目管理等,所以這兩個領域的人才需求更大一些。
瀏覽器端開發技術,也就是Web開發技術從21世紀初到現在,一直在不斷地演進,從早期的特別簡單的HTML,到后面的表格布局,到瀏覽器兼容問題處理,再到后面的標準化,Ajax的出現,促成了Web前端作為一個職業而產生,到了近期,HTML5 ,智能手機的興起,更是讓前端的領地從PC端延伸到了移動端。前端開發需求量在越來越大,薪資也自然是水漲船高。一個剛畢業能獨立 做事的前端,拿個8K是個常態,工作兩到三年的熟手,上到15K也是經常發生的。而從另一個層面來講,前端開發又是一個相對容易入門的行業,HTML、CSS、JavaScript入門學習曲線比較平,所以前端方向適合轉行學習和喜歡做能即時看見效果的朋友學習,所以業界有一個現象是做前端的女生比較多,當然JavaScript的學習曲線到了高級部分還是比較陡的,所以又有一個現象是前端高手太少。這個方向的學習需要我們對用戶體驗有一個較好的把握,同時對于新出現的技術,喜歡去嘗試和鼓搗,并大膽嘗試和應用到工作之中,比如最近的幾年中,響應式設計,AngularJS、Bootstrap 等,作為前端開發人員,都應該去了解和使用,絕對不是一個學完了,就可以用上好幾年的技術領域。
后端業務邏輯開發的語言有很多,能做的事情也有很多,以筆者的經歷為例,在 2002 年前后,開始做網站開發,使用的是 ASP 腳本語言,使用的是 HTML 和 VBScrpt 配合,讀取 Access 數據庫,后來讀取 SQL Server 數據庫。后來又用 ASP.NET(基于 C# )開發網站系統,再后來進入工作崗位,使用 JSP、J2EE、Swing 開發富交互的 WebGIS 系統前后端,后來又用 PHP 開發全文檢索的業務邏輯端,底層用 Java 開發 Lucene 應用,再后面是用 Perl 等開發文本和視頻處理腳本,用 C 開發底層爬蟲邏輯,再后來基本就是 PHP,開發網站大型應用邏輯。對比前端 HTML5 技術,后端的技術和框架技術,更為龐雜,但是在演進上也相對慢一些。理論上講,學習哪一種技術,都有工作的機會,但是我們也不能隨意選擇。比如同樣是 JSP 和 JavaEE 應用開發,如果選擇做 ERP 等軟件系統,相對就是一個過時的選擇,而去網站后端相對就更好一些,如果是應用的后端 API 也很不錯,這是時下流行的。那也許有同學就要說了,不都是同樣的技術么?做哪個不一樣嗎?理論上說是這樣,但是做 ERP 和做互聯網產品,面對的流量量級是不在一個層次上的,所以對于很多問題的經驗處理也不是在同一個層次上的,做軟件,重視的是各種復雜的邏輯和工作流的處理,做互聯網更看重的是簡潔的邏輯和高并發的架構。不同的路徑,導致了不同的能力層次,也會導向不同的工作機會,做互聯網產品的薪資水平和機會,相比做軟件的機會要好得多,并且多得多,當然壓力也大得多,不過年輕人就應該直面壓力,不是么?學習這個領域,需要的不僅僅是學會了語言,更需要的是業務能力,比如做游戲后端的整體設計能力,以及怎么寫出更高質量、更具有可維護性和擴展性的代碼。更重要的是,對于架構和大用戶量、大數據的追求和把握,可能是到了一定年限的工程師所需要去追求的。這個方向短時間內不會太過時,但是有很多的核心服務,比如數據庫服務、存儲服務等,會慢慢地被云服務所取代。這個領域,由于成果不太能看得見,摸得著,所以相比前端,女生學習的比例非常少。
移動客戶端開發是近年隨著智能手機興起的開發技術。勿庸置疑,這是正在興起的朝陽行業,由于移動互聯網比傳統互聯網能更緊密地把人聯結在一起,所以移動互聯網產生了比傳統互聯網更大的機會。那么,是不是,學習移動客戶端開發一定就一勞永逸呢?首先在技術研發領域,沒有一勞永逸的事情。其次,客戶端開發,同Web前端開發的機理是類似的,在有的公司也叫前端開發。做前端開發一個最大的缺陷是,能掌控的是界面和體驗,但是絕對不是整個應用的核心技術。再次,在平臺的選擇中,也要考慮到,Android(主要基于Java語言)和iOS(主要基于Objective-C語言,將被Swift語言替代)是目前最大的兩個平臺。如果選擇專職做Windows Phone 或者其他沒落的平臺,可能工作機會就相對少得多。第四,由于在客戶端研發中,每個不同的平臺,一般需要從頭到尾從新研發,所以跨平臺的研發技術,對于純原生的Android、iOS應用開發造成了挑戰。總之,隨著設備的更新升級,跨平臺開發技術,也許會更加流行。因此,在關注原生技術的同時,也不能固步自封。學習這個方向是很有前途的,但是不能僅僅關注應用在界面端的繪制和簡單的交互邏輯的實現,更要關注代碼的架構和可維護性,以及在有條件的情況下,能更了解后端,以寫出更好的代碼,同時學習相關聯的技術。
以上就是對于各種技術及其趨勢的一個簡單分析。在選擇這些技術的時候,我們應該選擇面向未來的技術,而不是沒落的技術,應該選擇職業面廣技術,而不是就業機會少的技術。應該選擇承載用戶量大的技術,而不是用戶量少的技術。我們選擇技術學習,也不要偏執地認為,某一種技術,就一定比另一種技術好。大多數情況下,特別是職業發展到一定程度,往往是學會了多種技術的,而技術之間,往往也是融會貫通,學了一種之后,學習另外一種,不是那么地困難。比如蘋果 Swift 語言出來之后,對于有好幾年的編程熟手而言,學習一門 Swift 也就是幾天的事情。學習 iOS 的 UI 開發,使用 UIKit ,跟使用 Java 的 Swing 和 Windows Form 控件并無太大的不同。這也是全棧工程師之所以能產生的原因。當然,在我們的眼里認為,全棧并不意味著全能。后面就會分析到。
技術方向這么多,編程語言這么多,在我們學習,尤其是初學者學習的時候,不要貪多,專注學習解決當前問題或者達成當前目標所需要去學習的技術,比如,想學會開發網站,就不需要去關心客戶端怎么做,重點學習好 HTML、CSS、JavaScript,再加一些框架和后端語言,比如PHP,最后也一點,也是最重要的一點,職業發展的高度,往往不是說你會某一門技術而決定的,而是由對于邏輯、計算機算法、原理本身的理解,以及對業務的把控等能力而體現的,因此,除了學習流行技術之外,我們也要關注自己的更編碼能力、算法功底的增強。
####個人情況
除了技術趨勢之外,選擇學什么跟個人條件緊密相關。這里筆者就從個人體會和面試經驗出發分析一下。
主要分為以下幾個方面:
#####1、學歷背景
編程本身并不需要學歷背景,從5-6歲開始就可以接受編程思維,比如 Uber 創始人卡拉尼克6歲左右開始學習編程,10歲左右就可以開始使用編程語言編寫軟件,比如微軟創始人比爾蓋茨、Facebook創始人扎克伯格、Telsa CEO 馬斯克都是在10歲左右開始學習編程。有初中以上文化,對編程思維和邏輯的基本理解也不會存在問題。但是對于某些知識有要求。羅飛老師并沒有上過大學,但是其對計算機編程的理解和掌握比一般的科班人好不少。但是對有些能力還是有要求的,比如英語,如果對英語很發悚,單詞不識幾個,也沒有決心想學好,那編程工作也有可能不適合你。總結起來,我們至少得考慮三個方面的事情。
* 英語水平
首先是英語水平,在學編程中,雖然不是說英語要達到多少多少級,但是英文水平對于學編程有非常重要的作用,尤其是發展到一定階段,尋求上升時,特別是在解決一些編程問題時,在中文網站上,往往很難找到合適的資料。所以需要從國外的網站,比如 Stack Overflow 上去了解。如果學歷上的限制,導致了英語水平不行,也是要注意加以改進的。
* 從業圈子
由于學歷的不同,可能接觸到不同的圈子,或者由于某些原因,比如不太自信,從而不一定能接觸到高一級別的圈子。當然,所謂圈子的事其實是看你本身的能力的。只要你有能力,你就能進入圈子,如果沒有能力,即使進入了圈子,也不一定能發揮作用。
* 工作機會
僅管學歷并不代表能力,但是高學歷,好學歷的人在大多數情況下是相對比較優秀的。因而在公司招人的時候,為了降低自己選拔人才的成本,會把學歷當做一個檢測標準,過不了的話,就基本上不會有機會。
如果學歷比較低,非得學習一些對算法等要求比較高、比較底層的技術,而這些技術,又相對是在大公司才需要比較多人才,而小公司不怎么需要的技術,那這樣就是走了一條成功機會不大的彎路。反之,我們應該去學一些技術門檻比較低的,比如網絡維護管理、運維、前端頁面開發、后端頁面邏輯開發等工作,可能更加適合。
#####2.專業背景
計算機編程,相對也是一個專業技術工作,雖然上面說了,高中畢業水平,并不影響編程學習和水平的發揮,甚至技術和職業成長也不影響。但是如果從大學生過來,想迅速學習技術和求職,還是要考慮一下專業背景。
編程行業,是一個工科工種,如果想快速地進入編程行業,最好有一定的專業背景,計算機專業最好,工科和數學等理科專業次之,其他文科專業相對就會比較費勁,當然這也不絕對,在我們優才團隊還有文科專業背景不錯的研發同事,看似例外,實則沒有例外,他在上大學時,就不喜歡自己的專業,對計算機的鼓搗比一般科班的人還多。
計算機科學與技術、計算機應用、軟件工程等專業的同學算是計算機科班出身的同學,這些同學在大學(這里指的是一般的國內大學)里會學習 C/C++ 或者 Java 等編程語言。所以針對前面所說的方向,有針對性地學習一門流行技術,并不是難事。建議基于自己的已知技能和興趣出發,專注地搞定一種技能,比如有 Java 經驗的,可以開發 Android 應用,有 C/C++ 經驗地,可以學習 iOS 開發,或者學自己感興趣的,Swift、JavaScript、PHP等都是不錯的。學習來相對比非專業背景的同學有優勢 。
其他的電子工程、自動化、通信、信息管理與信息系統、電子商務等專業方向,則屬于計算機相關專業,這些同學所學習的內容,讓其對計算機編程的原理有過一定程度的了解,也有過編程語言的經驗。在選擇方向時,建議從職業目標出發。而不僅僅是從已知出發,筆者面試過不下數百人,大學生由于在學校缺乏相應的技能準備,于是乎在找工作時,想當然地從自己的已知出發,要找 C/C++,嵌入式開發等方面的工作,殊不知這些工作市面上的職位需求少之又少,要求又高,關鍵是薪水待遇還很一般,同此相似,在國內有些同學學 Python、Ruby,也是如此,不從市場需求出發,純粹從某些建議或者自己的喜好出發,導致找工作時機會少、薪資低。
其他理工科專業。其實理工科轉計算機專業都不存在特別困難的專業門檻,反而在筆者的職業過程中,有不少大牛,并不是計算機專業的,甚至也不是計算機相關專業的,而是出自物理、地理等院系,筆者也分析了一下原因,就是由于計算機專業的人,往往仗著自己的專業,而并不是特別地下功夫學習,而這些理工專業轉學計算機的,相當地賣力,大學又有好的環境和比較硬的理學類學科底子,從而很多底子都學得很扎實。
文科專業的大學生,轉計算機程序開發的并不是特別多,不過有一過方向,我見過不少做得不錯的,文科生不少,那就是前端。前端由于入門門檻比較底,除非是 JavaScript 專業開發,否則對人的邏輯要求并不是那么地高,所以設計、數字媒體等有一定設計背景的同學轉前端,就自然而然了。更有甚者,我見過一個前端不錯的朋友,是來自于國貿專業。至于其他方向,除非有特別的興趣,并不建議文科同學去嘗試和挑戰。
#####3.性格興趣
由于編程行業,是一個腦力工作,要求對邏輯、理性、好靜的要求多一些,對發散、感性、好動的要求少一些,如果你是屬于后者的重度表現者,耐不住寂寞的話,那么編程即使要學也可能只適合你作為興趣,而不是一個職業。
編程方向不同,需要人的基本素質也有不同。底層和核心的研發,需要的是比較嚴謹、縝密的邏輯,在沒有用戶界面的情況下,清晰地分析和對各種情況進行測試。需要人能細心地堅持,可能比較長一段時間,都在編寫一個模塊,增加一個功能,調試一個BUG。需要有很強的分析問題和解決問題的能力,在編寫的東西上線或者發布了之后,能夠在最大程度減小損失和影響的情況下分析問題,修復問題。
對于前端的研發,如果涉及到從圖形到頁面的代碼的轉換,除了從技能上要學會一定程度的PS操作之外,也需要有一定的美感,并有一定程度的細心、細致。比如對于一個沒有美感和粗心的人,切出來的圖,如果本領不過硬的話,可能會或多或少有偏差或者失真。而對于有美感和細心的人,可能能發現設計和交互上的缺陷,對于一個像素的不足也會想辦法去改進。
而對于后端業務開發,需要的能力可能比較綜合。而不僅僅是編程技術,比如包括前后端協調、綜合,包括業務能力的分析,相比底層開發,后端業務邏輯開發,需要與人打交道的地方,比如開會、分配業務、收集反饋等,要多得多。所以如果是特別不愿意和人打交道,技術水平和底子又不錯的,而且對開發用戶邏輯產品沒有什么興趣的話,可以學習底層方向。如果愿意開發用戶能直接使用的產品,則去學習后端業務開發方向。
對于移動端開發,同前端開發一樣,需要注重的是交互和用戶體驗,所以在這塊有一定基礎或者愿意培養的同學,可能適合做移動端開發。因為對于做移動應用和其他客戶端產品而言,有比較大量的工作是在做界面和界面上的交互,即使交互之下,也需要考慮用戶體驗,所以最好除了技術實現之外,在用戶體驗方面有自己的看法和考慮。
#####4.家庭環境
雖然沒有說某類家庭環境出身的人只能做某類事情,但是個人的擇業跟家庭成長還是分不開的。比如你本來大學就是助學貸款上的,還繼續去連讀碩士、博士就相對就會比較困難,那么計算機編程這個行業相對來講就適合你,這個行業對學歷的重視比某些行業,比如金融、公務員行業弱得多。
如果你是富二代,甚至家里還有產業要繼承,那么相對加班加點,辛苦勞作的編程行業并不見得你能真正投入,如果不能全心投入,也不會有太大的成就,除非以此為鍛煉和跳板,進一步轉入創業。
我相信,絕大多數以編程作為職業的兄弟姐妹們都是普通人家的孩子,以藉此在這個時代取得一份穩定發展,薪資不錯的工作,賺的可是一份辛苦錢。
家庭經濟條件其實也是要考慮的,由于大學里不教這些技術,所以一般需要通過自學或者是通過培訓學校的學習。而培訓學校的學習,無論哪個方向都會是一筆不小的費用。最便宜的市面上是前端培訓,也要大幾千塊,最貴的(除去 SAP 之類的)培訓,比如 iOS 方向,一般在 16000 塊以上。而學習 iOS ,除了學費本身之外,還需要有設備,像蘋果電腦 、iPhone、iPad 這樣的設備,當然了,培訓學校本身會提供貸款、設備也由學校出,到了工作單位一般單位也會配電腦。不過一般情況下,除了公司設備之外,程序員在業務還需要能鼓搗和學習,這個時候就需要一筆投入。不過總的來講,這種投入和產出比是非常花算的。即使高達 16000 塊的學費,也就是畢業以后兩個月的工資而已。
如果是完全自學,這些投入可能需要自己去投入。所以在經濟條件上是需要去考慮一下的,如果實在想學 iOS 開發,自學的話,一種是安裝黑蘋果,借用別人的設備和賬號,其次是曲線救國,比如先去自學像前端、PHP等除了電腦之外,基本不需要額外成本的技術,在通過實習等工作機會賺到的一定的錢,再去學習 iOS 開發。
編程工作,對身體也有一定的要求,我親手帶過的資質不錯的小兄弟,由于有一定眼疾,離開了這個行業,盯住電腦到了一定的長度,就非常不舒服,所以真的是身體不合適,也就不要勉強。
最后就是你的興趣和愛好,如果對編程的沒有興趣,完全是強迫為之,如果是那種下了班,關了電腦就不想開機的同學,我是不建議你學習這行的,這行的成就需要你的努力和付出,絕不僅是上班那幾個小時,甚至更重要的提升來自于上班后的付出,要做互聯網的話,7X24能聯機是一個基本的工作職責上的需求。
聊了這么多,知道想學什么了嗎?如果你符合上面的推薦對象,那恭喜你!如果不是也不要太過在意,凡是總有例外,編程這個行業,拼的是個人能力和努力,無論你是什么情況,在這里,都可以找到你的存在和成就感,那怕是純興趣,只要你選擇它,它都不會嫌棄你!