必備乾貨,程序員進階升級全攻略!

編程語言 MySQL 設計模式 文章 W3Cschool 2017-04-16

前言

從學校走入職場後,我們總是聽到這樣的抱怨:學校課程總是偏向理論知識,看不出有什麼實際的作用,還不如從工作中的實際出發。

面對有志於程序員這個職業的人群,我們給出以下建議:

不亂追新:新書、新技術、新知識,因為基礎的東西是經過長時間的積累,在未來十年至少是通用的。

反觀歷史:分析,並歸納、總結出過去線上技術的發展,做到知古通今

消除惰性:不管例子多簡單,都要動手手敲一遍,以免忽略其中的細節。

未來大勢所趨:根據經驗所知:未來趨勢,前端是 Web+ 移動,後端是 Linux+ 開源;開發這邊基本上可以忽略Windows 。

原因如下:

現在的用戶界面幾乎只有兩個:Web,移動設備 iOS 或 Android,Windows 的圖形界面不被看好;越來越多的企業在用成本低性能高的 Linux 和各種開源技術來構架其系統,Windows 的成本太高;微軟的東西變得太快,因此不持久。

一、入門階段

1、 學習一門腳本語言,例如 Python、Ruby,可以擺脫你對底層語言的恐懼感,並且開發出有用的小程序。

  • 處理文本文件,或者 csv (關鍵詞 python csv、python open、 python sys) 讀一個本地文件,逐行處理(例如 word count,或者處理 log);

  • 遍歷本地文件系統 (sys、 os,、path),例如寫一個程序統計一個目錄下所有文件大小並按各種條件排序並保存結果;

  • 跟數據庫打交道 (python sqlite),寫一個小腳本統計數據庫裡條目數量;

  • 學會用各種 print 之類簡單粗暴的方式進行調試;

  • 學會用 Google (phrase、domain、use reader to follow tech blogs)。

2、 用熟一種程序員的編輯器 (不是 IDE) 和一些基本工具,這樣可以讓你在查看、修改代碼、配置文章、日誌會更加高效。

  • Vim 、 Emacs、 Notepad++,學會如何配置代碼補全,外觀,外部命令等;

  • Source Insight (或 ctag)。

3、 熟悉 Unix、Linux Shell 和常見的命令行,你會發現Unix/Linux 比 Windows 簡單並且高效。

  • 如果你用 windows,至少學會用虛擬機裡的 linux、 vmware player 是免費的,裝個 Ubuntu 吧;

  • 一定要少用少用圖形界面;

  • 學會使用 man 來查看幫助;

  • 文件系統結構和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …

  • 學會使用一些文本操作命令 sed/awk/grep/tail/less/more …

  • 學會使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…

  • 瞭解 /etc 目錄下的各種配置文章,學會查看 /var/log 下的系統日誌,以及 /proc 下的系統運行信息;

  • 瞭解正則表達式,使用正則表達式來查找文件。

4、 學習 Web 基礎 (HTML/CSS/JS) + 服務器端技術 (LAMP)

