序言
你是否定为自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么履历也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际浸染,不如从事情中的需求出发)
建议:

注: 你大概会很奇怪为什么下面的东西很偏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 Definitive 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 程序设计 ,MFC程序设计)写一个窗口,理解WinMain/WinProcedure,以及Windows的机制。写一些程序来操作Windows SDK中的资源文件或是各种图形控件,以及作图的编程。学习如何利用MSDN查看干系的SDK函数,各种WM_以及一些例程。这本书中有很多例程,在实践中请不要照抄,试着自己写一个自己的例程。不用太多于精通这些东西,由于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,数据分区,负载均衡,水平扩展的构架。实践任务:利用HTML5的canvas 制作一些Web动画。考试测验在前面开拓过的那个Web运用中进行SQL注入,JS注入,以及XSS攻击。把前面开拓过的那个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中的初始化,垃圾回收,接口,非常,虚函数,等等。实践任务:用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等。