1. 程式人生 > >程式設計師技術練級攻略——關於IT行業的高瞻遠矚以及學習之路的建議

程式設計師技術練級攻略——關於IT行業的高瞻遠矚以及學習之路的建議

你是否覺得自己從學校畢業的時候只做過小玩具一樣的程式?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業專案都看不出有什麼實際作用,不如從工作中的需求出發)

建議:

· 不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年通用。

· 回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。

· 一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了裡頭的細枝末節。

· 一定要學會思考,思考為什麼要這樣,而不是那樣。還要舉一反三地思考。

注:你也許會很奇怪為什麼下面的東西很偏Unix/Linux

,這是因為我覺得Windows下的程式設計可能會在未來很沒有前途,原因如下:

· 現在的使用者介面幾乎被兩個東西主宰了,1Web2)移動裝置iOSAndroidWindows的圖形介面不吃香了。

· 越來越多的企業在用成本低效能高的Linux和各種開源技術來構架其系統,Windows的成本太高了。

· 微軟的東西變得太快了,很不持久,他們完全是在玩弄程式設計師。詳情參見《Windows程式設計革命史

所以,我個人認為以後的趨勢是前端是Web+移動,後端是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)

使用這些東西不是為了Cool,而是這些編輯器在檢視、修改程式碼/配置文章/日誌會更快更有效率。

3、 熟悉Unix/Linux Shell和常見的命令列

· 如果你用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下的系統執行資訊

· 瞭解正則表示式,使用正則表示式來查詢檔案。

對於程式設計師來說Unix/LinuxWindows簡單多了。(參看我四年前CSDN的博文《其實Unix很簡單》)學會使用Unix/Linux你會發現圖形介面在某些時候實在是太難用了,相當地相當地降低工作效率。

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

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

· 學習HTML基本語法

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

· 學會用  Firefox + Firebug 或 chrome 檢視你覺得很炫的網頁結構,並動態修改。

· 學會用  Firefox + Firebug 或 chrome 除錯Javascript程式碼(設定斷點,檢視變數,效能,控制檯等)

· 在一臺機器上配置Apache或 Nginx

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

· 把PHP連線本地或者遠端資料庫 MySQLMySQL 和 SQL現學現用夠了)

