程序员技术练级攻略(转载)

 

谨以此文献给仍碌碌无为,却渴望成功之Me!,码农路漫漫,需要有同等粒坚定的方寸

本文转载自左耳朵耗子的博文,地址:http://coolshell.cn/articles/4990.html

月色博客6月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程序。
  • 筑一个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等。

写了那多,回顾一下,觉得温馨一定之来成就感。希望大家不用吓着,我好马上十来年也于频频地学习,今天自也以念着,人生本来就是是一个连连学习及练级的长河。只是,一定生漏的,也发出邪的,还愿意大家补充和修正。(我会根据大家的申报随时更新此文)欢迎大家经过自己之微博(@左耳朵耗子)和twitter(@haoel)和自家交流。

—– 更新  2011/07/19 —–

1)有情侣奇怪为什么自己在及时篇稿子开始说了web+移动,却从没当背后提到iOS/Android的前端开发。因为自衷心有相同种植感觉,移动设备及之UI最终也会叫Javascript取代。大家可为此iPhone或Android看看google+,你尽管见面分晓了。

2)有朋友说自己此的事物顶多矣,不能够为求学要上学,我死去活来同意。我以篇章的前方吧说了而想。另外,千万不要觉得我说的这些事物是一些初的艺,这卖攻略里95%之上的全都是基础。而且都是砥砺的功底技术。即凡是好吃您一样通百通的技艺,也是可于你找到同样客对工作之技术。

3)有情侣说学这些东西学了都40了,还无若考虑怎么去赚钱。我思告诉大家,一凡是自身今年尚从未40年度,二凡学无止境啊,三是自我无认为赚钱有差不多麻烦,难之凡怎给你值那么基本上钱?无论是打工或创业,是什么事物被你协调之价,让您企业之值更值钱?别的地方我未敢说,对于互联网或IT公司吧,技术实力绝对是内之一。

4)有心上人说技术还是工具,不应该如此着迷这句话没错,有时候我们需要重新多之是抬起头来看看技术外的工作,或者是说咱俩以发作技术之时光不失去想想为什么会产生是技能,为什么未是别的,问题无在于技术,问题在于我们死读书,读死书,成了技术的书呆子。

5)
对于NoSQL,最近可比火,但自身本着那有些保守,所以,我只是说了解就得。对于Hadoop,我觉着那个以分布式系统上产生伟大的潜力,所以要上。 对于涉嫌项目数据库,的确是很重要的物,这点是本身之疏忽,在原文里添。

网站地图xml地图