未來必然是 Web 的世界,學習 WEB 基礎的最佳網站是 W3School。

  • 學習 HTML 基本語法;

  • 學習 CSS 如何選中 HTML 元素並應用一些基本樣式(關鍵詞:box model);

  • 學會用 Firefox + Firebug 或 chrome 查看你覺得很炫的網頁結構,並動態修改;

  • 學習使用 Javascript 操縱 HTML 元件。理解 DOM 和動態網頁(http://oreilly.com/catalog/9780596527402 ) 網上有免費的章節,足夠用了。或參看 DOM ;

  • 學會用 Firefox + Firebug 或 chrome 調試 Javascript 代碼(設置斷點,查看變量,性能,控制檯等);

  • 在一臺機器上配置 Apache 或 Nginx;

  • 學習 PHP,讓後臺 PHP 和前臺 HTML 進行數據交互,對服務器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能;

  • 把 PHP 連接本地或者遠程數據庫 MySQL(MySQL 和 SQL現學現用夠了);

  • 跟完一個名校的網絡編程課程(例如:http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php ) 不要覺得需要多於一學期時間,大學生是全職一學期選 3 - 5 門課,你業餘時間一定可以跟上;

  • 學習一個 javascript 庫(例如 jQuery 或 ExtJS)+ Ajax (異步讀入一個服務器端圖片或者數據庫內容)+ JSON 數據格式;

  • HTTP: The Definitive Guide 讀完前 4 章你就明白你每天上網用瀏覽器的時候發生的事情了(proxy、 gateway,、browsers);

  • 做個小網站(例如:一個小的留言板,支持用戶登錄,Cookie/Session,增、刪、改、查,上傳圖片附件,分頁顯示);

  • 買個域名,租個空間,做個自己的網站。

二、進階階段

1、 C 語言和操作系統調用

  • 重新學 C 語言,理解指針和內存模型,用 C 語言實現一下各種經典的算法和數據結構。推薦《計算機程序設計藝術》、《算法導論》和《編程珠璣》;

  • 學習(麻省理工免費課程)計算機科學和編程導論

  • 學習(麻省理工免費課程)C語言內存管理

  • 學習 Unix/Linux 系統調用(Unix 高級環境編程),瞭解系統層面的東西:

1、用這些系統知識操作一下文件系統,用戶(實現一個可以拷貝目錄樹的小程序);

2、用 fork/wait/waitpid 寫一個多進程的程序,用 pthread 寫一個多線程帶同步或互斥的程序。多進程多進程購票的程序;

3、用 signal/kill/raise/alarm/pause/sigprocmask 實現一個多進程間的信號量通信的程序;

4、學會使用 gcc 和 gdb 來編程和調試程序;

5、學會使用 makefile 來編譯程序;

6、IPC 和 Socket 的東西可以放到高級中來實踐。

  • 學習 Windows SDK 編程(Windows 程序設計 ,MFC 程序設計)

1、寫一個窗口,瞭解 WinMain/WinProcedure,以及 Windows 的消息機制;

2、寫一些程序來操作 Windows SDK 中的資源文件或是各種圖形控件,以及作圖的編程;

3、學習如何使用 MSDN 查看相關的 SDK 函數,各種 WM_消息以及一些例程;

4、這本書中有很多例程,在實踐中請不要照抄,試著自己寫一個自己的例程;

5、不用太多於精通這些東西,因為 GUI 正在被 Web 取代,主要是瞭解一下 Windows 圖形界面的編程。@virushuo 說:“ 我覺得 GUI 確實不那麼熱門了,但充分理解 GUI 工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解 GUI 工作,或者在 win 那邊學,或者在 mac/iOS 上學”。

2、學習 Java

  • Java 的學習主要是看經典的 Core Java 《Java 核心技術編程》和《Java 編程思想》(有兩卷,我僅鏈了第一卷,足夠了,因為 Java 的圖形界面瞭解就可以了);

  • 學習 JDK,學會查閱 Java API Doc http://download.oracle.com/javase/6/docs/api/;

  • 瞭解一下 Java 這種虛擬機語言和 C 和 Python 語言在編譯和執行上的差別。從 C、Java、Python 思考一下“跨平臺”這種技術;

  • 學會使用 IDE Eclipse,使用 Eclipse 編譯,調試和開發 Java 程序;

  • 建一個 Tomcat 的網站,嘗試一下 JSP/Servlet/JDBC/MySQL 的 Web 開發。把前面所說的那個 PHP 的小項目試著用 JSP 和 Servlet 實現一下。

3、Web 的安全與架構

  • 學習 HTML5,網上有很多很多教程,以前酷殼也介紹過很多,我在這裡就不羅列了;

  • 學習 Web 開發的安全問題(參考新浪微博被攻擊的這個事,以及 Ruby 的這篇文章);

  • 學習 HTTP Server 的 rewrite 機制,Nginx 的反向代理機制,fast-cgi(如:PHP-FPM);

  • 學習 Web 的靜態頁面緩存技術;

  • 學習 Web 的異步工作流處理,數據 Cache、數據分區、負載均衡、水平擴展的構架。

  • 實踐任務:

1、使用 HTML5 的 canvas 製作一些 Web 動畫;

2、嘗試在前面開發過的那個 Web 應用中進行 SQL 注入,JS 注入,以及 XSS 攻擊;

3、把前面開發過的那個 Web 應用改成構造在 Nginx + PHP-FPM + 靜態頁面緩存的網站。

4、學習關係型數據庫

  • 你可以安裝 MSSQLServer 或 MySQL 來學習數據庫;

  • 學習教科書裡數據庫設計的那幾個範式,1NF、2NF、3NF,……

  • 學習數據庫的存過,觸發器,視圖,建索引,遊標等;

  • 學習 SQL 語句,明白表連接的各種概念(參看《SQL Join 的圖示》)

  • 學習如何優化數據庫查詢(參看《MySQL 的優化》)

  • 實踐任務:設計一個論壇的數據庫,至少滿足 3NF,使用 SQL 語句查詢本週,本月的最新文章,評論最多的文章,最活躍用戶。

5、一些開發工具

  • 學會使用 SVN 或 Git 來管理程序版本;

  • 學會使用 JUnit 來對 Java 進行單元測試;

  • 學習 C 語言和 Java 語言的 coding standard 或 coding guideline。(我 N 年前寫過一篇關 C 語言非常簡單的文章——《編程修養》,這樣的東西你可以上網查一下,一大堆)。

  • 推薦閱讀《代碼大全》《重構》《代碼整潔之道》。

三、高級階段

1、C++ / Java 和麵向對象

我個人以為學好 C++、Java也就是舉手之勞。但是 C++ 的學習曲線相當的陡。不過,我覺得 C++ 是最需要學好的語言了。參看兩篇趣文“C++ 學習信心圖” 和“21 天學好 C++”

  • 學習(麻省理工免費課程) C++ 面向對象編程;

  • 讀我的 “如何學好 C++”中所推薦的那些書至少兩遍以上(如果你對 C++ 的理解能夠深入到像我所寫的《C++ 虛函數表解析》或是《C++ 對象內存存局》,或是《C/C++ 返回內部靜態成員的陷阱》那就非常不錯了);

  • 然後反思為什麼 C++ 要幹成這樣,Java 則不是?你一定要學會對比 C++ 和 Java 的不同。比如,Java 中的初始化、垃圾回收、接口、異常、虛函數,等等;

  • 實踐任務:

1、用 C++ 實現一個 BigInt,支持 128 位的整形的加減乘除的操作;

2、用 C++ 封裝一個數據結構的容量,比如 hash table;

3、用 C++ 封裝並實現一個智能指針(一定要使用模板)。

  • 《設計模式》必需一讀,兩遍以上,思考一下,這 23 個模式的應用場景。主要是兩點:鍾愛組合而不是繼承;鍾愛接口而不是實現。(也推薦《深入淺出設計模式》)

  • 實踐任務:

1、使用工廠模式實現一個內存池;

2、使用策略模式製做一個類其可以把文本文件進行左對齊,右對齊和中對齊;

3、使用命令模式實現一個命令行計算器,並支持 undo 和 redo;

4、使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素;

  • 學習 STL 的用法和其設計概念 – 容器,算法,迭代器,函數子。如果可能,請讀一下其源碼。

  • 實踐任務:嘗試使用面向對象、STL,設計模式、和 WindowsSDK 圖形編程的各種技能:

1、做一個貪吃蛇或是俄羅斯方塊的遊戲。支持不同的級別和難度;

2、做一個文件瀏覽器,可以瀏覽目錄下的文件,並可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,mp3 或 avi 文件可以播放,圖片文件可以展示圖片。

  • 學習 C++ 的一些類庫的設計,如: MFC(看看候捷老師的《深入淺出 MFC》) ,Boost、ACE、CPPUnit、STL (STL 可能會太難了,但是如果你能瞭解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STL string 類的寫時拷貝技術》那就非常不錯了,ACE 需要很強在的系統知識,參見後面的“加強對系統的瞭解”);

  • Java 是真正的面向對象的語言,Java 的設計模式多得不能再多,也是用來學習面向對象的設計模式的最佳語言了(參看 Java 中的設計模式);

  • 推薦閱讀《Effective Java》 and 《Java 解惑》;

  • 學習 Java 的框架,Java 的框架也是多,如 Spring、Hibernate、Struts 等等,主要是學習 Java 的設計,如 IoC 等;

  • Java 的技術也是爛多,重點學習 J2EE 架構以及 JMS、 RMI 等消息傳遞和遠程調用的技術;

  • 學習使用 Java 做 Web Service。

  • 實踐任務: 嘗試在 Spring 或 Hibernate 框架下構建一個有網絡的 Web Service 的遠程調用程序,並可以在兩 個Service 中通過 JMS 傳遞消息。

C++ 和 Java 都不是能在短時間內能學好的,C++ 玩是的深,Java 玩的是廣,我建議兩者選一個。我個人的學習經歷是:

  • 深究 C++(我深究 C/C++ 了十來年了)

  • 學習 Java 的各種設計模式

2、加強系統瞭解

重要閱讀下面的幾本書:

  • 《Unix 編程藝術》瞭解 Unix 系統領域中的設計和開發哲學、思想文化體系、原則與經驗。你一定會有一種醍醐灌頂的感覺;

  • 《Unix 網絡編程卷 1,套接字》這是一本看完你就明白網絡編程的書。重要注意 TCP、UDP,以及多路複用的系統調用 select/poll/epoll 的差別;

  • 《TCP/IP 詳解 卷 1:協議》- 這是一本看完後你就可以當網絡黑客的書。瞭解以太網的的運作原理,瞭解 TCP/IP 的協議,運作原理以及如何 TCP 的調優。

  • 實踐任務:

1、理解什麼是阻塞(同步 IO),非阻塞(異步 IO),多路複用(select、 poll、epoll)的 IO 技術;

2、寫一個網絡聊天程序,有聊天服務器和多個聊天客戶端(服務端用 UDP 對部分或所有的的聊天客戶端進 Multicast 或 Broadcast);

3、寫一個簡易的 HTTP 服務器。

  • 《Unix 網絡編程卷 2,進程間通信》信號量、管道、共享內存、消息等各種 IPC …… 這些技術好像有點老掉牙了,不過還是值得了解。

  • 實踐任務:

1、主要實踐各種 IPC 進程序通信的方法;

2、嘗試寫一個管道程序,父子進程通過管道交換數據;

3、嘗試寫一個共享內存的程序,兩個進程通過共享內存交換一個 C 的結構體數組。

  • 學習《Windows 核心編程》一書。把 CreateProcess、Windows 線程、線程調度、線程同步(Event、信號量、互斥量)、異步 I/O、內存管理、DLL,這幾大塊搞精通。

  • 實踐任務:使用 CreateProcess 啟動一個記事本或 IE,並監控該程序的運行。把前面寫過的那個簡易的 HTTP 服務用線程池實現一下。寫一個 DLL 的鉤子程序監控指定窗口的關閉事件,或是記錄某個窗口的按鍵。

  • 有了多線程、多進程通信,TCP/IP,套接字,C++ 和設計模式的基本,你可以研究一下 ACE 了。使用 ACE 重寫上述的聊天程序和 HTTP 服務器(帶線程池)。

  • 實踐任務:通過以上的所有知識,嘗試:

1、寫一個服務端給客戶端傳大文件,要求把 100M 的帶寬用到 80% 以上。(注意,磁盤 I/O 和網絡 I/O 可能會很有問題,想一想怎麼解決,另外,請注意網絡傳輸最大單元 MTU);

2、瞭解 BT 下載的工作原理,用多進程的方式模擬 BT 下載的原理。

3、系統架構

  • 負載均衡。HASH 式的,純動態式的。(可以到 Google 學術裡搜一些關於負載均衡的文章讀讀)

  • 多層分佈式系統 – 客戶端服務結點層、計算結點層、數據 cache 層,數據層。J2EE 是經典的多層結構;

  • CDN 系統 – 就近訪問,內容邊緣化;

  • P2P 式系統,研究一下 BT 和電驢的算法。比如:DHT 算法;

  • 服務器備份,雙機備份系統(Live-Standby 和 Live-Live 系統),兩臺機器如何通過心跳監測對方?集群主結點備份;

  • 虛擬化技術,使用這個技術,可以把操作系統當應用程序一下切換或重新配置和部署;

  • 學習 Thrift,二進制的高性能的通訊中間件,支持數據(對象)序列化和多種類型的 RPC 服務;

  • 學習 Hadoop。Hadoop 框架中最核心的設計就是:MapReduce 和 HDFS。MapReduce 的思想是由 Google 的一篇論文所提及而被廣為流傳的,簡單的一句話解釋 MapReduce 就是“任務的分解與結果的彙總”。HDFS 是 Hadoop 分佈式文件系統 (Hadoop Distributed File System) 的縮寫,為分佈式計算存儲提供了底層支持;

  • 瞭解 NoSQL 數據庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高併發的純動態型網站日漸成為主流,而 SNS 類網站在數據存取過程中有著實時性等剛性需求,這使得目前 NoSQL 數據庫慢慢成了人們所關注的焦點,並大有成為取代關係型數據庫而成為未來主流數據存儲模式的趨勢。當前 NoSQL 數據庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort 等。

注:如有遺漏和錯誤,歡迎指正。

必備乾貨,程序員進階升級全攻略!

1.點擊右上角關注我們的頭條號,每天學習技術乾貨。

2. 關注我們公眾號:w3cschoolcn

獲取更多技術知識

下載官方APP

參與官方活動

相關推薦

推薦中...