给新手程序员的一封信

 首先,欢迎来到程序员的世界。在这个世界上,不是有很多人想创造软件并解决问题。你是一名hacker,属于那些愿意做一些有挑战性的事情的人。

  “当你不创造东西时,你只会根据自己的感觉而不是能力去看待问题。” – WhyTheLuckyStiff

  对于下面的文字你不必完全接受,所有这些来自一个其貌不扬的程序员。我喜欢把事情做到最好,而不是对原来的东西修修补补。

  仅仅是因为爱好开始做一些创新,这是一个很好的开始!如果你说“我要先学习一下再开始做”那么你永远不会真正开始。每个人都需要从某个地方开始,所以现在打开你的编辑器开始写代码吧。

  下面是一些很重要的建议,虽然有人并不认同,但我保证你看完我的分析以后会站在我这一边。一开始,先不要管算法和数据结构。大多数简单的程序不需要用到算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后找一些相关的论文去理解算法并动手编程实践。如果没有现成的函数库(其他程序员提供的可重用代码),你用自己喜欢的编程语言来实现它。

给新手程序员的一封信 - 小男生 - 小男生的博客

 

  0. 选择一门好的编程语言,一门你自认为可以用它快速地做出一些有用东西的语言。

  不要选择C语言作为你第一门编程语言。也许选择C语言会给你一种过时的满足感。虽然它比早期的汇编语言提供了更好语法描述,但是今天C(或者C++)不是能够快速编写软件的语言。毫不偏袒的说,我建议你学习一种动态语言。选择一种你觉得语法(文档)让你使用起来更舒服的编程。为此,你可能需要花费一些时间来在几种不同的语言之间进行比较。这么做目的不是为了让你感觉更好或者让编程更容易。更快地完成自己的作品并且能够看到成果,才是激励你编程的源动力。不要选择一门需要某种重量级的IDE(IDE是一种能够帮助你编写并运行代码的工具)才能轻松编程的语言。你所需要的仅仅是一个文本编辑器。(注:原文并没有标号,是我们加上的,请大家别忘记了哦,我们是从零开始数数的。:) )

  1. 选择一个好的编辑器。

  编辑器对程序员而言,就是像是弓对弓箭手一样重要。这里有一些推荐的编辑器:

  • SublimeText 2 – 如果你刚开始编程,推荐使用SublimeText 2
  • Emacs – 学习曲线陡峭,快捷键复杂。如果你想定制自己的使用习惯,需要学习Emacs Lisp.
  • Vim – 不仅操作简洁而且它默认包含在linux的发行版中,所以深受大家欢迎。我开始使用了2年Emacs。由于Emacs的快捷键操作过于复杂,我的双手开始经常疼痛,这迫使我转向了Vim阵营。了解Vim的快捷键是非常有必要的。当你在远程的服务器上编辑代码时,你唯一不需要安装的编辑器就是Vim。

  注意!Emacs和Vim可能已经成为成为古董了。但是,它们都具备一些现代编辑器多不具备的功能。

  2. 选择一个你可以从中学到东西的操作系统

  Windows不会教会你任何东西。使用Windows你唯一学会的就是打开一个exe(可执行)文件来安装软件和使用它。可能刚开始的时候你会觉得很酷,但是长远来看,如果你立志成为一个web开发人员,可能还是要具备基本的linux知识,尤其是当你要发布程序的时候。Linux也允许你根据自己的要求来定制程序。Macs也很酷,但是我认为你现在经济上还负担不起。

  3. 不要通过复制粘贴来做备份

  一个新手程序员通常会把文件复制粘贴到一个临时目录下面来进行备份。这也许也是他们唯一知道的方法。不要那么做!你需要使用版本控制软件。我强烈推荐使用Git,它是个目前很流行的版本控制工具,而且使用起来非常简单。对一个Git新手,有一个良好的社区和很多参考资源来学习。(除了Git之外,还有mercurial, darcs, fossil等等。但是我还是建议从Git开始,我有很多的理由来支持Git,这里就不多费口舌了。)

  4. 知道去哪里寻求帮助

  参加一个和你相关的(你使用编程工具相关的)程序员社区。比如StackOverflow就是程序员的Facebook。那里没有消息状态和回复,取而代之的是问题和答案。除此之外还要学会使用IRC。IRC是一种老式的聊天室,现在还在被大多数开发人员用来分享技术信息和帮助解决问题。

  5. 培养你的礼仪

  知道什么时候问问题。你遇到的大多数问题都是别人碰到过并且在Internet上能够找到解答的。在IRC或者任何论坛里发问之前,先搜索一下google(或者blekko)来看看是不是有现成的答案。在IRC上问问题需要有耐心。永远记住,人们只是处于好心来免费帮助你。有时你发问以后需要几个小时才能有回复。所以,耐心等待。除此之外,记得问问题的时候要礼貌。世界很小,你怎么对待别人,别人就会怎么对待你。

  6. 结交朋友,技术书籍只能教你解决常见的问题(他们说:书是死的)

  当你在捣鼓一些程序或者从程序的作者那里学习,你能学到一些书本上没有的东西。当你散步的时候,请和遇到的朋友打招呼。你肯定不是唯一的程序员。和其他的程序员一起交朋友一起工作。你会注意到,当一群技术爱好者在一起的时候,不论话题是从什么地方开始,最后总是以技术话题收尾。这是必然的现象。所以你可以尽情参与。在你的黄金年龄努力编程,我能告诉你的是,我在开始6年前寻找朋友并开始讨论编程,从那时起才学到那些书本和文章不会我的东西。所以我总是说,我的编程经验有6年,因为只有那个时候开始,我才开始与人交流并开始感觉真正地开始学习编程。

  7. 参加开源项目

  为开源项目编写代码能带来回报。这不仅仅是帮助别人,你留下的代码会被其他人使用或(可能)改进。当别人给你的代码添加功能或者提出修改意见时,也是在提高你的编程水平。开源软件项目不一定要是一个大工程,编写一个下载youtube视频的小程序也是很有用的。更重要的是,你会惊奇地发现你编写的代码会成为与他人有效沟通的桥梁。

  最后,若干年之后如果本文的内容曾经对你有一点点的帮助,作为回报请写一封类似的信给希望开始编程并不知如何入手的朋友,有可能的话请纠正本文中过时的内容。

  智者说过,掌握某个东西需要10年或10000个小时,也就是汉语中的“十年磨一剑”,所以不用着急。

  英文原文:An open letter to those who want to start programming

通过网络获取知识的秘诀(转)

