【delphi开源代码栏目提醒】:网学会员,鉴于大家对delphi开源代码十分关注,论文会员在此为大家搜集整理了“程序员技术练级攻略(转) - 技术总结”一文,供大家参考学习!
转自http://coolshell.cn/articles/4990.
html月光
博客6月12日发表了《写给新手程序员的一封信》翻译自《An open letter to those who want to start programming》我的朋友他在本站的id是Mailper告诉我他希望在酷壳上看到一篇更具操作性的文章。
因为他也是喜欢编程和技术
的家伙于是我让他把他的一些学习Python和Web编程的一些点滴
总结一下。
于是他给我发来了一些他的
心得和经历我在把他
的心得做了不多的增改并根据我的经历增加了“进阶”一节。
这是一篇由新手和我这个老家伙根据我们的经历完成的文章。
我的这个朋友把这篇文章取名叫Build Your ProgrammingTechnicalSkills我实在不知道用
中文怎么翻译但我在写的过程中我觉得这很像一个打网游做任务升级的一个过程所以取名叫“技术练级攻略”
题目有点大呵呵这个标题纯粹是为了好玩。
这里仅仅是在分享Mailper和我个人的学习经历。
注省去了我
作为一个初学者曾经学习过的一些技术今天明显过时了如
Delphi/Power builder也省去了我学过的一些我觉得没意思的技术Lotus
Notes/ActiveX/
COM/ADO/
ATL/.
NET ……前言你是否觉得自己从学校
毕业的时候只做过小玩具一样的程序走入职场后哪怕没有什么经验也可以把以下这些课外
练习走一遍朋友的抱怨学校课程总是从
理论出发
作业项目都看不出有什么实际
作用不如从工作中的需求出发建议l不要乱买书不要乱追新技术新名词基础的东西经过很长时间积累而且还会在未来至少10年
通用。
l回顾一下历史看看
历史上时间线上技术的
发展你才能明白明天会是什么样。
l一定要动手例子不管多么简单
建议至少自己手敲一遍看看
是否理解了里头的细枝末节。
l一定要学会思考思考为什么要这样而不是那样。
还要举一反三地思考。
注你也许会很奇怪为什么下面的东西很偏Unix/Linux这是因为我觉得Windows下的编程可能会在未来很没有前途
原因如下l现在的用户界面几乎被两个东西主宰了1Web2移动设备iOS或Android。
Windows的图形界面不吃香了。
l越来越多的
企业在用成本低性能高的Linux和各种
开源技术来构架其系统Windows的
成本太高了。
l微软的东西变得太快了很不持久他们完全是在玩弄程序员。
详情参见《Windows编程革命史》所以我个人认为以
后的趋势是前端是Web移动后端是Linux
开源。
开发这边基本上没Windows什么事。
启蒙
入门1、 学习一门脚本语言例如Python/Ruby可以让你摆脱对底层语言的恐惧感脚本语言可以让你很快开发出能用得上的小程序。
实践
项目:l处理文本文件或者csv 关键词python csv python open python sys 读一个本地文件逐行处理例如
word count或者处理logl遍历本地文件系统sys os path例如写一个程序统计一个目录下所有文件大小并按各种
条件排序并保存结果l跟数据库打交道 python
sqlite写一个小脚本
统计数据库里条目数量l学会用各种print之类简单粗暴的方式进行调试l学会用Google phrase domain use reader to follow tech blogs为
什么要学脚本语言因为他们实在是太方便了很多时候我们需要写点小工具或是脚本来帮我们解决问题你就会发现正规的编程语言太难用了。
2、 用熟一种程序员的编辑器不是IDE 和一些基本工具lVim / Emacs /
Notepad学会如何配置
代码补全外观外部命令等。
lSource Insight 或 ctag使用这些东西不是为了Cool而是这些
编辑器在查看、修改
代码/配置文章/日志会更快更
有效率。
3、 熟悉Unix/
Linux Shell和
常见的命令行l如果你用windows至少学会用虚拟机里的
linux vmware player是免费的装个Ubuntu吧l一定要少用少用图形界面。
l学会使用man来查看帮助l文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …l学会使用一些文本操作命令 sed/awk/grep/tail/less/more …l学会使用一些管理
命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…l了解/etc目录下的各种配置文章学会查看/var/
log下的系统日志以及/proc下的系统运行信息l了解正则表达式使用正则
表达式来查找文件。
对于程序员来说Unix/Linux比Windows简单多了。
参看我四年前CSDN的博文《其实Unix很
简单》
学会使用Unix/Linux你会
发现图形
界面在某些时候实在是太难用了相当地相当地降低工作
效率。
4、 学习Web基础HTML/
CSS/JS 服务器端技术LAMP
未来必然是Web的
世界学习W
EB基础的最佳网站是W3School。
l学习HTML
基本语法l学习CSS如何选中HTML元素并应用一些基本样式
关键词box mo
dell学会用 Firefox Firebug 或 chrome 查看你觉得很炫的网页结构并动态
修改。
l学习使用Javascript操纵
HTML元件。
理解DOM和动态
网页http://oreilly.com/catalog/9780596527402 网上有免费的章节足够用了。
或参看DOM。
l学会用 Firefox Firebug 或 chrome 调试Javascript
代码设置断点查看变量
性能控制台等l在一台机器上配置Apache或Nginxl学习PHP让后台PHP和前台HTML进行数据交互对服务器相应浏览器请求
形成初步认识。
实现一个表单提交和反显的功能。
l把PHP连接本地或者远程数据库MySQLMySQL 和 SQL现学现用够了l跟完一个名校的网络编程课程例如http://
www.stanford.edu/ouster/cgi-bin/cs142-fall10/index.php 不要觉得需要多于一学期
时间大学生是全职一学期选3-5门课你业余时间一定可以跟上l学习一个javascript库例如jQuery 或 ExtJS Ajax 异步读入一个服务器端图片或者数据库内容JSON数据
格式。
lHTTP:
The Definitive Guide 读完前4章你就明白你每天上网用浏览器的时候
发生的事情了proxy gateway browsersl做个小网站例如一个小的
留言板支持用户登录Cookie/Session增、删、改、查上传图片
附件分页
显示l买个域名租个空间做个自己的网站。
进阶加深1、 C语言和操作系统调用l重新学C语言理解指针和内存
模型用C语言实现一下各种经典的算法和数据结构。
推荐《
计算机程序设计艺术》、《算法导论》和《编程珠玑》。
l学习麻省理工
免费课程计算机科学和编程导论l学习麻省理工免费课程C
语言内存管理l学习Unix/Linux系统调用Unix高级环境编程了解系统层面的东西。
??用这些系统知识操作一下文
件系统
用户实现一个可以拷贝
目录树的小程序??用fork/wait/waitpid写一个多进程的程序用pthread写一个多线程带同步或互斥的程序。
多进程多进程购票的程序。
??用signal/kill/raise/alarm/pause/si
gprocmask实现一个多进程
间的信号量通信的程序。
??学会使用gcc和gdb来编程和调试程序参看我的《用gdb调试
程序》??学会使用makefile来编译程序。
参看我的《跟我一起写makefile》??IPC和Socket的东西可以放到
高级中来实践。
l学习Windows SDK编程
Windows 程序设计MFC程序设计 ??写一个窗口了解WinMain/WinProcedure以及Windows的消息机制。
??写一些程序来操作Windows SDK中的资源文件或是各种
图形控件以及作图的
编程。
??学习如何使用MSDN查看
相关的SDK函数各种WM_消息以及一些例程。
??这本书中有很多例程在实践中请不要照抄试着自己写一个
自己的例程。
??不用太多于精通这些东西因为GUI正在被Web取代主要是了解一下Windows 图形界面的编程。
virushuo说“我觉得GUI确实不那么热门了但充分
理解GUI工作原理是很重要的。
包括移动设备开发如果没有基础知识仍然很吃力。
或者说
移动设备开发
必须理解GUI
工作或者在
win那边学或者在mac/iOS上学”。
2、学习JavalJava 的学习主要是看经典的Core Java 《Java 核心技术编程》和《
Java编程思想》有两卷我仅链了第一卷足够了因为Java的图形界面了解就可以了l学习JDK学会查阅Java
API Dochttp://download.oracle.com/javase/6/docs/api/l了解一下Java这种虚拟机语言和C和Python语言在
编译和执行上的差别。
从C、Java、Python思考一下“跨平台”这种技术。
l学会使用IDE Eclipse使用Eclipse 编译调试和开发Java程序。
l建一个Tomcat的网站尝试一下JSP/Servlet/JDBC/MySQL的Web开发。
把前面所说的那个
PHP的小项目试着用
JSP和
Servlet实现一下。
3、Web的安全与架构l学习HTML5网上有很多很多教程以前酷壳也
介绍过很多我在这里就不罗列了。
l学习Web开发
的安全问题参考新浪微博被攻击的这个事以及Ruby的这篇文章l学习HTTP Server的rewrite
机制Nginx的反向
代理机制fast-cgi如PHP-FPMl学习
Web的静态页面缓存技术。
l学习Web的异步
工作流处理数据Cache数据分区负载均衡水平扩展的构架。
l实践任务??使用HTML5的canvas 制作一些Web动画。
??尝试在前面开发过的那个Web应用中
进行SQL注入JS注入
以及XSS攻击。
??把前面开发过的那个Web应用改成构造在Nginx PHP-FPM 静态
页面缓存的网站4、学习关系型数据库l你可以
安装MS
SQLServer或MySQL来
学习数据库。
l学习教科书里
数据库设计的那
几个范式1NF2NF3NF……l学习数据库的存过触发器视图建索引游标等。
l学习SQL语句明白表
连接的各种概念参看《SQL Join的图示》l学习如何
优化数据库查询参看《MySQL
的优化》l实践任务设计一个
论坛的数据库至少满足3NF使用SQL语句
查询本周本月的
最新文章评论最多的文章最活跃用户。
5、一些开发
工具l学会使用SVN或Git来
管理程序版本。
l学会使用JUnit来对Java进行单元测试。
l学习C语言和Java语言的coding standard 或 coding guideline。
我N年前写过一篇关C语言非常简单
的文章——《编程
修养》这样的东西你可以上网查一下一大堆。
l推荐阅读《
代码大全》《
重构》《
代码整洁之道》高级深入1、C / Java 和面向对象我个人以为学好CJava也就是举手之劳。
但是C的学习曲线相当的陡。
不过我觉得C是最需要学好的语言了。
参看两篇趣文“C学习
信心图”和“21天学好C”l学习麻省理工免费课程C面向对象编程l读我的 “如何学好C”中所
推荐的那些书至少两遍以上如果你对C的理解能够深入到像我所写的《C虚函数表解析》或是《C对象内存存局上下》或是《C/C返回
内部静态成员的陷阱》那就非常不错了l然后反思为什么C要干成这样Java则不是你一定要学会对比C和
Java的不同。
比如Java中的初始化垃圾回收接口异常虚
函数等等。
l实践任务??用C实现
一个Big
Int支持128位的整形的加减乘除的操作。
??用C封装一个数据结
构的容量比如hash table。
??用C封装并实现一个
智能指针一定要使用模板。
l《设计模式》必需一读两遍以上思考一下这23个模式的应用场景。
主要是两点1钟爱
组合而不是继承2钟爱
接口而不是实现。
也推荐《
深入浅出设计模式》l实践任务??使用工厂模式实现一个内存池。
??使用策略模式制做一个类其可以把
文本文件进行左对齐右对齐和中对齐。
??使用命令模式实现一个命令行计算器并支持undo和redo。
??使用修饰模式实现一个酒店的房间价格订价策略——旺季服务VIP、旅行团、等
影响价格的
因素。
l学习STL的用法和其设计
概念 -容器
算法迭代器函数子。
如果可能请读一下其
源码。
l
实践任务尝试使用
面向对象、STL设计
模式、和WindowsSDK图形编程的各种技能 ??做一个贪吃蛇或是俄罗斯方块的游戏。
支持不同的级别和难度。
??做一个
文件浏览器可以浏览目录下的文件并可以对
不同的文件有不同的操
作文本文件
可以打开编辑执行文件则执行之mp3或avi文件可以播放
图片文件可以展示图片。
l学习C的一些类库的设计如 MFC看看候捷
老师的《深入浅出MFC》 Boost ACE CPPUnitSTL STL可能会太难了但是如果你能了解其
中的设计模式和设计那就太好了如果你能深入到我写的《STL string类的写时拷贝技术》那就
非常不错了ACE
需要很强在的系统
知识参见后面的“加强对系统的了解”lJava是真正的面向对象的语言Java的设计模式多得不能再多也是用来学习面向对象的设计模式的最佳语言了参看Java中的设计模式。
l推荐
阅读《Effective Java》 and 《Java解惑》l学习Java的框架Java的框架也是多如SpringHibernateStruts 等等主要是学习Java的设计如IoC等。
lJava的技术也是烂多
重点学习J2EE架构以及JMS RMI 等消息传递和
远程调用的技术。
l学习使用Java做Web Service 官方教程在这里l实践
任务尝试在Spring或Hibernate
框架下构建一个有网络的Web Service的远程调用程序并可以在两个Service中通过JMS传递消息。
C和Java都不是能在短时间内能学好的C玩是的深Java玩的是广我建议两者选一个。
我个人的学习经历是l深究C我深究C/C了十来年了l学习Java的各种设计模式。
2、
加强系统了解重要阅读下面
的几本书l《
Unix编程艺术》了解Unix系统
领域中的设计和开发
哲学、
思想文化
体系、
原则与
经验。
你一定会有
一种醍醐灌顶的感觉。
l《Unix网络编程卷1套接字》这是一本看完你就明白网络编程的书。
重要注意TCP、UDP以及多路复用的系统调用select/poll/epoll的差别。
l《TCP/IP详解 卷1:协议》-这是一本看完后你就可以当
网络黑客的书。
了解以太网的的运作原理了解
TCP/IP的协议运作
原理以及如何TCP的调优。
l实践任务??理解什么是阻塞同步IO非阻塞异步IO多路复用select poll epoll的IO
技术。
??写一个网络聊天程序有聊天
服务器和多个聊天客户端服务端用
UDP对部分或
所有的的聊天
客户端进Multicast或Broadcast。
??写一个简易的HTTP
服务器。
l《Unix网络编程卷2进程间通信》
信号量管道共享
内存消息等各种IPC…… 这些技术好像有点老掉牙了不过还是值得了解。
l实践任务??主要实践各种IPC进程序
通信的
方法。
??尝试写一个
管道程序父子进程通过管道交换数据。
??尝试写一个
共享内存的程序两个进程通过共享内存
交换一个C的结构体数组。
l学习《Windows
核心编程》一书。
把CreateProcessWindows线程、线程调度、线程同步Event 信号量互斥量、异步I/O内存管理DLL这几大块搞精通。
l实践任务使用CreateProcess启动一个记事本或IE并监控该程序的
运行。
把前面写过的那个
简易的HTTP服务用线程池实现一下。
写一个
DLL的钩子程序
监控指定窗口的关闭
事件或是
记录某个窗口的按键。
l有了多线程、多进程通信TCP/IP套接字C和设计模式的基本你可以研究一下ACE了。
使用ACE重写上述的聊天程序和HTTP服务器带线程池l实践任务通过以上的所有知识尝试??写一个服务端给
客户端传大文件要求把100M的带宽用到80以上。
注意磁盘I/O和网络I/O可能会很有
问题想一想怎么
解决另外请注意网络传输最大单元MTU??了解BT下载的工作原理用多进程的方式模拟BT下载
的原理。
3、系统架构l负载均衡。
HASH式的纯
动态式的。
可以到Google学术里搜一些
关于负载均衡的文章读读l多层分布式系统–客户端服务结点层、计算结点层、数据cache层数据层。
J2EE是经典的多层结构。
lCDN系统–就近
访问内容边缘化。
lP2P式系统
研究一下BT和电驴的算法。
比如DHT算法。
l服务器备份双机备份系统Live-Standby和Live-Live系统两台
机器如何通过心跳
监测对方集群主结点备份。
l虚拟化技术使用这个技术可以把操作系统当应用程序一下切换或重新配置和部署。
l学习Thrift二进制的高性能的
通讯中间件支持数据对象序列化和多
种类型的RPC服务。
l学习Hadoop。
Hadoop框架中最核心的设计就是MapReduce和HDFS。
MapReduce
的思想是由Google的一篇
论文所提及而被广为流传的简单的一句话
解释MapReduce就是“任务的分解与结果的汇总”。
HDFS是Hadoop
分布式文件系统Hadoop Distributed File System的缩写为
分布式计算存储提供了底层支持。
l了解NoSQL数据库有人说可能是一个过渡炒作的技术不过因为超大
规模以及高并发的纯动态型网站日渐成为主流而SNS类网站在数据存取
过程中有着实时性等刚性需求这使得目前NoSQL数据库慢慢成了人们所关注的焦点并大有成为取代关系型数据库而成为未来主流数据
存储模式的趋势。
当前NoSQL数据库很多大部分都是
开源的其中比较知名的有MemcacheDB、Redis、Tokyo Cabinet升级版为Kyoto Cabinet、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
写了那么多
回顾一下觉得自己相当的有成就感。
希望大家不要吓着我自己这十来年也在不断地学习今天我也在学习中
人生本来就是一个不断学习和练级的过程。
不过一定有漏的也有不对的还希望
大家补充和更正。
我会根据大家
的反馈随时更新此文欢迎大家通过我的微博左耳朵耗子和twitterhaoel和我
交流。
—–
更新 2011/07/19 —–1有
朋友奇怪
为什么我在这篇文章开头说了
web移动却
没有在后面提到iOS/Android的前端开发。
因为我心里有一种感觉移动设备上的UI最终也会被Javascript取代。
大家可以用iPhone或Android看看
google你就会明白了。
2有朋友说我这里的东西太多了
不能为了学习而学习我非常同意。
我在文章的前面也说了要思考。
另外千万不要以为我说的这些东西是一些新的技术这份攻略里95以上
的全是基础。
而且都是久经考验
的基础技术。
即是可以让你一通百通的技术也是可以让你找到一份不错工作的技术。
3有朋友说学这些东西学完都40了还不如想想
怎么去挣钱。
我想告诉大家一是我今年还没有40岁二是学无止境啊三是我不觉得挣钱有多难难的是怎么让你值那么多钱无论是打工
还是创业是什么东西让你自己的价值让你公司的
价值更值钱别的
地方我不敢说对于互
联网或IT
公司来说技术实力绝对是其中之一。
4有朋友说技术都是工具不应该如此痴迷这句话没有错有时候
我们需要更多的是抬起头来看看技术以外的事情或者是说我们在作技
术的时候不去思考为什么会有这个技术为什么不是别
的问题不在于技术问题在于我们死
读书读死书成了技术的书呆子。
5 对于NoSQL最近
比较火但我对其有点保守所以我只是说了解就可以。
对于Hadoop我觉得其在分布式系统上有巨大的潜力所以需要学习。
对于关系型数据库的确是很重要的东西这点是我的疏忽在原文里补充。