程序員技術練級攻略

導讀:本文是由陳皓和他的一位朋友Mailper合作完成,原名叫《Build Your Programming?Technical?Skills》,本文分享了Mailper和作者個人的學習經歷。每個程序員都希望自己能順利的升級到高的層次,您不妨按照下面的方法去做。

前言

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

建議:

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

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

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

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

:你也許會很奇怪為什么下面的東西很偏Unix/Linux,這是因為我覺得Windows下的編程可能會在未來很沒有前途,原因如下:

現在的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。

越來越多的企業在用成本低性能高的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/Linux比Windows簡單多了。(參看我四年前CSDN的博文《其實Unix很簡單》)學會使用Unix/Linux你會發現圖形界面在某些時候實在是太難用了,相當地相當地降低工作效率。

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 Definite Guide讀完前4章你就明白你每天上網用瀏覽器的時候發生的事情了(proxy, gateway, browsers)

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

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

進階加深

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

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

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

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

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

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

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

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

學會使用gcc和gdb來編程和調試程序(參看我的《用gdb調試程序》)

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

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

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

寫一個窗口,了解WinMain/WinProcedure,以及Windows的消息機制。

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

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

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

不用太多于精通這些東西,因為GUI正在被Web取代,主要是了解一下Windows圖形界面的編程。

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,數據分區,負載均衡,水平擴展的構架。

實踐任務:

使用HTML5的canvas制作一些Web動畫。

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

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

4.一些開發工具

學會使用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中的初始化,垃圾回收,接口,異常,虛函數,等等。

實踐任務:

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

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

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

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

實踐任務:

使用工廠模式實現一個內存池。

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

使用命令模式實現一個命令行計算器,并支持undo和redo。

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

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

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

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

做一個文件瀏覽器,可以瀏覽目錄下的文件,并可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,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的調優。

實踐任務:

理解什么是阻塞(同步IO),非阻塞(異步IO),多路復用(select, poll, epoll)的IO技術。

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

寫一個簡易的HTTP服務器。

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

實踐任務:

主要實踐各種IPC進程序通信的方法。

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

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

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

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

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

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

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

了解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等。

寫了那么多,回顧一下,覺得自己相當的有成就感。希望大家不要嚇著,我自己這十來年也在不斷地學習,今天我也在學習中,人生本來就是一個不斷學習和練級的過程。不過,一定有漏的,也有不對的,還希望大家補充和更正。

原文來自:酷殼網?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux shell 之 提取文件名和目錄名的一些方法

很多時候在使用Linux的shell時,我們都需要對文件名或目錄名進行處理,通常的操作是由路徑中提取出文件名,從路徑中提取出目錄名,提取文件后綴名等等。例如,從路徑/dir1/dir2/file.txt中提取也文件名file.txt&#xff0c…

bzoj 2752: [HAOI2012]高速公路(road)

Description Y901高速公路是一條重要的交通紐帶,政府部門建設初期的投入以及使用期間的養護費用都不低,因此政府在這條高速公路上設立了許多收費站。Y901高速公路是一條由N-1段路以及N個收費站組成的東西向的鏈,我們按照由西向東的順序將收費…

搭建DNS主、從服務實驗

此次我們的口號是:簡單、有趣上手DNS服務博主是一個言出必行de好人,(正經臉)上次轉載了有關DNS的基礎介紹,此次我們來通過實驗搭建DNS服務器從而更好的了解DNS搭建過程如何開始,且聽我細細道來首先我們通常…

GDB中應該知道的幾個調試方法

七、八年前寫過一篇《用GDB調試程序》,于是,從那以后,很多朋友在MSN上以及給我發郵件詢問我關于GDB的問題,一直到今天,還有人在問GDB的相關問題。這么多年來,有一些問題是大家反復在問的,一方面…

長沙java技術_長沙如何提高自身的Java技術

長沙如何提高自身的Java技術?Java自發行二十多年來,一直都是開發者的寵兒,在編程界的位置一直十分穩固。雖然Java人才需求量大,薪資水平高,但想要用Java語言勝任企業工作不容易。比如要成為一名Java架構師,…

strcpy與strcat函數原型

1.strcpy函數原型 char *my_strcpy(char *dest,const char *src) //const使在函數中不能修改*src其原先的值{   char *strDest dest; //保存原始的strDest   assert((dest!NULL)&&(src!NULL)); //檢驗參數,…

