?/strong>Q你也许会很奇怪ؓ什么下面的东西很偏Unix/LinuxQ这是因为我觉得Windows下的~程可能会在未来很没有前途,原因如下Q?/p>- 现在的用L面几乎被两个东西d了,1QWebQ?Q移动设备iOS或Android。Windows的图形界面不吃香了?/li>
- 来多的企业在用成本低性能高的Linux和各U开源技术来构架其系l,Windows的成本太高了?/li>
- 微Y的东西变得太快了Q很不持久,他们完全是在玩弄E序员。详情参见?a title="Windows~程革命? target="_blank" style="color: #2970a6; text-decoration: initial;">Windows~程革命?/a>?/li>
所以,我个Z后的势是前端是Web+UdQ后端是Linux+开源。开发这边基本上没Windows什么事?/p>
启蒙入门
1?学习一门脚本语aQ例如Python/Ruby
可以让你摆脱对底层语a的恐惧感Q脚本语a可以让你很快开发出能用得上的小E序。实践项?
- 处理文本文gQ或者csv (关键?python csv, python open, python sys) M个本地文Ӟ逐行处理Q例?word countQ或者处理logQ?/li>
- 遍历本地文gpȝ (sys, os, path)Q例如写一个程序统计一个目录下所有文件大ƈ按各U条件排序ƈ保存l果
- 跟数据库打交?(python sqlite)Q写一个小脚本l计数据库里条目数量
- 学会用各Uprint之类单粗暴的方式q行调试
- 学会用Google (phrase, domain, use reader to follow tech blogs)
Z么要学脚本语aQ因Z们实在是太方便了Q很多时候我们需要写点小工具或是脚本来帮我们解决问题Q你׃发现正规的编E语a太难用了?/p>
2?用熟一U程序员的编辑器(不是IDE) 和一些基本工?/strong>
- Vim / Emacs / Notepad++Q学会如何配|代码补全,外观Q外部命令等?/li>
- Source Insight (?ctag)
使用q些东西不是ZCoolQ而是q些~辑器在查看、修改代?配置文章/日志会更快更有效率?/p>
3?熟悉Unix/Linux Shell和常见的命o?/strong>
- 如果你用windowsQ至学会用虚拟机里的linuxQ?vmware player是免费的Q装个Ubuntu?/li>
- 一定要用用囑Ş界面?/li>
- 学会使用man来查看帮?/li>
- 文gpȝl构和基本操?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目录下的各种配置文章Q学会查?var/log下的pȝ日志Q以?proc下的pȝq行信息
- 了解正则表达式,使用正则表达式来查找文g?/li>
对于E序员来说Unix/Linux比Windows单多了。(参看我四q前CSDN的博文?a target="_blank" style="color: #2970a6; text-decoration: initial;">其实Unix很简?/a>》)学会使用Unix/Linux你会发现囑Ş界面在某些时候实在是太难用了Q相当地相当地降低工作效率?/p>
4?学习Web基础QHTML/CSS/JS) + 服务器端技?(LAMP)
未来必然是Web的世界,学习WEB基础的最佳网站是W3School?/p>
- 学习HTML基本语法
- 学习CSS如何选中HTML元素q应用一些基本样式(关键词:box modelQ?/li>
- 学会? Firefox + Firebug ?chrome 查看你觉得很炫的|页l构Qƈ动态修攏V?/li>
- 学习使用Javascript操纵HTML元g。理解DOM和动态网(http://oreilly.com/catalog/9780596527402) |上有免费的章节Q够用了。或参看 DOM ?/li>
- 学会? Firefox + Firebug ?chrome 调试Javascript代码Q设|断点,查看变量Q性能Q控制台{)
- 在一台机器上配置Apache ?nbsp;Nginx
- 学习PHPQ让后台PHP和前台HTMLq行数据交互Q对服务器相应浏览器h形成初步认识。实C个表单提交和反显的功能?/li>
- 把PHPq接本地或者远E数据库 MySQLQMySQL ?SQL现学现用够了Q?/li>
- 跟完一个名校的|络~程评Q例如:http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php ) 不要觉得需要多于一学期旉Q大学生是全职一学期?-5门课Q你业余旉一定可以跟?/li>
- 学习一个javascript库(例如jQuery ?ExtJSQ? Ajax (异步d一个服务器端图片或者数据库内容Q?JSON数据格式?/li>
- HTTP: The Definitive Guide d?章你明白你每天上网用浏览器的时候发生的事情?proxy, gateway, browsers)
- 做个网站(例如Q一个小的留a板,支持用户dQCookie/SessionQ增、删、改、查Q上传图片附Ӟ分页昄Q?/li>
- C域名Q租个空_做个自己的网站?/li>
q阶加深
1?C语言和操作系l调?/strong>
- 重新学C语言Q理解指针和内存模型Q用C语言实现一下各U经典的法和数据结构。推荐?a style="color: #2970a6; text-decoration: initial;">计算机程序设计艺?/a>》、?a target="_blank" style="color: #2970a6; text-decoration: initial;">法D》和?a target="_blank" style="color: #2970a6; text-decoration: initial;">~程珠玑》?/li>
- 学习Q麻省理工免费课E)计算机科学和~程D
- 学习Q麻省理工免费课E)C语言内存理
- 学习Unix/Linuxpȝ调用Q?a target="_blank" style="color: #2970a6; text-decoration: initial;">Unix高环境~程Q,Q了解系l层面的东西?/li>
- 用这些系l知识操作一下文件系l,用户Q实C个可以拷贝目录树的小E序Q?/li>
- 用fork/wait/waitpid写一个多q程的程序,用pthread写一个多U程带同步或互斥的程序。多q程多进E购的E序?/li>
- 用signal/kill/raise/alarm/pause/sigprocmask实现一个多q程间的信号量通信的程序?/li>
- 学会使用gcc和gdb来编E和调试E序Q参看我的?a target="_blank" style="color: #2970a6; text-decoration: initial;">用gdb调试E序》)
- 学会使用makefile来编译程序。(参看我的?a target="_blank" style="color: #2970a6; text-decoration: initial;">跟我一起写makefile》)
- IPC和Socket的东西可以放到高U中来实c?/li>
- 学习Windows SDK~程Q?a target="_blank" style="color: #2970a6; text-decoration: initial;">Windows E序设计 Q?a target="_blank" style="color: #2970a6; text-decoration: initial;">MFCE序设计Q?/li>
- 写一个窗口,了解WinMain/WinProcedureQ以及Windows的消息机制?/li>
- 写一些程序来操作Windows SDK中的资源文g或是各种囑Ş控gQ以及作囄~程?/li>
- 学习如何使用MSDN查看相关的SDK函数Q各UWM_消息以及一些例E?/li>
- q本书中有很多例E,在实践中请不要照抄,试着自己写一个自q例程?/li>
- 不用太多于精通这些东西,因ؓGUI正在被Web取代Q主要是了解一下Windows 囑Ş界面的编E。@virushuo _“ 我觉得GUI实不那么热门了Q但充分理解GUI工作原理是很重要的。包括移动设备开发,如果没有基础知识仍然很吃力。或者说Ud讑֤开发必ȝ解GUI工作Q或者在win那边学,或者在mac/iOS上学”?/li>
2、学习Java
- Java 的学习主要是看经典的Core Java ?a target="_blank" style="color: #2970a6; text-decoration: initial;">Java 核心技术编E?/a>》和?a target="_blank" style="color: #2970a6; text-decoration: initial;">Java~程思想》(有两P我仅链了W一P_了,因ؓJava的图形界面了解就可以了)
- 学习JDKQ学会查阅Java API Doc http://download.oracle.com/javase/6/docs/api/
- 了解一下Javaq种虚拟a和C和Python语言在编译和执行上的差别。从C、Java、Python思考一?#8220;跨^?#8221;q种技术?/li>
- 学会使用IDE EclipseQ用Eclipse ~译Q调试和开发JavaE序?/li>
- Z个Tomcat的网站,试一下JSP/Servlet/JDBC/MySQL的Web开发。把前面所说的那个PHP的小目试着用JSP和Servlet实现一下?/li>
3、Web的安全与架构
- 学习HTML5Q网上有很多很多教程Q以?a target="_blank" style="color: #2970a6; text-decoration: initial;">酷壳也介l过很多Q我在这里就不罗列了?/li>
- 学习Web开发的安全问题Q参?a title="新浪微博的XSSd" target="_blank" style="color: #2970a6; text-decoration: initial;">新浪微博被攻ȝq个?/a>Q以?a target="_blank" style="color: #2970a6; text-decoration: initial;">Ruby的这文?/a>Q?/li>
- 学习HTTP Server的rewrite机制QNginx的反向代理机Ӟfast-cgiQ如Q?a target="_blank" style="color: #2970a6; text-decoration: initial;">PHP-FPMQ?/li>
- 学习Web的静态页面缓存技术?/li>
- 学习Web的异步工作流处理Q数据CacheQ数据分区,负蝲均衡Q水qx展的构架?/li>
- 实践dQ?/strong>
- 使用HTML5的canvas 制作一些Web动画?/li>
- 试在前面开发过的那个Web应用中进行SQL注入QJS注入Q以及XSSd?/li>
- 把前面开发过的那个Web应用Ҏ构造在Nginx + PHP-FPM + 静态页面缓存的|站
4、学习关pd数据?/strong>
- 你可以安装MSSQLServer或MySQL来学习数据库?/li>
- 学习教科书里数据库设计的那几个范式,1NFQ?NFQ?NFQ?#8230;…
- 学习数据库的存过Q触发器Q视图,建烦引,游标{?/li>
- 学习SQL语句Q明白表q接的各U概念(参看?a title="图解SQL的Join" style="color: #2970a6; text-decoration: initial;">SQL Join的图C?/a>》)
- 学习如何优化数据库查询(参看?a title="MySQL性能优化的最?0+条经? style="color: #2970a6; text-decoration: initial;">MySQL的优?/a>》)
- 实践dQ设计一个论坛的数据库,臛_满3NFQ用SQL语句查询本周Q本月的最新文章,评论最多的文章Q最z跃用户?/li>
5、一些开发工?/strong>
- 学会使用SVN或Git来管理程序版本?/li>
- 学会使用JUnit来对Javaq行单元试?/li>
- 学习C语言和Java语言的coding standard ?coding guideline。(我Nq前写过一关C语言非常单的文章——?a target="_blank" style="color: #2970a6; text-decoration: initial;">~程修养》,q样的东西你可以上网查一下,一大堆Q?/li>
- 推荐阅读?a target="_blank" style="color: #2970a6; text-decoration: initial;">代码大全》?a target="_blank" style="color: #2970a6; text-decoration: initial;">重构》?a target="_blank" style="color: #2970a6; text-decoration: initial;">代码整洁之道?/li>
高深入
1、C++ / Java 和面向对?/strong>
我个Z为学好C++QJava也就是D手之功뀂但是C++的学习曲U相当的陡。不q,我觉得C++是最需要学好的语言了。参看两趣?#8220;C++学习信心?/a>” ?#8220;21天学好C++”
- 学习Q麻省理工免费课E)C++面向对象~程
- L?“如何学好C++”中所推荐的那些书臛_两遍以上Q如果你对C++的理解能够深入到像我所写的?a target="_blank" style="color: #2970a6; text-decoration: initial;">C++虚函数表解析》或是?a target="_blank" style="color: #2970a6; text-decoration: initial;">C++对象内存存局Q?a target="_blank" style="color: #2970a6; text-decoration: initial;">?/a>Q(?/a>Q》,或是?a target="_blank" style="color: #2970a6; text-decoration: initial;">C/C++q回内部静态成员的陷阱》那非怸错了Q?/li>
- 然后反思ؓ什么C++要干成这PJava则不是?你一定要学会ҎC++和Java的不同。比如,Java中的初始化,垃圾回收Q接口,异常Q虚函数Q等{?/li>
- 实践dQ?/strong>
- 用C++实现一个BigIntQ支?28位的整Ş的加减乘除的操作?/li>
- 用C++装一个数据结构的定wQ比如hash table?/li>
- 用C++装q实C个智能指针(一定要使用模板Q?/li>
- ?a target="_blank" style="color: #2970a6; text-decoration: initial;">设计模式》必需一读,两遍以上Q思考一下,q?3个模式的应用场景。主要是两点Q?Q钟q合而不是承,2Q钟爱接口而不是实现。(也推荐?a style="color: #2970a6; text-decoration: initial;">深入出设计模式》)
- 实践dQ?/strong>
- 使用工厂模式实现一个内存池?/li>
- 使用{略模式制做一个类其可以把文本文gq行左对齐,叛_齐和中对齐?/li>
- 使用命o模式实现一个命令行计算器,q支持undo和redo?/li>
- 使用修饰模式实现一个酒店的戉Kh订h{略——旺季Q服务,VIP、旅行团、等影响h的因素?/li>
- 学习STL的用法和其设计概? - 容器Q算法,q代器,函数子。如果可能,误一下其源码?/li>
- 实践dQ?/strong>试使用面向对象、STLQ设计模式、和WindowsSDK囑Ş~程的各U技?/li>
- 做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的U别和难度?/li>
- 做一个文件浏览器Q可以浏览目录下的文Ӟq可以对不同的文件有不同的操作,文本文g可以打开~辑Q执行文件则执行之,mp3或avi文g可以播放Q图片文件可以展C图片?/li>
- 学习C++的一些类库的设计Q如Q?MFCQ看看候捷老师的?a target="_blank" style="color: #2970a6; text-decoration: initial;">深入出MFC》) QBoost, ACE, CPPUnitQSTL QSTL可能会太难了Q但是如果你能了解其中的设计模式和设计那太好了Q如果你能深入到我写的?a target="_blank" style="color: #2970a6; text-decoration: initial;">STL stringcȝ写时拯技?/a>》那非怸错了QACE需要很强在的系l知识,参见后面?#8220;加强对系l的了解”Q?/li>
- Java是真正的面向对象的语aQJava的设计模式多得不能再多,也是用来学习面向对象的设计模式的最佌a了(参看Java中的设计模式Q?/li>
- 推荐阅读?a style="color: #2970a6; text-decoration: initial;">Effective Java?and ?a style="color: #2970a6; text-decoration: initial;">Java解惑?/li>
- 学习Java的框ӞJava的框架也是多Q如Spring, HibernateQStruts {等Q主要是学习Java的设计,如IoC{?/li>
- Java的技术也是烂多,重点学习J2EE架构以及JMSQ?RMI, {消息传递和q程调用的技术?/li>
- 学习使用Java做Web Service Q?a target="_blank" style="color: #2970a6; text-decoration: initial;">官方教程在这?/a>Q?/li>
- 实践dQ?nbsp;试在Spring或Hibernate框架下构Z个有|络的Web Service的远E调用程序,q可以在两个Service中通过JMS传递消息?/li>
C++和Java都不是能在短旉内能学好的,C++玩是的深QJava玩的是广Q我两者选一个。我个h的学习经历是Q?/p>
- qC++Q我qC/C++了十来年了)
- 学习Java的各U设计模式?/li>
2、加强系l了?/strong>
重要阅读下面的几本书Q?/p>
- ?a target="_blank" style="color: #2970a6; text-decoration: initial;">Unix~程艺术》了解Unixpȝ领域中的设计和开发哲学、思想文化体系、原则与l验。你一定会有一U醍醐灌的感觉?/li>
- ?a target="_blank" style="color: #2970a6; text-decoration: initial;">Unix|络~程?Q套接字》这是一本看完你明白网l编E的书。重要注意TCP、UDPQ以及多路复用的pȝ调用select/poll/epoll的差别?/li>
- ?a target="_blank" style="color: #2970a6; text-decoration: initial;">TCP/IP详解 ?:协议? q是一本看完后你就可以当网l黑客的书。了解以太网的的q作原理Q了解TCP/IP的协议,q作原理以及如何TCP的调优?/li>
- 实践dQ?/strong>
- 理解什么是dQ同步IOQ,非阻塞(异步IOQ,多\复用Qselect, poll, epollQ的IO技术?/li>
- 写一个网l聊天程序,有聊天服务器和多个聊天客LQ服务端用UDP寚w分或所有的的聊天客LqMulticast或BroadcastQ?/li>
- 写一个简易的HTTP服务器?/li>
- ?a target="_blank" style="color: #2970a6; text-decoration: initial;">Unix|络~程?Q进E间通信》信号量Q管道,׃n内存Q消息等各种IPC…… q些技术好像有点老掉牙了Q不q还是值得了解?/li>
- 实践dQ?/strong>
- 主要实践各种IPCq程序通信的方法?/li>
- 试写一个管道程序,父子q程通过道交换数据?/li>
- 试写一个共享内存的E序Q两个进E通过׃n内存交换一个C的结构体数组?/li>
- 学习?a target="_blank" style="color: #2970a6; text-decoration: initial;">Windows核心~程》一书。把CreateProcessQWindowsU程、线E调度、线E同步(Event, 信号量,互斥量)、异步I/OQ内存管理,DLLQ这几大块搞_N?/li>
- 实践dQ?/strong>使用CreateProcess启动一个记事本或IEQƈ监控该程序的q行。把前面写过的那个简易的HTTP服务用线E池实现一下。写一个DLL的钩子程序监控指定窗口的关闭事gQ或是记录某个窗口的按键?/li>
- 有了多线E、多q程通信QTCP/IPQ套接字QC++和设计模式的基本Q你可以研究一下ACE了。用ACE重写上述的聊天程序和HTTP服务器(带线E池Q?/li>
- 实践dQ?/strong>通过以上的所有知识,试
- 写一个服务端l客L传大文gQ要求把100M的带宽用?0%以上。(注意Q磁盘I/O和网lI/O可能会很有问题,想一x么解决Q另外,h意网l传输最大单元MTUQ?/li>
- 了解BT下蝲的工作原理,用多q程的方式模拟BT下蝲的原理?/li>
3、系l架?/strong>
写了那么多,回顾一下,觉得自己相当的有成就感。希望大家不要吓着Q我自己q十来年也在不断地学习,今天我也在学习中Qh生本来就是一个不断学习和l的过E?strong>不过Q一定有漏的Q也有不对的Q还希望大家补充和更?/strong>。(我会Ҏ大家的反馈随时更新此?/strong>Q欢q大安过我的微博Q?a target="_blank" style="color: #2970a6; text-decoration: initial;">@左x耗子Q和twitterQ@haoelQ和我交?/p>
—– 更新 2011/07/19 —–
1Q有朋友奇怪ؓ什么我在这文章开头说了web+UdQ却没有在后面提到iOS/Android的前端开发。因为我心里有一U感觉,Ud讑֤上的UI最l也会被Javascript取代。大家可以用iPhone或Android看看google+Q你׃明白了?/p>
2Q有朋友说我q里的东西太多了Q不能ؓ了学习而学习,我非常同意。我在文章的前面也说了要思考。另外,千万不要以ؓ我说的这些东西是一些新的技术,q䆾ȝ?5%以上的全是基。而且都是久经考验的基技术。即是可以让你一通百通的技术,也是可以让你扑ֈ一份不错工作的技术?/p>
3Q有朋友说学q些东西学完?0了,q不如想x么L钱。我惛_诉大Ӟ一是我今年q没?0岁,二是学无止境啊,三是我不觉得挣钱有多难,隄是怎么让你值那么多钱?无论是打工还是创业,是什么东西让你自q价|让你公司的h值更值钱Q别的地Ҏ不敢_对于互联|或IT公司来说Q技术实力绝Ҏ其中之一?/p>
4Q有朋友说技术都是工P不应该如此痴q句话没有错,有时候我们需要更多的是抬起头来看看技术以外的事情Q或者是说我们在作技术的时候不L考ؓ什么会有这个技术,Z么不是别的,问题不在于技术,问题在于我们死读书,L书,成了技术的书呆子?/p>
5Q?对于NoSQLQ最q比较火Q但我对其有点保守,所以,我只是说了解可以。对于HadoopQ我觉得其在分布式系l上有巨大的潜力Q所以需要学习?nbsp;对于关系型数据库Q的是很重要的东西Q这Ҏ我的疏忽Q在原文里补充?/p>
Q全文完Q{载时h明作者和出处Q?/strong>

]]>