翻译自《An open letter to those who want to start programming》——这是一篇新手和老鸟共同完成的文章。
Build your Programming technical Skills.
Suggestions:
.不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来通用十年。
.回顾历史,看看历史上时间线上技术的发展,你就能明白明天会是怎样。
.一定要多动手,例子不管多简单,建议至少自己手敲一笔看看是否理解里面的细枝末节。
.一定要学会多思考,思考为什么会这样,而不是那样。还要举一反三地思考。
现在的用户界面几乎被两个东西主宰了,web,移动设备iOS(Android)。Windows的图形界面不吃香了。
越来越多的企业在用低成本高性能的Linux和各种开源技术来架构其系统,Windows的成本太高了。
微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。详情请看(Windows编程革命史)。
个人认为以后的趋势是前端web+移动,后端是linux+开源。
启蒙入门
1.学习一门脚本语言,例如Python/Ruby
可以让我们摆脱对底层语言的恐惧感,脚本语言可以让我们很快开发出能用得上的小程序。
可以用来实践的项目:
(1)处理文本文件,或者csv(关键词python csv,python open,python sys)读一个本地文件,逐行处理(例如 word count,或者处理log)
(2)遍历本地文件系统(sys,os,path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果
.跟数据库打交道(python sqlite),写一个小脚本统计数据库里条目数量。
.学会用Google(phrase ,domain ,use reader to follow tech blogs)
脚本语言的优势:非常方便,很多时候我们写点小工具或是脚本来帮我们解决问题,用正规的语言做到这点太难了。
2.用熟一种程序员的编辑器(不是IDE)和一些基本工具
.vim/Emacs/Notepad++,学会如何配置代码补全,外观,外部命令等。
.Source insight(或ctag)
使用这些东西不是为了装逼,而是这些编辑器在查看,修改代码/配置文章/日志更快更有效率。
3.熟悉Linux shell 常见的命令行。
.如果你用Windows,至少学会用虚拟机里的Linux,vmware player 是免费的,装个Ubuntu吧
.一定要少用图形界面
.学会使用man来查看帮助
.文件系统结构和基本操作ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip...
.学会使用一些管理类的命令ps/top/lsof/netstat/kill/tcpdump/iptables/dd...
.学会使用一些文本操作命令sed/awk/grep/tail/less/more
.了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息
.了解正则表达式,使用正则表达式来查找文件。
4.学习Web基础(HTML/CSS/JS)+服务器端技术(LAMP)
未来必然是web的世界,学习web基础的最佳网站是W3School。
.学会使用HTML基本语法
.学会使用CSS 如何选中HTML元素并应用一些基本样式(关键词:box model)
.学会使用Firefox+Firbug+chorme查看你就的很炫的网页结构,并动态修改。
.学会使用Javascipt操作HTML元件。理解DOM 和 动态网页(http://oreilly.com/catalog/978059696527402)网上有免费的章节,足够用了。或者参看DOM.
.学会使用Firefox+Firbug+chorme调试Javascipt代码(设置断点,查看变量,性能,控制台等)
.在一台机器上配置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 读完前四章你就明白了你每天上网用浏览器的时候发生的事情了(proxy,gateway,browsers)
.做一个小网站,一个小小的留言板,支持用户登录,Cookie/Sseesion,增,删,改查,上传图片附件,分页显示。。。
进阶加深:
1,c语言和操作系统调用
.重新学习c语言,理解指针和内存模型,用c语言实现一下各种经典的算法和数据结构。推荐《计算机程序设计艺术》,《算法导论》《编程珠玑》.
.学习(麻省理工免费课程)计算机科学和编程导论
.学习(麻省理工免费课程)C语言内存管理
.学习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图形界面的编程。充分理解GUI工作原理是很重要的。包括移动设备开发,如果没有基础知识依然很吃力。或者说移动设备开发必需理解GUI工作,或者在Win那边学,或者在mac/ios上学。
2学习Java
.Java的学习主要是看经典的Core JAVA《核心技术编程》和《Java编程思想》(Java的图形界面了解就可以了)
.学习JDK,学会查阅JavaAPI Doc http://download.oracle.coom/jvase/6/docs/api/
.了解一下Java这种虚拟语言和c和python语言在编译和执行上的区别。从C,java,python思考一下“跨平台的技术”。
.学会使用IDE Eclipse,使用Eclipse编译,调试,和开发java程序。
.建一个tomcat的网站,尝试一下JSP/Servlet/JDBC/Mysql的web开发。把前面所说的那个PHP的小项目试着用JSp和Sevlet实现以下。
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来学习数据库。
.学习教科书里数据库设计的那几个范式,INF,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++实现一个Biglnt,支持128位的整型的加减乘除的操作
。用C++封装一个数据结构的容量,比如hash table
。用C++封装并实现一个智能指针(一定要使用模板)
。《设计模式》必须读一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:
钟爱组合而不是继承,钟爱接口而不是实现。也推荐《深入浅出设计模式》
.实践任务:
。使用工厂模式实现一个内存池
。使用策略模式制作一个类其可以把文本文件进行左对齐,右对齐,右对齐和中对齐
。使用命令模式实现一个命令行计算器,并支持undo和redo.
。使用修饰模式实现一个酒店的房间价格定价策略--旺季,服务,vip,旅行团。等影响价格的因素
.学习STL的用法和其设计概念-容器,算法,迭代器,函数子。如果可能,请读一下其源码。
。实践任务:尝试使用面向对象,STL,设计模式,和WindowsSDK图形编辑器的各种技能
。做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。
。做一个文件浏览器,可以浏览目录下的一个文件,并可以对不同的文件有不同的操作,文本打开之后可以编辑,可以执行执行文件,mp3或AVI文件可以进行播放,图片文件可以展示图片。
。学习C++的一些类库的设计,如:MFC(看看侯捷老师的《深入浅出MFC》),Boost,ACE,CppUnit,STL(STL可能比较难但是如果你能了解其中的设计模式和设计那就太好了,如果你能深入到我写的《STLstring类的写时拷贝技术》那就非常不错了,,ACE需要很强的系统知识,参考后面“加强对系统的了解”
。Java是真正的面向对象的语言,JAVA的设计模式多得不能再多,也是用来学习面向对象的设计模式的最佳语言(参看Java中的设计模式)。
。推荐阅读《Effective Java》和《Java解惑》
。学习Java的框架,Java的框架也是很多,如Spring,Hibernate,Struts等等,主要也是学习Java的设计,如loc等。
。Java的技术也是很多,重点学习J2EE架构以及JMS,RML,等消息传递和远程调用的技术
。学习使用Java做Web Service
.实践任务:尝试在Spring Hibernnate框架下构建一个有用网络的Web Service 的远程调用程序,并可以在两个Service中通过JMS传递消息。
C++和Java都不是在短时间内就能学好的C++是深度,Java是广度,我建议两者选一个。我个人的学习经历是:
。深究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的结构体数组。
本文来自酷壳网(CoolShell)
程序员技术练级攻略