提问的智慧

  在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。

  首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们思维的好问题。 如若不然,我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感激不尽。好问题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思考过的问题。对黑客而言,“问得好!”是发自内心的大力称赞。

  尽管黑客们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知识贫乏者怀有敌意,但其实不是那样的。

  我们不想掩饰对这样一些人的蔑视–他们不愿思考,或者在发问前不去完成他们应该做的事。这种人只会谋杀时间–他们只愿索取,从不付出,无端消耗我们的时间,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。 我们称这样的人为“失败者”(由于历史原因,我们有时把它拼作“lusers”)。

  我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙,以便更高效的利用时间来回答胜利者的问题。

  如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地想想。我们并没有要求你向我们屈服–事实上,我们中的大多数人最喜欢公平交易不过了,只要你付出小小努力来满足最起码的要求,我们就会欢迎你加入到我们的文化中来。但让我们帮助那些不愿意帮助自己的人是没有 意义的。如果你不能接受这种“歧视”,我们建议你花点钱找家商业公司签个技术支持协议得了,别向黑客乞求帮助。

  如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一员。立刻得到有效答案的最好方法,就是象胜利者那样提问 —— 聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。

  (欢迎对本指南提出改进意见。任何建议请E-mail至esr@thyrsus.com,然而 请注意,本文并非网络礼节的通用指南,我通常会拒绝无助于在技术论坛得到有用答案的建议。) (当然,如果你写中文,最好还是寄DHGrand@hotmail.com;-)

= 提问之前 =

  在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:

1. 通读手册,试着自己找答案。

2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。

3. 在网上搜索(个人推荐google~~~)。

4. 向你身边精于此道的朋友打听。

  当你提出问题的时候,首先要说明在此之前你干了些什么;这将有助于树立你的形象:你不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间。如果提问者能从答案中学到东西,我们更乐于回答他的问题。

  周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。

  小心别问错了问题。如果你的问题基于错误的假设,普通黑客(J. Random Hacker)通常会用无意义的字面解释来答复你,心里想着“蠢问题…”,希望着你会从问题的回答(而非你想得到的答案)中汲取教训。

  决不要自以为够资格得到答案,你没这种资格。毕竟你没有为这种服务支付任何报酬。你要自己去“挣”回一个答案,靠提出一个有内涵的,有趣的,有思维激励作用的问题–一个对社区的经验有潜在贡献的问题,而不仅仅是被动的从他人处索要知识–去挣到这个答案。

  另一方面,表明你愿意在找答案的过程中做点什么,是一个非常好的开端。“谁能给点提示?”、“我这个例子里缺了什么?”以及“我应该检查什么地方?”比“请把确切的过程贴出来”更容易得到答复。因为你显得只要有人指点正确的方向,你就有完成它的能力和决心。

= 怎样提问 =

– 谨慎选择论坛

  小心选择提问的场合。如果象下面描述的那样,你很可能被忽略掉或者被看作失败者:

1. 在风马牛不相及的论坛贴出你的问题

2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然

3. 在太多的不同新闻组交叉张贴

– 用辞贴切,语法正确,拼写无误

  我们从经验中发现,粗心的写作者通常也是马虎的思考者(我敢打包票)。 回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。

  正确的拼写,标点符号和大小写很重要。

  更一般的说,如果你的提问写得象个半文盲,你很有可能被忽视。

  如果你在使用非母语的论坛提问,你可以犯点拼写和语法上的小错–但决不能在思考上马虎(没错,我们能弄清两者的分别)

– 使用含义丰富,描述准确的标题

  在邮件列表或者新闻组中,大约50字以内的主题标题是抓住资深专家注意力 的黄金时机。别用喋喋不休的“帮帮忙”(更别说“救命啊!!!!!”这 样让人反感的话)来浪费这个机会。不要妄想用你的痛苦程度来打动我们, 别用空格代替问题的描述,哪怕是极其简短的描述。

  蠢问题: 救命啊!我的膝上机不能正常显示了!

  聪明问题: XFree86 4.1下鼠标光标变形,Fooware MV1005的显示芯片。

  如果你在回复中提出问题,记得要修改内容标题,表明里面有一个问题。一个看起来象“Re:测试”或者“Re:新bug”的问题很难引起足够重视。另外,引用并删减前文的内容,给新来的读者留下线索。

– 精确描述,信息量大

1. 谨慎明确的描述症状。

2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)。

3. 说明你在提问前是怎样去研究和理解这个问题的。

4. 说明你在提问前采取了什么步骤去解决它。

5. 罗列最近做过什么可能有影响的硬件、软件变更。

  尽量想象一个黑客会怎样反问你,在提问的时候预先给他答案。

  Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读一读。

– 话不在多

  你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。

  这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得 到回答的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼 你的bug报告的过程中,也许你自己就能找出问题所在或作出更正。

– 只说症状,不说猜想

  告诉黑客们你认为问题是怎样引起的没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,不要加进你自己的理解和推论。让黑客们来诊断吧。

蠢问题: 我在内核编译中一次又一次遇到SIG11错误,我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好?

聪明问题: 我自制的一套K6/233系统,主板是FIC-PA2007 (VIA Apollo VP2芯片组),256MB Corsair PC133 SDRAM,在内核编译中频频产生SIG11错误,从开机20分钟以后就有这种情况,开机 前20分钟内从没发生过。重启也没有用,但是关机一晚上就又能工作20分钟。所有 内存都换过了,没有效果。相关部分的典型编译记录如下…。

– 按时间顺序列出症状

  对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明 应该包含操作步骤,以及电脑的反应,直到问题产生。

  如果你的说明很长(超过四个段落),在开头简述问题会有所帮助,接下来按时间顺序详述。这样黑客们就知道该在你的说明中找什么。

– 明白你想问什么

  漫无边际的提问近乎无休无止的时间黑洞。最能给你有用答案的人也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞不太感冒,因此也可以说他们对漫无边际的提问不大感冒。

  如果你明确表述需要回答者做什么(提供建议,发送一段代码,检查你的补丁或是别的),就最有可能得到有用的答案。这会定出一个时间和精力的上限,便于回答者集中精力来帮你,这很凑效。要理解专家们生活的世界,要把专业技能想象为充裕的资源,而回复的时间则是贫乏的资源。解决你的问题需要的时间越少,越能从忙碌的专家口中掏出答案。

  因此,优化问题的结构,尽量减少专家们解决它所需要的时间,会有很大的帮助–这通常和简化问题有所区别。因此,问“我想更好的理解X,能给点提示吗?”通常比问“你能解释一下X吗?”更好。如果你的代码不能工作,问问它有什么地方不对,比要求别人替你修改要明智得多。

– 别问应该自己解决的问题

  黑客们总是善于分辨哪些问题应该由你自己解决;因为我们中的大多数都曾自己解决这类问题。同样,这些问题得由你来搞定,你会从中学到东西。你可以要求给点提示,但别要求得到完整的解决方案。

– 去除无意义的疑问

  别用无意义的话结束提问,例如“有人能帮我吗?”或者“有答案吗?”。 首先:如果你对问题的描述不很合适,这样问更是画蛇添足。其次:由于这 样问是画蛇添足,黑客们会很厌烦你–而且通常会用逻辑上正确的回答来表 示他们的蔑视,例如:“没错,有人能帮你”或者“不,没答案”。

