① 如何成為一名程序員 6種方法來成為一名程序員
目錄方法1:網路編程1、了解網路編程的含義。2、瀏覽不同的網站,了解它們的外觀。3、學習至少一種頭腦風暴技術/方法,並學習一個用來實現頭腦風暴的軟體。4、熟悉網站結構。5、趕緊學一門圖形設計的課程。6、了解網路下部構造的基本情況。7、巧伍輪學習HTML和CSS語言。8、學習XML及其相關技術,比如XSL和XPath(不是必需,僅作推薦)。9、先建立簡單的靜態網站,直至你熟悉並習慣HTML語言。10、學習客戶端腳本語言。11、熟悉你所學的客戶端腳本語言。12、學習至少一種伺服器端腳本語言。13、學完伺服器端編程語言之後就開始創建一個試驗項目。14、獲得你的網站,開始用你自己的網頁實驗。方法2:桌面軟體編程1、弄清楚桌面軟體編程是怎麼回事。2、了解不同的電腦硬體結構。3、學習一種入門級(小孩子學的那種)編程語言。4、學習程序化、面向對象、函數設序設計規范的入門。5、學習一種程序化程式設計語言的入門課程。6、學習至少一種高級建模技術,比如UML 或ORM。7、開始編寫一些小的主控台應用程式或類似的應用程式。8、學習一門你選擇的編程語言的更高級課程。9、應用你所10、至少再學習一門編程語言規范的入門課程。11、試著比較你所學的兩門編程語言。12、利用你學過的一種語言來學習可視化編程概念。13、開始把你所學的知識運用到你設計的軟體小工程中。14、創建一個虛擬的"畢業工程"。15、通過學習更高級的課程、更加註意細節以及在網上學習搭建架構的技巧,來加深對你學過的可視化架孝信構/庫/包的理解。16、搜索其他含可視化元素的包/庫並學習它們。17、學習圖形學課程(而非圖形設計)。18、成為游戲程序員(不是必須的)。方法3:分布式程序設計1、處理分布式應用編程。2、快速了解通信系統及其硬體。3、熟悉網路硬體結構和設備,比如集線器、接線台和路由器。4、學習網路協議的課程。5、學習XML 語言,並熟悉它。6、開始學習一門shell腳本語言。7、開始時用上你學的腳本知識,只運用程序化程式設計。8、使用你所學的腳本語言,寫出實現機器之間通信的腳本。9、轉移到桌面腳本/編程語言。10、專注於語言的核心部分,尤其hi那些支持網路。11、學習分布式應用設計與結構的課程。12、使用你所學的編程語言來了解服務部分建構和服務。13、學習如下技術中一種或更多。方法4:庫/平台/框架/核心編程1、了解什麼是核心編程。2、學習一門支持創建可重復使用內容/包的編程語言,如果你還沒學過的話。3、學習一門UML 和ORM的高級課程。4、學習軟體工程的課程。5、學習至少一個模塊,基於內容的、面對對象的和 事件驅動編程技術和概念。6、進一步了解不同的操作系統及其支持的編程架構。7、集中學習獨立平台架構、編程語言和技術。8、如果到目前為止你學習的編程語言具有ANSI/ISO/EEE/W3C標准版本,那麼掌握這些標准。9、嘗試模擬簡單的、已經建立的庫,尤其是開源的庫。10、在你的編程領域內尋找開源的包。11、學習不同方法。方法5:系統編程1、了解系統編程的定義。2、跟著"桌面應用程序員"的前三個步驟。3、橘山學習線性代數的入門課程。4、學習微積分課程。5、學習邏輯學和/或離散數學課程。6、了解不同的"准操作系統"。7、學習計算機硬體結構的課程(或者作為替代,看看書)。8、深入理解不同的計算機硬體平台。9、初步熟悉你所選擇的硬體平台/操作系統的匯編語言。10、學習ANSI C 和 C++ 語言,還有程序化程式設計的一些概念。11、在你選擇的平台上理解並實踐C/C++標准庫。12、搜索網路資源、書籍和課程來理解你的平台獨特的C風格。13、用C/C++練習編寫高級代碼。14、學習更高級的Assembly。15、學習操作系統設計的課程。16、尋找並閱讀你所選擇的平台的相關文章。17、練習你已經掌握的知識。18、以最有益的順序學習語言。方法6:編程科學1、了解編程科學家是做什麼的。2、累積和四年制計算機科學學歷同等多的科學知識。3、選擇特定的領域。4、考慮獲取更高級的學歷。5、了解你選擇的編程領域的相關技術和編程語言。成為程序員是一個日積月累的過程,需要日復一日年復一年的技能增長。編程本身是有趣的,並且有回報(腦力層面、精神層面、經濟層面)。這份指南不能保證你輕松當上程序員。不要神化下面這些步驟,從中你大概能了解在現今編程界如何成為一名程序員。
方法1:網路編程
1、了解網路編程的含義。網路應用是指設計在網路結構頂層的軟體部分。這就意味著這些應用是通過諸如火狐或IE之類的瀏覽器來處理的。架構於網路結構的頂層並不一定要連接到網路。這就是說網路應用建立在如下標准網路技術的頂層:HTTP
FTP
POP3
SMTP
TCP
IP協議
HTML
XML
Coldfusion
ASP
JSP
PHP
ASP.NET
2、瀏覽不同的網站,了解它們的外觀。(右擊,選擇"查看源"或按F12。)尋找網站類型/內容的多樣性,而非數量。通常你需要訪問以下網站類型中至少一種: 團體網站(商業公司,非營利機構/組織,政府組織)
網路索引引擎(搜索引擎,meta搜索網站,專業化搜索引擎,目錄)
數據挖掘網站
個人網站
信息/網路全書式網頁(維基,數據單,技術規格,人工列表目錄,博客和日誌,新聞和新聞機構網站,黃頁,等等。)
社交網站(社交門戶,書簽網站,記錄筆記網站)
合作網站(這包含了上面提及的目錄,比如維基和博客)
3、學習至少一種頭腦風暴技術/方法,並學習一個用來實現頭腦風暴的軟體。例如:頭腦風暴圖和微軟Visio。
4、熟悉網站結構。指的是創建概念化網路範式、網路地圖和導航結構。
5、趕緊學一門圖形設計的課程。盡量學習至少一個圖形編輯/操作軟體包(不是必須的,但強烈推薦)
6、了解網路下部構造的基本情況。包括了解以下: 基本網路服務協議(HTTP,FTP, SMTP和POP3或IMAP4)
網路伺服器軟體(最好其中一個就是你以後主要工作的平台)
網路瀏覽軟體
郵件伺服器和客戶端軟體
7、學習HTML和CSS語言。或許你還想要"所見即所得"軟體包來編輯HTML。
8、學習XML及其相關技術,比如XSL和XPath(不是必需,僅作推薦)。
9、先建立簡單的靜態網站,直至你熟悉並習慣HTML語言。
10、學習客戶端腳本語言。多數人要麼學Java,要麼學VB,但也有一些人學習Perl和DHTML。
11、熟悉你所學的客戶端腳本語言。潛意識里提醒自己只用你學的那個語言。只有在你熟悉你的客戶端腳本語言之後才能進入下個步驟。
12、學習至少一種伺服器端腳本語言。如果你只用一種伺服器軟體,那就學其中一種編程語言。否則,你得每個伺服器軟體都學至少一種編程語言。
13、學完伺服器端編程語言之後就開始創建一個試驗項目。
14、獲得你的網站,開始用你自己的網頁實驗。
方法2:桌面軟體編程
1、弄清楚桌面軟體編程是怎麼回事。多數桌面軟體程序員都是編寫商務需要的代碼,所以好好了解一下商業及其組織和經濟結構將對節省時間、提高效率大有裨益。
2、了解不同的電腦硬體結構。看看數字電路設計和電腦結構的入門級課程,但是也有人認為這對於剛起步來說太超前了,所以看兩三篇說明的文章(比如 這一篇 和 這一篇)就夠了。學完第一種編程語言後你可以再返回這個步驟。
3、學習一種入門級(小孩子學的那種)編程語言。不要因為你不是個小孩子就不好意思去學。這些入門級語言能大大減輕你正式學習第一門編程語言時的痛苦和壓力。然而這一步也不是必須的。你也可以在上一步之前完成。
4、學習程序化、面向對象、函數設序設計規范的入門。
5、學習一種程序化程式設計語言的入門課程。無論你以後選擇何種編程語言,在某種程度上它都要求程序化程式設計。此外,據多數程序員反映,程序化程式設計總的來說是了解編程的一個很好的切入點。
6、學習至少一種高級建模技術,比如UML 或ORM。
7、開始編寫一些小的主控台應用程式或類似的應用程式。你可以利用編程書中的常見小練習。選擇一個工具,用你所學的編程語言編寫程序。
8、學習一門你選擇的編程語言的更高級課程。確保進展之前先理解下列概念,並能熟練運用。對程序用戶輸入輸出信息。
程式化設計語言寫成的程序中的邏輯流程和執行流程。
聲明、分配和比較變數
編程結構分支,比如if..then..else 和 select/switch..case.
循環結構,比如while..do, do..while/until, for..next.
創建、調用程序與函數的編程句法
數據類型及如何操控
用戶定義數據類型(records/structs/units)及其使用
如果你的語言支持超載函數,理解它。
你選擇的語言的內存處理方式(指針,變數窺視,等等。)
如果你的語言支持運營商超載,理解它。
如果你的語言支持delegates/函數指針,理解它。
9、應用你所學的高級技能 面向對象的規范
10、至少再學習一門編程語言規范的入門課程。推薦學習每種範式的編程語言,多數高級程序員確實是這么做的,然而,通常你開始時只學一種,應用所學知識訓練了一段時間,獲得了編程的鮮活經驗,然後接著學習另一種。試試下面的語言: 邏輯編程範式
函數編程範式
面向對象的範式
11、試著比較你所學的兩門編程語言。評估各自利弊。通常可按以下方法完成拿出你在學習第一門編程語言時編寫的簡單範例,現在用第二門語言重新編寫。
創建一個工程,盡量用上兩種語言完成它。有時取決於你選擇的工程和語言,你可能僅用一門語言還無法完成這個工程呢!
寫一份兩種語言之間相似結構和獨特之處對比的速查表或一覽表。
盡量使用另一門語言找到模仿這兩門語言中獨特之處的辦法。
12、利用你學過的一種語言來學習可視化編程概念。幾乎所有的編程語言都具有支持可視化編程和其他支持控制台或類似控制台編程的版本/庫。同時進行的包括: 初步了解事件驅動編程。在某種程度上,多數可視化編程依賴事件及事件處理(用上你選擇的語言)。
盡可能多的嘗試桌面軟體,理解軟體是做什麼的。多數軟體開發公司會提供產品的測試版,你可以拿來測試軟體。在完善用戶界面方面保持更新。
閱讀關於圖形用戶界面的文章或教程。
13、開始把你所學的知識運用到你設計的軟體小工程中。盡量把你的編程專業知識運用到你日常生活中的問題上。比如,編寫程序,批量重命名文件,視覺上比較文本文件,復制目錄里的文件名到內存/文本文件之類的東西。剛開始簡單一點。
14、創建一個虛擬的"畢業工程"。把這個放到最後完成,用上你到目前為止學到的可視化編程技術。
15、通過學習更高級的課程、更加註意細節以及在網上學習搭建架構的技巧,來加深對你學過的可視化架構/庫/包的理解。
16、搜索其他含可視化元素的包/庫並學習它們。
17、學習圖形學課程(而非圖形設計)。對於想要寫出吸引人的用戶界面元素的程序員來說,這將大有裨益。
18、成為游戲程序員(不是必須的)。很大程度上游戲編程是被當作桌面編程的。如果你想成為游戲程序員,完成這些步驟後你需要進一步學習游戲編程。對於游戲程序員而言,圖形學課程是必須的,後續步驟中第二門語言應該選擇邏輯/函數編程語言(最好是Prolog或Lisp)。
方法3:分布式程序設計
1、處理分布式應用編程。分布式應用編程被許多人認為是最難學的一種,它要求計算機和通信技術中的不同知識。
2、快速了解通信系統及其硬體。這個步驟不是必須的,但是對於理解網路拓撲結構很有用。
3、熟悉網路硬體結構和設備,比如集線器、接線台和路由器。
4、學習網路協議的課程。在你開始分布式應用編程之前,你需要好好理解"開放系統互聯 (OSI) "模型、以太、IP、TCP、UDP和HTTP 。
5、學習XML 語言,並熟悉它。
6、開始學習一門shell腳本語言。對基於Windows的編程,可以是任何能與Windows腳本宿主兼容的腳本。對基於Linux的編程,Bash腳本和 Perl就夠了。對這兩個平台都強烈推薦Java,原因如下: 幾乎所有操作系統的都支持腳本宿主(Windows 腳本宿主默認支持java ,大多數Linux發行版都有支持java腳本控制的包)。
許多開發者認為它很容易學。
當你需要學第二門編程語言(C,C++,C#,Java和J#都有ALGOL開源句法)時,它擁有的ALGLO開源句法就能使你熟悉更多編程語言
通過學習java,你會熟悉網頁的客戶端腳本,這可謂一大福利!
7、開始時用上你學的腳本知識,只運用程序化程式設計。之後,根據你的腳本語言和它所支持的,你可以用上更高級的編程技巧和範式。所有的腳本語言在某種程度上都有程序化程式設計的一些方面。
8、使用你所學的腳本語言,寫出實現機器之間通信的腳本。學習完成這個所必需的東西。簡單的通信就足夠了。
9、轉移到桌面腳本/編程語言。一個比較好的是多範式語言,比如Python。簡單了解第二門語言。有許多理由讓多數程序員選擇java。然而,在這個領域內C#正在獲得多數優勢。Java和C#被青睞的原因如下:它們是面向對象的編程語言,使大量程序員免遭實現細節之苦,因為它們都支持組成部分(代碼單元、預編譯,它們可以執行特定任務,並被用到其他程序中)。
它們支持事件驅動編程,在某種程度上還支持OO和程式化程序設計。
建立語言的架構按屬性分布(比如Java)。
有許多現成的包來處理。社交網路同時作為開源代碼和架構內置包,這使得程序員繼續其他人工作更加容易。
10、專注於語言的核心部分,尤其hi那些支持網路。少注意用戶界面元素,比如輸出,窗口設計和技術等。
11、學習分布式應用設計與結構的課程。可以通過書本、網上教程或學術課程來完成。然而,十分有必要理解分布式應用的結構及其概念。
12、使用你所學的編程語言來了解服務部分建構和服務。
13、學習如下技術中一種或更多。推薦你每一種都了解以下。多數分布式應用程序員不會止於一兩門編程語言,他們會每個操作系統各學至少一種語言。這是因為如果你希望你的應用"分布式",你應該至少為每個主要的操作系統各提供一個版本。公共對象訪問代理體系結構(CORBA)
簡單對象訪問協議(SOAP)
非同步JavaScript和XML(AJAX)
分布式組建對象模型(DCOM)
.NET遠程處理
XML 網路服務
方法4:庫/平台/框架/核心編程
1、了解什麼是核心編程。核心程序員幾乎都是高級程序員,已經從編寫應用轉變為給其他程序員編寫代碼匯編。
2、學習一門支持創建可重復使用內容/包的編程語言,如果你還沒學過的話。
3、學習一門UML 和ORM的高級課程。多數庫開發者使用其中一種,或兩種都用。
4、學習軟體工程的課程。
5、學習至少一個模塊,基於內容的、面對對象的和 事件驅動編程技術和概念。你所學覆蓋越多編程範式和語言,你就能成為越成功的庫/包程序員。
6、進一步了解不同的操作系統及其支持的編程架構。
7、集中學習獨立平台架構、編程語言和技術。
8、如果到目前為止你學習的編程語言具有ANSI/ISO/EEE/W3C標准版本,那麼掌握這些標准。無論何時盡可能使用標准代碼。
9、嘗試模擬簡單的、已經建立的庫,尤其是開源的庫。這在成為庫/包程序員的早期階段十分有用。從簡單的包開始,比如單位轉換和中間科學計算包。如果你是大學生,利用你的非編程課程,嘗試把這些課程的方程式與核心科學用作庫。
10、在你的編程領域內尋找開源的包。首先下載包的二進制/可執行文件。盡量去用,並發現它的利弊。之後,下載源,盡量弄明白它是怎麼完成的。嘗試再創造這些庫或其部分。剛開始,看完代碼再做;之後,先做再看代碼。後期階段,嘗試完善那些庫。
11、學習不同方法。給程序員分發、配送內容。通常,庫/包程序員傾向於以遞歸和/或迭代的思想來思考他們面臨的所有問題 。盡量把每個問題當作一個小問題的匯編(一系列更小的任務)或一個重復的不斷縮小問題范圍直至把這些更小的范圍彼此堆到一起的處理過程去思考。
庫/包程序員傾向於概括化。也就是說,當面臨一個特定的簡單的問題時,他們通常會想到一個更為概括的問題,並努力解決這個更概括的問題,如此,小問題便不攻自破。
方法5:系統編程
1、了解系統編程的定義。系統編程處理的是編程的"科學",而不是具體的編程實現。不要把你自己栓到特定平台上。
2、跟著"桌面應用程序員"的前三個步驟。
3、學習線性代數的入門課程。
4、學習微積分課程。
5、學習邏輯學和/或離散數學課程。
6、了解不同的"准操作系統"。這可以通過以下途徑完成:了解操作系統是如何安裝的。
了解在一台PC上如何安裝不同的操作系統(不是必須的,但作為推薦)
安裝不止一種操作系統。不要在系統中安裝任何輔助包,相反,僅利用操作系統本身提供的函數。
7、學習計算機硬體結構的課程(或者作為替代,看看書)。
8、深入理解不同的計算機硬體平台。
9、初步熟悉你所選擇的硬體平台/操作系統的匯編語言。稍後你會學習其他平台/系統的匯編。
10、學習ANSI C 和 C++ 語言,還有程序化程式設計的一些概念。
11、在你選擇的平台上理解並實踐C/C++標准庫。尤其注意標准模板庫(STL)和活動模板庫(ATL)。
12、搜索網路資源、書籍和課程來理解你的平台獨特的C風格。
13、用C/C++練習編寫高級代碼。
14、學習更高級的Assembly。
15、學習操作系統設計的課程。
16、尋找並閱讀你所選擇的平台的相關文章。如果你選的是基於Unix的操作系統就會容易得多。充分理解你今後將要用來工作的系統。
17、練習你已經掌握的知識。首先創建小的系統軟體。如下通常很有用: 試著重創你系統中已有的小工具。
試著把其他系統中的應用移植到你的系統里。
18、以最有益的順序學習語言。此處是唯一強調第一門編程語言的地方。首先學習ANSI C 而不是 C++、C#、Java 、D。然後學習 C++。限制你第一門語言僅為C是因為系統編程要求程序員熟悉如下概念:源代碼真實、完全的編譯
低級對象輸出文件
鏈接二進制
低級機器語言/匯編編程。C語言被某些人認為是偽飾過的/更容易學習的匯編語言。只要你願意,它還支持插入匯編語言代碼,並且它只是程序化的(像匯編)。
方法6:編程科學
1、了解編程科學家是做什麼的。編程科學家是十分高級的程序員,他們不開發程序,但他們研究計算科學,比如密碼學、編程語言和數據挖掘演算法。沒有深入的學術研究是很難達到這個水準的。
2、累積和四年制計算機科學學歷同等多的科學知識。可通過如下其中一種完成: 獲得真實的學術學歷(這也是通常情況)。
從現代大學中獲得該學歷要求的課程大綱,自學課程或 分開一門門學。理論上這樣做也可以,但還是推薦第一種做法。
3、選擇特定的領域。越具體越好。這取決於你的偏好。但是這里給出計算機編程領域中一些主要的課題:演算法設計(例如搜索、分類、密碼、解碼、錯誤檢測 等)
編程語言/編譯器設計/最優化
人工智慧領域(模式識別,語音識別,自然語言處理,神經網路)
機器人技術
科學編程
超級計算
計算機輔助設計/模式(CAD/CAM)
虛擬現實
計算機圖形學(計算機圖形學通常和圖形設計或圖形用戶界面設計混淆,計算機圖形學是研究如何表示和操控計算機系統中的圖形的領域)
4、考慮獲取更高級的學歷。或許你想追求碩士學歷或博士學歷。
5、了解你選擇的編程領域的相關技術和編程語言。
小提示不管你想嘗試哪種編程,不管你想達到何種水平,考慮去學校或本地社區大學上課。不要被諸如「計算機科學」一類的術語嚇到。你參加的任何不需要預備課程的課程都應該集中教一些編程的基礎知識。在上課之前先咨詢一下老師或客服,確保這門課是你想要的,像「計算機文化」這樣的課很有可能更多地集中在教你更熟悉辦公應用之類。
② 自學了編程,怎麼在網上接單
作為一名開發者,該如何走向自由職業?
這正是這篇文章要討論的問題,我們會先介紹開發者走向自由職業的 4 種常見方式,然後聊聊開始自由職業前必做的 5 種准備。最後,還會分享我個人的 2 點深切體會。
走向自由職業的 4 種常見方式
技術出色的開發者,通常具有下列能力:
軟體開發,即針對特定領域問題,運用思維、分析、設計、想像力等尋找答案,通過語言、技術框架、工具等編寫軟體來實現答案的能力。
講授,即把自己明白的技術、軟體、解決方案等展示給別人並讓別人也明白的能力。
咨詢,即通過你所儲備的知識、技能、經驗、框架等幫助別人解決問題的能力。
熱愛分享的開發者還會擁有另一項核心競爭力:寫作。
軟體開發、講授、寫作、咨詢這四種能力,構成了開發者走向自由職業的 4 種常見方式。
軟體開發
很多開發者都聽說過「私活」,也接過私活。所謂私活,就是個人通過某種途徑承接的軟體項目,相對於公司的「公」而言,這種形式被稱為「私」,現在這種方式還有很多說法,比如外包、眾包、任務等。
這是我們開發者走向自由職業的最常見方式。
我個人幫助別人修改過開源代碼,用 Qt 開發過 PC 端軟體,對這種方式有一些體會。除了軟體開發,你還需要下列能力:客戶開發、商務談判、項目管理。
這種方式很直接,不斷開發客戶,承接項目,賺取報酬。其好處是:你獲得的報酬是按項目金額來的,而不是按月薪。套用某二手車買賣平台的廣告語,沒有中間商賺差價。
想想看,你在公司,一個項目是 100 萬,你一個人一個月搞定了,也還是拿三幾萬的薪水;而如果你自己接到這個項目,一個月完成,那你這個月就賺到 100 萬(暫不考慮增值稅、個人所得稅等隱性成本),天差地別對吧。所以,獨立開發軟體項目是誘惑力很強的方式!
這種方式也有一些比較困擾人的問題:你並不總是能接到項目。需求可能不斷變化,你需要直接面對這點,還要管理這種狀況:項目款不一定能及時到賬,尾款也不見得能收回來。
還有,如果你想獨自承接稍大一點的項目,你還需要注冊一個公司來承接項目(稍大點兒的項目都是公對公),擁有一家公司,也會產生一些成本,比如代賬、房產稅、企業所得稅等。
不過現在的眾包方式,會好一些,像解放號、雲沃客、碼市、程序員客棧等平台,都有使用這種方式協作的項目,你只要做你擅長的事情——軟體開發——就好了,別的事情由別人或平台來完成(你需要支付平台一些提現費用,一般10%左右)。
講授
如果你具有良好的講授能力,就能把自己在某個技術棧上深厚的積累換一個形式變現:講課。
沒錯,你可以把自己學精學透的技術講給別人聽,把別人教明白。這是非常有價值的事情!
很多人在初學某種技術時都需要好的老師、好的教程幫助他們跨過從不知道到知道、從知道到做到的距離。
IT 技能類的課程,能幫助別人掌握一技之長,幫助別人賺到錢,需求一直很旺盛。這些年線上的平台發展很快,很多學員也願意低成本在線學習,像 51CTO 學院、CSDN 學院、慕課網、極客學院、網易雲課堂、騰訊課堂、淘寶教育等平台,都很受歡迎。
我個人錄制過 Qt 和 Node.js 方面的課程,放在 51CTO 學院和 CSDN 學院出售,有些 3 年前的課程,現在還有人購買。
如果你可以運用講授能力,把自己的技術積累轉化為在線課程,就可以利用在線教育這種方式實現自由職業。
我所潛伏的 51CTO 講師群里,有不少靠編程課程實現自由職業的講師,原來都是開發者。在雙 11 、IT 充電節等活動期間,有很多講師一天銷售額過萬。
這種方式有幾項好處:
●啟動成本低
●受眾面廣
●一份時間賣多次
●想像空間大
寫作
2013 年下半年,我恢復了 CSDN 技術博客的更新,專注分享 Qt 技術,很快成了 Qt 領域的知名博客,被不少人關注。後來一些文章被編輯看到,聯系我出版 Qt 方面的圖書,於是我通過 《Qt on Android 核心編程》和《Qt Quick 核心編程》等圖書建立了影響力和品牌,反過來博客也因此擁有了更多的訪問。
2015 年我開通了微信公眾號,一周更新三篇文章,同年出版了《你好哇,程序員》一書。
2017 年 7 月份,憑借寫作帶來的自信,我離開公司,開始自由職業,通過寫作、講課等方式獲取收入。
我的朋友楊開振,因為所著圖書《深入淺出 MyBatis 技術原理與實戰》銷量很好,於 2017 年 4 月份離開組織,通過寫作實現了自由職業。
寫作是程序員自由飛翔的翅膀,它能幫你積累影響力,建立個人品牌,並且,也能夠直接變現。對於開發者來講,寫作是通往自由之路最強有力的武器。
寫作這條路具有無與倫比的好處:
●啟動成本低
●個人可以獨立完成
●可以直接建立影響力和個人品牌
●一份時間賣無數次
●有想像力
它最大的困難在於:
●如何寫好
●如何捕捉到更為廣泛且強烈的需求
●如何持續寫下去
咨詢
如果你看過《我的前半生》這部電視劇,一定對賀涵印象深刻,他做的就是咨詢工作:用自己的知識、經驗、技能、思維、框架等幫別人解決問題。
在 IT 領域,如果你有完善的技能樹和豐富的經驗,能夠站在較高的層面上做全局性思考,善於尋本溯源地分析解決問題,也可以從事咨詢顧問之類的工作,不受雇於特定的組織,直接為客戶服務。
著名網站庫殼的創建者左耳朵耗子陳皓,擅長底層技術架構,對高性能、高可用性、分布式、高並發,以及大規模數據處理系統有豐富的經驗和心得。
他有段時間因為個人原因不能在公司上班,就通過為其他公司提供技術咨詢來獲取收入,並且,收入還蠻高。
我有段時間就希望通過為一些公司提供技術咨詢來賺錢,但沒有成功。
我還記得有家公司的老闆對我說的話:你加入我們公司,帶著團隊把項目做起來,然後就可以成為我們的咨詢顧問。
看見了吧,這就是獨立咨詢的難處:當你不夠牛 X 時,沒有人願意為你不知所謂無法確認效果的咨詢付費,開發客戶很難很難。ThoughtWorks 的很多咨詢顧問雖然有公司為其背書,也還是常常遭人詬病:你自己沒做過什麼項目,憑什麼給我們提供建議?
雖然很難,但這確實是一條路,如果你有志於此,可以看看享譽世界 IT 領域的咨詢顧問、美國計算機名人堂代表人物傑拉爾德·溫伯格寫的《咨詢的奧秘》,那是聖經式的著作。
當然,除此之外,你還要在自由之前,就積累一些客戶資源,並且為客戶留下你具備咨詢能力的深刻印象,這樣他們才可能成為你自由後的衣食父母。
走向自由職業必做的 5 種准備
如果你確認了走向自由職業的方式,接下來就該做准備了。根據我的個人經驗,下面 5 種准備是必須要做的:
●變現方式
●市場測試
●飽和度測試
●預期管理
●B和Z方案
變現方式
我所說的變現方式,包含兩種:賣時間和賣產品。
這里的賣時間,指「一份時間賣一次」這種工作方式。你在企業內工作,就是在賣時間,朝九晚五,每天 8 小時,每個月領薪水。
以賣時間的方式實現自由職業,實質還是用你的專業能力為客戶提供時間層面上的專屬服務(你不可能在同一時刻為不同的客戶服務),只是你不再受雇於企業,不再受規章制度約束,能夠按照你自己的意願安排在什麼時間用什麼方式完成服務。外包、眾包、私活、咨詢等方式,都是賣時間。
賣產品則是指「一份時間賣多次」這種工作方式,像我們前面提到的寫作、在線課程等,都可以歸為此類。它相比賣時間的方式,具有更大的想像空間,可以獲得規模化的收入。可能你寫出一本經典、暢銷的書,做出一個爆款的課程,就可以獲得幾十萬的收入。
在自由職業之前,你需要確認你最突出的能力,選定你首要的變現方式——因為你業余時間有限,不可能同時做很多事情。
市場測試
在離開組織自由職業之前,你需要測試一下,你賴以實現自由職業的變現方式,可以給你帶來多大規模的收入。
比如你做技術課程,一定要先在業余時間開發幾門課程,放到 51CTO 學院或者騰訊課堂之類的在線教育平台上去賣賣看,統計一下收入情況,看這些收入能不能維持你可以接受的生活水平。
比如你寫書,也要出版一本,觀察半年,看看銷量,看看能拿到多少版稅。前面提到的楊開振,他是利用業余時間寫出了《深入淺出 MyBatis 技術原理與實戰》這本書,半年內賣了 2 萬冊,拿到了十幾萬的版稅,才決定自由職業的。
比如你做軟體外包或者私活,也要開發幾個客戶接幾個項目看看收入情況;如果做眾包,則可以到雲沃客、解放號、程序員客棧、碼市等地方去驗證半年左右,看自己的開發技能,能為自己帶來多少單子多少收入。
如果你不做任何准備,不經市場測試,腦子一熱就脫離組織,往往會陷入冷啟動的泥沼,腸子悔青。
假如做市場測試時發現收入很低,做不起來,不要氣餒,要看看別人,尤其是和你經驗、水平、身份差不多的人,有沒有做得好的。
比如我寫書,版稅很低,一本賣三五千冊,不賺什麼錢。可是楊開振一本書半年賣 2 萬冊,版稅談得也高,就有很可觀的收入。那這個時候,就要找差距,看怎麼提高。
飽和度測試
自由職業不是不工作,只是不在組織內工作而已,你依然要投入足夠的時間才能創造像樣的產出賺到你想要的錢。
你在單位上班時,老闆們會給你安排事情,你不用考慮工作負荷是否飽和,哪怕你一天到晚沒事兒干,也可以領到一份薪水。自由職業後就不一樣了,你必須主動安排工作,讓自己有足夠的負荷,否則你逍遙自在不了多久就會陷入困境。
飽和度測試就是要讓你提前適應自由職業後自我安排工作的特點,看看你規劃出來准備在自由職業時做的事情,能不能把你的時間填滿。
可以分兩步: 先全力去做,看能不能把你現在的業余時間填滿。假如填不滿,OK,你不用自由職業,就繼續現在的工作,業余時間做你想做的事情,賺一份額外收入就行了。
假如你現在業余時間遠遠不夠用,那估算下到底會佔多少時間,平均每天幾個小時。假如平均每天4個小時,那OK,另外 4 個小時你做什麼?你需要再找點兒事情來填滿它,可以是賺錢的事情,也可以是興趣、愛好、休閑,總之你如果有大把時間無事可干,就會出問題。
預期管理
預期管理包括四個方面:
冷啟動周期。像接項目、寫書、在線課程,都有個回款周期,所以你應該設想一下,你可以承受的無收入的起始階段有多長,並為此准備一些錢,比如你預計周期為 3 個月,那你就要准備上至少夠 3 個月花的錢。
收入預期,最近三年,預期收入達到什麼規模。
時間預期,准備做多久來驗證自己真的可以持續走下去。
成就預期,你打算在哪個方向上取得什麼成就、建立什麼名聲。
B和Z方案
你要設想,萬一你現在規劃的事情,收入不如預期,不能保持你的生活水準,你還准備再做些什麼?這就是你的 B 方案,你要有至少 2 種可以變現的事情。
再設想一下最壞的情況:萬一你無論如何都養不活自己,該怎麼應對,是回單位上班?還是吃存款、繼續硬撐?你一定要提前做好備案,這樣才可以從容應對。
自由職業的自由與焦慮
在這篇文章的開始部分,我們說「你嚮往想干什麼干什麼,想怎麼賺錢怎麼賺錢的生活」,因此你考慮自由職業。但是,真實的自由職業,可能並沒有想像中那麼美好,它有自由,也有不自由;有高收入,也有與自由和不確定性伴生的焦慮。
自由
女兒看牙,時間約到周一下午,沒關系,直接去了,不用請假。復診,約到周五下午,沒關系,直接去了,不用請假。
朋友約見面聊天,周三中午,沒關系,直接去了,不用請假,因為不用考慮上班的事情,聊到幾點是幾點。
今天我累了,就晚點起來,沒關系,不用擔心上班遲到。今天晚上我有興致,可以寫作到凌晨 2 點,沒關系,第二天不用上班。
你看,這就是自由職業最大的好處:擁有安排工作時間的自由。只要你完成任務解決問題,鬼才管你什麼時間工作。
然而,你的自由是建立在自律的基礎上的,你的自由是如何安排自己工作的自由,而不是不工作想干什麼就干什麼的自由(那是財務自由)——因為你要賺錢養活自己。
舉個例子,你答應了客戶周四完成開發交付軟體的第一個版本,結果你周一周二都有事情,代碼沒完成,可以把交付日期更改到下周一嗎?不行!
如果你在單位做事情,可以找上司說:「哎呀老闆,出現了點狀況,是這么這么回事兒,看來這個事情得延期一周才行……」也許這樣老闆就會答應,你就又有了時間。
可是你自由職業後,沒有老闆啊,你得自己維護自己「值得被信任」的形象,得讓你的僱主覺得你「靠譜」。所以,你承諾了就要做到,哪怕熬夜趕出來!
這就是一種不自由。
焦慮
上班最大的一個好處是:不用考慮你要做什麼事情,不用考慮你做的事情能不能創造經濟價值,不管怎樣,你都每月固定拿薪水。只要你在單位待著,哪怕刷一天朋友圈,也有錢拿!這是多麼大的幸福啊!
可是自由職業者就不一樣:不做事就沒錢啊。而且,更尷尬的是,做事也不一定有錢啊。
所以,自由職業者每天都會受不確定性的干擾。譬如我,用了記賬軟體記錄收支,每次看到一大片紅色就焦慮,心裡就琢磨:「 哎呀我的錢什麼時候到賬啊。」 要是看到這個月的支出已經遠超收入,就焦慮得不行,「 哎呀,差這么多啊,下個月能不能補賺回來啊。」
這是你對收入波動性的焦慮,尤其容易出現在剛剛成為自由職業者的時候。
還有第二種焦慮:你做的事情是否能夠持續。
以我為例,我打算每年寫兩本書做兩門課,可是這真的可以嗎?一年、兩年都覺得沒問題啊,但真的可以這樣一直做下去嗎?3 年、5 年、10 年都沒問題嗎?我會一直有主題可寫?會一直有系統的課程可以開發?
狀態好時我覺得這都不成問題,因為既然我之前可以找到話題,將來也一定會有新的話題出現。狀態差的時候就會焦慮:能想到的話題都做差不多了,下一個話題在哪裡啊?萬一明年沒什麼可寫該怎麼辦?
現在,你知道了一切:開發者實現自由職業的 4 種常見方式,5 種必做准備,以及可能的自由和焦慮。你准備開始了嗎?