CCF 201312-4 有趣的數

試題編號:201312-4試題名稱:有趣的數時間限制:1.0s內存限制:256.0MB問題描述: 問題描述我們把一個數稱為有趣的,當且僅當:1. 它的數字只包含0, 1, 2, 3,且這四個數字都出現過至少一次…

java 代碼重用_Java 代碼重用:功能與上下文重用

我幾乎不需要討論為什么重用代碼是有利的。代碼重用通常使得程序開發更加快速,并使得 BUG 減少。一旦一段代碼被封裝和重用,那么只需要檢查很少的一段代碼即可確保程序的正確性。如果在整個應用程序中只需要在一個地方打開和關閉數據庫連接,那…

GCC-3.4.6源代碼學習筆記

大約4年前,我加入了GDNT - 北電網絡在中國的合資企業,參與3G UMTS無線接入網的研發工作。與GCC有了第一次親密的接觸(之前使用的是MS的VC)。彼時,北電在其諸如,UMTS、CDMA、及自行開發的眾多工具等項目中&a…

互聯網

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/u/3127489/blog/1550726

GCC筆記 命令行分析

1984年,Richard Stallman發起了自由軟件運動,GNU (Gnus Not Unix)項目應運而生,3年后,最初版的GCC橫空出世,成為第一款可移植、可優化、支持ANSI C的開源C編譯器。GCC最初的全名是GNU C Compiler,之后,隨著…

java 反射用法_Java 反射的概念與使用

一,反射的概念對于一個人來說,了解自己的能力、本事、特點,對于他去干事創業來說,是很重要的。同樣的,對于一門面向對象的語言來說,了解類(對象其實就是類的實現)本身也是重要的,可以在很多地方…

關于Unity中的Mesh Collider碰撞器

原來我的場景中有一個平面Plane帶Mesh Collider碰撞器組件,一個主角Hero帶有一個Box Collider碰撞器和有重力的Rigidbody剛體組件,主角可以放在平面上。 在導入場景后,隱藏平面Plane,給一個地板添加一個Mesh Collider碰撞器&#…

GCC常用選項使用詳解

通常所說的GCC是GUN Compiler Collection的簡稱,除了編譯程序之外,它還含其他相關工具,所以它能把易于人類使用的高級語言編寫的源代碼構建成計算機能夠直接執行的二進制代碼。GCC是Linux平臺下最常用的編譯程序,它是Linux平臺編譯…

java 井字棋 人機_井字游戲 人機對戰 java實現

package com.ecnu.Main;/*** 主函數觸發游戲*/public class MainApplication {public static void main(String[] args){TicTacToeGame ticTacToeGame new TicTacToeGame();ticTacToeGame.start();}}//TicTacToeGame 方法類import java.util.Scanner;public class TicTacToeGa…

Session(數據)共享的前后端分離Shiro實戰

1,前言本文期望描述如何使用Shiro構建基本的安全登錄和權限驗證。本文實戰場景有如下特殊需求:1,在集群和分布式環境實現session共享;2,前端只使用HTML/CSS/JS。因此無法直接使用Shiro提供的SessionManager&#xff0c…

讀書筆記(javascript 高級程序設計)

一. 數據類型: 1. undefined: 未聲明和未初始化的變量,typeof 操作符返回的結果都是 undefined;(建議未初始化的變量進行顯式賦值,這樣當 typeof 返回 undefined 時就知道是未聲明了,幫助定位問…

關于gcc擴展中的宏定義中用 # 和 ##

關于gcc擴展中的宏定義中用 "#" 和 "##"今天測試了宏定義中的 "#" 和 "##" 的區別。 結果如下: "#" 代表和一個字符串相連接 "##" 代表和一個符號連接,符號可以是變量,或另一…

java 年計算_java實現計算某年某月的天數

在計算某年某月的天數時,需要注意平年閏年。分析:閏年具體的判定方法就要看它的判定條件:四年一閏 , 百年不閏 ,400年再閏。而計算該年該月的天數,又分大月和小月,特殊月份2月之分。(視頻教程推…

添加自定義菜單,報錯40155

2019獨角獸企業重金招聘Python工程師標準>>> 提交的json中,某個自定義菜單對應的URL訪問是有問題的,請挨個檢查一下。 轉載于:https://my.oschina.net/selly1025/blog/1551496