程序员技术练级攻略

本文作者:陈皓

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

月光博客十月12日刊登了《写给新手程序员的一封信》,翻译自《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 ……)

前言

你是或不是认为自个儿从高校结束学业的时候只做过小玩意儿一样的次第?走入职场后就是没有啥样经验也可以把以下那几个课外练习走五次(朋友的抱怨:高校课程总是从理论出发,作业项目都看不出有何样实际成效,不如从工作中的需要出发)

建议:

  • 无须乱买书,不要乱追新技巧新名词,基础的东西经过不短日子累积而且还会在将来最少10年通用。
  • 纪念一下历史,看看历史上时间线上技巧的迈入,你才能领略前几天会是怎么着。
  • 肯定要入手,例子不管多么简单,提议至少本人手敲两遍看看是或不是知情了里头的细节。
  • 自然要学会思考,思考为啥要如此,而不是那样。还要举一反三地考虑。

:你恐怕会很意外为啥上面的事物很偏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程序。
  • 建一个汤姆cat的网站,尝试一下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图形编程的各个技能
    • 做一个贪吃蛇或是俄联邦四方的游乐。支持差其他级别和难度。
    • 做一个文本浏览器,可以浏览目录下的文件,并可以对两样的文书有两样的操作,文本文件能够打开编辑,执行文书则执行之,mp4或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的长途调用程序,并可以在多个瑟维斯中通过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线程、线程调度、线程同步(伊夫nt,
     信号量,互斥量)、异步I/O,内存管理,DLL,这几大块搞领会。
  • 实施义务:利用CreateProcess启动一个记事本或IE,并监控该程序的周转。把前边写过的要命简单的HTTP服务用线程池完成一下。写一个DLL的钩子程序监控指定窗口的关门事件,或是记录某个窗口的按键。
  • 有了八线程、多进程通讯,TCP/IP,套接字,C++和设计情势的为主,你可以钻探一下ACE了。使用ACE重写上述的扯淡程序和HTTP服务器(带线程池)
  • 进行职分:经过上述的富有知识,尝试
    • 写一个服务端给客户端传大文件,必要把100M的带宽用到80%之上。(注意,磁盘I/O和网络I/O或然会很有难题,想一想怎么化解,其它,请留意互联网传输最大单元MTU)
    • 刺探BT下载的劳作规律,用多进度的不二法门模拟BT下载的原理。

3、系统架构

  • 负载均衡。HASH式的,纯动态式的。(可以到谷歌学术里搜一些关于负载均衡的小说读读)
  • 多层分布式系统 –
    客户端服务结点层、计算结点层、数据cache层,数据层。J2EE是经典的多层构造。
  • CDN系统 – 就近访问,内容边缘化。
  • P2P式系统,琢磨一下BT和电驴的算法。比如:DHT算法
  • 服务器备份,双机备份系统(Live-Standby和Live-Live系统),两台机械怎么着通过心跳监测对方?集群主结点备份。
  • 虚拟化技术,使用这么些技术,可以把操作系统当应用程序一下切换或重新配置和布局。
  • 学习Thrift,二进制的高品质的简报中间件,帮衬数据(对象)系列化和八种类型的RPC服务。
  • 学习Hadoop。Hadoop框架中最主题的规划就是:MapReduce和HDFS。MapReduce的构思是由谷歌的一篇杂文所提及而被传出的,简单的一句话解释MapReduce就是“义务的表明与结果的会聚”。HDFS是Hadoop分布式文件系统(Hadoop
    Distributed File System)的缩写,为分布式统计存储提供了底层协助。
  • 了解NoSQL数据库(有人说或许是一个紧接炒作的技能),可是因为超大规模以及高并发的纯动态型网站日渐变成主流,而SNS类网站在多少存取进程中具备实时性等刚性须要,那使得近期NoSQL数据库逐步成了人们所关心的刀口,并大有成为取代关系型数据库而成为将来主流数据存储格局的来头。当前NoSQL数据库很多,半数以上都是开源的,其中比较显赫的有:MemcacheDB、Redis、Tokyo
    Cabinet(升级版为Kyoto
    Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。

写了那么多,回看一下,觉得温馨一定的有成就感。希望我们不用吓着,我要好那十来年也在相连地上学,后天我也在上学中,人生本来就是一个穿梭学习和练级的经过。但是,一定有漏的,也有不规则的,还可望大家补充和改正。(我会依据我们的反映随时更新此文)欢迎我们经过自个儿的博客园(@左耳朵耗子)和twitter(@haoel)和本人互换。

—– 更新  2011/07/19 —–

1)有心上人奇怪为何自身在那篇小说初始说了web+移动,却尚未在前面提到iOS/Android的前端开发。因为我心头有一种感觉,移动装备上的UI最后也会被Javascript取代。大家可以用One plus或Android看看google+,你就会清楚了。

2)有情侣说我那里的事物太多了,不或者为了求学而读书,我足够同意。我在作品的前方也说了要考虑。其它,千万不要认为我说的这么些事物是一对新的技能,那份攻略里95%上述的全是基础。而且都是砥砺的底子技术。即是可以让您一通百通的技艺,也是能够让你找到一份不错工作的技能。

3)有意中人说学这么些东西学完都40了,还不如考虑怎么去挣钱。我想告知大家,一是我当年还没有40岁,二是学无止境啊,三是自家不认为赚钱有多难,难的是怎么让你值那么多钱?无论是打工如故创业,是什么样事物让你协调的价值,让您集团的市值更高昂?其他地点我不敢说,对于互连网或IT公司来说,技术实力相对是内部之一。

4)有对象说技术都是工具,不该那样着迷这句话没有错,有时候大家要求更加多的是抬开始来看看技术以外的作业,可能是说俺们在作技术的时候不去思想为何会有其一技术,为啥不是其余,难点不在于技术,难点在于大家死读书,读死书,成了技术的书呆子。

5)
对于NoSQL,近期相比较火,但我对其稍微保守,所以,我只是说明白就足以。对于Hadoop,我觉得其在分布式系统上有巨大的潜力,所以须要上学。 对于关系型数据库,的确是很重点的事物,那点是自家的大意,在原文里补充。

网站地图xml地图