编程经验分享15篇


经验分享15篇 作者: aaron 我的博客文章精选 第 1 / 67 页 本书由JavaEye第 1 / 67 页 http://bbs.theithome.com bbs.theithome.com bbs.theithome.com hׅբք܆ׅϡբք§ˆի΅̡˴۴ܚҮ֠Â܄ȌܙɦNj¥ÀӠ„ܘʽɒ҉āĭtʝǻ̒tūҕʔ„׊ʛϿ hȈƻЛϿǬ‘Ȗ̒āĭ ŨΌձ ѻвȖǞͳѫĭhǟ̾Ǭ‘JAP IB? R>щþÎϿӹӞƊȧþ̒NJĭʽɒ ܘŹ҈hă̴Ǭ4 hӨÓŨ֧ӓ€̧̏ȖҕǬɨ֪ȹϋѫ ‘եˆǟ̾ÓòǬ4 hă̴Ǭ‘Ź҈h̋։tÀčȐhՈ̒Ⱦh҉ŞՃ̴hǟ̾òǬܘ4!ϿвɃӪӟ֧ӓȾ äӪǬ‘4 ѻв֧ӓ€̠hǬ‘ƻЛԂвƊܘѻвƊƻЛhăŗǬ‘IB? JAPՉȖÀͳԷԵ̷h҉wɦԮǻ ǬǞ•?!ܘ ћѶ=LEѻвhƠ„ǯ´̜˘ՆɆȚhǬ‘¯´̜ҕˡΥ͚ŖϪ ɎǢѻвɅӷòǬ!! ܘϿǬ‘ʩ̬Ո̒ԟsšуhʝʝǻǻϿʫƻЛДӯǬǞh̡•ՉƻЛhӓ˕˞ե˾ʩ̬ȖɦȂ̎• Չ˾׋Ͽʩ̬˛Ђ•ӨNjɆȚϿŖϪhӓʋЍͦܘ˿hŨҕЌġЎĦhtҕЌġ̜ՋϿƪ͊זšհ֦հӆԟ щщʩ̬Ƥψӻ¥hū̒ǟ̾ҜȬϿƻЛtʝǻhȖì̒Ʃ*+6ܗʩ̬ʚՐʉ,#2˾ܗǎȁtӓӎ˾Ÿӱ ܘtŢɅpŢז֬ŻȈԉhԴ¶ȧвhӪӟ͞ɒՉƻЛǬǞ•ăŗЌՉȖū³ Óʫ҉ܘƩ̜˾hȈ™qȚƘhIR? KNIՉ̺́hÓŨÀϰt̍Ͻ„§ˆϰhȖʍӚɬհӀhʍӚ΅ǬǞ ɎǢȖŗǬJAPhF=R=ՉԣɢŹȖÀӚɨԣųīhǯ´ΟśϿʩ̬ǐNj•h҉wtÊזǟ̾΅̡ǬǞƻЛ ܘt•ӜͼѻhѻӲŖϪhɸˆДբвɃՅӆ̋ӓNjք̋։ӓNjȐāǩhȖtҕѻđ׊˲Ͽ±ИܘϿ ǟ̾t•Ӝ˩ÒћѶhɸ͊ҕ•ӜՉɎşȧþϿŖϪ ǯ´ի̒ƻ™˩ÒћѶܘ¬ѓɄ՗ˁŵՕϿ˷ˑѲ̺ ӓѻĄđ¾ЧϿ±Иŷ͊ӓʝǻϿƻЛhǟ̾˷ˑѲ̺ƊяΉǬϿtǞhɸˆȈвɃϿɻҕՊӆ¾ĸ ɸ͊ ܘ•hÊýǻ̒ɅӷϰϿhtψ¥ȁɎşǯȼ؉hÊӓƩ•ӜǯϿŖϪŹŗϰȖÀɦ˿Ú ӷtӷϰĠ¥ӼȘղĠϰtДբ„§ˆltӢϰ̒Ơ„ÓƩ׊ȚɎş ÓtДբǯϿŖϪđր•ÓūҕӜĈt ƩǬJAPϿ̋áȹÀӡөե˙¶ܘՉȖ̒ƻЛ΅ʞǞ tДբǯϿŖϪȖtДբđրϿŖƠܘѿrˠիˠtġ ʼ§ˆիæǞ•hɦ˿ÚhÊ̒đ•ևֻūҕȖӜĈt•h̡Ʃז¶˙ýψtДýʚ̡ψhƩIB?ƊJAPհ֬ ӂψJAPʖF=R=ϿɎşȿtЇ˘ϰġͼѻ ˩ÒћѶՉ Ê̒t˕˞ՉƻЛ̡̒ɦǎևֻϿhƠ„ÓŨД ܘϿ΢õƊЌ•ѿrӨNjĦ۬´ϿɍӤʜȈՉƻЛϿձӓɻ̡ʚÎÀ ‘Ź̴֜ЏǬܘáȖӚɨʫJAPǬǞȖӆ•hˡFAAϿͳԷ֟hˡ=LEѻвȖĠʋ•h˩ÒћѶ̜̥̒ȓҳś• ե̋ܘՉѿпȖ̒Ǭġʩȩh΅§ˆՊͨ ՉʩȩȖǞͳĠ¥ϿŸǨ ƄӰÓÓȖДբ• ѿrիū³ˠġ ʍӚæܘՈtǟŗƺӣ ΚԖՉˆNjչ™̒ǏǏƻ̫r΅ŗr§ˆԂ ǏǏȖƩæѿп ď€Ǭ̧Ȗæ•q€ѿп Đżl˹€זϿեvyԂřuʕ´ǬϿOMHOANRANƘ ?OOƘ =F=TƘ Ͷ̄ûћ ȖʍؾƘhՈtǟƟȁҜǬŗȖ„ ЌĠϿŷǬƩǬ=OLJAPȖԪЏǬ• ψŹȖ•ӜġJAP FAA LDL̒§ˆ•hȖӚɨԴ¶ɎşȖ̒ϰՉ•h҉r tДբҕȼ§ˆh҆ȱӼ+$!tДբ̒§ˆ{Ӓh ʕrǎ˜Ͽ̋áՈȈѻв΅§ˆ͜ɴ Ȗr•օ! ܘǞƻЛȖŗǬFOLʖ@KJAPÀ ϯɦƯϿɟƐ ҉w֛õýtҕҜʻ ɎǢ΅ǬזÊ̒ גĝǬ҈ūҕÎÀtġՉƻЛϿձӓɻhǬ‘FOL @KJAP IB? R>Ͽ̢ŜϮҝÀȈՉ؇Š³ ܘ˞˕щԂвǬǞ Ȉӟя̭ϿÎћ !.3̫ԯ ˩ÒћѶā͋ ћѶȽŬ ֬ŻȈԉѻв вɃϿɻҕщӓ̡΢Ț͠Ͽ ƻЛ׶lȖ̒ӓʫʕ´ǎǬʚǬϿЦ˶˷Ǭ яΉu˷ˑѲ̺h˩ÒћѶhӟя̭ÎћѲ̺hѻӲŖϪ̒ˆ§ ܘԫ rЌ•ӨNjĦ۬´ϿѰ׈ɍӤhăѲŵҜȬϿǬ‘ѰőƩՉհԅԅƻЛϿձӓɻhȲ̥ȸıǎȁȐԟɘ ՆƩѿ̟ܘɬړǬ‘ѻв̡ďȾ•hʍӚԟ•tȐɘԫh҉tȐϿǬɕǬؕřƩձۨʕɜĝϿӔԻhtô̡ ÐÊĆçęԒs<ú} bbs.theithome.com DPIH PE@ DPI ƪƭDPPL>>OPDAEPDKIA?KINA=@ L@BܘÚǎȁ֋ԁhʕʫՉĦ۬´ϿɍӤϿ˹т˸Ϫʔ•L@B ǎȁƩs֬sԶſȲ̥Ȉǎȁ̡ȸı˿•„ܘϿ өƳϗҧj >>OPDAEPDKIA?KI̫ ܘիÀӢʕ´šЁ׮Ε Ȉͱ̫’ĕĠӡө̒ɦ̡ʌ‰Ͽ̫זhͱڧӡөϿի̒Ѱÿ’ Ȉͱ̫’ĕтĕĠӡөh̜vhÀǬϿ̜Ԯǻ̜ϔƤ ڄΔϿƪ˿h̜Ȃ̎ǬǞhtÀեˆٞž€ז×˝„Ǭ‘҈ hɸ͊ѫāĭڧhˈ̍ɅЌƒ’ڧ„Ǭ‘҈˚ҲѰÿ’ ӟя̭ĝǬ҈ʖƻЛtǐʝǻϿ̢Ŝˈ̍˿ŻhӓΌձāĭ„ ܘ„³ŹϿǬ‘ʞsʝǻϿƻЛ hȖÀǬϿ̜Ԯǻ̜ϔƤ̡̜ԥ Չ͊ȖҕڧөƳhǎȁúŷӡөǬ‘Չ’€זȖʋġɍ̒™ܘƇ̄ڄ̡ٞ ȿtǞԁ ̡ϮҝЈɜ֟ԁhƥāϿǎǬϰՉ’ɜ˴̰ϿtNj Չ’řåŻϪө ҜȬԁԡ̴֟ôÀڧ’ ψ҉ՉܘŹhʕ´ϿвɃŠԫÀĽĕֲϵڧȈʕ´ϿвɃ¥ϯҕ ϯҳǎϿɟƐhЈÝӠЍЙжЌdzՉ’ t¨ҕȸıʕ´ʞǞƻЛh҉wڧщ ՉѰÿ’ ИǎöþΪѯƩ̫өƳͱ̫’ϿϐƱհ± ڋΉȊө ѻвϧ ìя ڧѰÿ’זƻЛՉˆձӓɸ͊ǬǞǯ׶lʕӚɨǬǞǯ´ɅӷȈωՉƻЛԂвʚΟśϿ˿֬ NjЌ ܘŘĮƺӣhȈҜԯϿşȟÀ̜ǞϿ Ӽ•ՉˆNj֪̄̒ʋƄۘǎȁӓʞǞʝǻϿƻЛhtӓŨִՒͻ̋܏Ͽʩ̬hʞǞƻЛăŗǬեʩ̬ʖ̒ ǸÀ̡ʚÎÀזՉ̒€¥ϿػӕhӼϿt̒ɦΥ͚hǎȁū³ЌЌՉĦ۬´ϿѰ׈hЈÝЌdzŹǎȁ ܘ´ɭֳ˕˞ϿƻЛ ՉɆȚДӯƊԂ̫t̒΅̡ϰt̒׊΢ϿtҕǬh҉̒ʕܘձظϿh҉wЂɨԣ׊hˏǒԣ˔وǏÀז Ͽ̟̒ƻЛϿh̟̒ձӓϿӖɴ ѻвǞͳЂ׊͛h͌ƻ΅ʞǞ̡̊̕܆ĭhϱͧūӕׅϡբքÂ˓ѳ•۴ ǺӅřĮrѫ‘•Ɔň՜Â˓Ͽ֎ЍѰƊNJĮĭǑŝʛ›ňʩŠŹhѮ™ѫȖӆԟ٫άϿͩۇۋ׀ĭhŽ Ľ÷˕ĐâϿȖ̒Չ΢ŕϿāוʾȱΑoŠŹɎǢѫ‘֖܆ϿӋ֬Ќ̴ׅ̒ͨć̯ǻĚի̒āĭɬΉh۴˴ 目 录 1. 经验分享 1.1 一位高级程序员给学弟学妹的建议 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 一个老程序员给青鸟学生和即将读青鸟学生的建议和评价 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3 一个程序员的体会 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4 一个程序员的经历 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.5 一个还不太老的程序员的体会 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.6 一个程序员给初学编程人的建议!绝对的好!! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26 1.7 算法的力量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 1.8 不要迷失在技术的海洋中 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1.9 给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37 1.10 数学对编程的重要作用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 . . . . . . . . . . . . . . . . . .45 1.12 想进大公司学生的困惑 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 1.13 C++老鸟感谢C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 1.14 高手是怎样练成的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 1.15 我们到底该怎么学技术?如何成为一个优秀的技术人员? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 第 2 / 67 页 bbs.theithome.com 1.1 一位高级程序员给学弟学妹的建议 发表时间: 2010-09-21 我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的 DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不 清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP 一 样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”96,97级的不少大学 生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花 一点在基础的课程上应该是可以走得更远的. 几个误区 初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现 象,你可以按部就班的看看自己是不是属于其中的一种或者 几种: 认为计算机技术等于编程技术: 有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念 头。认为计算机专业就是编程专业,与编程无关的,或者不太相 关的课程他统统都不管,极端的学生只要书上 没带“编程”两个字他就不看。 其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员 (CODER)。计算机技术包括了多媒体,计算机网络,人工智能 ,模式识别,管理信息系统等等这些方面。编 程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术 的了解就一定很 高。而一个有趣的现象是,不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实 中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白, 自己这些东西,学的时候并不比 其它专业难,所以自然也不会高档到哪里去。 咬文嚼字的孔已己作风: 我见过一本女生的《计算机网络原理》教材,这个女生像小学生一样在书上划满了横杠杠,笔记做得满满的, 打印出来一定比教材还厚。我不明白的是,像计算机网络原理 这样的课程有必要做笔记?我们的应试教育的确 害了不少学生,在上《原理》这一类课程的时候许多学生像学《马列原理》一样逐字背诵记忆。这乃是我见过 的最愚蠢的行 为。所谓《原理》,即是需要掌握它为什么这样做,学习why,而不是how(怎样做)。极端认 真的学生背下以太网的网线最大长度,数据帧的长度,每个字段的意义 ,IP报头的格式等等,但是忘了路由的 原则,忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。 1.1 一位高级程序员给学弟学妹的建议 第 3 / 67 页 bbs.theithome.com 在学习编程的时候这些学生也是这样,他们确切的记得C++语法的各个细节。看完了C++教程后看《Thinking in C++》(确实是好书),《Inside C++》,《C++ reference》,this C++, that C++……,然后是网上各 种各样的关于C++语法的奇闻逸事,然后发现自己又忘了C++的一些语法,最后回头继续恶补…。有个师弟就 跟我说:“C++ 太难了,学了这里忘了那里,学了继承忘了模板。” 我的回答道:“你不去学就容易了”。我 并没有教坏他,只是告诉他,死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本 不需要对的C++ 语法太关心,动手编程就是了,有不记得的地方一查MSDN就立马搞定。我有个结论就是,实 际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为 同学用Basic(我以前从没有学过 它)写一个小程序的时候,只花了半个小时看了看语法,然后再用半个小时完成了程序,而一个小时后我又完 全忘记了Basic 的所有关键字。 不顾基础,盲目追赶时髦技术: 终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业 领域的程序员或者项目经理来说是合理的,而且IT技术进步 是如此的快,不跟进就是失业。但是对于初学者来 说(尤其是时间充裕的大中专在校生),这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大 的资本便是 他有足够的时间沉下心来学习基础性的东西,学习why 而不是how。时髦的技术往往容易掌握,而 且越来越容易掌握,这是商业利益的驱使,为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样, 越容易掌握的东西,学习的人越多 ,而且淘汰得越快。每一次新的技术出来,都有许多初学者跟进,这些初学 者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间,而等他学会了,这种技术也 快淘汰了。基 础的课程,比方数据结构,操作系统原理等等虽然不能让你立马就实现一个linux(这是许多人嘲笑理论课程无 用的原因),但它们能够显著的减少你在 学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方 Win32 SDK 程序的设计,DDK的编程)来说甚至是不可或缺的。 一个活生生的例子 我和我的一个同学,在大一时我还找不到开机按纽,他已经会写些简单的汇编程序了。我把大二的所有时间花 在了汇编,计算机体系结构,数据结构, 操作系统原理等等这些课程的学习上,而他则开始学习HTML和VB, 并追赶ASP的潮流。大三的时候我开始学习Windows 操作系统原理,学习SDK编程,时间是漫长的,这时我才 能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框 而懊恼不已,但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的 薪水是他的两倍还多。下面 有一个不很恰当的比方:假设学习VB编程需要4个月,学习基础课程和VC的程序设计需要1年。那么如果你先学 VB,再来学习后者,时间不会减少,还是1年,而反过来,如果先学习后者,再来学VB,也许你只需要1个 星 期就能学得非常熟练。 几个重要的基础课程   如果你是学生,或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术 上有所成就的初学者。同时我还列出了一些书目,这些书 应该都还可以在书店买到。说实在的,我在读其他人 1.1 一位高级程序员给学弟学妹的建议 第 4 / 67 页 bbs.theithome.com 的文章时最大的心愿就是希望作者列出一个书单。 大学英语-不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往 往在猴年马月才会出来,而现在的许多出版社干脆就直接把E 文印刷上去。学习的方法是强迫自己看原版的教 材,开始会看不懂,用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。 计算机体系结构和汇编语言-关于体系结构的书遍地都是,而且也大同小异,倒是汇编有一本非常好的书 《80x86汇编语言程序设计教程》(清华大学出版社,黑色封 面,杨季文著)。你需要着重学习386后保护模式 的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。 计算机操作系统原理-我们的开发总是在特定的操作系统上进行,如果不是,只有一种可能:你在自己实现一 个操作系统。无论如何,操作系统原理是必读的。这就象我们 为一个芯片制作外围设备时,芯片基本的工作时 序是必需了解的。这一类书也很多,我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应 该看看《In side Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内 幕之类吧)。关于学习它的必要性,ZDNET上的另一篇文章已经有过论述。 数据结构和算法-这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱 战立,刘天时)。很多人喜欢买C++版的,但我觉得没有必 要。C++的语法让算法实现过程变得复杂多了,而 且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最 好的 。 软件工程-这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看 《实用软件工程》(黄色,清华)。不要花太多的时间去记条 条框框,看不懂就跳过去。在每次自己完成了一 个软件设计任务(不管是练习还是工作)以后再来回顾回顾,每次都会有收获。 Windows 程序设计-《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前 仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在这本书 中,没有C++,没有GUI,没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以 后,你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC,你最好碰都不要碰。我知 道的许多名校甚至都已经用它作 为教材进行授课。可见其重要。 上面的几门课程我认为是必学的重要课程(如果你想做Windows 程序员)。 对于其它的课程有这样简单的选择方法:如果你是计算机系的,请学好你所有的专业基础课。如果不是,请参 照计算机系的课程表。如果你发现自己看一本书时无法看下去了,请翻到书的最后,看看它的参考文献,找到 它们并学习它们,再回头看这本书。如果一本书的书名中带有“原理”两个字,你一定不要去记忆它其中的细 节,你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。 1.1 一位高级程序员给学弟学妹的建议 第 5 / 67 页 bbs.theithome.com 你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书。 日三省乎己 每天读的书太多,容易让人迷失方向。一定要在每天晚上想想自己学了些什么,还有些什么相关的东西需要掌 握,自己对什么最感兴趣,在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应 用,这样能够让你不是追赶技术潮流而是引领技术潮流。同时,努力使用现在已经掌握的技术和理论去制作具 有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。 把最多的时间花在学习上 这是对初学者最后的忠告。把每个星期玩CS或者CS的时间压缩到最少,不玩它们是最好的。同时,如果你的 ASP技术已经能够来钱,甚至有公司请你兼职的话,这就证明你的天分能够保证你在努力的学习之后取得更好的 收益,你应该去做更复杂的东西。眼光放长远一些,这无论是对谁都是适用的。 相信你已经能够决定是否学习C#或者什么时候去学它了。 1.1 一位高级程序员给学弟学妹的建议 第 6 / 67 页 bbs.theithome.com 1.2 一个老程序员给青鸟学生和即将读青鸟学生的建议和评价 发表时间: 2010-09-21 在这篇帖子开始之前,我先自我介绍一下,这个介绍只是为了让大家了解我说这些话语的公正性, 本人是重本毕业,先后在一个不出名的IT企业(200人规模,单个项目额平均200万左右)工作4年, 华为1年,雅虎1年,先后的职位是c/c++程序员,oracle高级工程师,db2 dba,分析师,现在在一家 上市公司(非沿海城市,500人规模,单个项目额平均400万左右)做数据挖掘项目负责人,公司另外 个c/c++专家头衔。今年29岁,底薪10000,证书有一个计算机资格考试过的系统分析师证书,一个 oracle dba证书,一个db2 dba证书。我想,IT业界还是有不少纯技术专家比我强的,IT业界高 手如云,希望我的前辈看过一笑,我的师弟师妹们有个认识,交个朋友,如果有觉得我有炫耀嫌疑的, 希望能谅解,不介绍自己,就无从谈起这篇帖子的出发点。 由于,我曾经在一家北大青鸟做过1年的兼职,这个帖吧还是我以前兼职的学生告诉我的,我今天看到 这个帖吧里面相当混乱,骂的夸的互相拆台的,我只想把我对青鸟的上下的评价以及对各位学生的建议 清楚地写一下,把这当作是一个老程序员的话吧,毕竟,我不算高手,但是对于各位学生,暂时还算一个 你们的目标吧。 那么首先,我想评价一下青鸟的学生,青鸟的学生能力以及就业机会,可以毫不怀疑的说,青鸟学生的就业 是不难的,因为青鸟学生的动手能力比较强,并且掌握的是目前主流开发工具.net和j2ee技术,所以怀疑 青鸟就业的学生,不要担心,就业是不难的。但是我也不得不说一下你们面对的青鸟广告:月薪4000就业。 这个数字大部分人是怀疑的,但是据我所知,这个数字不是谎话,确实有学生毕业能拿4000。当然这里有 水分:第一,这些人是极少数;第二,4000这个薪水即使拿到了,也要考虑一下水分,比如小软件公司拿 4000,并不是多高收入,为什么呢?试想,小软件公司没有保障,说不定没有三保一金,五保一金,没有 出差补助,没有加班补贴,甚至年终奖都会打折扣,要解雇你也不赔钱,别小看这些待遇,这些待遇实际 上不是2,3千的工资差额能补偿的。所以在这里我得把你们的就业给你们估计一下,实际上呢,你们的平均 工资,在沿海看能否达到3千,这算比较公允的。然后,对于你们就业的公司而言,我也可以给你们估计一下 大概是哪些公司。外企?不可能,人家讲究英语。华为中兴这些大型企业?也不现实,去过华为应聘的人都 知道,就一套数据结构与算法的题目就可以刷掉青鸟95%的学生,中型企业,这个就比较现实,问题是中型 企业也讲究算法与数据结构还有高等数学,为什么呢,这些科目感觉跟软件开发不靠边阿。其实,一旦涉及到 大数据量大计算量的系统,这些科目的知识就至关重要。而只有大型,中型企业有可能接到这些大系统的项 目, 所以他们也需要自己的员工懂得这些方面的知识。那么最后剩下的就是小企业了,小企业重在项目总额, 项目利润不高不要紧,多接几个,每年的项目额就上去了,这些项目通常都是些小项目,人才的关键在于是否 掌握了马上就能动手的.net和j2ee,没时间培训了,所以他们偏爱青鸟学生。 所以可以告诉大家,青鸟的学生绝大部分流向是小型企业,少数去中型企业,一般是这个估算。 那么,将来有没有锻炼呢? 可以很肯定地告诉大家,做小项目没有什么锻炼价值,为什么?因为人人能做,物以稀为贵,人人都能做, 你就不值钱了,很难有薪水的提高,充其量就是.net和j2ee的熟手而已。所以,要进入大企业做大型系统的 锻炼,学习他们思考问题的方法,领悟到软件最重要的到底是.net,j2ee的那些架构,还是需求分析和数据流 1.2 一个老程序员给青鸟学生和即将读青鸟学生的建议和评价 第 7 / 67 页 bbs.theithome.com 设计,数据结构以及算法设计。这才是真正锻炼人的地方。这才是锻炼出高手的地方。 所以,各位青鸟的学生们,要清醒地认识到你们的优点,也要认识到你们的不足,你们1年学习掌握了.net和 j2ee, 那些在大学耗费4年学习数据结构,线性代数,高等数学的计科学生积累的厚重不是你们比拟的,你们小公司 有用武之地,那是因为你们是青鸟针对小企业量身打造的人才,而大学生是做为IT高级人才打造的,现状是 大学生太多以及大学生自己不争气,不学好这些科目,搞得一塌糊涂,但是你们要想发展,必须把大学的数学 相关科目补好,否则,小公司以及2000-3000的薪水,失业,竞争,就会伴随你一辈子。 所以,不要相信你们在青鸟学校里那些老师对你们的j2ee和.net吹捧,你们是靠这个找工作,但是这个东西是 最没有技术含量的,你花1年能学会,别人不能吗?没有几年的数学逻辑积累,你们的现状是很残酷的。 有人说,自学高等数学,数据结构,太夸张了吧?没错,很难,你们选择了青鸟,让你们具备了找工作的能 力, 但是,确实在某种程度上,你们成就高手这一步,将困难万分。 真正值钱的项目,是海量数据,专业性极强的分析系统,真正值钱的技术人才,也要从数据计算处理分析这里 着手。 这里奉劝各位青鸟的老师,不要误导学生j2ee和.net了,这两门一定要学好,但是,不是把学生送出门就可以 了, 他们将来还要存活还要发展,逻辑和算法才是真正的王道。你们可以不懂,但是不能这么教学生阿。 1.2 一个老程序员给青鸟学生和即将读青鸟学生的建议和评价 第 8 / 67 页 bbs.theithome.com 1.3 一个程序员的体会 发表时间: 2010-09-21 昨天,叔叔给我介绍了一份工作,搞推销,完成任务给1000元,完不成任务给500元。我又一次拒绝了,爸爸 问我为什么不干,我说不想从事这个行业。这次爸爸终于发怒了,真说我“不要脸”,还说了好多难听的话。 我知道,矛盾终于爆发了...... 这是理想和现实的一次碰撞!我不怨爸爸,只怪我自己不争气,这是我第n次拒绝工作了,这之前有亲戚、朋 友、同学给我介绍工作,都被我婉言谢绝了,不是我不想工作,而是我想从事自己喜欢的行业--it业,我想成为 一名真正的程序员!我不敢想像做一份你不喜欢的工作,会有多少的工作热情,会给公司带来多大的经济效 益?整日从事这样一份工作,是一种怎样的折磨?只会带来思想上的麻木,意志上的消磨,时间长了,你会越 来越离不开目前的工作,虽然你不喜欢,但是已经习惯了。我不想这样! 但是现实是残酷的!我必须工作挣钱养家,首先要养活自己,我不能再靠父母养活,他们养活我20多年已经 不容易了,该是我回报他们的时候了!可是理想和现实总是存在差距,下面说说我的经历: 我是一所三流高校一名本科生,学的是经济学专业,今年刚刚毕业。虽然我的毕业论文和答辩都是优,但是我 却对我的专业好无兴趣,整个大学四年,我面对的只是高深的经济学理论和与现实社会严重脱节的教材。我们 的专业是大而全的专业,相关专业都有所涉猎,但是都不精通。学院说开始要把我们往经济学理论研究方向培 养,可又是谈何容易?师资力量太薄弱,最后行不通,后来又要往经济管理方向发展,可是管理要是没有与实践 相结合,还不是空中楼阁。我们学院与企业之间基本没有交流,实习机会更是没有,都是自己在外面找,可是 真正能找到称心如意的是少之又少,大部分都在外面搞推销。毕业了,与学市场营销的同学相比,我们没有竞 争力;与会计学专业的同学相比,我们也没有竞争力;而与学国际贸易的同学相比,我们更没有竞争力!连我 们老师都说:“你们是什么的会,又什么都不会。”一语道破我们专业目前面临的窘境。老师又号召我们考 研,可是考研又谈何容易?又 是万人挤独木桥啊! 大学我们计算机课只学了两本书,一本是《计算机应用基础》,一本是《foxpro for windows》,两本都是我 们学校自己老师出的,都是为了赚钱,书是盗版,内容更是拼凑,质量可以想像。所以当时我对计算机并没有 多少兴趣,对编程更是一窍不通!只是上大学前专门学了指法,大一时想学打字,当时市面流行五笔输入法 (现在也是),而我并没有跟风学五笔,而是自学了两笔输入法,现在看来是正确的,两笔输入采用音形结合 的方法,摒弃了五笔不符合汉字书写规则和拼音重码太高的缺陷,而且有非常易学,极力向大家推荐。掌握了 方法以后,我就天天在机房练习打字,后来我打字就非常快了,一分钟可以打100多个字,同学们都很羡慕我, 在我们系也小有名气。一个打字不是很快的人都让同学羡慕甚至崇拜,可以想像我们班的同学计算机水平多么 低了. 我当时也很满足,认为打字快计算机水平就算高了,而不知道打字是最基本的操作,在整个计算机体系中 好像是大海里的一滴水。正因为这种认识,使我忽视了计算机其他知识的学习,当时只知道foxpro与数据库有 联系,其他的就什么也不知道了。 真正让我接触到编程是在大三下学期,因为知道我们专业就业形势不容乐观,有种紧迫感了,所以我每个礼 拜都会买《就业时报》,在某一期报纸上无意中看到****软件工程师的招生广告(后来知道每期都有),广告作 得很好,我当时就觉得就业压力这么大,能多学一门技能,就多了一分竞争力。于是我就给他们打了电话,问 他们学这个要多少钱,接线的小姐很会说话,没有明说,而是直接告诉我后天上午来听他们免费的宣讲会。当 1.3 一个程序员的体会 第 9 / 67 页 bbs.theithome.com 时我就觉得价格不菲,因为用“**”牌子是要增加成本的。我还是去听了他们 的宣讲会,说心理话,****好,不如****广告做的好,****广告做得好不如****宣讲会做得好。会到结束才说了 具体的学费,要比我预想的贵很多,一共分二个学年,三个阶段学习,第一学年课分两个阶段学习,第二学年 一个阶段。全部下来价格吓人!(价格我就不说了,不少人知道)当时我是这么想的,与其说毕业以后就失 业,还不如学一门技能,以后也好找工作,于是我就报名了。在那个时候,我对编程是一无所知,更谈不上兴 趣,只是为了以后能比较顺利的就业罢了。 由于没有基础(只会打字),我决定从头学起,参加一学期的班,给我们培训的是一位我看不出年龄的女老 师,后来知道是从**毕业的。我们一学期的课主要有《windows 2000操作系统》,《c语言基础》,vb基 础》,《access》,《html和网页设计基础》。我当时什么也不懂就跟着学,先是win2000,比较简单(教材简 单),后来是C语言,只讲了一个多月就结束了,我上的是周末班,那时我还以为讲得慢呢,哪知道C语言的地 位和重要性,岂是几天就可以学会?接着是VB,说真的,真正让我对编程产生兴趣的是VB,我一接触VB就对 VB6这种所见既所得的编程环境产生了浓厚的兴趣,当时觉得这才是真正的编程,C语言没用。我想大多数人也 是从VB开始学编程的吧。因为我们的教材写得太空洞,所以我就又买了一本VB入门书,我觉得好多知识老师都 不成讲过,有一次我问老师如何用VB实现一个功能时,她竟说无法实现,而没有说她不会实现,后来我翻书找 到了答案,从此我对老师的权威产生了怀疑。那时的我整天学习使用VB,连坐车都在看VB书,用VB做了很多 “芝麻”程序,自己做得最大的一个就是24点,用了极其笨的算法,可算完成了,还有很多BUG。我们一学期 的课程根本就没有讲数据结构和算法这些知识,我们也认为那是计算机专业开的垃圾课程,毫无意义,现在想 起来真是大错特错了!一学期结束时,老师领着我们用VB做了一个信用卡程序,很简单,算是毕业设计。考试 是分笔试和机试,超简单,笔试事先给你材料,回家去背吧,80%是原题,机试考的是C语言,超简单,你要是 还是不会,就把别人的COPY过来就行了,再不会,还有老师帮忙呢。当我手捧着《初级程序员》证书(国家劳 动保障部发的,与国家信息部发的差十万八千里)和《****》证书时,我觉得我就是程序员了(现在想起来,当 时真是幼稚!)这也促使我参加二学期的班,于是我在****“越陷越深了”。 第二学期的课没有换老师,而教材却是从2.0版本换成了3.0版本了, 可能是上个版本太说不过去了吧。3.0版本也没有太多改变。主要课程有:C++,sql server,VBA,java,asp. 哈哈, 真是大而全,有点像我们的专业了。当时却不这样认为。于是跟着学,先学c++,教材只有170多页,而理论部 分只有110页,后面是上机部分,和一本练习册的厚度差不多,由于我们C语言基础打得不好,所以学C++普遍感 到吃力,就这样不到一个月的时间,C++语言就结束了。接着就是sql server, VBA,我记得在讲VBA的时候,我 们就有很多人听不懂了,特别是COM组件,我现在也是知其然,而不知其所以 然。而老师看我们不懂,也没有耐心了,慢慢地我发现老师的讲课态度发生了变化,只是讲她的课,而不注重 和我们的沟通,我们上机时,她也是不闻不问,而是躲在一旁啃JAVA。后来才知道她辞职不干转行了。接着开 始学JAVA,给我们带课的是一位男老师,课讲得还行,就是张扬的很,让人觉得不舒服。我觉得当时上这门课 的时候,来了很多别的班的同学一起听,把本来就不宽敞的教授都坐满了,不知道是觉得JAVA重要还是因为已经 学得吃力了,我想是后者吧。 考试仍然很容易过,可是当二学期结束时,我发现我没有学到什么实际的东西,我甚至不会用一门语言写一个 大一点的程序,学的语言实在是太多了而自己的编程思想还没有建立。在是否继续学习二学年这个问题上,我 犹豫了很久,是坚持还是放弃?我想对每个深陷其中的人来说,都是很难抉择的,最后我还是选择了坚持,很 多人选择了放弃,我记得刚开始和我一起学第一学期的人现在没剩下几个了,大部分人都选择做了其他行业, 和编程彻底绝缘了。我真的不想就这么放弃,毕竟我付出了很多精力和金钱 1.3 一个程序员的体会 第 10 / 67 页 bbs.theithome.com ,而且我非常热爱这个行业,真的想用毕生的精力从事这个行业的工作,程序设计对我来说一直很神秘,像一 座待开发的宝矿,我一直想征服它! 当我怀揣着第二学年的学费前往****的路上,我的心情异常复杂,这可是我父母的血汗钱呀,我现在没有挣钱 回报我的父母,而是管父母要钱,这个滋味是没有经历过的人很难体会的。还有一个问题就是钱是不是白花? 我能不能实现自己的理想?为了自己的理想“不择手段”叫不叫自私?第二学年的班已经开了,我也已经毕业 了,我们系的就业率和前几届的一样,没有什么改观,而且有持续走低的趋势,我的好多同学都没有找到正式 工作,一部分人在作推销,辛苦不说而且工资少得可冷,也许能锻炼人吧,很多人干两天就不干了。还有一部 分人在家观望,还有几个有考研的打算。目前的状况使我的要求也在降低,我学编程不求能挣多少钱(以前有 这种想法),现在只是想能够自食其力,作自己喜欢做的工作,也就心满意足了. 可是我现在学得却越来觉得吃 力了,二学年课程有oracle,j2ee,.net,c#,asp.net等,目前在讲j2ee, 讲得很快,预计05年底就能结业,我不知 道到时候能不能找到一份工作,可是依我目前的知识结构,很难有竞争力。究竟是哪儿出了问题呢? 论智力,我觉得我不比别人差,我五岁学下棋,六岁没上小学就参加了区里的小学生组比赛并且拿到了名次, 接着我就开始了拜师学艺,初中蝉联了三届本市中学生比赛的冠军,一次省里的冠军,95年参加全国“**杯” 少年组的比赛并一举夺魁!大小比赛参加10多次,冠军如探囊取物。说真的,当时差一点就走这条路,因为当 时我和省里的一些大师都下过,觉得并不是不可战胜.但是后来由于中国象棋缺乏国际竞争力等诸多原因,发展 状况远没有围棋、国际象棋发展好,即使是一些象棋大师每日还要算计着过 日子,这不能不说是整个象棋界的悲哀!关于中国象棋的发展和象棋理论的专业探讨,我有一肚子话要说,但 是在这里不过多阐述,因为这里毕竟不是谈论象棋的地方,还有人不会下棋呢。不过后面我要对象棋和编程做 一番比较,谈我一点的肤浅看法,如果你有兴趣,请耐心往下看。当我决定把精力放在学业上时,已经是高三 了,面临高考,由于之前下棋付出太多时间和精力,落下了很多对基础课程的学习,所以我必须迎头赶上,凭 着一股儿冲劲,我来到了**,虽然不是名校,却是正规本科院校,一直到现 在。所以说论智力,我不比别人差,可为什么我学得会越来越吃力呢? 我开始反复思考这个问题,去这个网站的论坛上看一些高手总结的一些经验教训的贴子,去csdn看高手是怎么 从初学者变成人人尊敬的高手的。我看了大量这样的贴子,然后结合自己实际情况进行总结,才发现了问题所 在!基础太薄弱!!!正是这个原因使我现在学习非常吃力。看看我这一年学的都是一些流行的开发工具,比 如vc,vb,dreamweaver,jbuilder,oracle等等,而我却真正的忽视了对数据结构和算法、windows程序设计、汇 编、编译原理、操作系统等等这些基础课程的学习,一上来就学c++,java,vba,面向过程编程基础不牢固,直接 学面向对象,试想一个在大学上只学了两本书的人直接学这些流行的开发工具,结果会怎么样?而且是每门课 学的时间都不长,这个月dreamweaver,下个月就jbuilder,再下个月就oracle了,试想要精通asp,java,数据库原 理需要多长时间?我们是刚刚学点皮毛就学这些东西,岂不是在沙地上盖高楼,早晚有一天会挎掉的,而且盖 得越高,损失也越惨重!而我当初并没有意识到对基础理论学习的重要性,现在真是后悔。 对此****应该负有主要责任,他们的宣传广告上面招生的对象是只具有高中以上学历,而其他的一些培训机构 比如东软,清华都要求计算机本科专业或相关专业,说明这些机构已经懂得基础的重要性。而且****在授课时老 师也并没有引导学生重视基础理论的学习,盲目追赶最先进的东西。应该承认****的课程体系囊括了世界最流行 的开发工具,可以说是面面俱到,但是在学习这些东西之前,必须有很扎实的基础,如果没有,即使学会了, 也是知其然而不知其所有然,在此引用不知哪位网友的一句话:“与其说把流行的东西握在手中,还不如把过 时的技术记在心里,"可见基础的重要性。有很多零基础的人慕名来到****,希望摆脱自己的命运,可是学了一 学期以后就再也学不下去了,原因何在,基础不行,不过也有一些对计算机极有天赋者,这应另当别论。 1.3 一个程序员的体会 第 11 / 67 页 bbs.theithome.com 有时候我就想如果当初我在学习****的时候,如果能在家里恶补理论知识会不会更好呢?可是当初我很难意识 到这一点,而且那时学校的课很重,一本《西方经济学》就有点压得我喘不过气来,除了上课,我已经没有时 间在学别的东西了。况且当时我们培训的同学普遍流行着一种说法,说“我们毕业了将比计算机专业的更有竞 争力!”当初我也报有这种想法,现在看起来真是笑话,先看看学习时间,他们学四年,我们不到两年(快的 一年半),再看看计算机专业的课程体系,你就知道了,其中大部分是对基础理论的学习,学习时间宽松,如 果能抓紧时间学习,将能打下一个良好的基础,为以后学习流行开发工具铺平了道路。诚然,现在一些高校的 计算机专业的教材有些比较沉旧,可是一些原理上的东西并不是一两年就发展起来的,是大师们经过多年的研 究总结出来的,深度掌握,必然对以后学习大有裨益!还有一种说法是“我们毕业了能直接上手为企业打来效 益,而那些计算机专业毕业的学生根本不会做什么,所以我们更有竞争力!”初听起来,似乎很有道理,可是 如果那些计算机毕业的学生参加企业培训呢?新出来一种工具,同时学习,谁理解得更透彻,谁学习得更快 呢? 其实学习象棋和学习编程是一个道理。 先说象棋,会下棋的人都知道,下棋分开、中、残局三个阶段,要想学棋并想成为一名高手的话,必须先出 残局开始学起,然后是中局,最后是开局。从开局学起的人很难有大的发展。这是我的切身体会,我记得我小 时候学棋的时候,几乎没看过书,都是实战实战再实战,从实战中汲取营养,总结经验教训,等我到达一定阶 段时,我爸爸就每天给我摆棋式,先练杀法,每天几个,当时有一本很经典的书《象棋杀着大全》,有400多页 吧,我爸就天天给我摆,让我破解,不看到结果不许动手,最后都把这本书都翻烂了(当然不是我弄的),现在 真的应该感谢老爸,我虽然现在在象棋方面没有什么成就(我爸一直希望我成为一名象棋大师),但也算是一 盘好棋吧。然后开始摆残局,接着是中局。对象棋有研究的人会发现,中残局功夫是最难练的,也是最能看出 一个人象棋水平的高低。正是我爸一盘一盘的摆,才练就了我扎实的中残局功底,可以说我的基本功都是我爸 一盘一盘摆出来的(再次感谢老爸!),等我到了一定水平后,才自己开始打谱学习开局,看别人的对局选, 我发现我对开局的理解比那些上来就学习开局的人更透彻,记得也更牢,而且还能指出其中的错误并且提出自 己的观点,有时我看完一本开局书,书上会记很多我自己的体会,试想如果没有良好的基本功的话,是不可能 做到这些的。 再说编程,如果把学编程也分成三个阶段的话,那么残局就是基础,包括操作系统、汇编基础、离散数学、编 译原理、计算机图形学等等,而中局就是c语言(不是特定的)、数据结构和算法等等、而开局就是目前的各种 的流行开发工具吧,包括vc,vb,delphi,jbuilder,dreamweaver等等,以上三个阶段分的不一定正确,不过大概 是这个意思吧。如果"中残局"没有打好,只学"开局"是永远也成为不了高手的,而且"开局"总是随着时代发展而 改变,不断有新的开发工具出现,落后的"开局"将永远被淘汰,而相对来说"中残局"是不会有太大变化的。 而"中残局"和"中残局功夫"两者又不太一样",我个人认为"中残局功夫"指的是编程思想,一个好的编程思想不 是一朝一夕可以练成了。如果掌握了打下了扎实的"中残局"基础,练就了一身过硬的"中残局功夫",那么在学开 局就相当容易了,网上经常有这样的评论,比如:"如果学c一年,那么学vb之需一个月,如果学vb一年,再学c 时间可能超过一个月","学C++三年,再学JAVA只需一个月"等等是同一个道理。 痛定思痛以后,我觉得我要想在编程方面往更高更深的地方发展,必须打好基础,苦练内功,为此我打算从C 语言开始学起,然后是数据结构和算法-汇编-操作系统原理-windows程序设计-C++程序设计,之后要看很多国 外经典书,《C++ primer》,《C++编程思想》等等,然后再选一个合适的开发工具,虽然会很慢,但我会踏 踏实实的学习,再也不盲目跟风了。 现在我C语言只学了两天,课我还得继续上,毕竟钱已经交了,我想等我 基础打牢了,以前有些课还得重听,有基础了可能会悟出一些新的东西。****这点好,课可以循环听。 1.3 一个程序员的体会 第 12 / 67 页 bbs.theithome.com 回想我一年的学习,现在看来才刚刚起步,不免有些惭愧。正是走了这些弯路,才使我认识到基础的重要性。 虽然以后还要有很长的路要走,但是我无缘无悔,因为我热爱这个行业。我相信我重新选择学习的方向是正确 的, 我打算用十年的时间来掌握这门技术,我今年23岁,到我33岁时,我想我还会写一篇文章来回忆我十年的经 历,并总结出的经验和教训,供后来者借 鉴。 顺便说一下我的女朋友,她和我是一个学校毕业的,学外语的,英语八级,现在毕业工作了,一个月3000 元。她现在对我很失望,说不再向以前一样喜欢我,欣赏我了,这给我很大打击!但是作为男人,我理解她, 现在我的压力很大,我想我会顶住压力,坚持走自己的路的,希望大家能够支持我! 最后我想对初学者说的是,不要盲目跟风,要重视基础的学习,否则只会竹篮打水一场空。 如果您能耐心的把以上看完,我就很感谢了;如果您还能提出宝贵的意见和建议,我将感恩不尽! 1.3 一个程序员的体会 第 13 / 67 页 bbs.theithome.com 1.4 一个程序员的经历 发表时间: 2010-09-21 一.并不成功的开始 我所读的学校是中国西部的一所普通高校。我进大学后也和大多数同学一样,过着60分万岁的日子,除了对编 程比较感兴趣外。(呵呵,好多室友都说我外表女人,内心却男人:喜欢写程序,喜欢和男生打星际,喜欢打 CS选土匪,拿AK47)四年的大学生活淘进了我刚进校时的傲气与自尊,在栀子花开的季节,我面对的却是无法 把握的未来。毕业了,是的,四年象梦一样。男友执意去了中国最繁荣的大都市,我却希望留守相对平静的近 在咫尺的西部城市,结局是可想而知的。痛苦十分短暂,因为迫在眉睫的生存问题变得急为严峻。幸运的是, 2004年7月我很顺利的找到了一份程序员的工作。 我的第一份工作比较轻松,就是做MIS系统,写写C#代码。工作很轻松,带我的经理也很照顾我。于是我每天 过着上班下班的生活,每天穿梭在熙熙攘攘的人潮当中,全然没了生活的压力。这样的生活也让人讨厌,日子 太无聊了,无非就是写着重复的代码,再就是在天涯上闲逛。这样的日子结束于我看到的一篇文章,题目我记 不太清楚了,好像是:成为IT精英,我奋斗了7年。 当时很受鼓舞,也很自责。大学的四年已经荒废,难道还要重蹈覆辙? 于是我有了想离开这个安逸的城市,去 节奏相对较快的城市锻炼一下自己。 于是在今年年初,我毅然背起行囊,踏上了南下的火车。。。。 二。初来乍到 一下火车,我来到人山人海的车站广场,看着人山人海,心里没有底气,毕竟是第一次出远门。但是只觉告诉 我,先要找个落脚的地方。虽然我带了5000块,但是我却不敢乱花一分钱,因为在我印象中这座城市消费比原 来的城市高多了。我得想办法尽快找到工作。 经过2个多小时的寻找,终于让我找到了一个网吧。于是不顾旅途劳累,趴在电脑前就上51JOB ,简单回顾了自 己的工作经历,然后填写了简历,在网上投。时间过得很快,一下子到了中午。我出了网吧,胡乱吃了碗酸辣 粉。然后去找旅馆,这里的旅馆真的很多,各种档次都有,我找了一个看上去觉得比较安全的旅馆。130一晚 上,好心疼!!!尽管很累但是,大半个晚上我都没有睡着,双手紧紧的抓住手提袋。到了下半夜,我才慢慢 的睡着。 早上起来的时候已经是9点多了,我洗漱完毕。双眼盯着手机屏幕,生怕会错过面试电话。也许我运气真的不 错,大约10点,手机响了。我赶紧接了,一时高兴得语无伦次。电话里一个女声:您好,请问您是XX么?我们 是yy科技有限公司,想约您下午面试...... 挂了电话,我高兴得不知东南西北了,没想到这么快就有回应了。下午出门的时候我化了点淡妆,出门了。我 按着yy公司的提示,费了将近2个小时才找到地方,真后悔没有买张地图。到yy公司的时候已经是下午4点了。 面试我的是位女经理。30分钟过后,我们谈得比较好。我自信满满的,呵呵。 最后经理问我期望的薪水时,我咬咬了牙,很小声的说了句3500 .经理说,其实你比较符合我们的要求,但是薪 水可能不会那么高。我小声问她能给我多少,她说句2000。但是我心都冷了,我来这个城市之前的工资也有 1500啊。。我说了句考虑考虑后,出了yy公司的大门。在传说中,这个城市不是每个人都拿高工资的么?怎么 会这样?失望和痛苦同时袭来。 回到旅馆我仔细总结了一整天,得出结论:1.不是没有高工资,而是所掌握的技能门槛比较低,导致没有什么竞 1.4 一个程序员的经历 第 14 / 67 页 bbs.theithome.com 争力。2.一个规律:IT技能(不精通的情况下),技术门槛低的入门较容易的,在市场上竞争力不大(精通后, 每项IT技能的竞争力相差不大。)。   3.所以我决定,去学习新的东西,门槛稍稍高那么一点的东西。 注意拿定,我回顾了自己所学的东西,觉得C/C++基础还可以,而且上学的时候写过一段时间的VC,于是决定 啃C/C++。我开始在网上投C/C++相关的职位,把薪水要求降到2500~3000。上天又一次眷顾了我,四天后 我找到了一份工作,工资2500,包住宿。唉,总算是定下来了,接着我便写了个学习C++的详细计划,花了 1500元买了个二手电脑。工作后,我觉得极其的不适应,这个时候才知道,我对C++的理解是何其肤浅!基础 太差了。。。自尊心一向很强的我,受了很大的刺激。我觉得,是时候努力了! 在工作的时候我积极的请教同事,下班后我在宿舍里疯狂的肯C++,在网上下载了教材。一行一行认真的读,上 机练习,从基础开始。一步一步的来。在刚开始的一个月里,几乎每天都是凌晨才休息。但是我觉得很欣慰, 因为我逐渐适应工作了,而且觉得越来越理解C++的内涵。连续这样3个月后,我终于对工作得心应手了,VC 的底子也逐渐厚实。回想原来的夜郎自大,真的很好笑。现在我对C++无疑是敬畏的。 原来以为自己有多厉害,其实自己差得要命。不懂虚函数有什么用,不知道除了构造函数,析构函数外还有拷 贝函数,还有深浅拷贝之分。不懂什么是多态,不懂什么是抽象类,不知道C++里居然还有个STL库。随便拿本 VC的书就写程序,甚至不知道APP WIZARD生成程序的入口。 经过了三个月的苦心孤诣终于有点眉目了。我没有直接用VC,而是从SDK入手,用SDK写了将近一个月的程 序。终于知道了windows里面居然还有消息机制,每个应用程序还有消息队列。编译器分配存储空间的时候居 然还有内存对齐。这些新奇的东西让我兴奋,我每天如饥似渴的读着各类电子书。 《深入浅出MFC》,《高质量C/C++编程》,都是我的宝贝。 是的,正象很多人说的一样,没有几年是无法精 通VC的。但是,我们无需精通每个方面,我们只需足够熟悉我们工作所用到的部分。DLL,数据库,组件技术, 图形技术,进程调度,多线程等等,网络...太多太多了,MFC是如此的庞大。 也许是我心高气傲,当经理跟我说转正给我3000的时候,我拒绝了,我觉得自己可以拿更高的薪水。于是我辞 职了。。 这次的离职,没有给我带来什么忧虑,可能通过前断时间的学习有了些许的底气。可能大家很奇怪,为什么上 文多次提到工资,请原谅我的俗气!当爱情不能依靠时,金钱是能唯一给我安全感的东西。 这一次我打算找名气稍微强一点的企业。正好,TX公司正开招聘会。我一大早赶到招聘会现场,很热闹,已经 有很多人在那里面试了。等了大约半个小时,终于轮到我了。面试官没有象我想象的那样提一些基础知识,而 是直接问我对UML怎么理解,对UI设计有什么心得这些抽象的问题。我回答得吞吞吐吐,语无伦次,结果是可 想而知的。55555555,真的好惨,这个全国著名的SP把我就这样简单的拒绝了,好打击人啊。但是这次来并非 没有收获,因为在我走出招聘会场的时候,我留意到unix/linux展台门可罗雀,于是一个计划又在我内心酝酿。 我回家后在网上搜集linux入门资料,然后把电脑硬盘格式化,为了表示学习linux的决心,我给windows 15G,给了linux 25G,就这样开始了我的学习linux之旅! 第二天,我从朋友那里打听到GDNT有个招聘会,于是又风风火火的赶去。GDNT的面试也给了我重重一棒子, 让我好痛苦。在痛苦中过了3天后,一个高中同学说她们单位要招VC方面的人。我当时真的很高兴,也很紧 张,因为这次面对的公司是中国著名电信运营商的研发中心。由于朋友的引见,面试很快确定在2天后。在这两 天里,我把所有关于C/C++的知识点复习了一遍,然后阅读了一些网络方面的资料。果然功夫不负有心人,2个 小时的比试面试过去了,我成了她们的一员。最后PM许诺试用期给我4K。 这里的工作环境很好,工作也比较轻松,也许所有国企都是这样的把。下午2:00上班,中午可以休息两个小 1.4 一个程序员的经历 第 15 / 67 页 bbs.theithome.com 时。单位食堂的伙食丰富而且价格便宜,一般不超过5元,最令人觉得温馨的是饭后偶尔还会发水果。:) 真的是 好幸福,呵呵。在这里主要做的是一些交换网管系统,在这期间我跟PM学了不少东西。熟悉了HW,ZTE的很多 产品,以及COBAR接口规范。私下还对7号信令做了比较详细的阅读,而且对很多网络协议有所了解了,比如 SNMP,RIPv2、OSPF、IGRP,还学会了怎样使用CLEARCASE等工具。但是,最大的收获莫过于对UNIX的学习 了。在这里有很多UNIX机器,HP-UNIX ,IBM-AIX,SUNOS 等等。。。   每天下班后我没有直接回家,而是留在了单位telnet到SUNOS上,开始了我学习unix的计划。几乎天天都 是10:00以后才离开单位,搞不懂的就问人或者在网上找资料。回家以后,我继续在linux上学习一直到转钟。这 期间我真的学了很多,跟windows上写程序完全不同了,似乎更关心细节,更关心操作系统了。经过大约3个月 的摸索,终于对unix有所了解了,觉得好多东西豁然开朗。进程通讯,进程管理,页面置换,信号灯,线程池 这些东西是我在indows下写程序从未接触过的。   觉得学习unix真的很幸福,每天进步一点,会让我睡得踏实。把《unix高级环境编程》学完后,我开始慢 慢的请教前辈,有关嵌入式的开发的问题。   慢慢学着分析内核情景,裁减内核,底层的东西让我觉得好奇。还有一件让人特兴奋的事儿,咱们科室好 多开发人员都是女同志,PM也是女人。 时间飞快,转眼四个月已经过去了。我觉得是时候该离开这个安逸的国企了,说真的,真有些舍不得,我向PM 提出辞职时,经理非常真诚的挽留我,说我工作做得不错,叫我考虑考虑再走。这里的人真的很好,学习的气 氛也很浓,也许我希望日子过得紧张一些。经理说我这样跳来跳去不利于自身的发展。也许她是对的,也许是 我太倔犟,终于还是走了。我知道,当我交出那张卡,就再也不能回来了,走出大门站在华景的天桥上我默默 的站了10分钟,仰望着那熟悉的大厦。 晚上回去改了改简历,然后在网上投。躺在床上,看着天花板,突然之间觉得好孤单,这里一个亲人也没有, 鼻子很酸,好想哭。客厅电视机里传来世界杯预选赛的呐喊(我和一个男生一个女生合租三室一厅)。我走出 客厅和那个男生谈了很多,也知道了他很多事情。现在才知道,虽然是合租,但是彼此沟通真的很少。他原来 是在XTKJ工作,后来跳到外企,也是搞IT的,也是程序员。一个人到南方。   当时聊了很多,不觉到了凌晨。不过我们都没有睡意,于是他问我会星际否,我一拍即合。他很惊讶的看 着我:你真的会。我说试试就知道。于是我们各自回房打开电脑,比赛开始了,呵呵。也许是他太轻敌,第一 场,我选虫族,他选人族,结果被我出快狗偷袭成功,不过后来几场我都输得很惨,呵呵。。 第二天睡到中午才起来,1点多的时候突然来了个电话,通知我去面试,职位是linux程序员。我赶快打扮起 来:)。照镜子才发现,自己瘦了好多,也憔悴了不少。我穿上了自己最漂亮的衣服,然后简单了画了一下 眉,打了粉底和眼影,并且还画龙点睛的摸了腮红。呵呵,自己对着镜子傻笑。 到了面试的公司(一个刚成立不久的外企,VOIP设备商),和PM谈得很顺利。他问的问题也很简单:函数传 值传址的区别,常用的进程通讯方式,和我做过的一些项目等等。。最后PM问我期望的薪水是多少。我怯怯的 说了句:5K 。 经理摸了摸前额想了想对我说:这样把,你好好干,试用期我给你5.5K. 出了公司门,感觉天空一片蔚蓝。 1.4 一个程序员的经历 第 16 / 67 页 bbs.theithome.com 1.5 一个还不太老的程序员的体会 发表时间: 2010-09-21 (一) 文章由来及个人经历 我是一名计算机专业的本科毕业生,毕业已经1年多了。毕业后从事的是软件编程工作,经常有其他专业的朋友 想从事软件编程工作,向我请教如何,因为我自觉涉行不深,不敢信口开河,无奈朋友信任,我不得不郑重考 虑一下这个问题了,来帮助朋友选择和回报朋友的信任。 这也就是此文的由来。 还是先谈谈我个人的经历吧。(是不是有点俗套,但我觉得了解我的经历,有助于理解我话的含义;我一向认 为不了解古龙的生活经历的,不会真正读懂古龙的作品和古龙笔下的英雄的)我本科就读于南方一所著名的高 校(因为自己的不成气,愧谈母校名谓),学的就是计算机专业。上本科时,几乎没有认真的听完一门专业课 程,上课看报纸睡大觉,下课看录像看小说看球赛,临考抱佛脚,每次考试和课程设计都是蒙混过关。(于之 相对是,我选修的工商管理和经济贸易方面的课到是听得不亦乐乎,考的分数颇高,也许这才是我的真正兴趣 所在。) 总而言之,大学是混过来了,对专业的理解和掌握程度,应该没有达到毕业要求的合格水平。(也很后悔,但 是有什么用呢,当时不知道珍惜;如果上天再给我一次机会的话,我一定会抓住,多看点美国大片少看点港 片;现在,重回校园是我的一大理想)但是大学的学习使我有了一个简单的知识框架(总算学费没白交),我 对一个朋友这样形容过我的这个知识框架,“它不是钢筋铸的,是稻草扎的”,哈哈哈,不要笑,真的,我敢 说很多本科毕业的朋友的本专业的知识框架也只不过是“稻草扎的”。直到现在,我一直觉得自己的基础知识 还是很薄弱,一直想抓点时间,把基础书本好好的温习一下。(此项任务正在计划和实施中) 毕业后,分配到某研究所工作。当领导让我选择自己以后的工作方向时,我毫不犹豫的选择了软件(也不知道 到底是对还是错,但我决不后悔)。此研究所主要是以硬件为核心搞通信控制设备的研发生产;软件是辅助, 所以也不受什么重视,很多搞软件的人都跳槽走了,留下来的大都是一些已经废掉和行将废掉的“伪/萎”程序 员(名副其实的“软件人员”)。在这里感觉不到什么高紧张和高技术程度的研究和开发;软件开发的技术含 量极低,以致于大部分人只有半年的学习和开发经验,以后都是这些知识和经验的重复利用。(我问过其他到 研究所工作的同学,他们说都一样,呜呼,我们的国防科研开发呀)对于软件的开发,领导的意志和老掉牙的 经验在新课题的技术采用和开发中起了决定性作用,没有明确的需求,没有明确的开发计划和进度,大家在一 天一天一周一周的浪费着宝贵的时间,最后开发出来的东西修来改去,直至它变成垃圾。 我越来越认识到一 点,要么象那些废人一样废掉,要么自己去努力寻求出路,反正别指望从工作中得到什么高明的经验了(教训 倒也许有)。期间发生了一些感情上的纠纷,严重的影响了学习计划和效果,直到现在浮躁的心仍然有些浮 躁。 1.5 一个还不太老的程序员的体会 第 17 / 67 页 bbs.theithome.com 期间,我读了一些书,看了一些文章,编过一些小例程,搞了一些没有什么技术含量的开发工作,也和一些前 辈和高手们谈过聊过。 我一直在思考几个问题;如何学习软件开发?如何搞软件开发,国外的软件开发到底其 秘诀在何处?为何我们的软件业一直在低水平徘徊?我们难道真的离了Microsoft就活不了?我们的程序员到底 在浪费时间干些什么?软件开发到底是如何分类的?我们如何走自己的民族软件之路? 我想了很久,一些想通了,一些还在想。但我知道有一点是肯定的,那就是我们一定要靠我们自己走出自己的 软件之路!跟在别人屁股后面永远受制于人! 好了,关于经历和牢骚就先写这些吧,该进入我们的正题了。 (二) 你适合当程序员吗,你知道编程序是怎么回事吗? 1、 程序员意味着要编程序。(如果你仅仅想得到一份高薪水的工作,喝喝咖啡就等老板发薪水,我奉劝你还是 另找一份更合适的工作,譬如练摊,真的,兄弟,这份工作不适合你) 2、你是学文的还是学理的,编程序也许需要浪漫,但更需要逻辑和严谨。(说坦白点就是,在你没有找到乐趣 以前,它很枯燥) 3、你有对新技术追求的热情吗?你有刨根问底的探索精神吗?(热情绝对是最重要的!你仔细思考一下自己的 性格适合当程序员吗?) 4、当程序员决不是什么好差事,时刻需要学习,需要思考。(直到你成为那个可以引导别人去学习和思考的 人,你才可以偷偷的嘿嘿笑,又一群傻蛋) 5、程序员的未来很迷茫。(但我认为关键看你自己!我希望你是一个有追求的人,不仅仅是混碗饭吃。因为真 正的乐趣在于创造;如果你能改变软件业的历史,那才是英雄;不想成为Bill Gates,不想成为Dennis Ritchie 和 Bjarne Stroustrup,我会说你没有追求。有个关于程序员未来的笑话,也许你还没听过,你该听一听,摘抄 如下: 一个程序员对自己的未来很迷茫,于是去问上帝。 “万能的上帝呀,请你告诉我,我的未来会怎样?” 上帝说“我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的” 于是他去问Lippman。 Lippman说“程序员的未来就是驾驭程序员” 这个程序员对这个未来不满意,于是他又去问上帝。 “万能的上帝呀,请你告诉我,我的未来会怎样?” 1.5 一个还不太老的程序员的体会 第 18 / 67 页 bbs.theithome.com 上帝说“我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的” 于是他去问Gates。 Gates说“程序员的未来就是榨取程序员” 这个程序员对这个未来不满意,于是他又去问上帝。 “万能的上帝呀,请你告诉我,我的未来会怎样?” 上帝说“我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的” 于是他去问侯捷。 侯捷说“程序员的未来就是诱惑程序员” 这个程序员对这个未来不满意,于是他又去问上帝。 “万能的上帝呀,请你告诉我,我的未来会怎样?” 上帝摇摇头“唉,我的孩子,你还是别当程序员了”) 6、当程序员还是很有乐趣的。(当你学到新知识时,当你有新的思想见解时,当你有新的产品问世时,和知己 探讨你的成果时…我问你,觉得这些是乐趣吗?) 7、当程序员不易也不难。(世间事有难易乎?为之…;不为…。你有决心和信心吗?) 8、你真的要当程序员?是你自己的想法? 9、你舍得花钱买书吗?(读好书绝对是学习编程的最佳捷径。你一定会说,现在电脑书籍真T.M.D贵,没法 子,谁让知识和技术在人家的脑袋,在人家的书里呢;等你写书时可以把价格定低一点,记着还有好多没钱但 想买书的兄弟很困难呀。要舍得买书,买好书,不好的的书不如不读,其害大于其益,关于买什么书,你可以 问高手或看候捷的书评;准备一个小本子记录你想买的书的名字,逛书店时看看,如果好就买下,记住要读, 别光买不看。) 10、我告诉你,程序就是:任何有目的的、预想好的动作序列,它是一种软件。 11、编程序就是编写程序。 12、你想好了吗?(如果你想好了还是决定要当程序员,可以继续往下读;否则,你可以继续寻找别的出路 了。) (三) 一个程序员应该具备的基础知识和概念 1、计算机是有什么组成的,CPU是什么东西,其工作原理是什么。(对于这些以及下面将要提到的概念我不会 告诉你什么答案,你可以看相应的教材,关于教材我会在下一部分详述,记住理解最重要!) 2、机器语言和微指令集的概念。 3、程序的概念。 1.5 一个还不太老的程序员的体会 第 19 / 67 页 bbs.theithome.com 4、汇编语言是低级语言但不是机器语言。 5、高级语言主要有那些?(C,C++,Basic,Pascal,Fortran,C#,Java等等;如果你是中国软件业的英 雄,你也写一门语言,最好不用英语) 6、编译程序和解释程序的概念和其原理。(编译器是高手和专家编写 的) 7、HTML、XML等是标识性语言。 8、Prolog是人工智能语言。 9、操作系统OS的概念和原理。(Windows98,Windows2000,Windows NT,UNIX,Linux,等等都是 OS,还有一些实时OS,嵌入OS,编这些的绝对是高手) 10、Windows编程说白了就是Windows API的调用。(中国的程序员很多只是会编windows程序,用的是 VB,我的建议是这些程序员顶多只是低级编码员,我称其是coder) 11、VC++、VB、BC、BCB、Delphi、VF等都只是编程的工具和环境,不是编程语言。 12、面向结构的设计概念。 13、面向对象的概念。(好好理解,兄弟,这个东西还是很重要的) 14、软件工程的概念和原理。(如果你想当老总就需要好好研究了,系统分析员比编码员要高一个等级,薪水 也高哟) 15、数据库的概念。(要熟悉一些著名的数据库系统和语言的名字,如Orcle,SQL,DB2,DyBase等) 16、了解网络概念。 17、了解多媒体概念。 18、熟悉和掌握数据结构和基本算法。 19、是不是要求太高了,别着急慢慢来,进步在不知不觉之中。(一旦开始学习,一个月以后你就会有一个基 本的概念;两个月以后你就会感觉自己有了全面的基础知识;当你知道编程序是怎么回事时,说明你已经入门 了。也有很多人编了很多年程序还没有入门呢,你不会希望自己步其后尘吧。要有信心和耐心。沉不住气怎么 能成大事?!) 1.5 一个还不太老的程序员的体会 第 20 / 67 页 bbs.theithome.com (四) 教材推荐 ――-推荐的教材主要还是针对概念来的,最好选用名校的教学用书。 1、《计算机组成原理》(熟悉) 2、《数据结构》(掌握) 3、《操作系统》(了解->熟悉) 4、《The C language》(掌握) 5、《编译原理》(了解原理) 6、《汇编语言》(了解) 7、《计算机网络》(了解) 8、《软件工程》(了解) 9、《关系数据库》(熟悉) 10、《The C++Languege 》(掌握) 11、《面向对象设计》(掌握;结合C++学习) (五)一些经验和体会 1、真正的程序员用C++;(一位专家说的) 2、动手去编程序; 3、动脑去思考; 4、要有良好的编程风格; 1.5 一个还不太老的程序员的体会 第 21 / 67 页 bbs.theithome.com 5、读书,读好书,尽量读原版书!(我反复强调这一点,读书要有选择,坚持读好书,名家出的经典书,不要 浪费实践在一些粗制滥造的书上面;坚持博览群书) 6、有自己的学习计划; 7、总结自己的经验教训;(准备一个笔记本,记录错误和心得) 8、不要怕学新东西; 9、要有软件工程的思想; 10、善于发现问题,然后去寻找答案; 11、向高手请教;(要虚心直到你成为高手) 12、和同行交流;(不善于交流肯定不行) 13、懂得软件的实质,不要被千变万化的表象所迷惑; 14、真正要学习用的是编程语言和方法,不是什么库,什么类,什么工具;(学用那些什么库都比较简单,但 光会这些库,我觉得还远远不够) 15、学习wiodows编程主要是学习windows OS和win32 API; 16、有空了解一下嵌入式开发; 17、有空了解一下PDA软件开发; 18、了解一下.NET框架和C#语言,也许它是你新的衣食父母; 19、要有耐心,不要作浮躁的人; 20、对程序加注释,并保留你的老程序; 21、学到的东西越多,了解的越多,你就越接近专家; 22、有空去逛逛CSDN,那里有你很多知己; 23、要有信心成为一个优秀的程序; 1.5 一个还不太老的程序员的体会 第 22 / 67 页 bbs.theithome.com (六)一些好书的推荐 1、《The C Programming language》 (Keinighan & Dennis Ritchie 1988) 2、《The C++ Programming Languague》(Bjarne Stroustrup 1997) 3、《Inside The C++ Object Model》 (lippmans) 4、《Effective C++》 (同上) 5、《More Effective C++》 (同上) 6、《Exceptional c++》 7、《C++面向对象高效编程》 8、《设计模式》 9、《Thinking In C++》 10、《The Standard C++ Bible》(一般推荐) 11、《The Art of Computer Programming 》 12、《Programming Windows》 (Charles Petzold) 13、《VC++5.0技术内幕》 14、《MFC 深入浅出》 15、《软件需求》 16、《Advanced Windows》 17、《C++ primer》 18、《win32程序员参考手册》 1.5 一个还不太老的程序员的体会 第 23 / 67 页 bbs.theithome.com 19、《用TCP/IP进行网际互连》 20、《COM 本质论》 (七)学习计划 ――-这个学习计划是我个人定的,也共享给大家参考一下,共同进步吧。 1、《计算机组成原理》 2、《操作系统》 3、《数据结构》 4、《汇编语言》 5、《 C 》 6、《 C++ 》 7、《VC 技术内幕》 8、《Programming Windows》 9、《深入浅出MFC》 10、《Advanced Windows》 11、《Inside The C++ Object Model》 12、《Thinking in C++》 13、《Effective C++》 14、数据库 15、网络 16、嵌入式OS和编程 1.5 一个还不太老的程序员的体会 第 24 / 67 页 bbs.theithome.com 17、硬件单片机 18、.NET和C# 19、软件工程 20、UNIX和Linux (八)后记 一年来浪费了大量的时间去摸索,去思考,走了很多的弯路,直到现在我还觉得自己是个编程的门外汉。我把 我的一些体会和想法说出来(当然,很多都不一定正确,欢迎大家指正和讨论),也许对一些想加入程序员行 列的朋友有一些建议和帮助。希望能帮助这些朋友顺利走上编程之路,成为高手。 如果真能如此,我也就很高兴了。欢迎有兴趣的朋友给我发E_mail(sjpsky@163.net);我这个人有两大业余 爱好,其一就是读武侠小说,其二就是结交英雄侠士。 后记:此文我用analyster的名字登录,发表在“csdn-程序人生”上了,有很多网友看了,回了,还收到几个 网友发来邮件,和我探讨,我很感谢大家对我的信任和鼓励。 我要说明的就是我的这篇小文,主要是想给“一些想成为程序员”的朋友一些建议,帮他们寻找一条自我培训 的捷径,(其实世界上没有什么捷径的,我觉得一切都在于悟性,师傅领进门,修行在个人,譬如我就修行不 够)少象我一样作大量的无用功。还有,主要就是一个程序员应该具备的基本功(个人看法),有人称其为“内 功”,我觉得很对。没有扎实的基本功,我们如何能够做到游刃有余的编写高质量高性能的优秀程序呢? 1.5 一个还不太老的程序员的体会 第 25 / 67 页 bbs.theithome.com 1.6 一个程序员给初学编程人的建议!绝对的好!! 发表时间: 2010-09-21 想学习程序设计而又很迷惘的朋友,希望可以带来一点帮助。 我第一次接触电脑是在小学二年级的时候。那时纯粹是因为喜欢打电子游戏,听别人说电脑上的游戏十分好 玩,于是就漫漫开始与之接触了。在三年级时父母出于我对计算机浓厚的兴趣送我去了一个BASIC编程学习班, 从那时起我才真正开始走上编程这条不归之路。虽然说现在程序设计这门专业在社会上很热,竞争十分激烈, 但是这只是学习编程的人比较多而已。真正能够掌握以至于精通的人实际上很少,毕竟中国的软件业才刚刚起 步不久。现在社会对优秀的程序设计人员的需求量还是相当大的,但是前提是必须要优秀。我自己虽然也谈不 上优秀,但多少还是有些感触。在这里想讲述自己对于一般程序员和优秀程序员之间在技术上的一些认识(什 么敬业精神生活态度我就不多说了): 首先作为一个优秀的程序员,数学是十分重要的。数学是自然科学的基础,计算机科学实际上是数学的一个分 支。数学主要能让人懂得一种分析问题的方法,然后再通过编程去实现它。计算机内部的许多原理也都牵涉到 比较复杂的数学知识。它是我们用来解决现实问题的最高效的工具。很多学习编程的朋友对数学觉得不屑一 顾,觉得对于编程没有什么关系。实际上优秀程序员和一般程序员拉开档次很大一个程度上就是取决于对数学 的能力。一些项目有时需要很复杂的数学建模和利用数学对于系统效率进行分析,而这些项目对于一般的程序 员是很困难的。正确应用数学知识有时候能使你的程序的效率产生质的飞跃。现在的程序员在数学上普遍是薄 弱环节,这点是大家应该引起足够重视的。当别人对于这些项目感到无从下手,而你却能够完成,这个时候你 的价值也就表现出来了。真正优秀的程序员是能够最基本的一点就是要能够通过自己的知识来解决一般程序员 所无法完成的问题。而数学能力就是一个很重要的环节。 其次就是要对数据结构引起足够的重视。如果说计算机专业的学生与非计算机专业的最根本的差别绝对是数据 结构(数学大家都一样学了,主要看你自己学得好坏)。对数据结构的掌握与运用能力是衡量你编程能力的一 个很重要的指标。有的人对于看了链表,栈,树,广义表这些东西就头痛。然而这些东西往往能使你的程序的 效率比别人高出百倍。由于一直搞信息学竞赛,到了大学又搞ACM,所以我对数学和数据结构都掌握得相对较 好。这使我在应聘与工作中明显感到胜人一酬。记得自己大学时去一家公司应聘的经历,当时去应凭的还有3个 人,有2个大学毕业,有个也工作了一段时间了。他们几个都在大讲自己的能力如何之强,会使用的语言及编程 工具如何之多,经验如何之丰富。按理说我应该是资质最浅的。当时也是初生牛X不怕虎,也就硬着头皮去了。 当时面试的题目是一个公司的资金管理项目的一个问题,要求每个人都在思考后给出自己的设计方案。其中比 较核心的一个问题就是要计算一个资金最小波动值的问题,给出的数据量相当大,对效率要求很高。对于整个 程序的面向对象化的分析我们几个都是差不多的,毕竟这些东西在学校里是很重视的,而且不是真正的难点。 然而到了最关键的问题时其余的人都卡壳了,有两个是用简单的双重循环,时间复杂度(N^2),惨不忍睹。还有 一个在冥思苦想了好一阵以后说用树,具体技术细节又讲不清楚,效率分析也很马虎。只有我当时很快就给出 了采取AVL树的方案,并且利用高等数学推导作出了很详细的效率分析和时空换算,并提出了引入汇编的方法。 很自然的我得到了这分工作。在这里大家显然可以看到数学和数据结构对于一个优秀程序员是多么重要,它们 是和一般的程序员打开档次的最关键的地方。这样向“枣子”碰到的那种情况应该很轻松的就可以想到。 1.6 一个程序员给初学编程人的建议!绝对的好!! 第 26 / 67 页 bbs.theithome.com 如果你是一位想学习编程的朋友,我经过多年的学习总结出来了一个学习的线路希望对你有所帮助。要学习编 程是要有很大恒心和毅力的,首先你要明确自己的目标,想好自己编程是为了干什么。如果你学习仅仅只是一 时想编出QUAKE和成为比尔盖次的冲动,那么我劝你还是应该还是不要开始学习,应为这样的目标很难支持你 日后大量的学习。而且你的年龄不能太大(最好是中学或者大学生)。如果你想好目标并决定开始奋斗,那就 让我们开始吧。如果你一开始对电脑一无所知,那么你应该先熟悉一些电脑的一些最基本的原理和操作,这个 不需要特别细致的学习,只要大概知道二进制和一些基本操作就可以了。接下来你应该先学习BASIC语言,这个 语言并不会耽误你太多的时间,学习它完全是为了入门,让你对电脑编程有一个比较初步的认识。这时候你应 该多编一些小的程序,知道一些最基本每条语句的功能,搞清楚一些基本的数据结构(尤其是数组)对于一些 其余用途的函数最好不要做任何学习,因为这样只会分散你的注意力。当你能够可以熟练的运用BASIC编出猴子 选大王,以及电脑出题考试之类的程序时,你就可以开始后面的学习了。接下来如果觉得自己接受能力强的话 就可以开始学C了(注意不是C++),如果感觉有困难也可以先学Pascal过度一下。还有很重要的一点就是千万 不要一开始就学VB,DELPHI,VC之类的东西,这些东西在一开始学会对你造成很坏的影响。有可能会把你引 入另外一个错误的学习方向而忽略了真正应该掌握的东西。学C主要是学过程话的程序设计,学会把自己的程序 分成许多的函数(或过程),养成良好的编程习惯。这时可以多看一下高人的程序,不一定要懂意思,主要是 学会别人程序的格式(比如变量如何起名,怎么划分函数)。除开掌握基本的控制流语句外,应该学习一些很 简单的I/O函数和数学函数。C的学习主要是你舍弃原来BASIC程序那种把所有语句积成一大堆的风格,要学会 使用函数,提高代码重用性。对于指针之类的东西如果实在看不懂可以先不去管,到后面会有办法。当你能够 比较自如的用C编写一些小的计算程序时,你就可以开始你的数据结构的学习了(数学的学习主要是在学校,自 己要多用心)。数据结构你可以一点一点漫漫看,并不需要专门空出一段时间来专门研究,这样的目的是让你 能够很好的掌握它,要学会用数据结构的知识来规范自己的程序设计和提高程序的效率。学完C我认为接着最好 学习汇编。这个或许有许多人都会反对,然而我个人认为这样是很好的。从最基本的DOS汇编开始,买本 《IBM PC汇编程序设计》(清华黄皮)一定要一点一点吃透,实在看不懂就跳,反复的严读是一定可以看懂 的。汇编是一定要掌握的,因为它涉及到很多最基本的知识。掌握了汇编和对I/O有了个很彻底的认识后,应该 去学编译原理。这个东西并不要精通,但是一定要知道,在大脑里要有一个这样的概念,这对你对程序语言的 控制能力都有很大的帮助。这样最基本的学习就算完成了。一般智力正常的人前一段东西应该都是可以掌握 的。接着后面的学习就要看你自身的造化了。这个时候你应该研究一下数据结构,不要分散自己学习的注意 力,要知道数据结构是异常重要的(相信我,绝对没错)如果你觉得自己已经对于树,连表,堆栈之类的东西 和排序,递归之类的算法已经十分清楚,就可以开始学习C++了。学习前一定要有个正确的认识,那就是C和 C++是两个不同的东西。学习C++是为了学习面向对象的程序设计,这个时候你对于指针应该也能够掌握了 (有汇编的基础),主要抓住C++和C相比的一些新特性,对于多态之类的特性要注意理解掌握,如果没有搞懂 就坚决不要往下学习。一些基本的概念掌握以后可以看一些别人设计的程序,学习别人怎么利用面向对象的方 法来设计程序的。这个东西也是人之间拉开档次的一个环节,可以和数据结构放在同等重要的地位。我就见过 有的人都大学毕业了还搞不懂virtual到底是怎么一回事情。其实我认为学到这里你已经为你成为一个优秀的程 序员打下了很好的基础,你已经能够应用C++,懂得面向对象程序设计,对数据结构掌握很好,掌握汇编和编 译原理。接下来的学习就是基于操作平台的了,一般是先学windows(Microsoft毕竟是老大),先学win32 api,搞请windows基本消息机制和原理,有汇编基础基本上不会碰到什么困难。其实只要会了API,其余什么 MFC,VCL都是囊中之物了,都不过是对于API的封装而已。VC,C++Builder都可轻松拿下,这只是开发工具 1.6 一个程序员给初学编程人的建议!绝对的好!! 第 27 / 67 页 bbs.theithome.com 的问题。以后的OLE(ActiveX),.NET,数据库就要看自己的发展方向而定了。我在这里强调的是前面的基本能 力的学习,后面操作平台虽然知识体系庞大,然而毕竟比较死,更好掌握。最后编程能力的高低主要还是有以 下几点决定:1。编程的习惯 2。数学能力(包括逻辑思维,分析问题的能力) 3。对数据结构的认识能力 4。 经验的多少(包括多使用语言的掌握能力) 以上只是本人一些愚见,希望大家指出不正确的地方并与我多多交流: 1.6 一个程序员给初学编程人的建议!绝对的好!! 第 28 / 67 页 bbs.theithome.com 1.7 算法的力量 发表时间: 2010-09-21 2006年5月 算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘 时要求的编程语言五花八门,就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的 语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机 算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结 构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位同学生动地把这 些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没 有功力,是不可能成为高手的。 算法与我 当我在1980年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说: “知道为什么只有你们系要加一个‘科学’,而没有‘物理科学系’或‘化学科学系’吗?因为人家是真的科 学,不需要画蛇添足,而你们自己心虚,生怕不‘科学’,才这样欲盖弥彰。” 其实,这点他们彻底弄错了。真 正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工 程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。 记得我读博时写的Othello对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地 问我的程序平均每秒能搜索多少步棋,当他发现我的软件在搜索效率上比他快60多倍时,才彻底服输。为什么 在同样的机器上,我可以多做60倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数函数转换成四 个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关 键。 还记得1988年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开 发的慢几十倍,而且,在扩大至大词汇系统后,速度差异更有几百倍之多。他们虽然买了几台超级计算机,勉 强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景的。 在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了 O(n*n*m)。更惊讶的是,他们还为此发表了不少文章,甚至为自己的算法起了一个很特别的名字,并将算法提 名到一个科学会议里,希望能得到大奖。当时,贝尔实验室的研究员当然绝顶聪明,但他们全都是学数学、物 理或电机出身,从未学过计算机科学或算法,才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机 科学的人了吧! 网络时代的算法 1.7 算法的力量 第 29 / 67 页 bbs.theithome.com 有人也许会说:“今天计算机这么快,算法还重要吗?”其实永远不会有太快的计算机,因为我们总会想出新的 应用。虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快增长,价格也在不断下降。可我们不要忘 记,需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据(照片,视频,语音,文本等 等)。日益先进的记录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也 在飞快增长。在科学研究方面,随着研究手段的进步,数据量更是达到了前所未有的程度。无论是三维图形、 海量数据处理、机器学习、语音识别,都需要极大的计算量。在网络时代,越来越多的挑战需要靠卓越的算法 来解决。 再举另一个网络时代的例子。在互联网和手机搜索上,如果要找附近的咖啡店,那么搜索引擎该怎么处理这个 请求呢? 最简单的办法就是把整个城市的咖啡馆都找出来,然后计算出它们的所在位置与你之间的距离,再进行排序,然后返 回最近的结果。但该如何计算距离呢?图论里有不少算法可以解决这个问题。 这么做也许是最直观的,但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆,那这么做应该没什么问题, 反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就 大多了。在这种情况下,我们该怎样优化算法呢? 首先,我们可以把整个城市的咖啡馆做一次“预处理”。比如,把一个城市分成若干个“格子(grid)”,然后根据 用户所在的位置把他放到某一个格子里,只对格子里的咖啡馆进行距离排序。 问题又来了,如果格子大小一样,那么绝大多数结果都可能出现在市中心的一个格子里,而郊区的格子里只有 极少的结果。在这种情况下,我们应该把市中心多分出几个格子。更进一步,格子应该是一个“树结构”,最 顶层是一个大格——整个城市,然后逐层下降,格子越来越小,这样有利于用户进行精确搜索——如果在最底 层的格子里搜索结果不多,用户可以逐级上升,放大搜索范围。 上述算法对咖啡馆的例子很实用,但是它具有通用性吗?答案是否定的。把咖啡馆抽象一下,它是一个 “点”,如果要搜索一个“面”该怎么办呢?比如,用户想去一个水库玩,而一个水库有好几个入口,那么哪 一个离用户最近呢?这个时候,上述“树结构”就要改成“r-tree”,因为树中间的每一个节点都是一个范围, 一个有边界的范围(参考:http://www.cs.umd.edu/~hjs/rtrees/index.html)。 通过这个小例子,我们看到,应用程序的要求千变万化,很多时候需要把一个复杂的问题分解成若干简单的小 问题,然后再选用合适的算法和数据结构。 并行算法:Google的核心优势 上面的例子在Google里就要算是小case了!每天Google的网站要处理十亿个以上的搜索,GMail要储存几千万 1.7 算法的力量 第 30 / 67 页 bbs.theithome.com 用户的2G邮箱,Google Earth要让数十万用户同时在整个地球上遨游,并将合适的图片经过互联网提交给每个 用户。如果没有好的算法,这些应用都无法成为现实。 在这些的应用中,哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如,每天都有十亿以上的用户访 问Google的网站,使用Google的服务,也产生很多很多的日志(Log)。因为Log每分每秒都在飞速增加,我 们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对log进行一些分析处理的问题,有很多面试者 的回答虽然在逻辑上正确,但在实际应用中是几乎不可行的。按照他们的算法,即便用上几万台机器,我们的 处理速度都跟不上数据产生的速度。 那么Google是如何解决这些问题的呢? 首先,在网络时代,就算有最好的算法,也要能在并行计算的环境下执行。在Google的数据中心,我们使用的 是超大的并行计算机。但传统的并行算法运行时,效率会在增加机器数量后迅速降低,也就是说,十台机器如 果有五倍的效果,增加到一千台时也许就只有几十倍的效果。这种事倍功半的代价是没有哪家公司可以负担得 起的。而且,在许多并行算法中,只要一个结点犯错误,所有计算都会前功尽弃。 那么Google是如何开发出既有效率又能容错的并行计算的呢? Google最资深的计算机科学家Jeff Dean认识到, Google 所需的绝大部分数据处理都可以归结为一个简单的 并行算法:Map and Reduce(http://labs.google.com/papers/mapreduce.html)。 这个算法能够在很多 种计算中达到相当高的效率,而且是可扩展的(也就是说,一千台机器就算不能达到一千倍的效果,至少也可 以达到几百倍的效果)。Map and Reduce的另外一大特色是它可以利用大批廉价的机器组成功能强大的 server farm。最后,它的容错性能异常出色,就算一个server farm里面的机器down掉一半,整个farm依然能 够运行。正是因为这个天才的认识,才有了Map and Reduce算法。借助该算法,Google几乎能无限地增加计算 量,与日新月异的互联网应用一同成长。 算法并不局限于计算机和网络 举一个计算机领域外的例子:在高能物理研究方面,很多实验每秒钟都产生几个TB的数据量。但因为处理能力 和存储能力的不足,科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道,新元素的信息很有可能 就藏在我们来不及处理的数据里面。同样的,在其他任何领域里,算法都可以改变人类的生活。例如人类基因 的研究,就可能因为算法而发明新的医疗方式。在国家安全领域,有效的算法可能避免下一个911的发生。在气 象方面,算法可以更好地预测未来天灾的发生,以拯救生命。 所以,如果你把计算机的发展放到应用和数据飞速增长的大环境下,你一定会发现,算法的重要性不是在日益 减小,而是在日益加强。 给程序员的七个建议 1.7 算法的力量 第 31 / 67 页 bbs.theithome.com (1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据 结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。大家不妨试 试高德纳所著The Art of Computer Programming里的题目,如果你能够解决其中的大部分题目,就说明你在 算法方面有一定的功力了。 (2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言, 考试过关就算学会了;课题项目中,只要程序能够编译,运行,并且输入输出满足要求就算了事。这些做法是 不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四年 中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。 (3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作 风与敬业精神。我发现不少程序员对于知识的掌握很肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学 会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中是如 何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现 的? 这些东西恐怕在编程语言或编译原理中都没有详细提到,只有通过踏实的实干才能真正掌握。 (4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、 集合论和数理逻辑。这些知识并不难,但是对你未来的工作帮助会很大。 尤其当你对一些“数学密集型”的领 域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。 (5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才 能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。 (6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的 能力。想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成钻研,好奇,创新,动手, 合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。 (7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公 司,在一个好的“老板”指导下完成真正会被用户使用的程序。不要急于去一个要你做“头”而独挡一面的地 方,因为向别人学习才是你的目的。找工作也是一样,不要只看待遇和职衔,要挑一个你能够学习的环境,一 个愿意培养员工的企业,一个重视你的专业的公司。最后,还要挑一个好老板。 希望大家都能把握机会,养成好的学习习惯,把算法学精学透;希望大家都能有一个美好的未来! 1.7 算法的力量 第 32 / 67 页 bbs.theithome.com 1.8 不要迷失在技术的海洋中 发表时间: 2010-09-21 技术就好像一片汪洋大海,越深入越望不到边际。就拿自己的体验来说吧,2000 年的时候在学校搞ASP ,觉得网页开发就 是这么简单,把数据库中的数据格式化一下显示在页面上,把用户的输入组装成添加删除和修改的SQL 提交到数据库中去。 几年后的今天,我对自己了解或听说过的ASP.NET 相关(注意:仅仅是ASP.NET 或者说网站制作相关)技术列了一下: 1.8 不要迷失在技术的海洋中 第 33 / 67 页 bbs.theithome.com 在这些语言、技术、工具、理念中,每一项都能扩展出很多还要细化的技术,每一项要达到熟悉的程度可能都 会花去一年的时间,如果这些都要达到熟悉的话,大概也就快退休了。不但如此,每一个技术都在飞速发展, 今年语言到了明年就有更简单的语法,今年的技术到了明年就有更好的技术来替代,今年的工具到明年已经面 目全非,今年的理念到了明年已不再流行。 或许你现在: l 在为面试而去搜索接口和抽象类的区别; l 在为新技术来不及学习而烦恼; l 在为看不懂高深的技术文章而烦恼; l 在为项目不能提高自己的编码水平而发愁; l ………… 我觉得: l 不管做什么,学什么,一要心态好,二要态度好。所谓心态好就是不要着急、不用担心;所谓态度好是 多分享、多讨论、学出自己的心得。分享的意义是很大的,在分享之后的认知水平往往比分享之前的高,而且 在很多时候分享给别人1 点,别人能回报给你2 点。有些人在团队中不愿意分享,怕团队中的其它人水平提升了 影响到自己的地位,其实这种想法是没有什么道理的,也是对自己不利的。有些人又在羡慕别人的技术NB ,崇 拜高手,为自己的技术差感到烦恼,如果你对自己信心又有什么技术是花时间学不到的那? l 从学习的内容上来说,要坚持两个原则,如果你没有时间的话,那么学新技术不如学基础、学应用不如 学思想。举例来说,如果你只熟悉C# 的基本语法的话,那么学好C# 这个语言比学会编写留言本更有意义,如 果你关注MVC 、ORM 的话,那么学习它们的思想比学会使用MONORAIL 以及NHIBERNMATE 更好。技术虽 然一直在变,但是越是基础和越是抽象的技术变化越慢,越是偏向应用越是具体的技术变化越是快,从性价比 上说,学习基础知识性价比更高。再举一个直白的例子,DIY 电脑的时候,在显示器上多花费500 元的意义一 定比在显卡上多花费500 元的意义大,而就是有些人宁可在显卡上多花费500 元。在很多大型软件公司,招聘 的时候只看人(看人品、看聪明程度、看态度)不看技术的,因为它们需要的是能快速发展,适应企业文化的 人,而不需要你那些所谓的精通和熟悉。 l 不要过于专著于技术,这里的技术指工作中用于开发的技术。在几年之后,当你只有.NET 可以和你的孩 子分享的话,是不是太可悲了。在软件行业,技术虽然一定程度决定了薪水、决定了职位,但是我们的生活并 不是100% 是工作,有时间为技术而发愁,为何不综合提升自己的其它能力呢?并且随着职位的上升,往往沟 通能力、经济知识以及文学艺术修养比技术显得更重要,这个时候叹息自己过于专著技术往往为时过晚。 l 虽然国内很多公司的技术层次不同和文化也有差异,但是在大多数的时候公司或别人能教给你的东西很 少,要学东西还是要靠自己主动。有的人一直觉得在公司学不到东西,想换一个环境,往往他换了一个环境之 后发现还是学不到什么东西。国内的项目大多还是急功近利的,不要期望有这么多微软研究院,空闲的时间踏 踏实实学一些东西比到处找工作强很多,做项目的时候多分享一下自己的心得给团队成员比抱怨团队技术实力 差强很多。 l 在工作中,要始终提醒自己“谦恭”、“真诚”和“规矩”,谦恭真诚对别人,把规矩留给自己。技术 再强也要“谦恭”,离开了“谦恭”的技术就会失去光芒,社会再险恶也要“真诚”,一切虚伪会在“真”诚 面前低头,职位再高也要“规矩”(不迟到,不早退,以身作则),否则再大的权力也只能变成人员的流失。 如果能做到这六个子,那么无论你的技术怎么样,无论你到哪里都会得到领导的重用,在事业上有所发展。 现在的你不再: 1.8 不要迷失在技术的海洋中 第 35 / 67 页 bbs.theithome.com l 为面试而去搜索接口和抽象类的区别,而是在面试的时候告诉考官你并不知道它们之间的区别,但是愿 意在一个月内系统学习面向对象的知识; l 为新技术来不及学习而烦恼,而是明确了自己最需要学习的技术,一边学习一边分享; l 为看不懂高深的技术文章而烦恼,而是拿起《C# 高级编程》踏踏实实从头到底边阅读边做试验; l 为项目不能提高自己的编码水平而发愁,而是在进度允许的情况下尽可能让项目变得可扩展、可维护以 及高效; l ………… 看到身边的一些人为技术所累,在技术的海洋中航行的很辛苦,因此有了本文。本文的主要目的是提醒大家 找到方向,时不时回岸边休息一下,思考一下新的航向,不要迷失在技术的海洋中让自己筋疲力尽,在技术之 外的有很多东西的意义远大于技术,请大家踊跃讨论………… 更新(本文或许过于杂乱,总结一下观点): l 学习靠自己,不要期望别人教你什么,学习要主动; l 不管水平高低,不要看不起自己,也不能看不起别人,学习要心态好; l 不能不思进取,也不用让自己为技术所累,给自己多一点技术之外的时间; l 如果时间不充裕,优先考虑学习基础的内容,同时也可以多关注一些新的思想; l 如果别人能从你这里学到知识的话,那么你自己也一定学到了知识,请坚持分享; 1.8 不要迷失在技术的海洋中 第 36 / 67 页 bbs.theithome.com 1.9 给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完 发表时间: 2010-09-21 编了这么久的程序,一直想找机会总结下其中的心得和方法,但回想我这段编程道路,又很难说清楚,如果按 照我走过的所有路来说,显然是不可能的!当我看完了云风的《游戏之旅--编程感悟》和梁肇新的《编程高手箴 言》我突然知道我要从何说起,我要怎么说了! 从接触编程到现在已经至少要6年,虽然时间短,但我几乎每天都在编,而编程上突飞猛进的还是最近一两年, 单纯编程上的进步,很简单就是经验,但你要理解才可以进步的快!这就是说,你的理论课要学好,才能学好 编程,操作系统,网络原理,计算机体系结构,数据结构,编译原理,你哪个学的不好,你根本不配成为编程 高手,我见过的高手,这些学的都不错!这些都是计算机的支柱,你连它的支柱都不了解,怎么编程,即使你 编写的程序好——只有一个原因,你用的是高级语言或脚本语言,因为它们封闭大量低层语言细节,让你不用 了解就可以编写,你不了解低层细节你杂成为高手! 解释什么叫编程? 我觉得现在很多同学,根本不知道什么叫编程!我现在告诉你,单纯的编程,也就是就知道语法知识的编程, 根本不叫编程,只会单纯的语法的编程连低级程序员都不如! 编程不仅仅是你对语法的掌握,你还要把各种技术混合到里面,这样才叫编程,你编程的时候,你应该问问自 己,你的程序有算法吗?你的程序写的够简单吗?速度足够快吗?占用空间足够少吗?代码写的规范吗?语句 写的标准吗?你的程序之间的结构合理吗?你类定义的合适吗?方法和属性合理吗?接口合理吗?等等等,包 含很多东西!这就是高级程序员为什么赚这么多钱!要付出相当大的脑力劳动! 调试对你也很重要,一个程序高手,也是调试专家,其实调试很多方法,但大多数都是实践中得到的! 指正现在人对学计算机误区 现在我每天在和汇编,硬件指令 ,c和c++或一些低层API打交道,有些时候编程这个东西很难说清楚,只有你 经历了,你才能感受到,你没有经历,就永远体验不到! 我现在要更正几个现在学计算机人的误区,我想回答的是,学什么才是学计算机! 学计算机的两个方向:一个是纯搞理论的,一个是搞实践的。搞理论的无可厚非的,大家都承认是学计算机。 那么实践呢?我很难给出一个定义,但我会列出那些才是真正学计算机学的: (1)编程,这里的编程,我要抛出FLASH,PHOTOSHOP,3DMAX等,它们虽然也有语言,但都是为了给美 术人员提供的!也就是几乎封闭了大量的低层细节,对于一个学计算机的人来说,如果你努力学它们,你还是 不要学计算机了,去学美术把!网页编程能接触到至少两种类型语言,,HTML和ASP或JSP(PHP),HTML 说实话,不应该是计算机人学的,你应该学的是ASP,JSP等! 按严格意义上讲(但实际没有这么严格)如果你的主要必修语言,不是c ,c++,JAVA,或者硬件指令,都不 算是真正学计算机的,之所以这么说,我举个例子,比如你用JSP,它是一个脚本语言,如果你用过这个语言, 你认为你用好这门语言需要了解硬件结构知识吗?显然不用,如果你纯是JSP程序员,你需要只是,JSP语法, 一些简单的JAVA语言,SQL之类的数据库知识,其余的你什么都不需要,至于分析流程,那是系统分析师的 1.9 给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完 第 37 / 67 页 bbs.theithome.com 事,不要和编程混为一谈,我学JSP学了3个月,现学现买就做出了功能齐全的网上书店(当时是老师布置的作 业),如果再努点力,就可以投如使用!所以说,学JSP根本就不需要太多的专业知识,不是学计算机的也很容 易就学会! 学c++,我都学了好几年了,用它写程序都几十万行,我也不敢说我学的精通!就是因为它太灵活了!不同 人,用的效果就是不一样! 所以按严格意义上讲,如果你的主要必修语言,不是c ,c++,JAVA,或者硬件指令,都不算是真正学计算机 的,也就是说,学那些对计算机专业知识不需要太多了解的语言,就不叫学计算机的! (2)从事软件方法实践研究,这个纯是软件工程方面的,如果你没有容入一个大项目中很难体会它的重要性, 想一想,一个程序,几十万,几百万行代码,能这么好的实现,并运行,它的功劳不小! (3)从事低层硬件开发,这里可能和搞电子的专业有些重叠,但事实就是这样,他们也是学计算机的! 其余的,装系统了,装电脑了,用人家编好的软件实现些图片音乐等功能的,那都是计算机的门外汉,不要和 真正学计算机的混为一谈! 我经常被问到: 你会盗qq不?我晕,学计算机的就要会盗qq? 你会装电脑不?虽然我会,但不会并不可耻 你会装系统不?虽然我会,但不会并不可耻 ''''''''''''''''''''''' ''''''''''''' 等等把,有好多,通过我上面解释,你应该理解学计算机的应该会什么,不会什么也是应该的! 正式入题,怎么学好编程! , 世面上好象只有这两本是中国人写的关于编程心得的书,中国编程好的人很多,但写出方法很难!第一本 《游戏之旅--编程感悟》前面几章写的是云风的编程经历,后面几章写的是编程经验!总的来说本书很容易读 懂!《编程高手箴言》书很难,尤其写操作系统那章!正如作者所说,真正写一门编程方法学的书很难!本书 前几张概括了当前中国软件面临的形式,我强烈建议看一下,写的很经典!以前我不知道程序和软件的区别是 什么,现在我知道了!后面几张写的都是编程方法和编程要具备的知识! 总结他们两人所说的,我准备按照下面提纲来写编程方法! 1。如果你感兴趣,学计算机是一种光荣,如果你不感兴趣,那么它是地狱! 2。理论对你很重要,尤其是你一名搞技术的程序工程师! 3。学会自学,学会思考,学会合作与交流! 4。要想成为高手,一定要从底层学起,底层是什么?CPU,汇编等硬件指令! 5。编程需要经验积累,学会调试对你尤其重要! 6。全局把握整个工程,具体到每个类的属性和方法以及各个类的关系!一定确保你设计的类和类模式和类间关 1.9 给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完 第 38 / 67 页 bbs.theithome.com 系能够有效,利于修改和升级!概括说就是软件工程 下面我就分别说一下 一。如果你感兴趣,学计算机是一种光荣,如果你不感兴趣,那么它是地狱! 我经常听很多同学说,开始他对计算机很感兴趣,但随着大学里的学习,越来越感觉无聊甚至厌烦!你之所以 这么想,其实一点也不怪你!从高中的应试教育到大学里的自由学习方式上的转变,我们几乎都不适应,一到 大学,突然有一种解放的感觉,没有老师的强硬指示学习,自己根本不知道怎么学,学什么!所以说,教育对 我们很不负责任! 如果你在大学以前已经知道编程怎么回事,那到没什么事情!但好象很少有人象云风这样从小就接触了编程教 育!所以我们在没有上大学前几乎是零起步! 其实,按我的理解,刚上大学开始学编程有些晚了,之所以这么说,不是因为单纯的编程很难,如果你很努 力,几年完全可以搞定,其他的你去公司的经验可以弥补!我这里想说的是,一个真正的程序员不单单要有强 硬的编程实力,还要有强大的理论后盾!你只会编程,没有强大的理论做后盾,你也就不会把理论转化成实际 的代码,你也不会做出高效,高技能的程序!在计算机理论中,图论,人工智能等等都是很难的理论,但如果 你能把它们有效的用在计算机领域,功德无量!国人能做这点的很少,本来厉害的程序员就很少,有高尖端理 论技术并把它应用的更是凤毛麟角! (这里可以推荐大家一本书《游戏编程中的人工智能技术》,这本书抛开了传统的自动机,产生式,各种规则 的传统的人工智能理论,而是讲的更前沿的计算智能——生物遗传算法,人工神经网络!这本书,不单纯讲理 论,还用c++语言结合理论实现各种游戏程序!有时抽象的理论都是基于数学基础之上,如果没有一定数学基 础是很难看懂的,但正因为它有数学证明是正确的,所以它是可行的!能把它用语言实现更是可观!) 所以,如果你热爱计算机,在大学以前,就应该成为一个程序高手,而大学以后,主要专研各种技术的实现, 和各种技术的学习,如果你把他留在工作里,可能很难,我的同学在参加工作后,很少有继续看技术书籍,因 为技术书籍很难,不是一下两下就看懂的,有几个还有这样的耐力和精力去搞!这些怎么在编程上实现,都在 等着老外,咱们COPY,这样我们的软件技术能强大吗? 可是在大学以前成为一个编程高手几乎不可能,我们没有良好的学习编程的环境,而且面对着中考,高考的各 种压力,几乎没有机会去学习编程!其实,小学,初中,高学,那些课程没有必要象我们这样反复的复习,反 复的作题,浪费了大量时间,我们要学会什么?学会一种技能,能够应付各种变化的技能,就是自学,学会思 考,学会自己解决问题,学会团结合作!初等教育,打的口号很好,实际上,完全压制了这种学习方式! 所以我们应该以最快的速度,在大学里容入一个热爱计算机的氛围!说到这又很难,当代大学生迷茫呀!不知 道作什么,有些知道自己该好好编程,但光说不做!有些人,写了几段代码,出现了问题,不会调试,就放弃 了!大家都这样,所以以寝室为单位没有人编程,逐渐以整个计算机学院为单位逐渐编程!确实我们的计算机 老师,会编程的很少,我们应该知道,中国计算机引进并发展才短短20年,正是这样老一辈的,把这些计算机 理论上确立,他们不会编程理所当然,大学的老师主要研究理论,国外的也是,因为理论太难了! 所以大学里学习编程要完全考自己,你要有信心,有意志把它学好才可以,而且这个过程是循序渐进的!以最 快方式,找到你编程的爱好和兴趣! 我介绍几个方法,学习方式,希望你能找到兴趣,起码我是这样做的,记住如果跌倒了,你要站起来 。 1。一定要和喜欢编程的,或编程厉害的,或经常编程的人,在一起,经常探讨问题!初学编程会有很多问题 出现,你自己很 难解决 1.9 给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完 第 39 / 67 页 bbs.theithome.com 2。我建议VB和c一起学习,这个只是我的建议!我为什么这样说呢?如果你开始只学c,你会厌烦整天在 DOS下,没有图象的 程序!如果你直接学WINDOW编程会很难,所以我建议学VB,VB这是个语法简单,很 快可以见到你编写程序的画面,这样你就会逐渐喜 欢编程,没有画面很枯燥的,你不这样认为吗?反正我是 这样认为的,你编写的好坏,没有画面也很难用眼睛直接看出来!VB是最简 单的语言了!不存在c的复杂语 法结构,程序出错概率相对c 来说很少,因为VB封状的很好,帮你解决了复杂的过程!其实象JAVA,MFC, c#完全可以作到VB效果,但上手相对困难! c是我们一定要学的,它是一种很接近底层的语言!如果你要成为高手,应该学这个!C是个纯面向过程的语 言,它的语法不 是很难,你用它大约一年半多左右,就完全可以掌握它,记住这需要你的实践,多做程序, 主要是算法程序,最好把你教科书的后的 的习题都做了。大家几乎学的都是潭浩强的书,这本书我开始认为 很 好,但我看了很多国外的书,和很多国外人所打的代码后, 和国内高级程序员所说的话,我只能说这本 书,只能是你的开端,但不能 让你更深层次了解语言。但你要问我初学者用什么 书,我还会介绍这本书。C 的精髓在于指针,你能灵活运用指针就几乎等于你掌握了 C语言,这是一种高效的语法支持,快的让 你无法 想象,我很有感触,在VB下要慢的多。 那么我们学VB究竟做什么,很简单,做WINDOWS程序,控件的使用,数据库的使用等等,还有一个很重要 的是,你可以练习你 学的数据结构,各种计算机算法,很快就可以用图形的方式显现出来!你现在知道这些 就可以,等你以后学了真正WINDOWS编 程,你会对你以前所实现的东西有很深的理解,究竟什么是API, 什么是动态连接库,什么是控件,象VB,MFC这样的东西,究竟封状 了什么让我们用起来这么简单! 3如果你能作到,以上两点,(加上你学的专业,如果你很努力,课大约1年)我想你会对计算机感兴趣的!你 逐渐容入爱学 计算机的氛围!接下来有两个方向你要去做,一个是努力学好其他计算机专业课,二是在巩固c 语言的基础上,你可以选择学习c++ 或者WINDWOS编程!这两个先学哪个都无所谓。记住你大学时学的 10大专业课,数学,离散数学,数据结构,编译原理,汇编,数据库 ,计算机体系结构,操作系统,计算机 网络,软件工程,你要尽力把它们学好,这个是整个计算机系统的精髓,这些都是相互贯穿的 ,相互联系 的,你可能学某科没学懂,但学了别的后,可能会懂的!切记,在你学好编程的同时,一定要学好这些理论, 以后你会受 益匪浅的。 4。在你觉的c或者VB学的没什么问题,或者你学会WINDOWS编程,记住一定要自己有个想法,做个小的可 视化程序,小游戏也 好,小应用软件也好,都可以,这个步骤,你一定要做,你会学到很多东西!在这期 间,你还会遇到很多问题,你要自己多想,多问 别人,多去网上查资料!但你做的程序,最好不要COPY别人 的,如果都是你自己做的,自己想的,你收获最大,哪怕你是模仿别人的 程序,你用你自己的想法实现了,也 是厉害的!其次,你可以COPY部分代码,作为自己的。在你对你的想法,知道怎么实现后,写代 码只是浪费 时间的时候,而且你写的效率没有现成的代码效率高,你就可以完全COPY,但如果你是初学者,你千万不要这 么做!否则 你会对它产生依赖,有一天真正让你自己去写,你会无从下手!所以开始时,你可以试着COPY, 逐渐摆脱对它们的依赖,以后摆脱了 ,这个时候,你才可以总依赖它们。 5。大学期间,有很多程序的实验课,你要认真做,做出来收获是自己的,也可以作为自己的一个小项目!大 学期间加上实验 课,基本上自主编程或者团队自主编写的总小软件数目应该不少于7,8个,如果你做的程序很 大,可以少些! 以上,我把如果学习计算机入门 和提起 你兴趣的方法告诉你了!我相信你按照我的去做,应该没有问题的!对 于每个细节,我会在接下来详细为你们写出的! 1.9 给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完 第 40 / 67 页 bbs.theithome.com 1.10 数学对编程的重要作用 发表时间: 2010-09-21 数学对编程的重要作用 2007年09月21日 星期五 13:02 可能有很多朋友在网上看过google公司早几年的招聘广告,它的第一题如下了:{first 10-digit prime found in consecutive digits e}.com,e中出现的连续的第一个10个数字组成的质数。据说当时这个试题在美国很多地铁 的出站口都有大幅广告,只要正确解答了这道题,在浏览器的地址栏中输入这个答案,就可以进入下一轮的测 试,整个测试过程如同一个数学迷宫,直到你成为google的一员。   又如Intel某年的一道面试题目:巴拿赫病故于1945年8月31日。他的出生年份恰好是他在世时某年年龄的平 方,问:他是哪年出生的?这道看似很简单的数学问题,你能不能能快地解答呢?   下面则是一道世界第一大软件公司微软的招聘测试题:中间只隔一个数字的两个素数被称为素数对,比如5和 7,17和19,证明素数对之间的数字总能被6整除(假设这两个素数都大于6),现在证明没有由三个素数组成的素 数对。这样的试题还有很多很多,这些题目乍初看上去都是一些数学问题。但是世界上一些著名的公司都把它 们用于招聘测试,可见它们对新员工数学基础的重视。数学试题与应用程序试题是许多大型软件公司面试中指 向性最明显的一类试题,这些试题就是考察应聘者的数学能力与计算机能力。   某咨询公司的一名高级顾问曾说:微软是一家电脑软件公司,当然要求其员工有一定的计算机和数学能力, 面试中自然就会考察这类能力。微软的面试题目就考察了应聘人员对基础知识的掌握程度、对基础知识的应用 能力,甚至暗含了对计算机基本原理的考察。所以,这样的面试题目的确很“毒辣”,足以筛选到合适的人。   四川大学数学学院的曹广福教授曾说过:“一个大学生将来的作为与他的数学修养有很大的关系”。大学计 算机专业学生都有感触,计算机专业课程中最难的几门课程莫过于离散数学、编译原理、数据结构,当然像组 合数学、密码学、计算机图形学等课程也令许多人学起来相当吃力,很多自认为数据库学得很好的学生在范 式、函数依赖、传递依赖等数学性比较强的概念面前感到力不从心,这些都是因为数学基础或者说数学知识的 缺乏所造成的。   数学是计算机的基础,这也是为什么考计算机专业研究生数学都采用最难试题(数学一)的原因,当然这也能 促使一些新的交叉学科如数学与应用软件、信息与计算科学专业等飞速发展。许多天才程序员本身就是数学尖 子,众所周知, BillGates的数学成绩一直都很棒,他甚至曾经期望当一名数学教授,他的母校——湖滨中学的 数学系主任弗雷福?赖特曾这样谈起过他的学生:“他能用一种最简单的方法来解决某个代数或计算机问题,他可 以用数学的方法来找到一条处理问题的捷径,我教了这么多年的书,没见过像他这样天分的数学奇才。他甚至 可以和我工作过多年的那些优秀数学家媲美。当然,比尔也各方面表现得都很优秀,不仅仅是数学,他的知识 面非常广泛,数学仅是他众多特长之一。”。影响一代中国程序人的金山软件股份有限公司董事长求伯君当年 高考数学成绩满分进一步说明了问题。很多数学基础很好的人,一旦熟悉了某种计算机语言,他可以很快地理 1.10 数学对编程的重要作用 第 41 / 67 页 bbs.theithome.com 解一些算法的精髓,使之能够运用自如,并可能写出时间与空间复杂度都有明显改善的算法。   程序设计当中解决的相当一部分问题都会涉及各种各样的科学计算,这需要程序员具有什么样的基础呢?实 际问题转换为程序,要经过一个对问题抽象的过程,建立起完善的数学模型,只有这样,我们才能建立一个设 计良好的程序。从中我们不难看出数学在程序设计领域的重要性。算法与计算理论是计算机程序设计领域的灵 魂所在,是发挥程序设计者严谨,敏锐思维的有效工具,任何的程序设计语言都试图将之发挥得淋漓尽致。   程序员需要一定的数学修养,不但是编程本身的需要,同时也是培养逻辑思维以及严谨的编程作风的需 要。数学可以锻炼我们的思维能力,可以帮助我们解决现实中的问题。可以帮助我们更高的学习哲学。为什么 经常有人对一些科学计算程序一筹莫展,他可以读懂每一行代码,但是却无法预测程序的预测结果,甚至对程 序的结构与功能也一知半解,给他一个稍微复杂点的数学公式,他可能就不知道怎么把它变成计算机程序。很 多程序员还停留在做做简单的MIS,设计一下MDI,写写简单的Class或用SQL语句实现查询等基础的编程工作 上,对于一些需要用到数学知识的编程工作就避而远之,当然实现一个累加程序或者一个税率的换算程序还是 很容易的,因为它们并不需要什么高深的数学知识。   一名有过10多年开发经验的老程序员曾说过:“所有程序的本质就是逻辑。技术你已经较好地掌握了,但只 有完成逻辑能力的提高,你才能成为一名职业程序员。打一个比方吧,你会XXXXX般武艺,刀枪棍棒都很精 通,但就是力气不够,所以永远都上不了战场,这个力气对程序员而言就是逻辑能力(其本质是一个人的数学修 养,注意,不是数学知识)。”   程序员的数学修养不是一朝一夕就可以培养的。数学修养与数学知识不一样,修养需要一个长期的过程, 而知识的学习可能只是一段短暂的时间。下面是一些我个人对于程序员怎么样提高与培养自己的数学修养的基 本看法。   首先,应该意识到数学修养的重要性。作为一个优秀的程序员,一定的数学修养是十分重要也是必要的。 数学是自然科学的基础,计算机科学实际上是数学的一个分支。计算机理论其实是很多数学知识的融合,软件 工程需要图论,密码学需要数论,软件测试需要组合数学,计算机程序的编制更需要很多的数学知识,如集合 论、排队论、离散数学、统计学,当然还有微积分。计算机科学一个最大的特征是信息与知识更新速度很快, 随着数学知识与计算机理论的进一步结合,数据挖掘、模式识别、神经网络等分支科学得到了迅速发展,控制 论、模糊数学、耗散理论、分形科学都促进了计算机软件理论、信息管理技术的发展。严格的说,一个数学基 础不扎实的程序不能算一个合格的程序员,很多介绍计算机算法的书籍本身也就是数学知识的应用与计算机实 现手册。   其次,自身数学知识的积累,培养自己的空间思维能力和逻辑判断能力。数学是一门分支众多的学科,我 们无法在短暂的一生中学会所有的数学知识,像泛函理论、混沌理论以及一些非线性数学问题不是三五几天就 可以掌握的。数学修养的培养并不在与数学知识的多少,但要求程序员有良好的数学学习能力,能够很快地把 一些数学知识和自己正在解决的问题联系起来,很多理学大师虽然不是数学出身,但是他们对数学有很强的理 解能力和敏锐的观察力,于是一系列新的学科诞生了,如计算化学、计算生物学、生物信息学、化学信息学、 1.10 数学对编程的重要作用 第 42 / 67 页 bbs.theithome.com 计算物理学,计算材料学等等。数学是自然学科的基础,计算机技术作为理论与实践的结合,更需要把数学的 一些精髓融入其中。从计算机的诞生来看它就是在数学的基础上产生的,最简单的0、1进制就是一个古老的数 学问题。程序设计作为一项创造性很强的职业,它需要程序员有一定的数学修养,也具有一定的数学知识的积 累,可以更好地把一些数学原理与思想应用于实际的编程工作中去。学无止境,不断的学习是提高修养的必经 之路。第三,多在实践中运用数学。有些高等学校开设了一门这样的课程——《数学建模》。我在大学时期也 曾学过,这是一门内容很丰富的课程。它把很多相关的学科与数学都联系在一起,通过很多数学模型来解决实 际的生产生活问题,很多问题的解决需要计算机程序来实现。我在大学和研究生阶段都参加过数学建模竞赛, 获得了不少的经验,同时也进一步提高了自己的数学修养。实际上,现在的程序设计从某些角度来看就是一个 数学建模的过程,模型的好坏关系到系统的成败,现在数学建模的思想已经用于计算机的许多相关学科中,不 单只是计算机程序设计与算法分析。应该知道,数学是一门需要在实践中展示其魅力的科学,而计算机程序也 是为帮助解决实际问题而编制的,因此,应该尽量使它们结合起来,在这个方面,计算机密码学是我认为运用 数学知识最深最广泛的,每一个好的加密算法后面都有一个数学理论的支持,如椭圆曲线、背包问题、素数理 论等。作为一名优秀的程序员,应该在实际工作中根据需要灵活运用数学知识,培养一定的数学建模能力,善 于归纳总结,慢慢使自己的数学知识更加全面,数学修养得到进一步提高。   第四,程序员培养制度与教学的改革。许多程序员培养体制存在很多缺陷,一开始就要求学员能够快速精 通某种语言,以语言为中心,对算法的核心思想与相关的数学知识都一笔带过,讲得很少,这造成很多程序员 成为背程序的机器,这样不利于程序员自身的快速成长,也不利于程序员解决新问题。我在长期的程序员培训 与计算机教学工作采用了一些与传统方式不一致的方法,收到了一定的效果。很多初学程序的人往往写程序时 有时候会有思维中断,或者对一些稍难的程序觉得无法下手,我采用了一些课前解决数学小问题的方法来激励 大家的学习兴趣,这些小问题不单单是脑筋急转弯,其中不少是很有代表意义的数学思考题。通过数学问题来 做编程的热身运动,让学员在数学试题中激发自己的思维能力,记得有位专家曾经说过,经常做做数学题目会 使自己变聪明,很长时间不去接触数学问题会使自己思维迟钝。通过一些经典的数学问题来培养学员的思维的 严谨性和跳跃性。很多人可能不以为然,其实有些看似简单的问题并不一定能够快速给出答案,大脑也在不断 的运用中变更加灵活的。不信吗?大家有兴趣可以做做下面这道题目,看看能不能在1分钟之内想到答案,这只 是一道小学数学课后习题。很多人认为自己的数学基础很好,但是据说这道题目90%以上的人不能在一个小时 内给出正确答案。   证明:AB+AC>DB+DC(D为三角形ABC的一个内点)。   最后,多学多问,多看好书,看经典。我在这里向大家推荐两部可能大家已经很熟悉的经典的计算机算法 教材,它们中间很多内容其实就是数学知识的介绍。第一部是《算法导论》,英文名称:Introduction to Algorithms,作者:Thomas H. Cormen,Charles E. Leiserson ,Ronald L. Rivest ,Clifford Stein。本书的 主要作者来自麻省理工大学计算机,作者之一Ronald L.Rivest由于其在公开秘钥密码算法RSA上的贡献获得了 图灵奖。这本书目前是算法的标准教材,美国许多名校的计算机系都使用它,国内有些院校也将本书作为算法 课程的教材。另外许多专业人员也经常引用它。本书基本包含了所有的经典算法,程序全部由伪代码实现,这 更增添了本书的通用性,使得利用各种程序设计语言进行程序开发的程序员都可以作为参考。语言方面通俗, 很适合作为算法教材和自学算法之用。另一部是很多人都应该知道的Donald.E.Knuth所著《计算机程序设计艺 1.10 数学对编程的重要作用 第 43 / 67 页 bbs.theithome.com 术》,英文名称:The Art of Computer Programming。   Donald.E.Knuth人生最辉煌的时刻在斯坦福大学计算机系渡过,美国计算机协会图灵奖的获得者,是本领 域内当之无愧的泰斗。有戏言称搞计算机程序设计的不认识Knuth就等于搞物理的不知道爱因斯坦,搞数学的不 知道欧拉,搞化学的不知道道尔顿。被简称为TAOCP的这本巨著内容博大精深,几乎涵盖了计算机程序设计算 法与理论最重要的内容。现在发行的只有三卷,分别为基础运算法则,半数值算法,以及排序和搜索(在写本文 之际,第四卷已经出来了,我也在第一时间抢购了一本)。本书结合大量数学知识,分析不同应用领域中的各种 算法,研究算法的复杂性,即算法的时间、空间效率,探讨各种适用算法等,其理论和实践价值得到了全世界 计算机工作者的公认。书中引入的许多术语、得到的许多结论都变成了计算机领域的标准术语和被广泛引用的 结果。另外,作者对有关领域的科学发展史也有深入研究,因此本书介绍众多研究成果的同时,也对其历史渊 源和发展过程做了很好的介绍,这种特色在全球科学著作中是不多见的。至于本书的价值我觉得BillGates先生 的话足以说明问题:“如果你认为你是一名真正优秀的程序员读Knuth的《计算机程序设计艺术》,如果你能读 懂整套书的话,请给我发一份你的简历”。作者数学方面的功底造就了本书严谨的风格,虽然本书不是用当今 流行的程序设计语言描述的,但这丝毫不损伤它“程序设计史诗”的地位。道理很简单,它内涵的设计思想是 永远不会过时的。除非英语实在有困难,否则建议读者选用英文版。 1.10 数学对编程的重要作用 第 44 / 67 页 bbs.theithome.com 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 发表时间: 2010-09-21 为什么我们要学习计算机,为什么我们要学习编程,有很多很多的原因,但当我们踏进计算机的世界里的时候 ,我们找到了可以任由我们发挥,任由我们施展拳脚的天地,我们有了一种对学习计算机,甚至是学好计算机 的渴望, 但是任何一门学科都不是那么容易学的好的,计算机更是如此,我想我们大多数人都是从编程开始学习的,逐 渐形成了 对学习编程的兴趣,但是如果想真正的学好计算机,单单学习高级语言是不能达到效果的,就算你说我只想学 好一门高 级语言,把它学的精通就可以了,但问题就是那么的简单么,我想不是吧。 计算机是一个整体,学习任何一门计算机课都是和其他课程联系在一起的,要学习就要有足够的深度和广度, 不然不可能有深入的了解就像学习c语言一样,如果你想知道他是怎样在计算机的内存中分布的,具体是怎么运行 的,就要学习汇编语言,当然计算机体系结构,计算机组成原理,是你理解计算机的基础,计算机大师knuth都非 常重视汇编语言(汇编语言和机器语言是一一对应的) ,要想学好软件,脱离硬件是不可能,因为软件最终要靠硬件来运转的。当然了如果是初学者还是要一步步学的, 如果你 想知道c语言是怎么运行的,想了解指针和数组的真正区别,那多学一门语言汇编语言吧,人们都说汇编语言是与 机器相关的,不能移植的,但想在的pc机上用的几乎都是AMD,和intel的处理器,他们有都是互相兼容的,所以指 令集的体系结构都是IA-32当然了现在都有64位的处理器了,但是这并没有什么很大的区别,仅仅是位数变多 了,所能表达的数字变 大了,精度也变的更长了等等。就像学习高级语言一样学习汇编语言也是相通的,因为他们的功能都差不多,而 且更加 简单,你会发现在高级语言中的语法会在汇编语言中消失,仅存的就只是指令的书写格式(相当如词法吧,当 然了我可能也说的不太对,因为对汇编语言学的不是很深入,所以现在也正在有计划的去学习)。如果你学习 的java,vb,c#等等那 么就请您多多看看c和c++吧,我们常常听说某种语言实现了垃圾回收机制,用某种算法不定期的把你程序中不 再使用的内存回收掉,最好的例子就是JAVA 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 45 / 67 页 bbs.theithome.com 了(关于它的一句话说的挺好,一次编译到处运行,非常适用于嵌入式计算机程序的编写),不过你能用JAVA 语言写出 内存回收的程序么 我想应该是不可能,JAVA对于这方面做了太多的限制,但在c/c++中却没有,你可以用库函数malloc等等去分 配内存, free去释放内存, c++中对应的是(new,delete)实现的跟方便些,你也可以用系统调用brk(其实库函数也是调用了他,只不过 做了一些 更加完善的工作而已)去分配,而且他可以直接去操作数据到位(&,|,~),如果说 高级语言是汇编语言的一个子集的话,那么JAVA在这方面就是C/C++的一个子集,我并没有说java不用学, 不好,而 是在学习他之前 应该多去学学C/C++,(注意语法不是特别的重要,重要的是你怎么能在学完语言以后去灵活的运用他),计 算机体系 结构对于你理解 软硬件非常的重要给大家推荐一本书,书名 :计算机组成与设计——硬件/软件接口 作者:David A.Patterson John L. hennessy 出版社:机械工业出版社 ,这本书很不错,能够很好的把软硬件的关系数清楚,而且不像一些国内的体系结构 教材, 看的非常的费劲 谁然讲的都是很清楚,但不能从读者的角度去考虑问题,这本书会让你看的爱不释手的,恩,对于我来说却是 如此,不 适合初学c语言的 ,要有一定的c语言基础。我想还有一点要和大家分享一下,就是学习计算机切忌浮躁,不要像追星族一样,看 到一项 新出的技术就去 学习,新技术会不断的变的,而且很容易让你迷失方向,一定要打好基础,关于计算机基础的书一定要多看, 不要死记 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 46 / 67 页 bbs.theithome.com 硬背,但你发现 你需要死记硬背去记住书中的知识的时候,那么我可以给你个建议把此书放在书架里,去看一些能够引导你一 步步的从 本质上理解知识 的书,首选一些计算机科学丛书,图灵丛书(机械工业出版社,人民邮电出版社,电子工业出版社),我们学 校用的是 清华大学自己出版 的计算机书籍,虽说清华大学在工科方面很不错,但是出版的计算机书籍就我个人来说真的不怎么好,相对于 国外的计算机书籍来说 差的真是太远了,我很不明白为什么要用清华出的,有一本关于Linux/unix内核的书我觉得挺好的,书名是 Linux内核源代码情景分析 浙江大学出版的,我目前正在潜心学习这本书,虽然很难,但真的不错,很少有由我们自己写的关于Linux内核 这方面 的好书,这本就是 不可多得的好书。说了太多关于计算机书籍的话题了,但我认为一本好的书籍真的能给我们很大的帮助 还能从中得到快乐。 如果你只想学习计算机去赚钱的话,那么你大可以不必去学习很多东西,对于你也没有用处,如果你是对 计算机有着非常浓厚的 兴趣的话,那么就塌下心来,一步一步去在计算机的海洋里傲游吧,真是一件美妙的事情。 现在我告诉大家自己认为的关于学习计算机的路程 (1) c语言(可以去学谭浩强写的c语言的书,如果能找到K&R C 那就更好,自己是没有找到,要想进一步去 学习的话 去看 c缺陷与陷阱,c专家编程 ,这两本书很经典的) (2)c++语言(c和c++其实并不一样,可以说c++是继承了c,增加了面向对象的思想,如果能找到 c++program language c++之父写的就很好,不过自己没有找到,要想进一步去学习的话去看 effective c++ 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 47 / 67 页 bbs.theithome.com more effective c++,挺不容易懂的,因为自己要看Linux内核所以没有多少时间去看,c++沉思录(c缺陷与 陷阱 的作者 与他的妻子)也非常的不错,还是没有时间去看,只看了200多页,讲的太好了,有时间自己一定会去看完的, 这本书 讲的主要是教你怎么运用C++语言去写出好的文章) 算法和数据之间的结构的理解也很重要,我想如果你有了c++的学习经验学习数据结构应该不太 困难,一直以来我都不是很明白抽象的数据结构(abstract data type ADT)的抽象是怎么回事是什么意思,之 后看 了c++沉思录才恍然大悟,抽象就是把想关注事务的部分拿出来,不关心的不去考虑,就像我们人类,人有很 多属性, 姓名,年龄,体重等等,当我们研究具体问题是 也许只关心人的属性的某些方面,例如姓名,年龄,那么就把它拿出来也就是术语抽象,在c/c++语言 就用用户自定义的数据类型来去定义人: struct people{ char name[10]; int age; }; struct 是structure(结构)的缩写,这样理解就非常简单了么,所以c++沉思录非常的好。 (3)算法与数据结构(有很多好的书籍,大家可以去找找,反正清华出的不敢恭维) (4)汇编语言,计算机组成原理,计算机体系结构 微机原理(我认为刚才我说 计算机组成与设计——硬件/软 件接口 就很好的包含了这些内容挺不错的,当然了学习是无止境的。 ) 之后才能开始os的学习,我认为OS是让你在学习计算机上有一个质的飞跃,因为现代的程序设计一般都是基于 OS的,如 果不了解OS,那么就不可能学好程序设计,就像建造房子一样,房子要建在地上,如果你不了解当地的环境, 地质,这 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 48 / 67 页 bbs.theithome.com 么怎么能建造好的房子呢(5)操作系统原理的学习,数据库原理的学习(有一本挺好的书,自己是看完了一 遍,电子 工业出版社 的操作系统设计与精髓 作者 stalling 忘了具体怎么拼了,理论性很强,不过是一本好书,要理解性的看) 至于网络原理,软件工程,通信安全,鉴于尚在学习中,就不说了。 哦,还有编译原理,是一门教你怎么把语言翻译成汇编语言,机器语言的一门课,有很多很难的算法,LR算法 就很不好 理解,至于要什么时候学那就在学好语言和算法的基础上去学习吧。记住千万不要赶时髦去学什么VC,BC,包 括MFC之类的,他们只是开 发程序的工具而已 帮你做了一些辅助性的工作,所以好好学习语言吧!还有就是对于什么等级考试一点作用都没有,如果要是我 说现在的 等级考试 只是人家赚钱的一种方式,已经变质了,我不知道为什么不跟上时代的脚步,把它们给取消了,不止是计算机 等级考试 ,英语等级考试也没有用,不管怎么说他都是一门纸上的考试,对于提高自己没有作用,反而会有反作用。如 果你只是 为了拿一个计算机 考试的凭证,那我劝你还是止步吧,我们是为了学习计算机而学习计算机而不是为了学习计算机而去拿那个一 文不值得 证,不然我真不知道你学习计算机还有什么意思。如果真的是对计算机感兴趣那就塌下心来,一步一个脚印的 去探索计算机世界的奥秘,多么美好的事情呀。很多人开始学习的人都是梦想成为黑客,用几个程序去攻击别 人的漏洞,但什么 是黑客,天才的程序员才能配的上,就像Linus等一样,我们的目的是去建造宏伟的建筑,而不是去炸毁他那是 骇客所 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 49 / 67 页 bbs.theithome.com 做的事情,如果你认为别人的建筑有不足之处大可以指出来。这只是我个人的意见,有不足之处请指出,谢谢 了! 还有就是谈谈自己对于Linux学习的看法。学完os以后自己就觉得应该去学习os的内核了,其实当自己刚学 os的时 候就特别特别特别的想去自己写一个os,看了很多东西还是一无所获,当然了这是必然的,因为自己连os有什 么功能, 进程线程,进程调度,虚拟内存,进程间的通信,文件系统,系统调用与中断,都是不知所云,所以当时很是 郁闷, 很是茫然,在学完os之后才对操作系统有一个感性的认识,但是还是太理论了,没有任何源代码的分析,没有 任何 设计os的细节,所以自己只好去看linux源代码了,但是还有一件重要的事没有做,写源代码我要在一个环境中 去写 在哪去写呢,那就是在类UNIX操作系统上(我用的是fedora 9.0的发行版,内核是2.6版的),怎样去编译源代 码呢 用的是一种特殊的格式(其实这种特殊的格式就是在写make命令时,所规定的make 认识的文件)书写去告诉编译器编译的过程是什么,也就是用make命令去解释,在windows上我们所用的 几乎都是IDE(集成的开发环境,编辑器,编译器,调试器等都组装在一个程序中)的开发环境所以想,对于编译的 过程一无所知,所以当初自己看linux内核书籍的时候很是不理解,为什么 每个文件目录下都会有一个Makefile文件,原来但你输入make命令的时候他会自动在当前的目录下按照 makefile, Makefile的顺序去查找是否有此文件名,然后就读取文件进行解释,并告诉gcc编译器怎样编译按照什么样的顺 序编译 这些源文件。之后就是去熟悉linux操作系统,编写Linux上的c程序(unix环境高级编程第二版 是在类unix上学 习的 很好的书籍,因为这些开放源代码的os都是按照POSIX(开放的操作系统接口标准)标准写的,所提供的 API(通用的应用程序编程接口,就是人们把各个方面常用的函数用某种语言编写出来供程序员使用,减少了程 序员的负担,增加了代码的可重用性,就像程序中通常都要与输入输出打交道,所以 Dennis Ritchie 图灵奖得 主、unix 操作系统、c语言之父,就用c语言写出了标准I/O库,但我们遇到库函数的时候也就 能知道其是什么意思有什么功能,为什么呢,都是一样的嘛,就像向标准的输入输出设备读写的printf, scanf 函数,名字都是一样的,所以就有很多好处了) c编程接口都是很一致的,不同os上的扩展肯定是有的,不过大 致上是差不多的,所以在这些os上编写的程序非常容易移植,有错 误估计也只会做一些小的细微的修改就可以了)自己也真在学习中,最后就是Linux内核源代码了,情景分析那 本书我 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 50 / 67 页 bbs.theithome.com 觉的应该是本不错的关于linux内核方面的书了,自己也正在学习中,不过就是太艰难了,不过任何事情都不会 是轻松 的,因为自己喜欢所以去做,只能坚持到底了,呵呵。 有一句话说的好,要想了解一门学科就要先了解他的历史,在学习linux的过程中我深刻体会到了这句话的作 用, 去看看那Linux的发展史吧,对你一定会有帮助的,我们不仅要知其然还要知其所以然的学习,知道linux的现状 还要 知道他是怎么来的,是怎么壮大起来的,linus是linux的开创者,多么令人兴奋那,正是有了这些开放的源代 码,我们 才得以去学习,多么好的事情呀! 其实我并不太喜欢c#和VB因为他们根本就没有移植性可言,是微软为了让更多的人为自己的操作系统编写 应用 程序而开发的,VS,VC就是这个环境嘛,其IDE的人性化确实不错,可却让我们忘却了什么是编辑器,什么是 编译器,什么是调试器,不能组装我们自己喜欢的环境最重要的是c c++ java是不受操作系统限制的,所以又 回到了前 面,学学不受os限制的语言吧,以至于不会被微软牢牢的套住,c#,VB当然可以学,但是在学之前学学这些不受 操作系统限制的语言吧, 不要受那些书籍里的言语的迷糊,说其(c#, VB, VC++.net, VB.net等等)是怎么怎么的好,可是他怎么没有提 及他是不可移植性的呢?! 不说了,Linux内核这样大的阿房宫还要我去游览呢,找个好的导游带我去探险吧! 学习linux续: 自己也是从今年下半年开始了解linux的,这还要感谢的自己的OS老师,如果没有他让我们这些学生知道了 linux,恐怕我现在也不知道 linux呢。之前我和大多数人一样在用windows,不管是应用还是编程,一开始总觉 得还是蛮好的,可是学完了OS原理以后,总觉得缺点什么,自己当初就有想写一个OS的想法, 可是却无从下手,除了基本的语言学习外,有太多的东西需要自己去学习,因为当初自己在学习OS原理 后,没有真正的理解,进程和线程,SMP,和信号量都只是泛泛的知道而已,所以自己清楚只有在完全 明白OS的基本概念和算法以后才能进一步的去学习,于是自己用一个月的时间看完了 William Stallings写的操 作系统——精髓与设计原理,感觉和自己当初看陈向群写操作系统完全不一样,虽然在理论了,可是于是自己 有进一步去学习linux内核0,11版的完全注释,可是看了几天 就看不下去了,什么也看不懂makefile是什么,gcc是什么,它是怎么编译,以前在windows下自己只知道写完 程序然后由TC后VC 去编译,可是现在却完全的茫然了,通过上网和从其他书籍了解到,要想 理解linux,要先学会去用linux,只有这样才能感性的了解linux,于是自己从网上下载了red hat 的后继版本 fedora core 9.0内核是2.6版的,安完之后,进入了GNOME的桌面环境,我发现自己来到了一个新的世界 自己完全成了一个陌生人,完全不知道怎么操作,安软件原来还有这么多的方法,./configure是什么 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 51 / 67 页 bbs.theithome.com make ,make install是什么自己当初都快崩溃了,自己想在上面看电影,可是却什么都看不了RMVB也无法播 放,听说mplayer挺不错的,我就下了源码包,解码包,皮肤包,然后通过书籍和网上教的步骤一步步的去安, 花了几天的时间才能完全的安上,皮肤也出现了,真是不易呀,但是全屏又有画面播放的问题于是自己下了个 realplayer 11的rpm包安装到还是顺利,yum到还是用的 不太明白。这些经历以后自己就通过一本关于 GNU/ Linux的书籍去了解应用linux(自己当初买这本书的时候,还有些犹豫,怎么会有GNU,这是什么呢,应为自 己买书的那个书店只有这一本带 linux的,所以自己就买了,后来才知道, GNU代表着自由软件,它是GNU ' s not Unix 的递归表示),还是有一点点感觉的,呵呵。 大概了解了 linux后 ,自己就去看关于 linux内核的API,找到了 advanced programming in the unix environment,发现真的和其他人说的一样 ,Richard Stevens写 的 太经典了,自己到现在看了有 10章了 ,还在继续学习。因为自己在学校有很多时候不能够用计算机,自己觉得现在可以去看linux内核了, 于是我就去看了,linux内核源代码情景分析 ,但自己对于硬件和计算机体系结构根本就是不了解 ,虽然 在学OS 原理时 ,学校也开了微机原理 和体系结构,因为体系结构是考查课,自己没有完全的 重视,所以自己只能重新 开始计算机体系结构的学习,用的是计算机组成原理——硬件与软件接口 ,也挺不错的,可以说自己通过这本 书真正的了解了什么是硬件什么是软件 ,至于微机原理 ,我真的不想说什么,很重要MMU不讲 ,汇编的也没 有真正的讲完 ,可以说我是 通过计算机组成原理——硬件与软件接口这本书,才真正的了解汇编语言虽然是 MIPS的体系结构 不是intel的 ,真的很不错,自己也知道了 c语言是 如何 翻译成汇编语言的 ,虽然很想去深入的去学习汇编语言,但时间太有限了,还要去应付考试,所以 只能以后去看了,真是舍不得呀! 在看完计算机组成原理后,自己就继续看情景分析看完 存储管理 以后 ,发现自己 反过来再去看这张, 自己完全忘记了,我想这种方法太差了,通过不断的了解才知道还是应该看看linux内核设计与原理和深入理解 linux内核,了解linux内核是怎么设计,为什么会这样设计,我结合自己现在的情况把这两本书的关于存储管理 的基本看完了,然后在去看情景分析的存储管理的源代码,发现原来自己怎么也不明白的,现在竟然一下子就 明白了,这给自己增加了很大的信心,相信自己一定能够在这条道路上走下去 ,现在自己正在学习中,不管是应用linux,通过linux编程,还是看linux内核,我发现我越来越喜欢linux 了, 在linux下一切都变的那么的简单,我离不开linux了! 1.11 给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议 第 52 / 67 页 bbs.theithome.com 1.12 想进大公司学生的困惑 发表时间: 2010-09-21 我是从金蝶软件出来的,所以我还是比较有发言权的。我曾经不止一次的和同学们说过:应届生就要进像金蝶 软件这样的大中型软件公司,这样才有更快的成长。你有这样的努力目标非常值得表扬,相信只要有这样的勇 气,再加上矢志不渝的努力,你一定会梦想成真。 像金蝶软件这样的公司每年都有一定数量的校园招聘计划的,我曾经说过所有招聘应届毕业生的公司对应届生 的要求和对社会招聘人员的水平是不一样的 校园招聘对应聘者的要求是“底子扎实、动手能力强”,会不会这个框架、那个工具人家根本不关心。像金蝶 这样的公司都有自己的内部技术框架,根本用的不是jquery、asp.net mvc、struts、hibernate之类的东西, 如果你只是会用这些框架、工具,而没有扎实的底子的话绝对不会入他们的“法眼”,所以如果你想进入这些 公司的话就要在底子上下功夫,而不是把精力放在学jquery、ajax、mvc之类花拳绣腿的东西。 我当年参加金蝶技术笔试的时候,考题中有60%是课本上的东西(比如数据结构、网络原理、操作系统等), 有20%是计算机英文(中翻英、英翻中),有20%是对一个扩展能力的要求(比如如果你会asp.net的话,他不 会考你怎么用 asp.net 拖放控件写一个网页,而是要你说出asp.net的内在运作机制)。 webform、jquery、mvc之类的东西只不过是用来简化开发的一些框架而已,微软、IBM、SUN之类的公司会 频繁不断的推出各种各样的框架、工具、语言,如果你只是跟着这些新出的东西跑的话会累死的,刚学完asp来 了asp.net,刚学完asp.net又来了webform,刚学完webform又来了asp.net mvc,刚学完asp.net mvc又来 了wpf。。。你永远追不上的。编程最根本的东西却是永远都不会变的,掌握了最根本的东西才会被潮流追,而 不是追潮流。比如我现在做开发的时候,如果项目需要一个新技术,那么我只要照着文档看一会儿就会用了, 我现在的原则就是“用到再学”。 你说你感觉webform没意思了,那我问问你webform中是靠什么实现像开发WinForm程序那样的事件驱动开 发的?ViewState、doPostBack的内部原理是什么样的?webform中数据绑定是怎么实现的?你会写一个 webform控件吗?如果要你重新实现一个webform,你会怎么做? 如果你真能回答这些问题的话你去金蝶就没问题了,因为金蝶内部就有一套模拟webform实现的web开发框 架;否则的话就不要说“webform没啥意思”。 我建议你不要在这个框架、那个框架之间徘徊,也别管它三层、四层还是一百层,多少层写代码的本质都是if、 while、for。既然“学校所有讲解asp.net的书基本是属于那种webform开发形式”,那么你就把webform开发 形式真正搞精通,目标是自己能写一套webform框架出来。有什么问题可以到如鹏网来提问。希望你成 功!!! 另外提一句,金蝶有两套主打产品,一套是K3,这套产品是基于.net技术的,没有用webform、也没有用 1.12 想进大公司学生的困惑 第 53 / 67 页 bbs.theithome.com mvc,而是自己搞的框架;一套是Java的,没有用Struts、没有用spring,更没有用hibernate,也都是自己搞 的框架。所以把精力放在“内功”上。 1.12 想进大公司学生的困惑 第 54 / 67 页 bbs.theithome.com 1.13 C++老鸟感谢C# 发表时间: 2010-09-21 CSDN的语言之争永远没有风平浪静,某天无聊的时候,和一个C++的高手级别的老鸟说起这事,没想到他说 的是:"其实,我很感谢C#的,真的。" 我疑惑了,问道:"你啥时候改用C#了?" "没有啊,我一直都是用C++啊!" "那你刚刚说的是啥意思? "事实。" "?" "现在的C#,已经比C++高级很多了。很多东西,封装做得非常好。同一个功能,可能用C#写得更为简便。" "话虽如此,但那和你感激有啥关系? "因为C++入门太难了,所以很多初学者都学C#去了,所以C++的新生力量就少了,这样对我们大龄的程序 员冲击就少多了。" "不过,话虽如此,但那些初学者都是菜鸟,对于你这高手应该不会造成什么冲击吧?毕竟你们的经验什么的 不在一个档次上的。" "先说个别的,你认识洪XX没?" "是不是在C#论坛上还挺有名的,经常帮助菜鸟的那个?" "对,就是他。他前几天被公司炒掉了。" "哦,那没事啊,他肯定很快找到东家,毕竟是高手级别的人物啊!" "嗯,后来他是找到了工作,不过,不如意啊,工资只有以前的70%。" "嗯?不可能!他傻了啊,少了那么多,还去啊?" "没辙啊,他找了很多家公司,都只是开那么多的薪水。" 1.13 C++老鸟感谢C# 第 55 / 67 页 bbs.theithome.com "不可能啊,他技术那么牛!一个人能顶好几个人呢!" "没办法啊,人家公司说,他们只需要能满足公司业务的人,而不是花高薪去聘请一个什么都懂的。虽然他很 强,一进公司就能上手,就能直接开始工作,但公司还是宁愿去请一个一般点的,因为C#很简单,培训两三个 月,就能承接公司的工作了,没必要每个月多花一两万去请一个高手。这多出的钱,足以多请几个菜鸟,然后 再培训他们了。" "啊?" "所以,这份工作虽然工资不比以前,但他也只能欣然接受了。" "唉,不知道说啥了。" "但我就不怕。" "?" "因为我用的是C++!大家都一窝蜂去学C#去了,C++的有生力量就少了啊!像前几天我们公司想招个 C++,结果一票子人都是学C#,JAVA之类。直到现在,还是没招到人呢!" "......" "所以无聊的时候,看到有人在论坛上有人唱衰C++,我也就拼命起哄,绝对是不把C++贬得一无是处就不 罢休。" "......" "只有这样,大家看衰了C++,很多初学者就会觉得迷茫,就不去学习C++。没有了新鲜血液,我们这些老 人就不用怕了。" "难道你就不怕C++没落了?" "不会的。C#有C#的好,C++有C++的棒。C#做的事情,C++做起来不一定顺手;同样,C++能做的,C# 不一定能够称心。这两个语言各有长处。但唯一不同的是,学习C#的人越来越多,而C++的人越来越少,在新 鲜血液的补充上面,这差异是明显的。" "嗯,也是" "而这差异,就导致了不少C#高手提心吊胆,担心同事,担心菜鸟会超越自己,导致饭碗不保。毕竟,菜鸟 有一天也会成为高手,即使只有1%能成为高手,也会因为新手的基数太大,这高手的数量也绝对不少。而这 C++呢,即使有40%能成为高手,真正的数量相对于C#而言,也只是沧海一粟。" 1.13 C++老鸟感谢C# 第 56 / 67 页 bbs.theithome.com "所以,你就很悠哉了?" "那肯定不行。作为程序员,一定要用到老,学到老,不能啃老本啊。不过相对于那些C#高手而言,我还是 幸运点,我可以不用去提心吊胆担心哪个同事会超过我啊,还要小心谨慎堤防下属之类,因为即使我想提防也 没有人给我提防啊!" "哈哈,说白了,你觉得C++安心,是因为没有后来人啊!" "哈哈,那是啊!" "你这家伙,太那个了......" "没辙啊,难道不是么?饭碗就那么几个,人越多,竞争就越激烈。即使你的实力脱颖而出,幸运地拿到了这 个饭碗,也因为供大于求的关系,薪水也会大为减少!但对于C++而言,就是求大于供,即使是供大于求,这 供求比例也比C#的少多了,所以薪水相对就会高一点啦!" "怪不得你老是在论坛上推荐初学者学习C#,我还以为你对C++失去了信心呢!原来你打的是这主意!" "那是,少一个人学C++,就少一份竞争压力!" "你就不怕人家初学者识破你的诡计,找你算账啊?" "怕啥?我推荐初学者学C#,他们能够很快上手,也就很快能够找到工作,这对于他们的家庭,他们的生活 难道不好吗?大家都是人,都是要吃人间烟火的。难道你要他去学C++,然后闷头闷脑入了几个月的门,还没 找到工作啊?" "你这家伙,太邪恶了,包藏祸心啊!还好当年我没信你的!" "哈哈,我也要养家,也要糊口的,总不能让我家小孩到外面乞讨丢人吧?人不为己天诛地灭啊!" "哈哈......" C++好,还是C#好?这种事情永远没有答案。只要存在,就必然有其相应的道理。选择哪种,对于老鸟们而 言,根本就不存在这个问题。只可惜了那些初学者,在众多老鸟的唇战中,迷茫。相对而言,初学者与其纠缠 于哪种语言更优异,还不如擦亮眼睛,看看众多争论之后的用意,毕竟明升暗降,暗渡陈仓之类的老祖宗的智 慧,从古至今,从无间断。或许,无从选择之余,看看陆琪的毒舌,说不定还更有收获。 1.13 C++老鸟感谢C# 第 57 / 67 页 bbs.theithome.com 1.14 高手是怎样练成的 发表时间: 2010-09-21 手成长的六个阶段 程序员怎样才能达到编程的最高境界?最高境界绝对不是你去编两行代码,或者是几分钟能写几行代码,或者 是用什么所谓的可视化工具产生最少的代码这些工作,这都不是真正的高手境界。即使是这样的高手,那也都 是无知者的自封。 我认为,一个程序员的成长可分为如下六个阶段。 第一阶段 此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。 第二阶段 此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函 数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。 第三阶段 此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。 第四阶级 此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入 了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。 这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一 下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是 比较困难的。为什么会难呢?这就是因为很多人的思想转变不过来。 第五阶级 此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从 内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析, 并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。 1.14 高手是怎样练成的 第 58 / 67 页 bbs.theithome.com 第六阶级 此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么 代码就能表示的。也就是“手中无剑,心中也无剑”。 此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就 用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。 每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐 心地去学习。 要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练 手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的 突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难 些的软件,他们往往还是无从下手。 现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的,不过这样的程序员一般在 软件公司也能独当一面,完成一些软件的模块。 但是,也还有一大堆处在第一阶段的程序员,他们一般就能玩玩VB,做程序时,去找一堆控件集成一个软件。 现在一种流行的说法是,中国软件人才现在是一个橄榄型的人才结构,有大量的中等水平的程序员,而初级和 高级程序员比较少。而我认为,现在中国绝大多数都是初级的程序员,中级程序员很少,高级的就更少了。所 以,现在的人才结构是“方塔”形,这是一种断层的不良结构。而真正成熟的软件人才结构应该是平滑的三角 形结构。这样,初级、中级、高级程序员才能充分地各施所长。三种人才结构对比如图1.1所示。 1.2.2 初级程序员和高级程序员的区别 一般对于一个问题,初级程序员和高级程序员考虑这个问题的方法绝对是不同的。比如,在初级程序员阶段 时,他会觉得VB也能做出应用来,且看起来也不错。 但到了中级程序员时,他可能就不会选择VB了,可能会用MFC,这时,也能做出效果不错的程序。 到高级程序员时,他绝对不是首先选择以上工具,VB也好,VC也好,这些都不是他考虑的问题。这时考虑的绝 对是什么才是具有最快效率、最稳定性能的解决问题的方法。 软件和别的产品不同。比如,在软件中要达到某个目标,有n种方法,但是在n种方法中,只有一种方法或两种 方法是最好的,其他的都很次。所以,要做一个好的系统,是很需要耐心的。如果没有耐心,就不会有细活, 有细活的东西才是好东西。我觉得做软件是这样,做任何事情也是这样的,一定要投入。 1.14 高手是怎样练成的 第 59 / 67 页 bbs.theithome.com 程序员到达最高境界的时候,想的就是“我就是程序,程序就是我”。这时候我要做一个软件,不会有自己主 观的思路,而是以机器的思路来考虑问题,也就是说,就是以程序的思考方式来思考程序,而不是以我去设计 程序的方式去思考程序。这一点如果不到比较高的层次是不能明白的。 你设计程序不就是你思考问题,然后按自己的思路去做程序吗? 其实不是的。在我设计这个程序的时候,相当于我“钻”入这个程序里面去了。这时候没有我自己的任何思 维,我的所有思维都是这个程序,它这步该怎么走,下步该怎么走,它可能会出现什么情况。我动这个部分的 时候,别的部分是否要干扰,也许会动一发而牵全身,它们之间是怎么相互影响的? 也只有到达这个境界,你的程序才能真正地写好,绝对不是做个什么可视化。可视化本身就是“我去设计这个 程序”,而真正的程序高手是“我就是程序”,这两种方法绝对是不同的。比如,我要用VB去设计一个程序, 和我本身就是一个程序的思维方式,是不一样的。别人也许觉得操作系统很深奥,很复杂,其实,如果你到达 高手状态,你就是操作系统,你就能做任何程序。 对待软件要有一个全面的分析方法,光说理论是没有用的。如果你没有经过第一、第二、第三、第四这四个阶 段,则永远到达不了高境界。因为空中楼阁的理论没有用,而这些必须是一步一步地去做出来。 一个高级程序员应该具备开放性思维,从里到外的所有的知识都能了解。然后,看到世界最新技术就能马上掌 握,马上了解。实际上,技术到达最高的境界后,是没有分别的。任何东西都是相通的,只要你到达这个境界 以后,什么问题一看就能明白,一看就能抓住最核心的问题,最根本的根本,而不会被其他的枝叶或表象所迷 惑,做到这一步后才算比较成功。 从程序员本身来说,如果它到达这一步以后,他就已经形成了开阔的思维。他有这种开放性思维的话,他就能 做战略决策,这对他将来做任何事情都有好处。事实上,会做程序后,就会有一种分析问题的方法,学会怎么 样把问题的表象剖开,看到它的本质。这时你碰到任何具体的问题,只要给点时间,都能轻而易举地解决。实 际上,对开发计算机软件来说,没有什么做不了的软件,所有的软件都能做,只是看你有没有时间,有没有耐 心,有没有资金做支撑。 这几年,尤其是这两三年,估计到2005年前,中国软件这个行业里面大的软件公司就能形成。现在就已经在形 成,例如用友,它上市后,地位就更加稳固了。其他大的软件企业会在这几年内迅速长大。这时候,包括流通 渠道、经销商的渠道也会迅速长大。也就是说,到2005年以后,中国软件这个行业的门槛比现在还要高很多, 与美国不会有太大的差别。此时,中国软件才真正体现出它的威力来。如果你是这些威力中的一员,就已经很 厉害了。 别人可能知道比尔·盖茨是个谈判的高手,是卖东西的高手,其实,比尔·盖茨从根本上来说是个程序高手,这是 他根本中的根本。他对所有的技术都非常敏感,一眼就看到本质,而且他本身也能做程序,时常在看程序。现 在他不做董事长,而做首席设计师,这时他就更加接近程序的本质。因为他本身就有很开阔的思维,又深入到 技术的本身,所以他就知道技术的方向。这对于一个公司,对他这样的人来说,是非常重要的。 如果他判断错误一步,那公司以后再回头就很难了。计算机的竞争是非常激烈的,不能走错半步。很多公司以 1.14 高手是怎样练成的 第 60 / 67 页 bbs.theithome.com 前看上去很火,后来就 销声匿迹了,就是因为它走错一步,然后就不行了。为什么它会走错?因为他不了解技 术的本质在哪里,技术的发展方向在哪里。 比尔·盖茨因为父母是学法律的,所以他本身就很能“侃”,很有说服力,而他又是做技术的,就非常清楚技术 的方向在哪里,所以他才能把方向把握得很准确,公司越来越大。而别的公司只火一阵子,他却火了还会再 火。就算微软再庞大,你如果不把握好软件技术的最前沿,一样也会玩完。就像Intel时刻把握着CPU的最新技 术,才能保证自己是行业老大。技术决定它的将来。 因为计算机技术没有任何时候是突变的。它的今年和去年相差不会很大,但是回过头来看三年以前的情况,和 现在的距离就很大。所以说,如果你每年都跟着技术进步的话,你的压力就很小,因为你时刻都能掌握最新的 技术。但是,如果你落下来,别说十年,就是三年,你就赶不上了。 如果你一旦赶不上,就会觉得非常吃力;如果你赶不上,你就会迷失方向;如果你迷失了方向,你就觉得计算 机没有味道,越做越没劲。当你还只是有个思路的时候,别人的产品都做出来了,因为你的水平跟别人相差太 远,人家早就想到的问题,你现在才开始认识。水平越高,他就看得越远,那么他的思维就越开阔;水平越 低,想的问题就越窄。 64位CPU是这个十年和下个十年最重要的技术之一,谁抓住这个机会,谁就能抓住未来赚钱的商机。CPU是英 特尔设计的,对这一点他肯定清楚。举例来说,如果从64位的角度来看现在的32位,就像从现在的角度去看 DOS。你说DOS很复杂吗?当你在DOS年代的时候,你会觉得DOS很复杂。你说现在的Windows不够复杂 吗?Windows太复杂了,但是你到了64位的时候再去看Windows,就如同现在看DOS一样。 整个64位系统的平台和思维方式、思路都比现在更开阔,打个比方说,现在的Windows里面能开n个DOS窗 口,每个DOS窗都能运行一个程序。到达64位的时候,操作系统事实上能做到开n个X86,开n个Windows 98,然后再开n个Windows 95都没有问题,系统能做到这一步,甚至你的系统内开n个Windows NT都没有关 系。这就是64位和32位的差别。所以,微软的那些“老头”,四、五十岁的那几个做核心的人,现在正在玩这 些东西。你说微软的技术它能不先进吗?是Linux那几个玩家能搞定的吗? 微软的技术非常雄厚,世界计算机的最新技术绝对集中在这几个人手里。而且这几个人的思维模式非常开阔, 谁都没有意识到的东西他早就开始做了。现在64位的CPU都出来一二年了,你说有什么人去做这些应用吗?没 有,有的就是那几个UNIX厂商做好后给自己用的。 所以,追求技术的最高境界的时候,实际上是没有年龄限制的。对我来说,现在都三十三了,我从来没有想过 退出这行,我觉得我就能玩下去,一直玩到退休都没有问题。我要时刻保持技术的最前端,这样的话对我来说 是不困难的,没有任何累的感觉。 很多人说做程序不是人干的事情,是非人的待遇。这样,他们一旦成立一个公司,做出一点成绩,在辉煌的时 候马上就考虑退出。因为他们太苦了,每天晚上熬夜,每天晚上烧了两包烟还不够,屋子里面简直就缺氧了, 好像还没有解决问题。 1.14 高手是怎样练成的 第 61 / 67 页 bbs.theithome.com 白天睡觉,晚上干活,那当然累死了,这是自己折腾自己。所以,做程序员一定要有一种正常的心态,就是 说,你做程序的时候,不要把自己的生活搞得颠三倒四的。如果非得搞得晚上烧好多烟才行,这样你肯定折腾 不到三十岁,三十岁以后身体就差了。 事实上,我基本上就没有因为做程序而熬夜的。我只经历过三次熬夜,一次是在学校的时候,1986年刚接触计 算机时,一天晚上跟一个同桌在计算机室内玩游戏,研究了半天,搞着搞着就到了天亮,这是第一次。然后在 毕业之前,在286上做一个程序。还有一次就是超级解霸上市前,那时公司已吹得很大了,那天晚上没法睡觉。 一般来说,我也是十二点钟睡觉,第二天七点就起了。所以说,只有具有正常的生活、正常的节奏,才有正常 的心态来做程序员,这样,你的思路才是正常的,只有正常的东西才能长久。搞疲劳战或者是黑白颠倒,时间 长久后就玩不转了,玩着玩着就不想玩了。 只要你不想玩,不了解新技术,你就会落后,一旦落后,你再想追,就很难了。 在这一节中,主要讲从我的经验来看,一般程序员需要注意的地方。教你怎样去具体学习不是我的责任,你可 以去任何一个书店去找一本书回来自己看就可以了。这里只是对这些书做一些补充以及一些平常从来没注意的 内容。 入门最基本的方法就是从C语言入手。如果以前学过BASIC语言的话,那么从C语言入手是非常容易的。我就经 历了一个过程,根本不觉得这中间有太大的难度。其实,C语言本身和BASIC没有什么两样。BASIC每个所谓的 命令在C语言里面都可以做成一个函数来实现,那么你就能用那个命令组合成整个程序。从这个角度来看, BASIC和C语言没有本质的差别。C语言就是入门的正确方法,没有其他。 现在的C语言本身就包含了嵌入汇编,使学习汇编语言的时候更加方便。你可以忽略掉纯汇编里面的很多操作。 也许有人觉得这个方法太慢了。但要知道,工欲善其事,必先利其器,要想成功,没有一个艰苦的过程是不可 能的,所以一开始的时候就要有耐心。如果你准备花5年的时间成为高手,那我敢说,你根本不用等到5年,你 只要有这个耐心就足够了,你可能2年~3年内就能达到目标。但如果你想在一年时间内就成为高手,即使5年 后,你还是成不了高手。 我们公司1998年招的开发人员都是应届大学毕业生。很明显,有人好像什么都会,又会CorelDraw,又会 Photoshop,又会Flash,又会C++,甚至VB也会。可是这样的人到现在还是全都会,但是什么事情也做不 好,做的东西“臭”死了。但其中有一个人就不同,他以前甚至连Windows的程序都没有做过,只会在DOS下 做几个小程序。但当我们把超级解霸的程序给他看,让他去研究的时候,他只用一周的时间,就迅速掌握。他 那个月进步非常快,几乎就是一生中进步最快的阶段,这就是一个质的飞跃。 从基本入手以后,当你的积累到达一个阶段以后,就会有一个质的飞跃的阶段。事实上,我也有这么一个阶 段,这个阶段也是我离开大学以后,真正去公司做事的时候。当我真正拥有一台计算机后,我把所有以前积累 1.14 高手是怎样练成的 第 62 / 67 页 bbs.theithome.com 的问题在一个月内做了探讨以后,感觉自己的水平迅速提高。 入门和积累是很重要的。事实上,到达高手的境界以后,不管什么语言不语言的,其实都根本不用去学,只要 拿过来看两天,就全部精通。如果你没有入门,即使去书店找n本书,天天背它,你也不会成为高手。 所有的语言只是很花哨的表面东西。高手马上就能透过它的表象而看到它的本质。这样才是真正的高手。他不 需要再去学什么Java,或者其他什么语言。当他真正要写个Java程序的时候,只要把Java程序拿过来看一看, 瞄一瞄书,就全都清楚了。如果这时他学VB就更容易了,我想他不用一天的时间,就能学会。到达高手的境界 以后,所有的事物都是触类旁通的。 当你成为C语言的高手,那么就你很容易进入到操作系统的平台里面去;当你进入到操作系统的平台里去实际做 程序时,就会懂得进行调试;当你懂得调试的时候,你就会发现能轻而易举地了解整个平台的架构。这时候, 计算机基本上一切都在你的掌握之中了,没有什么东西能逃得出你的手掌心。 上面只是针对程序的角度说明,另外一点也很重要,即好的程序员必须具备开放性思维,也就是思考问题的方 法。程序员,尤其现在很多的程序员,都被误导从MFC入手,这就很容易形成一种封闭式的思维模式。这也是 微软希望很多人只能学点表面的东西,不致成为高手,所以他大力推荐MFC之类的工具,但也真有很多人愿意 去上他的当,最后真正迷失方向。说他做不了程序吧,他也能做程序,但是如果那个程序复杂一点,出现问题 时,问题出在哪里就搞不清楚了,反正是不清楚。如果你真正有一种开放性的思维,在你能够成为高级程序员 的时候,对MFC这些是不屑一顾的,MFC、VB根本不会在考虑的范围之内。 事实上很多人,包括外面很多公司里面工资挺高的人,可能一个月能拿五、六万的这些人,他们的思维也不一 定能达到很高的境界。但是,他确实做了很多的事情,已经有很好的积累了。但要上升到更高的境界上,就要 有正确的思维方法。这就是为什么比尔·盖茨说,他招人的时候宁愿招一个学物理,而不是学编程的。学物理的 人会有非常非常广的思维,他考虑的小到粒子,大到宇宙,思维空间非常广阔,这样,他思考问题的时候,就 会很有深度。 有人研究物理研究得比较深的时候,他能针对某个问题一直深入进去。很多写程序的人只会注意到这行代码或 那行代码,则比较起来则显得肤浅。所以,编程的时候也要深入进去,把你的爱好、你的所有思维都放进去, 努力做到物我合一的境界。 1.14 高手是怎样练成的 第 63 / 67 页 bbs.theithome.com 1.15 我们到底该怎么学技术?如何成为一个优秀的技术人员? 发表时间: 2010-09-21 看了不要迷失在技术的海洋中,深表同意。在后来的评论中大家也表达了自己的看法。让我觉得很有意思的 是,大家的观点惊人地一致——几乎没有反对的声音。 不过从经验上来看,意见太统一也不一定是一件好事。我有时也会小人之心地想,表示赞同的朋友们是真与 LoveCherry的想法一致,还是仅仅因为自己以前对待技术随波逐流不堪所累,现在把这篇文章作为救命稻草看 待,追求自身的心理平衡呢?LoveCherry写这篇文章,是基于他对于技术和思想的深度。如果我们没有达到这 样的程度,是否会误解他的意思,得到的仅仅是一种心理安慰,却失去了更多东西呢? 我们到底该如何学习技术?或者说,如何成为一个优秀的技术人员? 扎实的基础 如果要成为一个优秀的技术人员——我并没有说是“开发人员”,比如也包括“测试人员”吧——一定需要扎 实的基础。什么叫做扎实的基础呢?其实就是我们大学所学的课程——离散数学、算法与数据结构、操作系 统、计算机体系结构、网络、编译原理等等。现在它们经常被视为“没有用”,但是我认为这些都是一个优秀 技术人员成长和前进的基础。不知道大家有没有过这样的感觉:某天早上一醒来,发现对于最近接触的事物有 了新一层的认识,似乎什么都不会了,却好像什么都理解了——就像张无忌练太极剑,不求剑招,只求剑意。 我曾经有过两次这样的感觉,真可谓豁然开朗。其实我想,这就是所谓的“突破瓶颈”。而引起“量变到质 变”的关键,可能就是您忽视的那些课程,那些一进大学就被“灌输”的知识。 在面试时我经常听到这样的话:“我的理论和基础不行,但是我让我写代码是没有问题的。”这样看来,基础 真的没有用吗?我并不这样认为,因为…… 如果您不了算法和数据结构,又如何从.NET Framework(甚至包括Power Collections,在这里我强烈推荐这 个组件)琳琅满目的数据结构中做出最适合目前需求的选择呢? 如果您不了解操作系统,又如何能深入Windows系统,写好.NET Framework程序,或者在postmortem环境 中做调试呢? 如果您不了解计算机体系结构,又如何能在Multi-CPU(Multi-Core)时代写出真正高效的应用程序呢? 如果…… 因为我们不光要写代码,而且要写好的代码,因此我们必须强调基础。很多时候技术人员之间能力的高低,很 可能就会取决于这写基础。有朋友告诉我,这些计算机科学的基础的意义不仅仅在于知识本身,它们还能够让 人的思维更符合计算机科学的发展和变革——这可能说的有点远大,但是我基本上同意这个看法。如果说得简 单一些,它们让您的思维方式更适合这个行业——试想,如果您知道了计算机/程序/框架/系统是怎么想的,他 们还能够为难你吗? 1.15 我们到底该怎么学技术?如何成为一个优秀的技术人员? 第 65 / 67 页 bbs.theithome.com 举一个例子,微软有着大量高素质的技术人员,他们是微软惊人生产力的源泉。因此微软能够在Vista和Office 开发完成之后将大量牛人派去作Windows Live产品研发。在我们很多技术人员看来,Vista是操作系统, Windows Live是Web,两者大相径庭。但是微软就是能够有大量的技术人员作此类迁移。再举一个例子,当年 Google挖角Microsoft许多技术人员,难道他们跳槽去Google继续作微软产品的研发吗?正是因为那些技术人 员有着扎实的基础能力,因此就能够在各种类型的技术之间游刃有余,即使它们“表面”上看来差距有多大。 表面?这两个字放在这里是什么意思?因为这就是我想说的就是…… 技术之间的关系 其实《不》一文的中心思想,就是不要随波逐流,不要迷失在技术的汪洋之中。我很同意,但是我也想补充一 点我的看法。 在《不》文的评论中,我看到了一段话,其主要意思就是:“如果一个技术不会用到,就不要去学它。当要用 的时候再去学”。首先表明我的观点:我不同意。这里我想举一个例子: 我是今年1月份加入目前的公司的,公司的技术团队当时使用.NET Framework 1.1进行应用开发。是时由于业 务的原因需要开发一个平台以及其他一些应用,我在时在技术部门内部强烈建议将新系统使用.NET Framework 2.0 + 3.0的方式进行构建。我的理由是:“使用.NET Framework 2.0构建新平台在基础设施上不会增加任何成 本,但是在功能和性能上都会有提高。而.NET Framework 3.0,尤其是WCF,是微软提供的新组件,也即将成 为微软平台上通信的标准。”领导同意了我的建议,并希望我带领新的团队进行新平台的开发。过程中的细节 就不一一道来了,现在回头看来过程虽有波折,但是倒也收到了较好的效果。我们经常会发现有技术人员会抱 怨技术发展地太快,但是就拿我之前的例子来说,在2007年还在使用2001年出现的东西,却忽视2004年就已 经成熟的技术,这究竟是技术发展的太快,还是我们没有根本没有去跟进技术呢? 我想答案很明显是后者,这其实就是“如果一个技术不会用到,就不要去学它。当要用的时候再去学”。我们 不会(或者很难)因为不断钻研老技术而领会新技术,掌握新技术是需要我们主动去追求的。如果一个人不追 求,他就难以发展。如果人人不追求,那么整个技术团队就难以发展。不过我认为,其实只要怀着“把项目做 的更好”的想法,追求新的技术和实践(例如重构、TDD)是自然而然的事情。 不论您是普通开发人员、技术经理抑或是架构师,我想您都不能止步不前。有人说,领导不愿意使用新技术, 我们没有办法——那么设法说服他们。如果他们不能给出让您满意的理由,如果您觉得他们妨碍了您的发展, 那么可以选择离开。我想有追求的您一定不会在找工作的问题上遇到太多麻烦。:) 似乎话题有些偏了,我们回到正体。新技术那么多,我们到底该怎么学呢?我这里想说的就是,新技术并非洪 水猛兽。在一定程度上,我们完全可以驾驭它们。 我们来想一下,新技术是怎么来的?新技术并不是某些公司的牛人们拍脑袋出来的,新技术也是发展过来的。 发展需要时间,发展是一个过程。例如C# 3.0由2.0发展而来,CLR 2由CLR 1发展而来。根据我的经验,如果一 1.15 我们到底该怎么学技术?如何成为一个优秀的技术人员? 第 66 / 67 页 bbs.theithome.com 个技术人员能够较好地掌握.NET Framework 1.1,他几乎能够轻而易举地过渡到.NET Framework 2.0。他之 需要了解一下新特性,找一些资料比较一下前后两者的改变即可。我们并没有创造技术,我们只是在跟进。为 什么总有人能够在技术出现不久就写出大量文章或书籍来进行推广呢?这就是值得我们思考的地方。 举个例子,如果要从.NET 2.0升级到3.5(我不懂VB,用VB的朋友抱歉了),其实您只需要了解…… ListView控件:一个控件而已。 集成了ASP.NET AJAX:不是新东西了。 Linq To XML:一套新的语法用于解析和构建XML。 Linq To Object:枚举,只是枚举。 Linq To Sql:可以视作简单的一套ORM,动态生成SQL语句。 Lambda Expression:即使没有接触过LISP(很幸运,我大学课程中有Functional Programming这门课:)), 我想如果您了解编译原理的话,对此也应该不陌生了。 …… 真的不多。其实我觉得,跟进每个人各自领域的技术并非不可能的事情。我一再提到这么一句话:一个优秀的 技术人员,他的知识架构应该成倒T字形,有着扎实的底盘,并且成为某个领域的专家。 我们究竟该如何学习基础呢? 扎实。我认为,这是关键。 您有扎实的基础吗?这是成为优秀技术人员知识储备。 您对于每项掌握的知识或技能都学的扎实吗?这是您前进过程中的助手。 您有扎实的学习目标和计划吗?这是您在技术汪洋中的指南针。 我的文章写完了。 我很理想,我也在努力。:) 1.15 我们到底该怎么学技术?如何成为一个优秀的技术人员? 第 67 / 67 页 bbs.theithome.com
还剩66页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

517832403

贡献于2014-04-15

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf