软件程序员的技术练级攻略(2)

发表于:2013-11-25来源:酷壳 - CoolShell.cn作者:陈皓点击数: 标签:程序员
HTTP: The Definitive Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers) 做个小网站(例如:一个小的留言板,支持用户登录,

  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)钟爱接口而不是实现。(也推荐《深入浅出设计模式》)

  实践任务:

原文转自:http://coolshell.cn/articles/4990.html