– 谦逊绝没有害处,而且常帮大忙

彬  彬有礼,多用“请”和“先道个谢了”。让大家都知道你对他们花费时间义务提供帮助心存感激。然而,如果你有很多问题无法解决,礼貌将会增加你得到有用答案的机会。

  (我们注意到,自从本指南发布后,从资深黑客处得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得“先谢了”的言外之意是过后就不会再感谢任何人了。我们的建议是:都道谢。)

– 问题解决后,加个简短说明

  问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在那里贴一个补充说明。补充说明不必很长或是很深入;简单的一句“你好,原来是网线出了问题!谢谢大家–Bill”比什么也不说要强。事实上,除非结论真的很有技术含量,否则简短可爱的小结比长篇学术论文更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。除了表示礼貌和反馈信息以外,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。最后(至少?),这种补充有助于所有提供过帮助的人从中得到满足感。如果你自己不是老手或者黑客,那就相信我们,这种感觉对于那些你向他们求助的导师或者专家而言,是非常重要的。问题久拖未决会让人灰心;黑客们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次贴出新问题时尝到甜头。

– 还是不懂

  如果你不是很理解答案,别立刻要求对方解释。象你以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),去理解它。如果你真的需要对方解释,记得表现出你已经学到了点什么。比方说,如果我回答你:“看来似乎是zEntry被阻塞了;你应该先清除它。”,然后:一个很糟的后续问题:“zEntry是什么?” 聪明的问法应该是这样:“哦~~~我看过帮助了但是只有-z和-p两个参数中提到了zEntry而且还都没有清楚的解释:<你是指这两个中的哪一个吗?还是我看漏了什么?”

= 三思而后问 =

以下是几个经典蠢问题,以及黑客在拒绝回答时的心中所想:

问题:我能在哪找到X程序?

问题:我的程序/配置/SQL申明没有用

问题:我的Windows有问题,你能帮我吗?

问题:我在安装Linux(或者X)时有问题,你能帮我吗?

问题:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?

提问:我能在哪找到X程序?

回答:就在我找到它的地方啊蠢货–搜索引擎的那一头。天呐!还有人不会用Google吗?

提问:我的程序(配置、SQL申明)没有用

回答:这不算是问题吧,我对找出你的真正问题没兴趣–如果要我问你二十个问题才找得出来的话–我有更有意思的事要做呢。

在看到这类问题的时候,我的反应通常不外如下三种:

1. 你还有什么要补充的吗?

2. 真糟糕,希望你能搞定。

3. 这跟我有什么鸟相关?

提问:我的Windows有问题,你能帮我吗?

回答:能啊,扔掉萎软的垃圾,换Linux吧。

提问:我在安装Linux(或者X)时有问题,你能帮我吗?

回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的Linux用户组寻求手把手的指导吧(你能在这儿找到用户组的清单)。

提问:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?

回答:想要这样做,说明你是个卑鄙小人;想找个黑客帮你,说明你是个白痴!

= 好问题,坏问题 =

  最后,我举一些例子来说明,怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。

蠢问题:我可以在哪儿找到关于Foonly Flurbamatic的资料?

// 这种问法无非想得到“STFW”这样的回答。

聪明问题:我用Google搜索过“Foonly Flurbamatic 2600”,但是没找到有用的结果。谁知道上哪儿去找对这种设备编程的资料?

// 这个问题已经STFW过了,看起来他真的遇到了麻烦。

蠢问题:我从FOO项目找来的源码没法编译。它怎么这么烂?

// 他觉得都是别人的错,这个傲慢自大的家伙

聪明问题:FOO项目代码在Nulix 6.2版下无法编译通过。我读过了FAQ,但里面没有提到跟Nulix有关的问题。这是我编译过程的记录,我有什么做得不对的地方吗?

// 他讲明了环境,也读过了FAQ,还指明了错误,并且他没有把问题的责任推到别人头上,这个家伙值得留意。

蠢问题:我的主板有问题了,谁来帮我?

// 普通黑客对这类问题的回答通常是:“好的,还要帮你拍拍背和换尿布吗?” ,然后按下删除键。

聪明问题:我在S2464主板上试过了X、Y和Z,但没什么作用,我又试了A、B和C。请注意当我尝试C时的奇怪现象。显然边带传输中出现了收缩,但结果出人意料。在多处理器主板上引起边带泄漏的通常原因是什么?谁有好主意接下来我该做些什么测试才能找出问题?

// 这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的能力,而不是坐等天上掉答案。

  在最后一个问题中,注意“告诉我答案”和“给我启示,指出我还应该做什么诊断工作”之间微妙而又重要的区别。事实上,后一个问题源自于2001年8月在Linux内核邮件列表上的一个真实的提问。我(Eric)就是那个提出问题的人。我在Tyan S2464主板上观察到了这种无法解释的锁定现象,列表成员们提供了解决那一问题的重要信息。

  通过我的提问方法,我给了大家值得玩味的东西;我让人们很容易参与并且被吸引进来。我显示了自己具备和他们同等的能力,邀请他们与我共同探讨。我告诉他们我所走过的弯路,以避免他们再浪费时间,这是一种对他人时间价值的尊重。后来,当我向每个人表示感谢,并且赞赏这套程序(指邮件列表中的讨论 –译者注)运作得非常出色的时候,一个Linux内核邮件列(lkml)成员表示,问题得到解决并非由于我是这个列表中的“名人”,而是因为我用了正确的方式来提问。我们黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙;我相信他是对的,如果我象个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他建议我记下这件事,给编写这个指南的人一些指导。

