13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

程序员技术练级攻略

月光博客发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告诉我,他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜欢编程和技术的家伙,于是,我让他把他的一些学习Python和Web编程的一些点滴总结一下。于是他给我发来了一些他的心得和经历,我在把他的心得做了不多的增改,并根据我的经历增加了“进阶”一节。这是一篇由新手和我这个老家伙根据我们的经历完成的文章

我的这个朋友把这篇文章取名叫Build Your Programming Technical Skills,我实在不知道用中文怎么翻译,但我在写的过程中,我觉得这很像一个打网游做任务升级的一个过程,所以取名叫“技术练级攻略”,题目有点大,呵呵,这个标题纯粹是为了好玩这里仅仅是在分享Mailper和我个人的学习经历。(注:省去了我作为一个初学者曾经学习过的一些技术(今天明显过时了),如:Delphi/Power builder,也省去了我学过的一些我觉得没意思的技术Lotus Notes/ActiveX/COM/ADO/ATL/.NET ……)

前言

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

建议:

:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:

所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。

启蒙入门

1.学习一门脚本语言,例如Python/Ruby

可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:

为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。

2. 用熟一种程序员的编辑器(不是IDE) 和一些基本工具

使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。

3. 熟悉Unix/Linux Shell和常见的命令行

对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。

4. 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)

未来必然是Web的世界,学习WEB基础的最佳网站是W3School。

#p#

进阶加深

1. C语言和操作系统调用

  1.  用这些系统知识操作一下文件系统,用户(实现一个可以拷贝目录树的小程序)
  2. 用fork/wait/waitpid写一个多进程的程序,用pthread写一个多线程带同步或互斥的程序。多进程多进程购票的程序。
  3. 用signal/kill/raise/alarm/pause/sigprocmask实现一个多进程间的信号量通信的程序。
  4. 学会使用gcc和gdb来编程和调试程序(参看我的《用gdb调试程序》)
  5. 学会使用makefile来编译程序。(参看我的《跟我一起写makefile》)
  6. IPC和Socket的东西可以放到高级中来实践。
  1. 写一个窗口,了解WinMain/WinProcedure,以及Windows的消息机制。
  2. 写一些程序来操作Windows SDK中的资源文件或是各种图形控件,以及作图的编程。
  3. 学习如何使用MSDN查看相关的SDK函数,各种WM_消息以及一些例程。
  4. 这本书中有很多例程,在实践中请不要照抄,试着自己写一个自己的例程。
  5. 不用太多于精通这些东西,因为GUI正在被Web取代,主要是了解一下Windows 图形界面的编程。@virushuo 说:“ 我觉得GUI确实不那么热门了,但充分理解GUI工作原理是很重要的。包括移动设备开发,如果没有基础知识仍然很吃力。或者说移动设备开发必须理解GUI工作,或者在win那边学,或者在mac/iOS上学”。

2.学习Java

3.Web的安全与架构

  1. 使用HTML5的canvas 制作一些Web动画。
  2. 尝试在前面开发过的那个Web应用中进行SQL注入,JS注入,以及XSS攻击。
  3. 把前面开发过的那个Web应用改成构造在Nginx + PHP-FPM + 静态页面缓存的网站

4.学习关系型数据库

5.一些开发工具

高级深入

1.C++ / Java 和面向对象

我个人以为学好C++,Java也就是举手之劳。但是C++的学习曲线相当的陡。不过,我觉得C++是最需要学好的语言了。参看两篇趣文“C++学习信心图” 和“21天学好C++”

  1. 用C++实现一个BigInt,支持128位的整形的加减乘除的操作。
  2. 用C++封装一个数据结构的容量,比如hash table。
  3. 用C++封装并实现一个智能指针(一定要使用模板)。

《设计模式》必需一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。(也推荐《深入浅出设计模式》)

  1. 使用工厂模式实现一个内存池。
  2. 使用策略模式制做一个类其可以把文本文件进行左对齐,右对齐和中对齐。
  3. 使用命令模式实现一个命令行计算器,并支持undo和redo。
  4. 使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。

学习STL的用法和其设计概念  - 容器,算法,迭代器,函数子。如果可能,请读一下其源码。

  1. 做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。
  2. 做一个文件浏览器,可以浏览目录下的文件,并可以对不同的文件有不同的操作,文本文件可以打开编辑,执行文件则执行之,mp3或avi文件可以播放,图片文件可以展示图片。

#p#

C++和Java都不是能在短时间内能学好的,C++玩是的深,Java玩的是广,我建议两者选一个。我个人的学习经历是:

2.加强系统了解

重要阅读下面的几本书:

  1. 理解什么是阻塞(同步IO),非阻塞(异步IO),多路复用(select, poll, epoll)的IO技术。
  2. 写一个网络聊天程序,有聊天服务器和多个聊天客户端(服务端用UDP对部分或所有的的聊天客户端进Multicast或Broadcast)。
  3. 写一个简易的HTTP服务器。
  1. 主要实践各种IPC进程序通信的方法。
  2. 尝试写一个管道程序,父子进程通过管道交换数据。
  3. 尝试写一个共享内存的程序,两个进程通过共享内存交换一个C的结构体数组。
  1.  写一个服务端给客户端传大文件,要求把100M的带宽用到80%以上。(注意,磁盘I/O和网络I/O可能会很有问题,想一想怎么解决,另外,请注意网络传输最大单元MTU)
  2. 了解BT下载的工作原理,用多进程的方式模拟BT下载的原理。

3.系统架构

写了那么多,回顾一下,觉得自己相当的有成就感。希望大家不要吓着,我自己这十来年也在不断地学习,今天我也在学习中,人生本来就是一个不断学习和练级的过程。不过,一定有漏的,也有不对的,还希望大家补充和更正。(我会根据大家的反馈随时更新此文)欢迎大家通过我的微博(@左耳朵耗子)和twitter(@haoel)和我交流。

1)有朋友奇怪为什么我在这篇文章开头说了web+移动,却没有在后面提到iOS/Android的前端开发。因为我心里有一种感觉,移动设备上的UI最终也会被Javascript取代。大家可以用iPhone或Android看看google+,你就会明白了。

2)有朋友说我这里的东西太多了,不能为了学习而学习,我非常同意。我在文章的前面也说了要思考。另外,千万不要以为我说的这些东西是一些新的技 术,这份攻略里95%以上的全是基础。而且都是久经考验的基础技术。即是可以让你一通百通的技术,也是可以让你找到一份不错工作的技术。

3)有朋友说学这些东西学完都40了,还不如想想怎么去挣钱。我想告诉大家,一是我今年还没有40岁,二是学无止境啊,三是我不觉得挣钱有多难,难 的是怎么让你值那么多钱?无论是打工还是创业,是什么东西让你自己的价值,让你公司的价值更值钱?别的地方我不敢说,对于互联网或IT公司来说,技术实力 绝对是其中之一。

4)有朋友说技术都是工具,不应该如此痴迷这句话没有错,有时候我们需要更多的是抬起头来看看技术以外的事情,或者是说我们在作技术的时候不去思考为什么会有这个技术,为什么不是别的,问题不在于技术,问题在于我们死读书,读死书,成了技术的书呆子。

5) 对于NoSQL,最近比较火,但我对其有点保守,所以,我只是说了解就可以。对于Hadoop,我觉得其在分布式系统上有巨大的潜力,所以需要学习。 对于关系型数据库,的确是很重要的东西,这点是我的疏忽,在原文里补充。


网页名称:程序员技术练级攻略
当前URL:http://cdbrznjsb.com/article/cccccij.html

其他资讯

让你的专属顾问为你服务