本帖最后由 轻舟过 于 2012-7-19 17:36 编辑
Lightbot是一个蕴含了一些编程思想的flash游戏,不过当然并不是只有会写程序的人才能玩,其实可以通过向没接触过编程的人传达一些编程的概念
游戏主要是通过为小机器人编写行动指令来完成将所有蓝色方块点亮的任务
总共有7种不同的指令
依次是向前走一步,向右转,向左转,跳到前面的一格方块上去(或跳下去),点亮当前方块的灯,调用函数f1, 调用函数f2
将指令拖到下面的方格中来来完成指令的布置,机器人会按照最上面的main method那块里的指令一个个执行,遇到f1的指令则会调用funct. 1里面的指令,遇到f2则执行funct. 2里面的指令
越到后面地形越复杂,完成任务也更难,所以要将重复的操作抽象出来写到函数里面,也就是要用好f1和f2。大家还是自己去体验一下吧~~
游戏地址: http://armorgames.com/play/2205 (5楼也有)
[查看全文]
Paul Graham是公认的“硅谷创业之父”,对于许多技术问题,他有自己独到的见解。在本文中,他分享了何谓理想的编程语言。
我的朋友曾对一位著名的操作系统专家说他想要设计一种真正优秀的编程语言。那位专家回答,这是浪费时间,优秀的语言不一定会被市场接受,很可能无人使用,因为语言的流行不取决于它本身。至少,那位专家设计的语言就遭遇到了这种情况。
那么,语言的流行到底取决于什么因素呢?流行的语言是否真的值得流行呢?还有必要尝试设计一种更好的语言吗?如果有必要的话,怎样才能做到这一点呢?
为了找到这些问题的答案,我想我们可以观察黑客,了解他们使用什么语言。编程语言本来就是为了满足黑客的需要而产生的,当且仅当黑客喜欢一种语言时,这种语言才能成为合格的编程语言,而不是被当做“指称语义”(denotational semantics)或者编译器设计。
流行的秘诀
没错,大多数人选择某一种编程语言,不是因为这种语言有什么独特的特点,而是因为听说其他人使用这种语言。但是我认为,外界因素对于编程语言的流行其实并没有想象中那么大的影响力。我倒是觉得,问题出在对于什么是优秀编程语言,黑客的看法与大多数的语言设计者不一样。
黑客的看法其实比语言设计者的更重要。编程语言不是数学定理,而是一种工具,为了便于使用,它们才被设计出来。所以,设计编程语言的时候必须考虑到人类的长处和短处,就像设计鞋子的时候必须符合人类的脚型。如果鞋子穿上去不舒服,无论它的外形多么优美,多么像一件艺术品,你也只能把它当做一双坏鞋。
大多数程序员也许无法分辨语言的好坏。但是,这不代表优秀的编程语言会被埋没,专家级黑客一眼就能认出它们,并且会拿来使用。虽然他们人数很少,但就是这样一小群人写出了人类所有的优秀软件。他们有着巨大的影响力,他们使用什么语言,其他程序员往往就会跟着使用。老实说,很多时候这种影响力更像是一种命令,对于其他程序员来说,专家级黑客就像自己的老板或导师,他们说哪种语言好用,自己就会乖乖地跟进。
专家级黑客的看法不是决定一种语言流行程度的唯一因素,某些古老的软件(Fortran和Cobol的情况)和铺天盖地的广告宣传(Ada和Java的情况)也会起到作用。但是,我认为从长期来看,专家级黑客的看法是最重要的因素。只要有了达到“临界数量”(critical mass)的最初用户和足够长的时间,一种语言就可能会达到应有的流行程度。而流行本身又会使得这种优秀的语言更加优秀,进一步拉大它与平庸语言之间的好坏差异,因为使用者的反馈总是会导致语言的改进。你可以想一下,所有流行的编程语言从诞生至今的变化有多大。Perl和Fortran是极端的例子,但是甚至就连Lisp都发生了很大的变化。
所以,即使不考虑语言本身的优秀是否能带动流行,我想单单流行本身就肯定会使得这种语言变得更好,只有流行才会让它保持优秀。编程语言的最高境界一直在发展之中。虽然语言的核心功能就像大海的深处,很少有变化,但是函数库和开发环境之类的东西就像大海的表面,一直在汹涌澎湃。
当然,黑客必须先知道这种语言,才可能去用它。他们怎么才能知道呢?就是从其他黑客那里。所以不管怎样,一开始必须有一群黑客使用这种语言,然后其他人才会知道它。我不知道“一群”的最小数量是多少,多少个黑客才算达到“临界数量”呢?如果让我猜,我会说20人。如果一种语言有20个独立用户,就意味着有20个人是自主决定使用这种语言的,我觉得这就说明这种语言真的有优点。
达到这一步并非易事。如果说用户数从0到20比从20到1000更困难,我也不会感到惊讶。发展最早的20个用户的最好方法可能就是使用特洛伊木马:你让人们使用一种他们需要的应用程序,这个程序碰巧就是用某种新语言开发的。
外部因素
我们得先承认,确实有一个外部因素会影响到语言的流行。一种语言必须是某一个流行的计算机系统的脚本语言(scripting language),才会变得流行。Fortran和Cobol是早期IBM大型机的脚本语言。C是Unix的脚本语言,后来的Perl和Python也是如此。Tcl是Tk的脚本语言,Visual Basic是Windows的脚本语言,(某种形式的)Lisp是Emacs的脚本语言,PHP是网络服务器的脚本语言,Java和JavaScript是浏览器的脚本语言。
编程语言不是存在于真空之中。“编程”其实是及物动词,黑客一般都是为某个系统编程,在现实中,编程语言总是与它们依附的系统联系在一起的。所以,如果你想设计一种流行的编程语言,就不能只是单纯地设计语言本身,还必须为它找到一个依附的系统,而这个系统也必须流行。除非你只想用自己设计的语言取代那个系统现有的脚本语言。
这种情况导致的一个结果就是,无法以一种语言本身的优缺点评判这种语言。另一个结果则是,只有当一种语言是某个系统的脚本语言时,它才能真正成为编程语言。如果你对此很吃惊,觉得不公平,那么我会跟你说不必大惊小怪。这就好比大家都认为,如果一种编程语言只有语法规则,没有一个好的实现(implementation),那么它就不能算完整的编程语言。这些都是很正常很合理的事情,编程语言本来就该如此。
当然,编程语言本来就需要一个好的实现,而且这个实现必须是免费的。商业公司愿意出钱购买软件,但是黑客作为个人不会愿意这样做,而你想让一种语言成功,恰恰就是需要吸引黑客。
编程语言还需要有一本介绍它的书。这本书应该不厚,文笔流畅,而且包含大量优秀的范例。布赖恩·柯尼汉和丹尼斯·里奇合写的《C程序设计语言》(C Programming Language)就是这方面的典范。眼下,我大概还能再加一句,这一类书籍之中必须有一本由O’Reilly公司出版发行。这正在变成是否能吸引黑客的前提条件了。
编程语言还应该有在线文档。事实上,在线文档可以当做一本书来写,但是目前它还无法取代实体书。实体书并没有过时,它们读起来很方便,而且出版社对书籍内容的审核是一种很有用的质量保证机制(虽然做得很不完美)。书店则是程序员发现和学习新语言的最重要的场所之一。
简洁
假定你的语言已经能够满足上面三项条件——一种免费的实现,一本相关书籍,以及语言所依附的计算机系统——那么还需要做什么才能使得黑客喜欢上你的语言?
黑客欣赏的一个特点就是简洁。黑客都是懒人,他们同数学家和现代主义建筑师一样,痛恨任何冗余的东西或事情。有一个笑话说,黑客动手写程序之前,至少会在心里盘算一下哪种语言的打字工作量最小,然后就选择使用该语言。这个笑话其实与真实情况相差无几。就算这真的是个笑话,语言的设计者也必须把它当真,按照它的要求设计语言。
简洁性最重要的方面就是要使得语言更抽象。为了达到这一点,首先你设计的必须是高级语言,然后把它设计得越抽象越好。语言设计者应该总是看着代码,问自己能不能使用更少的语法单位把它表达出来。如果你有办法让许多不同的程序都能更简短地表达出来,那么这很可能意味着你发现了一种很有用的新抽象方法。
不要觉得为用户着想就是让他们使用像英语一样又长又啰唆的语法。这是不正确的做法,Cobol就是因为这个毛病而声名狼藉。
如果你让黑客像下面这样求和:
add x to y giving z
而不是写成:
z=x+y
那么你就是在侮辱黑客的智商,或者自己作孽了。
简洁性是静态类型语言的力所不及之处。不考虑其他因素时,没人愿意在程序的头部写上一大堆的声明语句。只要计算机可以自己推断出来的事情,都应该让计算机自己去推断。举例来说,hello-world本应该是一个很简单的程序,但是在Java语言中却要写上一大堆东西,这本身就差不多可以说明Java语言设计得有问题了。
单个的语法单位也应该很简短。Perl和Common Lisp在这方面是两个不同的极端。Perl的语法单位很短,导致它的代码可以拥挤得让人无法理解,而Common Lisp内置运算符的名称则长得可笑。Common Lisp的设计者们可能觉得文本编辑器会帮助用户自动填写运算符的长名称。但是这样做的代价不仅是增加了打字的工作量,还包括提高了阅读代码的难度,以及占用了更多的显示器空间。
可编程性(Hackability)
对黑客来说,选择编程语言的时候,还有一个因素比简洁更重要,那就是这种语言必须能够帮助自己做到想做的事。在编程语言的历史上,防止程序员做出“错误”举动的措施多得惊人。这是语言设计者很自以为是的危险举动,他们怎么知道程序员该做什么不该做什么?我认为,语言设计者应该假定他们的目标用户是一个天才,会做出各种他们无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。你也许能够阻止他引用另一个模块中的变量,但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题。
优秀程序员经常想做一些既危险又令人恼火的事情。所谓“令人恼火”,我指的是他们会突破设计者提供给用户的外部语义层,试着控制某些高级抽象的语言内部接口。比如,黑客喜欢破解,而破解就意味着深入内部,揣测原始设计者的意图。
你应该敞开胸怀,欢迎这种揣测。对于制造工具的人来说,总是会有用户以违背你本意的方式使用你的工具。如果你制造的是编程语言这样高度组合的系统,那就更是如此了。许多黑客会用你做梦也想不到的方式改动你的语法模型。我的建议就是,让他们这样干吧,而且应该为他们创造便利,尽可能多地把语言的内部暴露在他们面前。
其实,黑客并不会彻底颠覆你的工具,在一个大型程序中,他可能只是对语言改造一两个地方。但是,改动多少地方并不重要,重要的是他能够对语言进行改动。这可能不仅有助于解决一些特殊的问题,还会让黑客觉得很好玩。黑客改造语言的乐趣就好比外科医生摆弄病人内脏的乐趣,或者青少年喜欢用手挤破青春痘的那种感觉。至少对男生来说,某些类型的破坏非常刺激。针对青年男性读者的Maxim杂志每年出版一本特辑,里面一半是美女照片,另一半是各种严重事故的现场照片。这本杂志非常清楚它的读者想看什么。
一种真正优秀的编程语言应该既整洁又混乱。“整洁”的意思是设计得很清楚, 内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。“混乱”的意思是它允许黑客以自己的方式使用。C语言就是这样的例子,早期的Lisp语言也是如此。真正的黑客语言总是稍微带一点放纵不羁、不服管教的个性。
优秀的编程语言所具备的功能,应该会使得言必称“软件工程”的人感到非常不满、频频摇头。与黑客语言形成鲜明对照的就是像Pascal那样的语言,它是井然有序的模范,非常适合教学,但是除此之外就没有很大用处了。
一次性程序
为了吸引黑客,一种编程语言必须善于完成黑客想要完成的各种任务。这意味着它必须很适合开发一次性程序。这一点可能出乎很多人的意料。
所谓一次性程序,就是指为了完成某些很简单的临时性任务而在很短时间内写出来的程序。比如,自动完成某些系统管理任务的程序,或者(为了某项模拟任务)自动生成测试数据的程序,以及在不同格式之间转化数据的程序等。令人吃惊的是,一次性程序往往不是真的只用一次,就像二战期间很多美国大学造的一大批临时建筑后来都成了永久建筑。许多一次性程序后来也都变成了正式的程序,具备了正式的功能和外部用户。
我有一种预感,最优秀的那些大型程序就是这样发展起来的,而不是像胡佛水坝那样从一开始就作为大型工程来设计。一下子从无到有做出一个大项目是一件很恐怖的事。当人们接手一个巨型项目时,很容易被它搞得一蹶不振。最后,要么是项目陷入僵局,要么是做出来一个规模小、性能差的东西。你想造一片闹市,却只做出一家商场;你想建一个罗马,却只造出一个巴西利亚;你想发明C语言,却只开发出Ada。
开发大型程序的另一个方法就是从一次性程序开始,然后不断地改进。这种方法比较不会让人望而生畏,程序在不断的开发之中逐渐进步。一般来说,使用这种方法开发程序,一开始用什么编程语言,就会一直用到最后,因为除非有外部政治因素的干预,程序员很少会中途更换编程语言。所以,我们就有了一个看似矛盾的结论:如果你想设计一种适合开发大型项目的编程语言,就必须使得这种语言也适合开发一次性程序,因为大型项目就是从一次性程序演变而来的。
Perl就是一个鲜明的例子。它不仅仅设计成适合开发一次性程序,而且它本身就很像一次性程序。最初的Perl只是好几个生成表格的工具收集在一起而已。后来程序员用它写一次性程序,当那些程序逐渐发展壮大后,Perl才随之发展成了一种正式的编程语言。到了Perl 5,这种语言才适合开发重要的程序,但是在此之前它已经广为流行了。
什么样的语言适合写一次性程序?首先,它必须很容易装备。一次性程序是你只想在一小时内写出来的程序,所以它不应该耗费很多时间安装和配置,最好已经安装在你的电脑上了。它必须是想用就用的。C语言可以想用就用,因为它是操作系统的一部分;Perl可以想用就用,因为它本来就是一种系统管理工具,操作系统已经默认安装它了。
很容易装备不仅仅指很容易安装或者已经安装,还指很容易与使用者互动。一种有命令行界面、可以实时反馈的语言就具有互动性,那些必须先编译后使用的语言就不具备互动性。受欢迎的编程语言应该是前者,具有良好的互动性,可以快速得到运行结果。
一次性程序的另一个特点就是简洁。对黑客来说,这一点永远有吸引力。如果考虑到你最多只打算在这个程序上耗费一个小时,这一点就更重要了
Paul Graham
硅谷创业之父,经历颇为传奇。他大学在康奈尔大学主修哲学,研究生在哈佛大学主攻人工智能,博士期间又去哈佛艺术系旁听。拿到博士学位后,先后进入罗德岛设计学院和佛罗伦萨美术学院学习绘画,梦想成为画家。
1995年,他与史上第一个蠕虫病毒“莫里斯蠕虫”的制作者Robert Morris开发出世界上第一个通过互联网使用的软件—Viaweb,该软件后来被雅虎以4900万美元兼并,并改名为Yahoo Store。结束在雅虎的任职后,他将自己对于技术和创业的观点写成系列文章,由O’Reilly结集出版,取名为《黑客与画家》
2005年,他与Morris等人合伙成立了Y Combinator(简称YC),它既是一个创业公司的孵化器,也是一个教导员,还是一个与投资人联系的中介。到目前为止,从YC“毕业”的创业公司共有200多家,已经失败的公司不到20%,远低于90%的业内平均水平。这些YC学员成为新一代硅谷创业公司的主流,他们组成了一张不断壮大的关系网,有人称其为“YC匪帮”。
本文节选自Paul Graham的文集《黑客与画家》,主要介绍黑客及优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等话题。中文版将由人民邮电出版社北京图灵文化发展有限公司出版,特此感谢图灵公司授权。
[查看全文]
C++老师布置的假期作业!10!
笼中有鸡和兔子一共30只,共有90只脚,用C++编程计算出有几只鸡几只兔子?
老师说结果不止一种,要用一个程序算出所有的可能情况......
还说以2x+4(30-2x)=90为基础就可以写出来了
可是我想了好多办法就是不会算,所以求助啊啊啊啊啊啊!!!!42!
我们刚学完循环 老师说用循环就可以解出来..........▽-▽ 可是我还是不会!56!
[查看全文]
月光博客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编程革命史》
- 处理文本文件,或者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)
- Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。
- Source Insight (或 ctag)
- 如果你用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下的系统运行信息
- 了解正则表达式,使用正则表达式来查找文件。
- 学习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 Definite Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)
- 做个小网站(例如:一个小的留言板,支持用户登录,Cookie/Session,增、删、改、查,上传图片附件,分页显示)
- 买个域名,租个空间,做个自己的网站。
- 重新学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上学”。
- 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实现一下。
- 学习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 + 静态页面缓存的网站
- 学会使用SVN或Git来管理程序版本。
- 学会使用JUnit来对Java进行单元测试。
- 学习C语言和Java语言的coding standard 或 coding guideline。(我N年前写过一篇关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++(我深究C/C++了十来年了)
- 学习Java的各种设计模式。
- 《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下载的原理。
- 负载均衡。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等。
本帖最后由 Sleepwalking 于 2011-7-20 17:08 编辑
估计不少人不清楚‘系统底层’到底指什么
好吧 在专门讨论系统的版块出来前 系统底层版主要包括以下内容:
1.系统(windows、dos、linux。。。 ,引导,文件系统,对硬盘等部件的底层原理或底层操作调用以及涉及到的底层信息)
2.文件结构(文件头,压缩方式压缩算法,加密方式加密算法等要用到winhex之类16进制编辑器的对文件的底层操作)
3.机器码(汇编,内存修改,游戏修改或改存档,指令系统的研究等)
4.计算机(BIOS等)
5.对外接设备的涉及底层的修改(USB设备、底层改造、重新编写代码等)
另外:
在出现专门讨论系统的版块出现前,‘系统’包括系统优化等不是特低级的操作,但以底层操作等为主
关于游戏修改,如果游戏用纯文本保存信息这种不需要技术的教程和问题就不要发了
关于第四项”计算机“,不包括硬件参数等信息,请去硬件设备版。我指类似于”修改了BIOS设置界面的背景“、”BIOS密码破解方法“之类的软硬结合的底层操作。
第5项”外接设备。。。“不包括破解iphone,那种东西没啥技术含量,网上一搜一大堆。但包括并欢迎“我用winhex破解了iphone”(如果你做得到的话。。。)
以上要做一个简单的总结,一句话概括就是“欢迎有技术的讨论,反对无技术的讨论”(见2011-7-20补充内容)
关于水贴。。。我认为稍微水水还是可以的,就是别水多了。虽然‘系统底层’是个很有技术含量很严肃的话题。。但我不希望因为这毁了版块的气氛。我希望系统底层版能有一个活跃的气氛。
P.s. 最好发帖时在标题前附上说明性的文字,比如“[汇编][资源]常用汇编指令详解”这样子。系统底层这个话题涉及得太广。贴子一多估计会很乱。 这个很新的版块没人气,因为熟悉系统底层的人好像都隐居了。。。我会发一些学习资源上来以活跃人气
---------------2011-7-20日补上一条 非常重要的一条------------------------
貌似到目前为止都是本宅一人发帖 这怎么行捏? 这样下去这版块不久变成博客了么。。。
所以嘞 要适当的降低一下难度 大家有什么不懂的尽管问(全不懂么?。。。通知我写篇相关的教程好了 这也是斑猪应尽的义务)
我会抽空写点转点新手入门教程的。
[查看全文]
本帖最后由 封獣★ぬえ 于 2013-7-7 23:51 编辑
求助。如题。我想做一个有窗口的计算器程序,但是苦于自己不会弄窗口,找来MFC也一时不知所措,急求大神指教。我想要的窗口如下图:
求窗口框架啊,最好全程求指教QAQ
[fold=+]-@兰陵笑忘生 @scropioczn [/fold]
[查看全文]