= 找不到答案怎么办 =

  如果仍得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。

  总的说来,简单的重复张贴问题是个很糟的想法。这将被视为无意义的喧闹。

  你可以通过其它渠道获得帮助,这些渠道通常更适合初学者的需要。有许多网上的以及本地的用户组,由狂热的软件爱好者(即使他们可能从没亲自写过任何软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。

  另外,你可以向很多商业公司寻求帮助,不论公司大还是小(Red Hat 和LinuxCare 就是两个最常见的例子)。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了–完全可能如此–你还得把它送到修车铺,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的。

  对大众化的软件,就象Linux之类而言,每个开发者至少会有上万名用户。根本不可能由一个人来处理来自上万名用户的求助电话。要知道,即使你要为帮助付费,同你必须购买同类软件相比,你所付出的也是微不足道的(通常封闭源代码软件的技术支持费用比开放源代码软件要高得多,且内容也不那么丰富)。

Copyright (C) 2001 by Eric S. Raymond

中文版 Copyleft 2001 by D.H.Grand(nOBODY/Ginux)

英文版:http://www.tuxedo.org/~esr/faqs/smart-questions.html

如何成为一位 hacker

    这真是一个好问题, 不止是原作者说他被问过很多次, 包括我和许多网络上的朋友们也常有这个困扰. 不过和作者不同的是, 我经常没有一个固定的答案 :p

    事实上我所能提供也只是自己的经验, 却没有足够的能力来肯定自己的看法是不是正确的. 这份文章应该可以减去大家不少的麻烦 🙂

    嗯!! 这次自告奋勇当起翻译, 虽然是起于晚上回到住的地方之后很无聊, 可以用来打发时间. 不过我翻了百行之后, 越翻越后悔. 主要是因为面有一些句子实在很难翻译, 这大概是因为我的英文底子不太好的关系吧!! 好不容易, 终于是翻完了. 为让句子更通顺或者是个人误解, 翻译后和原文有些出入, 这方面还请各位大大见谅. 🙂

Thinker

————————————————————————–

如何成为一位 hacker

为何有这份文件?

    身为 Jargon File 的编辑, 常有一些网络新手发 mail 问我 "如何成为一个厉害的hacker?". 但, 很奇怪的, 似乎没有任何的 FAQs 或 Web documents 说明这么重要的问题, 所以我写了一份我自己的看法.

    如果你是以 offline 的方式在看这一份文件的某一个版本, 那么你可以在

    http://www.ccil.org/~esr/faqs/hacker-howto.html

找到这份文件的目前最新版本.

怎么样才算是一位 Hacker ??

    在 Jargon File 有一堆关于 `hacker’ 这个名词的定义, 大部份必须是技术上的行家或热衷于解决问题, 克服限制的人. 然而, 如果你想知道如何成为一位 hacker,有两件事是很有关连的.

    这可以追溯到几十年前第一台 minicomputer 刚诞生, ARPAnet 实验也刚展开的时代. 那时有一个由程序设计专家和网络名人所组成的, 具有分享特质的文化族群.这种文化的成员创造了 `hacker’ 这个名词. 这些 Hacker 建立了 Internet,创造出我们现在使用的 UNIX 操作系统, 他们也使 Usenet 运作起来, 并且让 WorldWide Web 动起来. 如果你是这个文化的一部分, 如果你对这些种种有所供献, 而且这个文化的其它成员也认识你, 并称你为 hacker, 那么你就是一位 hacker.

    在精神上, hacker 并不单指(限制于)这种软件 hacker 的文化. 有人也把 hacker的特质发挥在其它领域, 例如: 电子或者音乐方面. 事实上你会发现, 在任何一种科学或艺术的最高境界, 你都可以发现 hacker 的特质. 软件 hacker 们认为,那些类似的精神也都可以称为 "hacker". 有些人还主张 hacker 的通性是独立于任何媒介之上的, 不特别属于任何一种 hacker 所在的环境. 但是, 在这份文件,我们将把重点放在软件 hacker 们所需的技能、态度和发明 `hacker’ 这个词的分享文化的传统.

    在另一个团体, 他们的成员也很大声的称自己为 hacker, 但是他们不是真的 hacker.这些人(大部分是男性青年)专门闯入电脑和入侵电话系统, 真正的 hacker 们称他们为 `cracker’, 并且不愿意和他们在一些做任何事. hacker 们认为这些人都是懒惰, 不负责, 并且不够光明正大的, 并且认为能破解安全系统并不能使你成为一位hacker. 但是很不幸的, 很多记者和作家不明究理的使用 `hacker’ 这个字来描述

cracker 们; 这让真的 hacker 们很忿怒.

    基本上, hacker 和 cracker 之间最主要的不同是: hacker 们创造新东西,cracker 们破坏东西.

    如果你想要成为一位 hacker, 继续读下去吧. 如果你是想要成为一位 cracker, 那么就去读 alt.2600 newsgroup 并准备在你发现自己并不如想像中那么行时, 给自己一点评价. 所有关于 cracker 的事情就只有这些了.

Hacker 态度

    Hacker 们解决了问题并创造新东西, 他们相信自由并自愿的互相帮助. 想要被别人接受成为一位 hacker, 你必须发自内心的表现出这种态度. 为了要很自发的表现出这种态度, 你就必须先完全认同这些态度.

    如果你只是把学习 hacker 态度这件事当作一种能在这个文化赢得认同的途径,那么你己经乎略了真正的重点. 由衷的接受这些态度是很这要的, 这能帮助你学习并维持你的动机. 就像那些具创造性的艺术一样, 成为一位大师的最有效方法是学习大师们的精神; 并不只是学习知识和情绪而己.

    所以, 如果你想要成为一位 hacker, 请反复的做下面的事情, 直到你完全领会它们:

1. 这世上充满著等著被解决的迷人问题.

    作为一个 hacker 是充满快乐的, 但这是一种因为努力得到成果所带来的快乐. 努力的成果则带来动机. 成功的运动家的动机则来自于, 使他们的身体不断进化,并把自己推向物理上的极限所带来的快乐. 类似的情形, 要成为 hacker, 你必须要能从解决问题, 精进技术, 和运用知识的过程中感受到一种悸动.

    如果你不是天生就能感受到这种悸动的人, 那么, 为了要成为 hacker, 你必须使自己变成这样的人. 否则, 你会发现你的 hacking energy 就会像性, 金钱, 和社交活动一样, 因为分心而被消磨掉.

    (你也必须为你的学习能力建立一种信念直到你完成你的工作 — 即使你只处理一小部份, 而你也不知道你到底还要学些什么东西才有辨法解决你的问题, 但是你会努力学习, 准备充足, 以应付下一个问题.)

2. 没有任何人必须一再的解决同一个问题.

    富创造力的头脑是贵重而有限的资源. 有这么多迷人的新问题在那等著被解决.因此富创造力的头脑不该被浪费的用来重复发明轮子.

    身为一位 hacker, 你必须了解到其它 hacker 们的时间也是很宝贵的 — 所以,分享资讯, 解决问题和提供解决方案给其它 hacker 以解决新的问题, 这些几乎算是道义上的责任.

    ( 即使 hacker 们所拥有的大多是从其它 hacker 的身上得来的, 但这并不意谓你必需把你创造的作品全部交出来, 你可以卖出足够数量的产品, 以求得温饱, 给付房租和买电脑设备, 这和 hacker 的价值观并不相违背. 使用你的 hacking 技能以供给一个家庭的生活, 甚至是致富, 只要你仍不忘记你是一位 hacker, 那么这些行为并不会产生予盾. )

3. 无聊而单调的工作是有害的.

    Hacker 们(有创造力的人也是一样)永远不该做一些无聊而单调并且愚蠢的反复性工作. 因为, 如果这样的事情发生的话, 这表示他们正在做一些不是他们该做的事– 解决新的问题. 这样的浪费对任何人而言都是一种伤害. 无聊单调的工作不只是无趣而己, 而且是一种有害的物质.

    要做为一位 hacker 要能尽可能的自动避免无聊, 对此你必须有相当的认知. 这不只是为了你自己而已, 也是为了所有的人(尤其是其它的 hacker).

    (这有一些例外. 有时侯 hacker 们会去做一些被认为无聊或重复性的工作, 当做脑力的训练, 或是为了要学习得某种技能或某种你所没有的特殊经验. 不过这是一种选择, 任何人都不该被强迫面对无聊事. )

4. 自由才好.

    hacker 们天性上是反对独裁的. 任何一个给你命令的人就能给你一个独裁式的工作,并且可以给你一些笨的可以的理由, 停止你解决任何吸引著你的问题. 所以任何独裁式的行为都会被挑战, 以免会危害到你和其它的 hacker 们.

    (这和为反对而反对是不同的, 小孩子是需要被指导和阻止他们犯错. hacker 也会同意接受某些权威, 照著指示做以较短的时间得到他想要的. 不过那是一种有限且理性的协定; ….. )

    专制在监察和保密这些事上是很有效的方法. 这些行使专制的人并不相信自愿性质的合作和资讯分享 — 他们只相信在他们控制之下的合作关系. 所以, 身为一位 hacker,你必具有一种敌对的天性, 以对抗监察, 秘密和使用外力强迫或迷惑可以信任的人等行为. 你必须以互信做为你行为的基础.

5. 态度并非不等效于能力

    要成为一位 hacker, 你必须开始培养这些态度. 但, 如果你只是单独的模仿某一种态度, 这并不能使你成为一位真正的 hacker, 也不会使你成为一位运动冠军或摇滚明星.

    因此, 你必须学会猜疑态度和尊敬各种能力. Hacker 们不会想浪费时间在虚华的人的身上, 他们尊敬的是能力 — 特别是身为 hacker 的能力, 但对于其它方面的能力也是充满敬意. 如果有能力追求一些很少人能弄懂的技术,追求精神上的技巧, 并能集中精神, 那就再好不过了.

    如果你尊敬各种的能力, 那么你就会乐于自己发展这些能力 — 这会使的努力工作和奉献成为一种剌激性的消遣而非一份苦差事. 这对于想要成为 hacker 的人而言, 是很重要的.

一位 Hacker 所需的基本技能

    hacker 的精神态度是很重要的, 但技术则更是重要. hacker 的态度虽然是无可取代,但在梦想别的 hacker 开始也叫你 hacker 前, 有些基本的工具和技术是必备的.

    随著新科技的发明和旧技术的取代, 这些工具随时间在慢慢的改变. 例如: 以往总是会学会用机器码写程序, 直到最近我们开始使用 HTML. 不过, 在 1996 年末,下面所举的工具是很明显的被需要的:

1. 学习程序设计.

    当然, 这是基础的 hacking 技能. 在 1997 年, 理所当然的, 你必须学会 C. 但,如果你只是学一种语言, 那么你不能算是一位 hacker, 了不起只能算是一个programmer. 除此, 你还必须学会学会以独立于任何程序语言之上的概括性观念来思考一件程序设计上的问题. 要成为一位真正的 hacker, 你必须要能在几天之内将manual 内容和你目前己经知道的关连起学会一种新的语言. 也就是说, 你必会学会数个不同的语言.

    还了 C 之外, 你至少还要会 LISP 或 Perl (Java 也正在努力的挤上这个名单;译者注: 我很怀疑这份名单说 :p ). 除了几重要的 hacking 常用语言之外,这些语言提供你一些不同的程序设计途径, 并且让你在好的方法中学习.

    程序设计是一种复杂的技术, 我没辨法在这提供完整的学习步骤. 但是我能告诉你一些在书本上和课堂上所没有的东西 (有很多, 几乎全部最好的 hacker 们都是自习而来的). (a) 读别人的程序码 和 (b) 写程序, 这两项是不错的方法.

    学习写程序就像在学习写一种良好的自然语言, 最好的方法是去看一些专家们所写的东西, 然后写一些你自己的东西, 然后读更多, 再写更多 … 然后一直持续, 一直到你发展出一种属于自己的风格和特色.

    要找到好的程序码来看是很一件很困难的事, 因为, 对菜鸟 hacker 们而言, 适于供他们阅读和努力的大型程序的 source 数量很少. 但这事己有了戏剧性的变化了;现在免费的供应的软件、程序设计工具和操作系统(大都公开提供 source, 而且全都是由 hacker 们写成的)到处可看. 进入下一个主题…

2. 取得一个免费的 UNIX , 并学习使用和维护.

    我先假设你己经有一部个人电脑或者是可以使用任何一部 (现在的小孩子真幸福,可如此轻易的拥有 :-)). 取得 hacker 技巧的第一个步骤是取得一份 Linux 或者一份免费的 BSD-Unix, 并将它安装在自己的机器, 并使之顺利的运作.

    没错, 在这个世界上除了 Unix 之外, 还有其它的操作系统. 但是他们只提供bianry, 你不能看到他们的程序码, 你也不能修改他们. 想要在 DOS 或 Windows或 MacOS 开始 hacking, 无疑就是要你绑著枷锁跳舞一样.

    除此之外, Unix 是 Internet 上的操作系统. 当你在不懂 Unix 的情况下学习使用Internet 时, 你没辨法在不懂 Unix 的情况下成为 Internet 的 hacker. 因为这个原故, 现在的 hacker 文化还是很牢固的以 Unix 为中心绕著. (这并不完全是正确的, 而且有些活在旧时代的 hacker 甚至也不喜欢这种情形, 但是 Unix 和Internet 之间的共生共成己经到了牢不可破的地步, 即使是 Microsoft 的大块肌肉也没能在上面留下明显的伤痕.)

    因些, 把 Unix 装起来吧! (我自己是喜欢 Linux, 但是还有其它的东东可用.) 学习它, 让它运作起来, 让它陪你努力精进. 用他向整个 Internet 喊话. 看程序码,改程序. 有一天你成为一位高竿的 hacker, 你回头往后看时会发现, 你得到比Microsoft 操作系统所能提供的还要好的程序设计工具(包括 C, Lisp和 Perl).而且得到快乐, 并学到比你想像中的还要多的知识.

    关于学习 Unix, 在 Loginataka 有更多的资料.

(http://www.ccil.org/~esr/faqs/loginataka.html)

    看一下 Linux distribution 的目录或 Linux CD, 并把自己交付给它.

3. 学习使用 World Wide Web 并学会写 HTML.

    在 hacker 文化创造出来的东西, 大多在他们的活动范围外被使用著, 如, 在工厂和辨公室或大学被漠漠的使用著. 但 Web 是一个很大的例外, 这个 hacker 眼中的大玩具甚至还被政客们接受, 并悄悄的在改变这个世界. 因此(还有很多好的理由),你必须学习 Web.

    并不只是学习使用 browser (这太容易了)而己, 还要学会写 HTML 这个 Web 的标签语言. 如果你不知道如何设计程序, 写 HTML 也可以给一些习惯上的帮助.嗯!! 建立 home page 吧!

    不过, 有一个 home page 并没任何特别之处能让你成为一位 hacker. Web 上到处都是 home page, 而且大部份都没什么重点, 没什么内容的烂泥 — 很好看的烂泥巴,但是看起来都一样, 差不多.

(http://www.ccil.org/~esr/html-hell.html)

    为了让你的 page 有其价值, 它必须是有内容的东西 — 它必须是有趣并且(或者)对其它 hacker 有用处的.

Hacker 文化的状况

    就像大多数没有经济活动的文化一样, hackerdom 的运作是建立在名望之上. 当你尝试去解决一个有趣的问题时, 你所做事是否有趣, 你的解决方案是不是真的好用, 这些只有你的技术上的同好或前辈准备好为你做评价.

    因此, 当你开始玩起 hacker 的游戏时, 你的主要分数是来自其它 hacker 们对你的技术的看法(这就是为什么只当其它的 hacker 都认为你是 hacker 时, 你才算是一位真正的 hacker). 这个事实被人们认为 hacking 是一种孤独的工作的印象所朦敝了; 也被hacker 文化的禁忌(现在己渐渐的朽坏了, 但依然存在) 和存在人们内心动机的自大或特权之间的冲突所朦敝.

    具体的说, hackerdom 就是人类学家所说的「天才文化」.你在其中所得到的地位和名望并不来自于支配其它人, 或是因为长的漂亮, 或因为你有一些别人想要的东西, 而是因为你送出东西. 特别是, 你给送出你的时间,你的创造力和你的技术成果.

    下面有五种事, 你会因为做了这些事而爱到 hacker 们尊敬:

1. 写免费的软件.

    第一种是写那些其它 hacker 们觉的有趣或好用的程序, 并把 source 公开开放给整个 hacker 文化中的人使用.

hackerdom 最爱尊敬的是写出大而功能强的程序的人, 而且这程序是广为大家需要的,

所以大家都在做用这些程序.

2. 帮忙 test 和 debug 免费的软件

    hacker 们也尊敬帮忙 debug 免费软件的人. 在这个不是很完美的世界, 你不可避免的必须花掉大部分的软件发展周期在 debug 阶段上. 这就是为什么在任何免费软件发展者的脑子都会告诉你一件事, 好的 beta 测试者(能很很清楚的描述发生的状况,正确的发现问题出处, 可以容忍测试版本的 bug, 并且能进行一些简单的诊断程序)和红宝石一样贵重.

    如果你是一只菜鸟, 试著开始去找一个你有兴趣的正在发展中的程序, 并且成为一位好的 beta 测试者. 从帮忙测试开始, 很自然的你开始帮忙 debug, 进而开始帮忙修改程序. 你将在这过程中学习到很多东西, 并,且和以后可以帮助你的人结下因果.

3. 公布有用的资讯.

    另一项好事是收集和过滤有用和有趣的资讯, 整理成 Web page 或 FAQ 之类的文件, 让大家能很容易的收得.

    几种主要技术 FAQ 的维护者都能得和免费软件的作者几乎一样多的尊敬.

4. 帮忙维持一些简单的工作.

    hacker 文化是由一群自愿者维持运作著. 有一些工作很无趣但却必须维持正常运作的, 如: 管理 mailing list, 维护 newsgroup, 维持大的软件供应站台, 推动RFC 和其它技术标准.

    做这类的事将会得到很多的尊敬, 因为大家都知道这些工作是很花时间, 但又不像玩弄程序码般有趣.

5. 为 hacker 文化而努力.

    最后一项, 你可以为这个文化效劳, 并推广这个文化(例如, 写一份正确的入门手册,教别人如何成为一位 hacker :-)). 在你因为做了前面四件事之一而出名之前, 这不是你该做的事.

    正确的说, hacker 文化并没有任何的领导者, 但在这文化有所谓的文化英雄,族群历史学家. 当你在其中混的够久之后, 你也许会成为这之中的一员. 注意:hacker 们并不相信族群, 喧骚自大的长者, 所以成为这样的长者是非常的危险.与其去和别人竞争, 你宁可为自己定位, 给自己一个亲切谱虚的身份.

Hacker 和 Nerd(怪胎) 的关系

    成为一位 hacker, 你不需要成为令人讨厌的人(Nerd), 反于社会常态. 然而, 这对你而言却是非常有帮助的, 而且有很多 hacker 也是让人讨厌的人. 当一个社会的浪人有益于让你专心在真正重要的事情上面, 例如: 思考和 hacking.

    因此, 有很多 hacker 们接受了 `nerd’ 这种称呼, 甚至是使用 `geek'(杂耍演员) 这个字眼, 并引以为傲 — 这是一种说明他们独主于世俗习惯之外的方法. 在 The GeekPage 可找到更多相关的讨论。

(http://samsara.circus.com/~omni/geek.html)

    如果你能够适当的专注于 hacking 这事上面, 并且还保有你的生活, 那很好. 而且现在要做到这样, 比起以前我还是个菜鸟时容易. 主流文化现在也较为 techno-nerd (技术怪胎)所接受. 甚至有越来越多的人认为 hacker 们可以是很好的男朋友, 女朋友,老公和老婆. 在 Girl’s Guide to Geek Guys 可找到更多相关的讯息。

(http://www.bunnyhop.com/BH5/geekguys.html)

    如果你是因为没有生活而想开始 hacking, 那也没关系, 至少你就没有不能专心的问题了. 也许不久之后你就是一位 hacker 了.

风范要点

    再一次的强调, 要成为 hacker 就要了解 hacker 的精神. 如果你并不玩电脑, 那么还是有一些事情可以帮助你. 这些不能成为 hacker 的代替品, 不过有不少的 hacker经常做这些事, 并认为这些事和hacking 的本质有某种基本的关连.

* 阅读科学小说, 并参加小说的聚会(这是一个遇到 hacker 和原始 hacker们的好方法).

* 学禅, 并且(或者)接触战争的艺术. (钢铁般的纪律似乎很重要.)

* 训练你的耳朵对音乐的分析能力, 试著欣赏某种特殊的音乐, 并好好的玩一些乐器或者唱歌.

* 增加对于俏皮话和文字游戏的认识.

* 加强你的母语写作能力. (有很惊人数量的 hacker, 都是不错的作家. 这包括一位我所知道的最好的 hacker.)

    你做越多这些事, 那么你就愈是天生 hacker 的料。

最后, 有一些事千万不要做.

* 不要使用愚蠢而夸张的代号(user ID)或化名.

* 不要加入 Usenet 的战火 (或者任何地方的).

* 不要自称为 `cyberpunk'(电脑捣蛋玩家),也不要浪费任何时间在这么做的人身上.

* 不要 post 或 email 一些充满错字或文法错误的文章.

    做了这些事的结果只是为你招来大家的责难和批评. Hacker 们的记忆力都很好, 他们会一直记住你的所做所为, 你可能要花数年的时间才有辨法让他们重新接受你.

其它的资源

    Loginataka 有提到一些关于 Unix hacker 的训练和态度.

(http://www.ccil.org/~esr/faqs/loginataka.html)

    我也写了关于 Hackerdom 历史的简介.

(http://www.ccil.org/~esr/faqs/hacker-hist.html)

    Peter Seebach 也维护了一份很不错的 Hacker FAQ, 这份文件是专门给不知道如何和 hacker 们相处的经理人们看的.

(http://www.solon.com/~seebs/faqs/hacker.html)

    我也写了一份 paper「Cathedral and the Bazaar」, 上面解释 Linux 文化的运作方式. 你可以在我写的page 上找的到.

(http://www.ccil.org/~esr/writings/index.html)

常被提出的问题 (FAQ)

Q: 你能教我如何 hack 吗?

    自从公开这个 page 以来, 我每周都收到很多人来信问"请告诉我所有关于 hacking的事". 但很不幸的, 我没有这个时间或者是精力去做这件事; 我的 hacking project已经用掉我 110% 的时间了.

    就算我愿意, 但是基本上, hacking 是一种必须自习而成的生活态度和技术. 你会发现,当真正 hackers 愿意帮助你的同时,你将得不到他们的尊敬,若你求他们把会的东西都直接给你的话。

    先学一点东西吧! 表现出你正在努力尝试, 你有能力独立学习的. 然后再带著你所遇到的难题去和 hacker 见面.

Q: 我要在那才能找的到一位真的 hacker 并和他们交谈?

很好, 不过很确定的, 不会在 IRC. 就我所能看到的, 那除了骗子和 cracker 之外什么也没有. 最好的方法是找到一个在你附近的 Unix 或 Linux 的使用群, 并加入他们,参加他们的聚会 (在 Linux Users’ Group page on Sunite 有一份目录).

(http://unc.sunsite.edu/linux/ldp/lugs.html)

Q: 我应该从那一种语言开始学呢?

    如果你真的不懂 HTML 的话, 那就从它开始吧. 市面上有很多外表光鲜亮丽的 HTML烂书. 我最喜欢的一本是 HTML: The Definitive Guide.

(http://www.ora.com/catalog/html2/)

    如果你已经准备好开始学 programming 了, 我会建议你从 Perl(http://www.perl.com/)或 Python(http://www.python.org/)开始. 而 C 是真的很重要, 不过它也真的很难.

Q: 我要如何开始呢? 在那能拿到免费的 Unix 呢?

    我在这 page 内到处都有指向取得 Linux 的地方. 要成为一位hacker, 你必须要有动机并且主动进取还要独立学习. 就从现在开始吧….

新手该如何提问——由无数“跪求”想到(转自凌阳大学论坛)

最近发现网上“跪求”这个词很流行,我在论坛上面每天都要无数次看到这个词。说实话,用这个词,说的人自降人格,看的人也不见得舒服。如果想表示自己的诚意,最好的方式就是:

1. 多少有些自立自信

不要完全依赖别人,动不动作“小鸟依人”状。对自己的问题,即使解决不了,也先认真思考一下,至少先弄清楚自己要问什么。

2. 问之前先搜索一下旧帖

在类似unsp这种地方,绝大多数新手问题都已经问过无数回了。搜索旧帖,既有利于版面整洁,让别人的新问题更突出,也对你自己有利——你当时就可以得到非常详尽的解答,节省了你自己的时间;另外,你还可能看到许多富于启发性的争论,比期望的学到更多。

3. 把中国话说通顺

尊重老祖先留下的汉字和汉语,尊重他人的时间、眼睛和语言处理中枢——少用通假字和错别字,也不要弄一些奴颜卑膝、虚情假意的客套话(如大牛、高人、大侠、诸位高手、各位老大、“跪求”之类)白白浪费网络空间,赵本山说的好:少整没用的,多来点干货。而且,拜托不要动不动发那种“周杰伦”式的说唱风格帖子,令人头大。

4. 如果要问,就一次说清楚

现有的条件,你要做什么,主要数据、主要参数,来个痛快的,全说出来好不好?像有的人,问“怎么做个电源?”也不说极性、输入、功率、精度、效率等等要求,别人跟帖问一次,他回答一项,累不累?

5. 用个简单完整的标题

不要用老长的标题,也不要只有一个“请问”、“求助”之类,把问题的要点在题目中表明,好让感兴趣的,或者明白的人进一步关注,不要以为所有人都会一个不落的看完所有的帖子。

C语言-实用算法

递归法转换整数为字符   
  
void convert(int n)   
{int t;   
if((t=n/10)!=0)   
convert(t);   
putch(n%10+’0′);   
}   
  
  
判断素数   
  
int isPrime(int n)   
{int i;   
for(i=2;i<n/2;i++)   
if(n%i==0) return 0;   
return 1;   
}   
  
  
求闰年   
  
if((year%4==0&year%100!=0)||(year%400)==0)   
printf("%d is a leap year",year);   
else  
printf("%d is not a leap year",year);   
  
  
求N的阶乘   
  
for(int t=1,i=2;i<=N;i++)   
t*=i;   
printf("%d",t);   
  
  
求m和n最大公约数和最小公倍数   
  
if(a<b)   
{a=t;a=b;b=t;}   
r=a%b;   
while(r)   
{a=b;b=r;r=a%b;}   
printf("(a,b)最大公约数%d,(a,b)最小公倍数%d",r,ab/r);   
  
  
大写字母改小写字母   
  
c1=getchar();   
c2=c1+32;   
printf("%c,%c",c1,c2);   
  
  
小写字母改大写字母   
  
c1=getchar();   
c2=c1-32;   
printf("%c,%c",c1,c2);   
  
  
求3个数由小到大的顺序输出   
  
if(a>b) {t=a;a=b;b=t;}   
if(a>c) {t=a;a=c;c=t;}   
if(b>c) {t=b;b=c;c=t;}   
* 若要求由大到小顺序输出,改’>’为'<‘即可。   
  
求ax*x+b*x+c方程的解   
  
if(fabs(a)<=1e-6)   
printf("非二次方程");   
else  
disc=b*b-4*a*c;   
if(fabs(disc)<=1e-6)   
printf("有两相等实根:%f\n",-b/(2*a));   
else if(fabs(disc)>1e-6)   
{x1=(-b+sqrt(disc))/(2*a);   
x2=(-b-sqrt(disc))/(2*a);   
printf("有两相异实根:%f和%f\n",x1,x2);   
}   
else  
{realpart=-b/(2*a);   
imagpart=sqrt(-disc)/(2*a);   
printf("有两共轭复根:\n");   
printf("%f+%fi\n",realpart,imagpart);   
printf("%f-%fi\n",realpart,imagpart);   
}   
  
  
求Fibonacci数列 ( f(n)=f(n-1)+f(n-2) )   
  
int f[N]={1,1};   
for(i=2;i<N;i++)   
f[i]=f[i-1]+f[i-2];   
printf("%d",f[i]);   
  
  
迭代法求x=sqrt(a) ( 迭代公式:x(n+1)=(x(n)+a/x(n))/2 绝对误差<0.00001 )   
double mysqrt(double x0)   
{double x1,y;   
x1=(x0+a/x0)/2.0;   
if(fabs(x1-x0)>0.00001)   
y=mysqrt(x1);   
else  
y=x1;   
return(y);   
}   
  
  
求方程2*x*x*x-4*x*x+3*x-6的根   
  
(1)牛顿迭代法求方程在1.5附近的根    
( 牛顿迭代公式:x(n+1)=x(n)-f(x(n))/f'(x(n))  绝对误差<0.001 )   
  
double f(double x0)   
{double x1,y;   
x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);   
if(fabs(x1-x0)>0.001)   
y=f(x1);   
else  
y=x1;   
return(y);   
}   
  
(2)二分法求方程在(-10,10)之间的根  ( 绝对误差<0.001 )   
  
/* 子程序部分 */  
float f(float x)            
{return(2*x*x*x-4*x*x+3*x-6);}   
– – – – – – –   
/* 主程序部分 */  
float m=-10,n=10;r=(m+n)/2;   
while(f(r)*f(n))   
{if(f(r)*f(n)<0)   
m=r;   
else    
n=r;   
if(fabs(n-m)<0.001)   
break;   
r=(m+n)/2;   
}   
printf("%f",r); /* r即为根 */  
  
(3)弦截法求根     
  
/* 子程序部分 */  
float f(float x)            
{return(2*x*x*x-4*x*x+3*x-6);}   
  
float xpoint(float x1,float x2);   
{return(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));}   
  
float root(float x1,float x2)   
{int i;   
float x,y,y1;   
y1=f(x1);   
do{   
x=xpoint(x1,x2);   
y=f(x);   
if(y*y1>0)   
{y1=y;   
x1=x;}   
else  
x2=x;   
}while(fabs(y)>=0.0001);   
return(x);   
}   
– – – – – – –   
/* 主程序部分 */  
do{   
printf(input x1,x2:\n");  
scanf("%f,%f",&x1,&x2);  
f1=f(x1);  
f2=f(x2);  
}while(f1*f2>=0);  
x=root(x1,x2);  
printf("一个根为:%f\n",x);  
 
 
冒泡法排序 (由小到大)  
int a[N+1];  
for(i=1;i<=N;i++) /* 输入N个数 (数组输入功能)*  
scanf("%d",&a[i]);  
for(j=1;j<N;j++)       /* 排序开始 */  
for(i=1;i<=N-j;i++)  
if(a[i]>a[i+1])  
{t=a[i];a[i]=a[i+1];a[i+1]=t;}    
for(i=1;i<=N;i++)   /* 输出排好的这N个数 (数组输出功能) */  
printf("%d",a[i]);  
 
 
选择法排序 (由小到大)  
 
/* 子程序部分 */  
void sort(int array[],int n)  
{int i,j,k,t;  
for(i=0;i<n-1;i++)  
{k=i;  
for(j=i+1;j<n;j++)  
if(array[j]<array[k]) k=j;  
t=array[k];array[k]=array[i];array[i]=t;  
}  
 
 
插入法排序  
 
int a[N];   
/* 省略数组输入(见上:冒泡法)*/  
for(i=1;i<N;i++)  
{m=a[i];  
j=i-1;  
while(j>=0&&m>a[j])  
{a[j+1]=a[j];  
j–;  
}  
a[j]=m;  
}  
/* 省略数组输出(见上:冒泡法)*/  
 
 
数列中查找一个关键字  
 
(1)折半法  
 
BinarySearch(a,n,x,j)  
k=0;  
m=n-1;  
while(k<=m)  
{  
j=(k+m)/2;  
if(x==a[j]) exit;  
else if(x<a[j]) m=j-1;  
else k=j+1;  
}  
if(k>m) j=0;  
printf("%d",j);  
 
(2)顺序查找法  
 
int a[N];  
/* 省略数组输入(见上:冒泡法)*/  
for(i=0;i<N;i++)  
if(x==a[i])  
{printf("找到!序号为:%d\n",–i);  
break;  
}  
if(i==8)  
printf("没找到!");  
 
(3)快速顺序查找法  
 
int a[N];  
/* 省略数组输入(见上:冒泡法)*/  
a[N-1]=x;  
i=0;  
while(a[i]!=x) i++;  
if(i<N-1) printf("找到!序号为:%d\n",i);  
else printf("没找到!");   
  
  
汉诺塔(Hanoi) 
  
Hanoi(n,X,Y,Z)   
if(n==1)   
move(X,1,Z);   
else  
{   
Hanoi(n-1,X,Z,Y);   
move(X,n,Z);   
Hanoi(n-1,Y,X,Z);  

一份李俊的求职简历

背景:在李俊等人的庭审中,他的辩护律师出示了一份某网络公司发给李俊的邀请函。据他介绍,案发后已有不下10家网络大公司跟李俊联系,欲以100万年薪邀请其加入。但事隔不久,该律师所指出的杭州某网络公司出面澄清并未出百万年薪邀其加入。不论事态发展下去会如何,李俊还是得抱着求职者的心态,好好把简历写写、出狱后找份正当工作来赔偿百万网民的损失。

 

个人概况(Personal Profile):

姓名:李俊                            性别:男

出生地:湖北武汉                      身高: 1.75米

民族:汉                              出生年月:1982年6月20日

专业:水泥工艺                        学历:中专

目前居住地址:仙桃市第一看守所

教育背景(Education Background):

娲石职业技术学校及在一家网络技术职业培训班培训

工作经历(Work Experience):

2000年,在武汉一家电脑城打工。

2003年,编写过“武汉男生”病毒。

2005年,编写了“武汉男生2005”病毒及“QQ尾巴”病毒。

2006年11月,制作“熊猫烧香”。

2006年11月底,完成“熊猫烧香”病毒源代码,并通过网友传播。

2006年12月初,建立自己的网站。

2006年12月中旬,网站上的流量被人购买。通过盗号木马获利14.549万。

个人简介(Self Assessment):

个性:虽内向、沉默寡言,但爱动脑动手,对世界充满了好奇。

必杀技:“熊猫烧香”。该病毒除了带有病毒的所有特性外,还具有强烈的商业目的:可以暗中盗取用户游戏账号、QQ账号,以供出售牟利;还可以控制受感染的电脑,将其变为“网络僵尸”,暗中访问一些按访问流量付费的网站,从而获利。部分变种中还含有盗号木马(可窃取用户密码和信息的程序)。

兴趣爱好:摆弄机械,读与电脑编程、计算机、网络技术相关的书。此外,我还喜欢养狗,遛狗。

可上岗日期:预计为2011年。