· 學習一個javascript庫(例如jQuery 或 ExtJS+  Ajax (非同步讀入一個伺服器端圖片或者

· 做個小網資料庫內容)+JSON資料格式。

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

· 站(例如:一個小的留言板,支援使用者登入,Cookie/Session,增、刪、改、查,上傳圖片附件,分頁顯示)

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

進階加深

1、 C語言和作業系統呼叫

· 重新學C語言,理解指標和記憶體模型,用C語言實現一下各種經典的演算法和資料結構。推薦《計算機程式設計藝術》、《演算法導論》和《程式設計珠璣》。

· 學習Unix/Linux系統呼叫(Unix高階環境程式設計),,瞭解系統層面的東西。 

o 用這些系統知識操作一下檔案系統,使用者(實現一個可以拷貝目錄樹的小程式)

o 用fork/wait/waitpid寫一個多程序的程式,用pthread寫一個多執行緒帶同步或互斥的程式。多程序多程序購票的程式。

o 用signal/kill/raise/alarm/pause/sigprocmask實現一個多程序間的訊號量通訊的程式。

o 學會使用gccgdb來程式設計和除錯程式(參看我的《gdb除錯程式》)

o 學會使用makefile來編譯程式。(參看我的《跟我一起寫makefile》)

o IPCSocket的東西可以放到高階中來實踐。

o 寫一個視窗,瞭解WinMain/WinProcedure,以及Windows的訊息機制。

o 寫一些程式來操作Windows SDK中的資原始檔或是各種圖形控制元件,以及作圖的程式設計。

o 學習如何使用MSDN檢視相關的SDK函式,各種WM_訊息以及一些例程。

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

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

2、學習Java

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

· 瞭解一下Java這種虛擬機器語言和CPython語言在編譯和執行上的差別。從CJavaPython思考一下跨平臺這種技術。

· 學會使用IDE Eclipse,使用Eclipse 編譯,除錯和開發Java程式。

· 建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQLWeb開發。把前面所說的那個PHP的小專案試著用JSPServlet實現一下。

3Web的安全與架構

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

· 學習HTTP Serverrewrite機制,Nginx的反向代理機制,fast-cgi(如:PHP-FPM

· 學習Web的靜態頁面快取技術。

· 學習Web的非同步工作流處理,資料Cache,資料分割槽,負載均衡,水平擴充套件的構架。

實踐任務:

o 使用HTML5canvas 製作一些Web動畫。

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

o 把前面開發過的那個Web應用改成構造在Nginx + PHP-FPM + 靜態頁面快取的網站

4、學習關係型資料庫

· 你可以安裝MSSQLServerMySQL來學習資料庫。

· 學習教科書裡資料庫設計的那幾個正規化,1NF2NF3NF……

· 學習資料庫的存過,觸發器,檢視,建索引,遊標等。

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

· 學習如何優化資料庫查詢(參看《MySQL的優化》)

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

5、一些開發工具

· 學會使用SVNGit來管理程式版本。

· 學會使用JUnit來對Java進行單元測試。

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

· 推薦閱讀《程式碼大全》《重構》《程式碼整潔之道

高階深入

1C++ / Java 和麵向物件

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

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

· 然後反思為什麼C++要幹成這樣,Java則不是?你一定要學會對比C++Java的不同。比如,Java中的初始化,垃圾回收,介面,異常,虛擬函式,等等。

實踐任務:

o 用C++實現一個BigInt,支援128位的整形的加減乘除的操作。

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

o 用C++封裝並實現一個智慧指標(一定要使用模板)。

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

實踐任務:

o 使用工廠模式實現一個記憶體池。

o 使用策略模式製做一個類其可以把文字檔案進行左對齊,右對齊和中對齊。

o 使用命令模式實現一個命令列計算器,並支援undoredo

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

· 學習STL的用法和其設計概念  容器,演算法,迭代器,函式子。如果可能,請讀一下其原始碼。

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

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

o 做一個檔案瀏覽器,可以瀏覽目錄下的檔案,並可以對不同的檔案有不同的操作,文字檔案可以開啟編輯,執行檔案則執行之,mp3avi檔案可以播放,圖片檔案可以展示圖片。

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

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

· 學習Java的框架,Java的框架也是多,如Spring, HibernateStruts 等等,主要是學習Java的設計,如IoC等。

· Java的技術也是爛多,重點學習J2EE架構以及JMS, RMI, 等訊息傳遞和遠端呼叫的技術。

· 學習使用JavaWeb Service 官方教程在這裡

· 實踐任務:嘗試在SpringHibernate框架下構建一個有網路的Web Service的遠端呼叫程式,並可以在兩個Service中通過JMS傳遞訊息。

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

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

· 學習Java的各種設計模式。

2、加強系統瞭解

重要閱讀下面的幾本書:

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

· 《Unix網路程式設計卷1,套接字》這是一本看完你就明白網路程式設計的書。重要注意TCPUDP,以及多路複用的系統呼叫select/poll/epoll的差別。

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

實踐任務:

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

o 寫一個網路聊天程式,有聊天伺服器和多個聊天客戶端(服務端用UDP對部分或所有的的聊天客戶端進MulticastBroadcast)。

o 寫一個簡易的HTTP伺服器。

· 《Unix網路程式設計卷2,程序間通訊》訊號量,管道,共享記憶體,訊息等各種IPC…… 這些技術好像有點老掉牙了,不過還是值得了解。

實踐任務:

o 主要實踐各種IPC程序序通訊的方法。

o 嘗試寫一個管道程式,父子程序通過管道交換資料。

o 嘗試寫一個共享記憶體的程式,兩個程序通過共享記憶體交換一個C的結構體陣列。

· 學習《Windows核心程式設計》一書。把CreateProcessWindows執行緒、執行緒排程、執行緒同步(Event,  訊號量,互斥量)、非同步I/O,記憶體管理,DLL,這幾大塊搞精通。

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

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

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

o 寫一個服務端給客戶端傳大檔案,要求把100M的頻寬用到80%以上。(注意,磁碟I/O和網路I/O可能會很有問題,想一想怎麼解決,另外,請注意網路傳輸最大單元MTU

o 瞭解BT下載的工作原理,用多程序的方式模擬BT下載的原理。

3、系統架構

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

· 多層分散式系統 – 客戶端服務結點層、計算結點層、資料cache層,資料層。J2EE是經典的多層結構。

· CDN系統– 就近訪問,內容邊緣化。

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

· 伺服器備份,雙機備份系統(Live-StandbyLive-Live系統),兩臺機器如何通過心跳監測對方?叢集主結點備份。

· 虛擬化技術,使用這個技術,可以把作業系統當應用程式一下切換或重新配置和部署。

· 學習Thrift,二進位制的高效能的通訊中介軟體,支援資料(物件)序列化和多種型別的RPC服務。

· 學習HadoopHadoop框架中最核心的設計就是:MapReduceHDFSMapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋

相關推薦

程式設計師技術——關於IT行業高瞻遠矚以及學習建議

你是否覺得自己從學校畢業的時候只做過小玩具一樣的程式?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業專案都看不出有什麼實際作用,不如從工作中的需求出發) 建議: · 不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年

程式設計師技術的補充

1. 併發程式設計 隨著單機上CPU核數的不斷增多,以及網際網路中大型網站每天產生的海量資料,併發程式設計將會成為程式設計師必不可少的技能。 學習《Erlang程式設計》和Scala,理解函數語言程式設計,搞清Actor模式以及併發程式設計的訊息傳遞方式。 2.

程式設計師技術

月光部落格6月12日發表了《寫給新手程式設計師的一封信》,翻譯自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告訴我,他希望在酷殼上看到一篇更具操作性的文章。因為他也是喜歡程式設計和技術的傢伙,於是,我

程式設計師技術(coolshell)

月光部落格6月12日發表了《寫給新手程式設計師的一封信》,翻譯自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告訴我,他希望在酷殼上看到一篇更具操作性的文章。因為

程序員技術(轉)

proxy sele more class 算法 tp服務器 list scrip 子程序 前言   你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麽經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麽實

學習筆記---程式設計師(入門篇、修養篇、專業基礎篇、軟體設計篇、高手成長篇)

根據極客時間 左耳朵耗子 整理,請忽略最後的每一行最後的數字 文章目錄 1. 入門篇 47 2. 修養篇 51 3. 專業基礎篇 56 4. 軟體設計篇 60 5. 高手養成 63 1. 入門篇 47

程式設計師(2018):前端基礎和底層原理

這個是我訂閱 陳皓老師在極客上的專欄《左耳聽風》,我整理出來是為了自己方便學習,同時也分享給你們一起學習,當然如果有興趣,可以去訂閱,為了避免廣告嫌疑,我這就不多說了!以下第一人稱是指陳皓老師。 對於前端的學習和提高,我的基本思路是這樣的。首先,前端的三個最基本的

程式設計師

•瞭解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高併發的純動態型網站日漸成為主流,而SNS類網站在資料存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關係型資料庫而成為未來主流資料儲存模式的趨勢。當前NoSQL資料庫很多,大部分都

矽谷IT大牛推薦10種機器學習框架,程式設計師跳槽漲薪

人工智慧已經存在了很長時間。 然而,由於該領域的巨大改進,近年來它已成為流行語。 人工智慧曾經被稱為總體書呆子和天才的領域,但由於各種庫和框架的發展,它已成為一個更友好的IT領域,並有很多人進入它。   在本文中,我們將研究用於人工智慧的高質量庫,它們的優缺點以及它們的一些功

【轉】簡明 Vim

優秀 super 換行 下劃線 分屏 內容 改變 鼠標 cool 原文出處: yannesposito 譯文出處:陳晧 Vim的學習曲線相當的大,所以,如果你一開始看到的是一大堆VIM的命令分類,你一定會對這個編輯器失去興趣的。下面的文章翻譯自《Learn Vim

系統 | 京東架構師傾情解讀

劉慎寶:京東財務研發部架構師,主要負責財務研發部的基礎元件和各系統技術方案支援,10+年網際網路研發專家。 2010年入職京東並歷經幾乎所有618和雙11挑戰。精通高併發服務搭建和業務建模,曾多次主導京東財務系統架構升級和資料庫升級,主導結算魔方重構,訂單臺賬優化、價保優化等重大研發專

java

0. 概述 在**《2019秋招經驗談》**這篇文章中,我通過我的練級之路篇介紹了我是如何轉行的,開啟Java後端開發工程師之路的,通過認知思維篇講述了在開啟練級之路之前你需要具備的心態以及思維,通過專業技術篇介紹了Java後端開發工程師需要掌握的核心知識,通

簡明Vim

Vim的學習曲線相當的大,所以,如果你一開始看到的是一大堆VIM的命令分類,你一定會對這個編輯器失去興趣的。下面的文章翻譯自《Learn Vim Progressively》,我覺得這是給新手最好的VIM的升級教程了,沒有列舉所有的命令,只是列舉了那些最有用的命令。

[zz] 簡明 VIM

vim的學習曲線相當的大(參看各種文字編輯器的學習曲線),所以,如果你一開始看到的是一大堆VIM的命令分類,你一定會對這個編輯器失去興趣的。下面的文章翻譯自《Learn Vim Progressively》,我覺得這是給新手最好的VIM的升級教程了,沒有列舉所有的命令,只是列舉了那些最有用的命令。非

簡明 VIM

 Vim的學習曲線相當的大(參看各種文字編輯器的學習曲線),所以,如果你一開始看到的是一大堆VIM的命令分類,你一定會對這個編輯器失去興趣的。你想以最快的速度學習人類史上最好的文字編輯器VIM嗎?你先得懂得如何在VIM倖存下來,然後一點一點地學習各種戲法。 Vim the Six Billion Doll

簡明 Vim 如何快速熟練Vim編輯

vim的學習曲線相當的大(參看各種文字編輯器的學習曲線),所以,如果你一開始看到的是一大堆VIM的命令分類,你一定會對這個編輯器失去興趣的。下面的文章翻譯自《Learn Vim Progressively》,我覺得這是給新手最好的VIM的升級教程了,沒有列舉所有的命令,

【VIM]:簡明Vim

(轉載本站文章請註明作者和出處 酷 殼 – CoolShell.cn ,請勿用於任何商業用途) vim的學習曲線相當的大(參看各種文字編輯器的學習曲線),所以,如果你一開始看到的是一大堆VIM的命令分類,你一定會對這個編輯器失去興趣的。下面的文章翻譯自《Learn Vim Progressively

從高考到程式設計師,一生無悔的選擇,碼農的成長

     高考畢業了,學弟學妹們哈皮了。但是我身為程式設計師還在為追夢而努力著。會想高考,彷彿就是一場夢,一場我無法都無法忘記的夢。高中三年的時光,對於我來說是痛苦的,我現在極其後悔高中三年的生活,很多的東西都被沉重的學業淹沒了。舉個例子,作為一個書呆子,在進入大學,沒有任

#程式設計師技術厲害,上級卻不想讓他轉正:技術厲害,但是不尊重人

現在的職場如果你要找工作的話,都要經過試用期,用來檢測新員工是否合適留在公司工作,如果試用期過後能夠正常工作的話,那麼就可以成為公司的正式員工了。 在這裡我推薦下自己整理的資料,我自己是一名從事了5年java開發的全棧工程師,如果有想要學習java的小夥伴,可來我們的java學習扣裙哦:

程式設計師技術交流群

歡迎加入祈澈姑娘的程式設計微刊qq群:548096997 本群提供免費的學習指導 架構資料 以及免費的解答,不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導 進群修改群備註:開發年限-地區-經驗 方便架構師解答問題,免費領取架構師全套視訊! 1、具有1-5工作經驗的,面對目前