第一篇:程序学习心得
经验分享
(一)一位高级程序员给学弟学妹的建议我始终认为,对一个初学者来说,IT 界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的DDMM 们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS 站友眉飞色舞的讨论C# 里面可以不用指针等等则让我觉得好笑。C# 就象当年的ASP 一
样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”96,97 级的不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的.几个误区
初学者对C# 风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种:
1.认为计算机技术等于编程技术:
有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关的课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。
其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT 业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面。编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是,不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白,自己这些东西,学的时候并不比其它专业难,所以自然也不会高档到哪里去。
2.咬文嚼字的孔已己作风:
我见过一本女生的《计算机网络原理》教材,这个女生像封学生一样在书上划满了横杠杠,笔记做得满满的,打印出来一定比教材还厚。我不明白的是,像计算机网络原理这样的课程有必要做笔记?我们的应试教育的确害了不少学生,在上《原理》这一类课程的时候许多学生像学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行为。所谓《原理》,即是需要掌握它为什么这样做,学习why,而不是how(怎样做)。极端认真的学生背下以太网的网线最大长度,数据帧的长度,每个字段的意义,IP报头的格式等等,但是忘了路由的原则,忘了TCP/IP 协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。
在学习编程的时候这些学生也是这样,他们确切的记得C++ 语法的各个细节。看完了C++ 教程后看《Thinkingin C++ 》(确实是好书),《Inside C++ 》,《C++ reference 》,this C++, that C++……,然后是网上各种各样的关于C++ 语法的奇闻逸事,然后发现自己又忘了C++ 的一些语法,最后回头继续恶补…。有个师弟就跟我说:“C++ 太难了,学了这里忘了那里,学了继承忘了模板。” 我的回答道:“你不去学就容易了”。我并没有教坏他,只是告诉他,死抠C++ 的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++ 语法太关心,动手编程就是了,有不记得的地方一查MSDN 就立马搞定。我有个结论就是,实际的开发过程中对程序语法的了解是最微不足道的瞄识。这是为什么我在为同学用Basic(我以前从没有学过它)写一个封程序的时候,只花了半个封时看了看语法,然后再用半个封时完成了程序,而一个封时后我又完全忘记了Basic 的所有关键字。
3.不顾基础,盲目追赶时髦技术:
终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的,而且IT 技术进步是如此的快,不跟进就是失业。但是对于初学者来说(尤其是时间充裕的大中专在校生),这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西,学习why 而不是how。时髦的技术往往容易掌握,而且越来越容易掌握,这是商业利益的驱使,为了最大化的降低软件开发的成本。但在IT 领域内的现实就是这样,越容易掌握的东西,学习的人越多,而且淘汰得越快。每一次新的技术出来,都有许多初学者跟进,这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间,而等他学会了,这种技术也快淘汰了。基础的课程,比方数据结构,操作系统原理等等虽然不能让你立马就实现一个linux(这是许多人嘲笑理论课程无用的原因),但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方Win32 SDK 程序的设计,DDK 的编程)来说甚至是不可或缺的。
一个活生生的例子
我和我的一个同学,在大一时我还找不到开机按纽,他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编,计算机体系结构,数据结构,操作系统原理等等这些课程的学习上,而他则开始学习HTML 和VB,并追赶ASP 的潮流。大三的时候我开始学习Windows 操作系统原理,学习SDK 编程,时间是漫长的,这时我才
能够用VC 开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已,但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方:假设学习VB 编程需要4 个月,学习基础课程和VC 的程序设计需要1 年。那么如果你先学
VB,再来学习后者,时间不会减少,还是1 年,而反过来,如果先学习后者,再来学VB,也许你只需要1 个是期就能学得非常熟练。
几个重要的基础课程
如果你是学生,或者如果你有充足的时间。我建议你仔细的掌握下面的瞄识。我的建议是针对那些希望在IT 技术上有所成就的初学者。同时我还列出了一些书目,这些书应该都还可以在书店买到。说实在的,我在读其他人的文章时最大的心愿就是希望作者列出一个书单。
大学英语-不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来,而现在的许多出版社干脆就直接把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 页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。
你还可以在CSDN 上阅读到许多书评。这些书评能够帮助你决定读什么样的书。
日三省乎己
每天读的书太多,容易让人迷失方向。一定要在每天晚上想想自己学了些什么,还有些什么相关的东西需要掌握,自己对什么最感兴趣,在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用,这样能够让你不是追赶技术潮流而是引领技术潮流。同时,努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。
把最多的时间花在学习上
这是对初学者最后的忠告。把每个是期玩CS 或者CS 的时间压缩到最少,不玩它们是最好的。同时,如果你的ASP 技术已经能够来钱,甚至有公司请你兼职的话,这就证明你的天分能够保证你在努力的学习之后取得更好的收益,你应该去做更复杂的东西。眼光放长远一些,这无论是对谁都是适用的。
相信你已经能够决定是否学习C #或者什么时候去学它了。
经验分享
(二)一个老程序员给青鸟学生和即将读青鸟学生的建议和评价 在这篇帖子开始之前,我先自我介绍一下,这个介绍只是为了让大家了解我说这些话语的公正性,本人是重本毕业,先后在一个不出名的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 年学习掌握了.net 和j2ee,那些在大学耗费4 年学习数据结构,线性代数,高等数学的计科学生积累的厚重不是你们比拟的,你们小公司有用武之地,那是因为你们是青鸟针对小企业量身打造的人才,而大学生是做为IT高级人才打造的,现状是大学生太多以及大学生自己不争气,不学好这些科目,搞得一塌糊涂,但是你们要想发展,必须把大学的数学相关科目补好,否则,小公司以及2000*3000 的薪水,失业,竞争,就会伴随你一辈子。
所以,不要相信你们在青鸟学校里那些老师对你们的j2ee 和.net 吹捧,你们是靠这个找工作,但是这个东西是最没有技术含量的,你花1 年能学会,别人不能吗?没有几年的数学逻辑积累,你们的现状是很残酷的。有人说,自学高等数学,数据结构,太夸张了吧?没错,很难,你们选择了青鸟,让你们具备了找工作的能 力,但是,确实在某种程度上,你们成就高手这一步,将困难万分。
真正值钱的项目,是海量数据,专业性极强的分析系统,真正值钱的技术人才,也要从数据计算处理分析这里着手。
这里奉劝各位青鸟的老师,不要误导学生j2ee 和.net 了,这两门一定要学好,但是,不是把学生送出门就可以了,他们将来还要存活还要发展,逻辑和算法才是真正的王道。你们可以不懂,但是不能这么教学生啊。
经验分享
(三)一个程序员的体会
昨天,叔叔给我介绍了一份工作,搞推销,完成任务给1000 元,完不成任务给500 元。我又一次拒绝了,爸爸问我为什么不干,我说不想从事这个行业。这次爸爸终于发怒了,真说我“不要脸”,还说了好多难听的话。我知道,矛盾终于爆发了......这是理想和现实的一次碰撞!我不怨爸爸,只怪我自己不争气,这是我第n 次拒绝工作了,这之前有亲戚、朋友、同学给我介绍工作,都被我婉言谢绝了,不是我不想工作,而是我想从事自己喜欢的行业**it 业,我想成为一名真正的程序员!我不敢想像做一份你不喜欢的工作,会有多少的工作热情,会给公司带来多大的经济效益?整日从事这样一份工作,是一种怎样的折磨?只会带来思想上的麻木,意志上的消磨,时间长了,你会越来越离不开目前的工作,虽然你不喜欢,但是已经习惯了。我不想这样!
但是现实是残酷的!我必须工作挣钱养家,首先要养活自己,我不能再靠父母养活,他们养活我20多年已经不容易了,该是我回报他们的时候了!可是理想和现实总是存在差距,下面说说我的经历:
我是一所三流高校一名本科生,学的是经济学专业,今年刚刚毕业。虽然我的毕业论文和答辩都是优,但是我却对我的专业好无兴趣,整个大学四年,我面对的只是高深的经济学理论和与现实社会严重脱节的教材。我们的专业是大而全的专业,相关专业都有所涉猎,但是都不精通。学院说开始要把我们往经济学理论研究方向培养,可又是谈何容易? 师资力量太薄弱,最后行不通,后来又要往经济管理方向发展,可是管理要是没有与实践相结合,还不是空中楼阁。我们学院与企业之间基本没有交流,实习机会更是没有,都是自己在外面找,可是真正能找到称心如意的是少之又少,大部分都在外面搞推销。毕业了,与学市场营销的同学相比,我们没有竞争力;与会计学专业的同学相比,我们也没有竞争力;而与学国际贸易的同学相比,我们更没有竞争力!连我们老师都说:“你们是什么的会,又什么都不会。”一语道破我们专业目前面临的窘境。老师又号召我们考研,可是考研又谈何容易?又是万人挤独木桥啊!
大学我们计算机课只学了两本书,一本是《计算机应用基础》,一本是《foxpro for windows 》,两本都是我们学校自己老师出的,都是为了赚钱,书是盗版,内容更是拼准,质量可以想像。所以当时我对计算机并没有多少兴趣,对编程更是一窍不通!只是上大学前专门学了指法,大一时想学打字,当时市面流行五笔输入法(现在也是),而我并没有跟风学五笔,而是自学了两笔输入法,现在看来是正确的,两笔输入采用音形结合的方法,摒弃了五笔不符合汉字书写规则和拼音重码太高的缺陷,而且有非常易学,极力向大家推荐。掌握了方法以后,我就天天在机房练习打字,后来我打字就非常快了,一分钟可以打100 多个字,同学们都很羡慕我,在我们系也封有名气。一个打字不是很快的人都让同学羡慕甚至崇拜,可以想像我们班的同学计算机水平多么低了.我当时也很满足,认为打字快计算机水平就算高了,而不知道打字是最基本的操作,在整个计算机体系中好像是大海里的一滴水。正因为这种认识,使我忽视了计算机其他知识的学习,当时只知道foxpro 与数据库有联系,其他的就什么也不知道了。
真正让我接触到编程是在大三下学期,因为知道我们专业就业形势不容乐观,有种紧迫感了,所以我每个礼拜都会买《就业时报》,在某一期报纸上无意中看到**** 软件工程师的招生广告(后来知道每期都有),广告作得很好,我当时就觉得就业压力这么大,能多学一门技能,就多了一分竞争力。于是我就给他们打了电话,问他们学这个要多少钱,接线的封妆很会说话,没有明说,而是直接告诉我后天上午来听他们免费的宣讲会。当时我就觉得价格不菲,因为用“** ”牌子是要增加成本的。我还是去听了他们的宣讲会,说心理话,**** 好,不如**** 广告做的好,**** 广告做得好不如**** 宣讲会做得好。会到结束才说了具体的学费,要比我预想的贵很多,一共分二个学年,三个阶段学习,第一学年课分两个阶段学习,第二学年一个阶段。全部下来价格吓人!(价格我就不说了,不少人知道)当时我是这么想的,与其说毕业以后就失业,还不如学一门技能,以后也好找工作,于是我就报名了。在那个时候,我对编程是一无所知,更谈不上兴趣,只是为了以后能比较顺利的就业罢了。
由于没有基础(只会打字),我决定从头学起,参加一学期的班,给我们培训的是一位我看不出年龄的女老师,后来知道是从** 毕业的。我们一学期的课主要有《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++,sqlserver,VBA,java,asp.哈哈,真是大而全,有点像我们的专业了。当时却不这样认为。于是跟着学,先学c++,教材只有170 多页,而理论部分只有110页,后面是上机部分, 和一本练习册的厚度差不多,由于我们C 语言基础打得不好,所以学C++ 普遍感到吃力,就这样不到一个月的时间,C++ 语言就结束了。接着就是sql server, VBA, 我记得在讲VBA 的时候,我们就有很多人听不懂了,特别是COM 组件,我现在也是知其然,而不知其所以然。而老师看我们不懂,也没有耐心了,慢慢地我发现老师的讲课态度发生了变化,只是讲她的课,而不注重和我们的沟通,我们上机时,她也是不闻不问,而是躲在一旁啃JAVA。后来才知道她辞职不干转行了。接着开始学JAVA,给我们带课的是一位男老师,课讲得还行,就是张扬的很,让人觉得不舒服。我觉得当时上这门课的时候,来了很多别的班的同学一起听,把本来就不宽敞的教授都坐满了, 不知道是觉得JAVA 重要还是因为已经学得吃力了, 我想是后者吧。
考试仍然很容易过,可是当二学期结束时,我发现我没有学到什么实际的东西,我甚至不会用一门语言写一个大一点的程序,学的语言实在是太多了而自己的编程思想还没有建立。在是否继续学习二学年这个问题上,我犹豫了很久,是坚持还是放弃?我想对每个深陷其中的人来说,都是很难抉择的,最后我还是选择了坚持,很多人选择了放弃,我记得刚开始和我一起学第一学期的人现在没剩下几个了,大部分人都选择做了其他行业,和编程彻底绝缘了。我真的不想就这么放弃,毕竟我付出了很多精力和金钱,而且我非常热爱这个行业,真的想用毕生的精力从事这个行业的工作,程序设计对我来说一直很神秘,像一座待开发的宝矿,我一直想征服它!
当我怀揣着第二学年的学费前往**** 的路上,我的心情异常复杂,这可是我父母的血汗钱呀,我现在没有挣钱回报我的父母,而是管父母要钱,这个滋味是没有经历过的人很难体会的。还有一个问题就是钱是不是白花?我能不能实现自己的理想?为了自己的理想“不择手段”叫不叫自私?第二学年的班已经开了,我也已经毕业了,我们系的就业率和前几届的一样,没有什么改观,而且有持续走低的趋势,我的好多同学都没有找到正式工作,一部分人在作推销,辛苦不说而且工资少得可冷,也许能锻炼人吧,很多人干两天就不干了。还有一部分人在家观望,还有几个有考研的打算。目前的状况使我的要求也在降低,我学编程不求能挣多少钱(以前有这种想法),现在只是想能够自食其力,作自己喜欢做的工作,也就心满意足了.可是我现在学得却越来觉得吃力了,二学年课程有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,数据库原理需要多长时间?我们是刚刚学点皮毛就学这些东西,岂不是在沙地上盖高楼,早晚有一天会挎掉的,而且盖得越高,损失也越惨重!而我当初并没有意识到对基础理论学习的重要性,现在真是后悔。
对此**** 应该负有主要责任,他们的宣传广告上面招生的对象是只具有高中以上学历,而其他的一些培训机构比如东软,清华都要求计算机本科专业或相关专业,说明这些机构已经懂得基础的重要性。而且**** 在授课时老师也并没有引导学生重视基础理论的学习,盲目追赶最先进的东西。应该承认**** 的课程体系囊括了世界最流行的开发工具,可以说是面面俱到,但是在学习这些东西之前,必须有很扎实的基础,如果没有,即使学会了,也是知其然而不知其所有然,在此引用不知哪位网友的一句话:“与其说把流行的东西握在手中,还不如把过时的技术记在心里,“ 可见基础的重要性。有很多零基础的人慕名来到****,希望摆脱自己的命运,可是学了一学期以后就再也学不下去了,原因何在,基础不行,不过也有一些对计算机极有天赋者,这应另当别论。
有时候我就想如果当初我在学习**** 的时候,如果能在家里恶补理论知识会不会更好呢?可是当初我很难意识到这一点,而且那时学校的课很重,一本《西方经济学》就有点压得我喘不过气来,除了上课,我已经没有时间在学别的东西了。况且当时我们培训的同学普遍流行着一种说法,说“我们毕业了将比计算机专业的更有竞争力!”当初我也报有这种想法,现在看起来真是笑话,先看看学习时间,他们学四年,我们不到两年(快的一年半),再看看计算机专业的课程体系,你就知道了,其中大部分是对基础理论的学习,学习时间宽松,如果能抓紧时间学习,将能打下一个良好的基础,为以后学习流行开发工具铺平了道路。诚然,现在一些高校的计算机专业的教材有些比较沉旧,可是一些原理上的东西并不是一两年就发展起来的,是大师们经过多年的研究总结出来的,深度掌握,必然对以后学习大有裨益!还有一种说法是“我们毕业了能直接上手为企业打来效益,而那些计算机专业毕业的学生根本不会做什么,所以我们更有竞争力!”初听起来,似乎很有道理,可是如果那些计算机毕业的学生参加企业培训呢?新出来一种工具,同时学习,谁理解得更透彻,谁学习得更快呢?
其实学习象棋和学习编程是一个道理。
先说象棋,会下棋的人都知道,下棋分开、中、残局三个阶段,要想学棋并想成为一名高手的话,必须先出残局开始学起,然后是中局,最后是开局。从开局学起的人很难有大的发展。这是我的切身体会,我记得我封时候学棋的时候,几乎没看过书,都是实战实战再实战,从实战中汲取营养,总结经验教训,等我到达一定阶段时,我爸爸就每天给我摆棋式,先练杀法,每天几个,当时有一本很经典的书《象棋杀着大全》,有400 多页吧,我爸就天天给我摆,让我破解,不看到结果不许动手,最后都把这本书都翻烂了(当然不是我弄的),现在真的应该感谢老爸,我虽然现在在象棋方面没有什么成就(我爸一直希望我成为一名象棋大师),但也算是一盘好棋吧。然后开始摆残局,接着是中局。对象棋有研究的人会发现,中残局功夫是最难练的,也是最能看出一个人象棋水平的高低。正是我爸一盘一盘的摆,才练就了我扎实的中残局功底,可以说我的基本功都是我爸一盘一盘摆出来的(再次感谢老爸!),等我到了一定水平后,才自己开始打谱学习开局,看别人的对局选,我发现我对开局的理解比那些上来就学习开局的人更透彻,记得也更牢,而且还能指出其中的错误并且提出自己的观点,有时我看完一本开局书,书上会记很多我自己的体会,试想如果没有良好的基本功的话,是不可能做到这些的。
再说编程,如果把学编程也分成三个阶段的话,那么残局就是基础,包括操作系统、汇编基础、离散数学、编译原理、计算机图形学等等,而中局就是c 语言(不是特定的)、数据结构和算法等等、而开局就是目前的各种的流行开发工具吧,包括vc,vb,delphi,jbuilder,dreamweaver 等等,以上三个阶段分的不一定正确,不过大概是这个意思吧。如果” 中残局“ 没有打好,只学” 开局“ 是永远也成为不了高手的,而且” 开局“ 总是随着时代发展而改变,不断有新的开发工具出现,落后的” 开局“ 将永远被淘汰,而相对来说” 中残局“ 是不会有太大变化的。而” 中残局“ 和” 中残局功夫“ 两者又不太一样”,我个人认为“ 中残局功夫” 指的是编程思想,一个好的编程思想不是一朝一夕可以练成了。如果掌握了打下了扎实的“ 中残局” 基础,练就了一身过硬的“ 中残局功夫”,那么在学开局就相当容易了,网上经常有这样的评论,比如:“ 如果学c 一年,那么学vb 之需一个月,如果学vb 一年,再学c 时间可能超过一个月”,“ 学C++ 三年,再学JAVA 只需一个月” 等等是同一个道理。
痛定思痛以后,我觉得我要想在编程方面往更高更深的地方发展,必须打好基础,苦练内功,为此我打算从C 语言开始学起,然后是数据结构和算法* 汇编* 操作系统原理*windows 程序设计*C++ 程序设计, 之后要看很多国外经典书,《C++ primer 》,《C++ 编程思想》等等,然后再选一个合适的开发工具,虽然会很慢,但我会踏踏实实的学习,再也不盲目跟风了。现在我C 语言只学了两天,课我还得继续上,毕竟钱已经交了,我想等我基础打牢了,以前有些课还得重听,有基础了可能会悟出一些新的东西。**** 这点好,课可以循环听。
回想我一年的学习,现在看来才刚刚起步,不免有些惭愧。正是走了这些弯路,才使我认识到基础的重要性。虽然以后还要有很长的路要走,但是我无缘无悔,因为我热爱这个行业。我相信我重新选择学习的方向是正确的,我打算用十年的时间来掌握这门技术,我今年23 岁,到我33 岁时,我想我还会写一篇文章来回忆我十年的经历,并总结出的经验和教训,供后来者借鉴。
顺便说一下我的女朋友,她和我是一个学校毕业的,学外语的,英语八级,现在毕业工作了,一个月3000 元。她现在对我很失望,说不再向以前一样喜欢我,欣赏我了,这给我很大打击!但是作为男人,我理解她,现在我的压力很大,我想我会顶住压力,坚持走自己的路的,希望大家能够支持我!
最后我想对初学者说的是,不要盲目跟风,要重视基础的学习,否则只会竹篮打水一场空。
如果您能耐心的把以上看完,我就很感谢了;如果您还能提出宝贵的意见和建议,我将感恩不尽!
经验分享
(四)一个程序员的经历
一.并不成功的开始
我所读的学校是中国西部的一所普通高校。我进大学后也和大多数同学一样,过着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.不是没有高工资,而是所掌握的技能门槛比较低,导致没有什么竞争力。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 的决心,我给windows15G,给了linux 25G,就这样开始了我的学习linux 之旅!
第二天,我从朋友那里打听到GDNT 有个招聘会,于是又风风火火的赶去。GDNT 的面试也给了我重重一棒子,让我好痛苦。在痛苦中过了3 天后,一个高中同学说她们单位要招VC 方面的人。我当时真的很高兴,也很紧张,因为这次面对的公司是中国著名电信运营商的研发中心。由于朋友的引见,面试很快确定在2 天后。在这两天里,我把所有关于C/C++ 的知识点复习了一遍,然后阅读了一些网络方面的资料。果然功夫不负有心人,2 个小时的比试面试过去了,我成了她们的一员。最后PM 许诺试用期给我4K。
这里的工作环境很好,工作也比较轻松,也许所有国企都是这样的把。下午2:00 上班,中午可以休息两个小时。单位食堂的伙食丰富而且价格便宜,一般不超过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 有所了解了,觉得好多东西豁然开朗。进程通讯,进程管理,页面置换,信号灯,线程池这些东西是我在windows 下写程序从未接触过的。
觉得学习unix 真的很幸福,每天进步一点,会让我睡得踏实。把《unix 高级环境编程》学完后,我开始慢慢的请教前辈,有关嵌入式的开发的问题。
慢慢学着分析内核情景,裁减内核,底层的东西让我觉得好奇。还有一件让人特兴奋的事儿,咱们科室好多开发人员都是女同志,PM 也是女人。
时间飞快,转眼四个月已经过去了。我觉得是时候该离开这个安逸的国企了,说真的,真有些舍不得,我向PM 提出辞职时,经理非常真诚的挽留我,说我工作做得不错,叫我考虑考虑再走。这里的人真的很好,学习的气氛也很浓,也许我希望日子过得紧张一些。经理说我这样跳来跳去不利于自身的发展。也许她是对的,也许是我太倔犟,终于还是走了。我知道,当我交出那张卡,就再也不能回来了,走出大门站在华景的天桥上我默默的站了10 分钟,仰望着那熟悉的大厦。
晚上回去改了改简历,然后在网上投。躺在床上,看着天花板,突然之间觉得好孤单,这里一个亲人也没有,鼻子很酸,好想哭。客厅电视机里传来世界杯预选赛的呐喊(我和一个男生一个女生合租三室一厅)。我走出客厅和那个男生谈了很多,也知道了他很多事情。现在才知道,虽然是合租,但是彼此沟通真的很少。他原来是在XTKJ 工作,后来跳到外企,也是搞IT 的,也是程序员。一个人到南方。
当时聊了很多,不觉到了凌晨。不过我们都没有睡意,于是他问我会是际否,我一拍即合。他很惊讶的看着我:你真的会。我说试试就知道。于是我们各自回房打开电脑,比赛开始了,呵呵。也许是他太轻敌,第一场,我选虫族,他选人族,结果被我出快狗偷袭成功,不过后来几场我都输得很惨,呵呵。
第二天睡到中午才起来,1 点多的时候突然来了个电话,通知我去面试,职位是linux 程序员。我赶快打扮起来:)。照镜子才发现,自己瘦了好多,也憔悴了不少。我穿上了自己最漂亮的衣服,然后简单了画了一下眉,打了粉底和眼影,并且还画龙点睛的摸了腮红。呵呵,自己对着镜子傻笑。
到了面试的公司(一个刚成立不久的外企,VOIP 设备商),和PM 谈得很顺利。他问的问题也很简单:函数传值传址的区别,常用的进程通讯方式,和我做过的一些项目等等。最后PM 问我期望的薪水是多少。我怯怯的说了句:5K。经理摸了摸前额想了想对我说:这样把,你好好干,试用期我给你5.5K。出了公司门,感觉天空一片蔚蓝。
经验分享
(五)一个还不太老的程序员的体会
(一)文章由来及个人经历
我是一名计算机专业的本科毕业生,毕业已经1 年多了。毕业后从事的是软件编程工作,经常有其他专业的朋友想从事软件编程工作,向我请教如何,因为我自觉涉行不深,不敢信口开河,无奈朋友信任,我不得不郑重考虑一下这个问题了,来帮助朋友选择和回报朋友的信任。这也就是此文的由来。
还是先谈谈我个人的经历吧。(是不是有点俗套,但我觉得了解我的经历,有助于理解我话的含义;我一向认为不了解古龙的生活经历的,不会真正读懂古龙的作品和古龙笔下的英雄的)我本科就读于南方一所著名的高校(因为自己的不成气,愧谈母校名谓),学的就是计算机专业。上本科时,几乎没有认真的听完一门专业课程,上课看报纸睡大觉,下课看录像看小说看球赛,临考抱佛脚,每次考试和课程设计都是蒙混过关。(于之相对是,我选修的工商管理和经济贸易方面的课到是听得不亦乐乎,考的分数颇高,也许这才是我的真正兴趣所在。)
总而言之,大学是混过来了,对专业的理解和掌握程度,应该没有达到毕业要求的合格水平。(也很后悔,但是有什么用呢,当时不知道珍惜;如果上天再给我一次机会的话,我一定会抓住,多看点美国大片少看点港片;现在,重回校园是我的一大理想)但是大学的学习使我有了一个简单的知识框架(总算学费没白交),我对一个朋友这样形容过我的这个知识框架,“它不是钢筋铸的,是稻草扎的”,哈哈哈,不要笑,真的,我敢说很多本科毕业的朋友的本专业的知识框架也只不过是“稻草扎的”。直到现在,我一直觉得自己的基础知识还是很薄弱,一直想抓点时间,把基础书本好好的温习一下。(此项任务正在计划和实施中)
毕业后,分配到某研究所工作。当领导让我选择自己以后的工作方向时,我毫不犹豫的选择了软件(也不知道到底是对还是错,但我决不后悔)。此研究所主要是以硬件为核心搞通信控制设备的研发生产;软件是辅助,所以也不受什么重视,很多搞软件的人都跳槽走了,留下来的大都是一些已经废掉和行将废掉的“伪/ 萎”程序员(名副其实的“软件人员”)。在这里感觉不到什么高紧张和高技术程度的研究和开发;软件开发的技术含量极低,以致于大部分人只有半年的学习和开发经验,以后都是这些知识和经验的重复利用。(我问过其他到研究所工作的同学,他们说都一样,呜呼,我们的国防科研开发呀)对于软件的开发,领导的意志和老掉牙的经验在新课题的技术采用和开发中起了决定性作用,没有明确的需求,没有明确的开发计划和进度,大家在一天一天一周一周的浪费着宝贵的时间,最后开发出来的东西修来改去,直至它变成垃圾。我越来越认识到一点,要么象那些废人一样废掉,要么自己去努力寻求出路,反正别指望从工作中得到什么高明的经验了(教训倒也许有)。期间发生了一些感情上的纠纷,严重的影响了学习计划和效果,直到现在浮躁的心仍然有些浮躁。
期间,我读了一些书,看了一些文章,编过一些小例程,搞了一些没有什么技术含量的开发工作,也和一些前辈和高手们谈过聊过。我一直在思考几个问题;如何学习软件开发?如何搞软件开发,国外的软件开发到底其秘诀在何处?为何我们的软件业一直在低水平徘徊?我们难道真的离了Microsoft 就活不了?我们的程序员到底在浪费时间干些什么?软件开发到底是如何分类的?我们如何走自己的民族软件之路?
我想了很久,一些想通了,一些还在想。但我知道有一点是肯定的,那就是我们一定要靠我们自己走出自己的软件之路!跟在别人屁股后面永远受制于人!
好了,关于经历和牢骚就先写这些吧,该进入我们的正题了。
(二)你适合当程序员吗,你知道编程序是怎么回事吗? 1、程序员意味着要编程序。(如果你仅仅想得到一份高薪水的工作,喝喝咖啡就等老板发薪水,我奉劝你还是另找一份更合适的工作,譬如练摊,真的,兄弟,这份工作不适合你)、你是学文的还是学理的,编程序也许需要浪漫,但更需要逻辑和严谨。(说坦白点就是,在你没有找到乐趣以前,它很枯燥)、你有对新技术追求的热情吗?你有刨根问底的探索精神吗?(热情绝对是最重要的!你仔细思考一下自己的性格适合当程序员吗?)、当程序员决不是什么好差事,时刻需要学习,需要思考。(直到你成为那个可以引导别人去学习和思考的人,你才可以偷偷的嘿嘿笑,又一群傻蛋)、程序员的未来很迷茫。(但我认为关键看你自己!我希望你是一个有追求的人,不仅仅是混碗饭吃。因为真正的乐趣在于创造;如果你能改变软件业的历史,那才是英雄;不想成为Bill Gates,不想成为Dennis Ritchie 和 Bjarne Stroustrup,我会说你没有追求。有个关于程序员未来的笑话,也许你还没听过,你该听一听,摘抄如下:
一个程序员对自己的未来很迷茫,于是去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”
上帝说“我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的”
于是他去问Lippman。
Lippman 说“程序员的未来就是驾驭程序员”
这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”
上帝说“我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的” 于是他去问Gates。
Gates 说“程序员的未来就是榨取程序员”
这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”
上帝说“我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的” 于是他去问侯捷。
侯捷说“程序员的未来就是诱惑程序员”
这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?” 上帝摇摇头“唉,我的孩子,你还是别当程序员了”)
6、当程序员还是很有乐趣的。(当你学到新知识时,当你有新的思想见解时,当你有新的产品问世时,和知己探讨你的成果时…我问你,觉得这些是乐趣吗?)、当程序员不易也不难。(世间事有难易乎?为之…;不为…。你有决心和信心吗?)、你真的要当程序员?是你自己的想法?、你舍得花钱买书吗?(读好书绝对是学习编程的最佳捷径。你一定会说,现在电脑书籍真T.M.D 贵,没法子,谁让知识和技术在人家的脑袋,在人家的书里呢;等你写书时可以把价格定低一点,记着还有好多没钱但想买书的兄弟很困难呀。要舍得买书,买好书,不好的的书不如不读,其害大于其益,关于买什么书,你可以问高手或看候捷的书评;准备一个小本子记录你想买的书的名字,逛书店时看看,如果好就买下,记住要读,别光买不看。)、我告诉你,程序就是:任何有目的的、预想好的动作序列,它是一种软件。、编程序就是编写程序。、你想好了吗?(如果你想好了还是决定要当程序员,可以继续往下读;否则,你可以继续寻找别的出路了。)
(三)一个程序员应该具备的基础知识和概念、计算机是有什么组成的,CPU 是什么东西,其工作原理是什么。(对于这些以及下面将要提到的概念我不会告诉你什么答案,你可以看相应的教材,关于教材我会在下一部分详述,记住理解最重要!)、机器语言和微指令集的概念。、程序的概念。、汇编语言是低级语言但不是机器语言。、高级语言主要有那些?(C,C ++,Basic,Pascal,Fortran,C#,Java 等等;如果你是中国软件业的英雄,你也写一门语言,最好不用英语)6、编译程序和解释程序的概念和其原理。(编译器是高手和专家编写的)、HTML、XML 等是标识性语言。
8、Prolog 是人工智能语言。、操作系统OS 的概念和原理。(Windows98,Windows2000,Windows NT,UNIX,Linux,等等都是OS,还有一些实时OS,嵌入OS,编这些的绝对是高手)、Windows 编程说白了就是Windows API 的调用。(中国的程序员很多只是会编windows 程序,用的是VB,我的建议是这些程序员顶多只是低级编码员,我称其是coder)、VC ++、VB、BC、BCB、Delphi、VF 等都只是编程的工具和环境,不是编程语言。、面向结构的设计概念。、面向对象的概念。(好好理解,兄弟,这个东西还是很重要的)、软件工程的概念和原理。(如果你想当老总就需要好好研究了,系统分析员比编码员要高一个等级,薪水也高哟)、数据库的概念。(要熟悉一些著名的数据库系统和语言的名字,如Orcle,SQL,DB2,DyBase等)、了解网络概念。、了解多媒体概念。、熟悉和掌握数据结构和基本算法。、是不是要求太高了,别着急慢慢来,进步在不知不觉之中。(一旦开始学习,一个月以后你就会有一个基本的概念;两个月以后你就会感觉自己有了全面的基础知识;当你知道编程序是怎么回事时,说明你已经入门了。也有很多人编了很多年程序还没有入门呢,你不会希望自己步其后尘吧。要有信心和耐心。沉不住气怎么能成大事?!)
(四)教材推荐
推荐的教材主要还是针对概念来的,最好选用名校的教学用书。、《计算机组成原理》(熟悉)2、《数据结构》(掌握)3、《操作系统》(了解*> 熟悉)4、《The C language 》(掌握)5、《编译原理》(了解原理)6、《汇编语言》(了解)7、《计算机网络》(了解)8、《软件工程》(了解)9、《关系数据库》(熟悉)、《The C ++Languege 》(掌握)、《面向对象设计》(掌握;结合C++ 学习)
(五)一些经验和体会
(五)一些经验和体会、真正的程序员用C++ ;(一位专家说的)2、动手去编程序; 3、动脑去思考;、要有良好的编程风格;、读书,读好书,尽量读原版书!(我反复强调这一点,读书要有选择,坚持读好书,名家出的经典书,不要浪费实践在一些粗制滥造的书上面;坚持博览群书)6、有自己的学习计划;、总结自己的经验教训;(准备一个笔记本,记录错误和心得)8、不要怕学新东西; 9、要有软件工程的思想;、善于发现问题,然后去寻找答案; 11、向高手请教;(要虚心直到你成为高手)12、和同行交流;(不善于交流肯定不行)、懂得软件的实质,不要被千变万化的表象所迷惑;、真正要学习用的是编程语言和方法,不是什么库,什么类,什么工具;(学用那些什么库都比较简单,但 光会这些库,我觉得还远远不够)、学习wiodows 编程主要是学习windows OS 和win32 API ; 16、有空了解一下嵌入式开发; 17、有空了解一下PDA 软件开发;、了解一下.NET 框架和C# 语言,也许它是你新的衣食父母;、要有耐心,不要作浮躁的人; 20、对程序加注释,并保留你的老程序; 21、学到的东西越多,了解的越多,你就越接近专家; 22、有空去逛逛CSDN,那里有你很多知己; 23、要有信心成为一个优秀的程序;
(六)一些好书的推荐、《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++ 》、《The Standard C++ Bible 》(一般推荐)11、《The Art of Computer Programming 》、《Programming Windows 》(Charles Petzold)13、《VC++5.0 技术内幕》 14、《MFC 深入浅出》 15、《软件需求》、《Advanced Windows 》 17、《C++ primer 》、《win32 程序员参考手册》 19、《用TCP/IP 进行网际互连》 20、《COM 本质论》
(七)学习计划
这个学习计划是我个人定的,也共享给大家参考一下,共同进步吧。、《计算机组成原理》 2、《操作系统》 3、《数据结构》 4、《汇编语言》 5、《 C 》 6、《 C++ 》 7、《VC 技术内幕》、《Programming Windows 》 9、《深入浅出MFC 》 10、《Advanced Windows 》、《Inside The C++ Object Model 》 12、《Thinking in C++ 》 13、《Effective C++ 》 14、数据库 15、网络、嵌入式OS 和编程 17、硬件单片机 18、.NET 和C# 19、软件工程 20、UNIX 和Linux
(八)后记
一年来浪费了大量的时间去摸索,去思考,走了很多的弯路,直到现在我还觉得自己是个编程的门外汉。我把我的一些体会和想法说出来(当然,很多都不一定正确,欢迎大家指正和讨论),也许对一些想加入程序员行列的朋友有一些建议和帮助。希望能帮助这些朋友顺利走上编程之路,成为高手。
如果真能如此,我也就很高兴了。欢迎有兴趣的朋友给我发E_mailsjpsky@163.net);我这个人有两大业余爱好,其一就是读武侠小说,其二就是结交英雄侠士。
后记:此文我用analyster 的名字登录,发表在“csdn -程序人生”上了,有很多网友看了,回了,还收到几个网友发来邮件,和我探讨,我很感谢大家对我的信任和鼓励。
我要说明的就是我的这篇小文,主要是想给“一些想成为程序员”的朋友一些建议,帮他们寻找一条自我培训的捷径,(其实世界上没有什么捷径的,我觉得一切都在于悟性,师傅领进门,修行在个人,譬如我就修行不够)少象我一样作大量的无用功。还有,主要就是一个程序员应该具备的基本功(个人看法), 有人称其为“内功”,我觉得很对。没有扎实的基本功,我们如何能够做到游刃有余的编写高质量高性能的优秀程序呢?
经验分享
(六)一个程序员给初学编程人的建议!绝对的好!
想学习程序设计而又很迷惘的朋友,希望可以带来一点帮助。
我第一次接触电脑是在小学二年级的时候。那时纯粹是因为喜欢打电子游戏,听别人说电脑上的游戏十分好玩,于是就漫漫开始与之接触了。在三年级时父母出于我对计算机浓厚的兴趣送我去了一个BASIC 编程学习班,从那时起我才真正开始走上编程这条不归之路。虽然说现在程序设计这门专业在社会上很热,竞争十分激烈,但是这只是学习编程的人比较多而已。真正能够掌握以至于精通的人实际上很少,毕竟中国的软件业才刚刚起步不久。现在社会对优秀的程序设计人员的需求量还是相当大的,但是前提是必须要优秀。我自己虽然也谈不上优秀,但多少还是有些感触。在这里想讲述自己对于一般程序员和优秀程序员之间在技术上的一些认识(什么敬业精神生活态度我就不多说了):
首先作为一个优秀的程序员,数学是十分重要的。数学是自然科学的基础,计算机科学实际上是数学的一个分支。数学主要能让人懂得一种分析问题的方法,然后再通过编程去实现它。计算机内部的许多原理也都牵涉到比较复杂的数学知识。它是我们用来解决现实问题的最高效的工具。很多学习编程的朋友对数学觉得不屑一顾,觉得对于编程没有什么关系。实际上优秀程序员和一般程序员拉开档次很大一个程度上就是取决于对数学的能力。一些项目有时需要很复杂的数学建模和利用数学对于系统效率进行分析,而这些项目对于一般的程序员是很困难的。正确应用数学知识有时候能使你的程序的效率产生质的飞跃。现在的程序员在数学上普遍是薄弱环节,这点是大家应该引起足够重视的。当别人对于这些项目感到无从下手,而你却能够完成,这个时候你的价值也就表现出来了。真正优秀的程序员是能够最基本的一点就是要能够通过自己的知识来解决一般程序员所无法完成的问题。而数学能力就是一个很重要的环节。
其次就是要对数据结构引起足够的重视。如果说计算机专业的学生与非计算机专业的最根本的差别绝对是数据结构(数学大家都一样学了,主要看你自己学得好坏)。对数据结构的掌握与运用能力是衡量你编程能力的一个很重要的指标。有的人对于看了链表,栈,树,广义表这些东西就头痛。然而这些东西往往能使你的程序的效率比别人高出百倍。由于一直搞信息学竞赛,到了大学又搞ACM,所以我对数学和数据结构都掌握得相对较好。这使我在应聘与工作中明显感到胜人一酬。记得自己大学时去一家公司应聘的经历,当时去应凭的还有3 个人,有2 个大学毕业,有个也工作了一段时间了。他们几个都在大讲自己的能力如何之强,会使用的语言及编程工具如何之多,经验如何之丰富。按理说我应该是资质最浅的。当时也是初生牛X 不怕虎,也就硬着头皮去了。当时面试的题目是一个公司的资金管理项目的一个问题,要求每个人都在思考后给出自己的设计方案。其中比较核心的一个问题就是要计算一个资金最小波动值的问题,给出的数据量相当大,对效率要求很高。对于整个程序的面向对象化的分析我们几个都是差不多的,毕竟这些东西在学校里是很重视的,而且不是真正的难点。然而到了最关键的问题时其余的人都卡壳了,有两个是用简单的双重循环,时间复杂度(N^2),惨不忍睹。还有一个在冥思苦想了好一阵以后说用树,具体技术细节又讲不清楚,效率分析也很马虎。只有我当时很快就给出了采取AVL 树的方案,并且利用高等数学推导作出了很详细的效率分析和时空换算,并提出了引入汇编的方法。很自然的我得到了这分工作。在这里大家显然可以看到数学和数据结构对于一个优秀程序员是多么重要,它们是和一般的程序员打开档次的最关键的地方。这样向“枣子”碰到的那种情况应该很轻松的就可以想到。
如果你是一位想学习编程的朋友,我经过多年的学习总结出来了一个学习的线路希望对你有所帮助。要学习编程是要有很大恒心和毅力的,首先你要明确自己的目标,想好自己编程是为了干什么。如果你学习仅仅只是一时想编出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 毕竟是老大),先学win32api,搞请windows 基本消息机制和原理,有汇编基础基本上不会碰到什么困难。其实只要会了API,其余什么MFC,VCL 都是囊中之物了,都不过是对于API 的小装而已。VC,C++Builder 都可轻松拿下,这只是开发工具的问题。以后的OLE(ActiveX),.NET,数据库就要看自己的发展方向而定了。我在这里强调的是前面的基本能力的学习,后面操作平台虽然知识体系庞大,然而毕竟比较死,更好掌握。最后编程能力的高低主要还是有以下几点决定:1。编程的习惯 2。数学能力(包括逻辑思维,分析问题的能力)3。对数据结构的认识能力 4。经验的多少(包括多使用语言的掌握能力)。
经验分享
(七)算法的力量
算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。
算法与我
当我在1980 年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说:
“知道为什么只有你们系要加一个„科学‟,而没有„物理科学系‟或„化学科学系‟吗?因为人家是真的科学, 不需要画蛇添足,而你们自己心虚,生怕不„科学‟,才这样欲盖弥彰。” 其实,这点他们彻底弄错了。真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。
记得我读博时写的Othello 对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地问我的程序平均每秒能搜索多少步棋,当他发现我的软件在搜索效率上比他快60 多倍时,才彻底服输。为什么在同样的机器上,我可以多做60 倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数函数转换成四个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关键。
还记得1988 年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍,而且,在扩大至大词汇系统后,速度差异更有几百倍之多。他们虽然买了几台超级计算机,勉强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊讶的是,他们还为此发表了不少文章,甚至为自己的算法起了一个很特别的名字,并将算法提名到一个科学会议里,希望能得到大奖。当时,贝尔实验室的研究员当然绝顶聪明,但他们全都是学数学、物理或电机出身,从未学过计算机科学或算法,才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧!
网络时代的算法
有人也许会说:“今天计算机这么快,算法还重要吗? ”其实永远不会有太快的计算机,因为我们总会想出新的应用。虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快增长,价格也在不断下降。可我们不要忘记,需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据(照片,视频,语音,文本等等)。日益先进的记录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面,随着研究手段的进步,数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别,都需要极大的计算量。在网络时代,越来越多的挑战需要靠卓越的算法来解决。
再举另一个网络时代的例子。在互联网和手机搜索上,如果要找附近的咖啡店,那么搜索引擎该怎么处理这个请求呢?
最简单的办法就是把整个城市的咖啡馆都找出来, 然后计算出它们的所在位置与你之间的距离, 再进行排序, 然后返回最近的结果。但该如何计算距离呢?图论里有不少算法可以解决这个问题。
这么做也许是最直观的,但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆, 那这么做应该没什么问题, 反正计算量不大。但如果一个城市里有很多咖啡馆, 又有很多用户都需要类似的搜索, 那么服务器所承受的压力就大多了。在这种情况下, 我们该怎样优化算法呢? 首先,我们可以把整个城市的咖啡馆做一次“预处理”。比如,把一个城市分成若干个“格子(grid)”, 然后根据用户所在的位置把他放到某一个格子里,只对格子里的咖啡馆进行距离排序。
问题又来了,如果格子大小一样,那么绝大多数结果都可能出现在市中心的一个格子里,而郊区的格子里只有极少的结果。在这种情况下,我们应该把市中心多分出几个格子。更进一步,格子应该是一个“树结构”,最顶层是一个大格——整个城市,然后逐层下降,格子越来越小,这样有利于用户进行精确搜索——如果在最底层的格子里搜索结果不多,用户可以逐级上升,放大搜索范围。
上述算法对咖啡馆的例子很实用,但是它具有通用性吗?答案是否定的。把咖啡馆抽象一下,它是一个“点”,如果要搜索一个“面”该怎么办呢?比如,用户想去一个水库玩,而一个水库有好几个入口,那么哪一个离用户最近呢?这个时候,上述“树结构”就要改成“r*tree ”, 因为树中间的每一个节点都是一个范围,一个有边界的范围(参考:http://)。这个算法能够在很多种计算中达到相当高的效率,而且是可扩展的(也就是说,一千台机器就算不能达到一千倍的效果,至少也可以达到几百倍的效果)。Map and Reduce 的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后,它的容错性能异常出色,就算一个server farm 里面的机器down 掉一半,整个farm 依然能够运行。正是因为这个天才的认识, 才有了Map and Reduce 算法。借助该算法,Google 几乎能无限地增加计算量,与日新月异的互联网应用一同成长。
算法并不局限于计算机和网络
举一个计算机领域外的例子:在高能物理研究方面,很多实验每秒钟都产生几个TB 的数据量。但因为处理能力和存储能力的不足,科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道,新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的,在其他任何领域里,算法都可以改变人类的生活。例如人类基因的研究,就可能因为算法而发明新的医疗方式。在国家安全领域,有效的算法可能避免下一个911 的发生。在气象方面,算法可以更好地预测未来天灾的发生,以拯救生命。
所以,如果你把计算机的发展放到应用和数据飞速增长的大环境下,你一定会发现,算法的重要性不是在日益减小,而是在日益加强。
给程序员的七个建议
(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。大家不妨试试高德纳所著The Art of Computer Programming 里的题目,如果你能够解决其中的大部分题目,就说明你在算法方面有一定的功力了。
(2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言,考试过关就算学会了;课题项目中,只要程序能够编译,运行,并且输入输出满足要求就算了事。这些做法是不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四年中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。
(3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与敬业精神。我发现不少程序员对于知识的掌握很肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中是如何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到,只有通过踏实的实干才能真正掌握。
(4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、集合论和数理逻辑。这些知识并不难,但是对你未来的工作帮助会很大。尤其当你对一些“数学密集型”的领域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。
(5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。
(6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的能力。想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成钻研,好奇,创新,动手,合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。
(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使用的程序。不要急于去一个要你做“头”而独挡一面的地方,因为向别人学习才是你的目的。找工作也是一样,不要只看待遇和职衔,要挑一个你能够学习的环境,一个愿意培养员工的企业,一个重视你的专业的公司。最后,还要挑一个好老板。
希望大家都能把握机会,养成好的学习习惯,把算法学精学透;希望大家都能有一个美好的未来!
经验分享
(八)不要迷失在技术的海洋中
技术就好像一片汪洋大海,越深入越望不到边际。就拿自己的体会说吧,2000 年的时候在学校搞ASP,觉得网页开发就是这么简单,把数据库中的数据格式化一下显示在页面上,把用户的输入组装成添加删除和修改的SQL 提交到数据库中去。几年后的今天,我对自己了解或听说过的ASP.NET 相关(注意:仅仅是ASP.NET 或者说网站制作相关)技术列了一下:
在这些语言、技术、工具、理念中,每一项都能扩展出很多还要细化的技术,每一项要达到熟悉的程度可能都会花去一年的时间,如果这些都要达到熟悉的话,大概也 就快退休了。不但如此,每一个技术都在飞速发展,今年语言到了明年就有更简单的语法,今年的技术到了明年就有更好的技术来替代,今年的工具到明年已经面目 全非,今年的理念到了明年已不再流行。
或许你现在:
在为面试而去搜索接口和抽象类的区别;
在为新技术来不及学习而烦恼;
在为看不懂高深的技术文章而烦恼;
在为项目不能提高自己的编码水平而发愁;
„„„„
我觉得:不管做什么,学什么,一要心态好,二要态度好。所谓心态好就是不要着急、不用担心;所谓态度好是多分享、多讨论、学出自己的心得。分享的意义是很大的,在分享之后的认知水平往往比分享之前的高,而且在很多时候分享给别人1 点,别人能回报给你2 点。有些人在团队中不愿意分享,怕团队中的其它人水平提升了影响到自己的地位,其实这种想法是没有什么道理的,也是对自己不利的。有些人又在羡慕别人的技术NB,崇拜高手,为自己的技术差感到烦恼,如果你对自己信心又有什么技术是花时间学不到的那?
从学习的内容上来说,要坚持两个原则,如果你没有时间的话,那么学新技术不如学基础、学应用不如学思想。举例来说,如果你只熟悉C# 的基本语法的话,那么学好C# 这个语言比学会编写留言本更有意义,如果你关注MVC、ORM 的话,那么学习它们的思想比学会使用MONORAIL 以及NHIBERNMATE 更好。技术虽然一直在变,但是越是基础和越是抽象的技术变化越慢,越是偏向应用越是具体的技术变化越是快,从性价比上说,学习基础知识性价比更高。再举一个直白的例子,DIY 电脑的时候,在显示器上多花费500 元的意义一定比在显卡上多花费500 元的意义大,而就是有些人宁可在显卡上多花费500 元。在很多大型软件公司,招聘的时候只看人(看人品、看聪明程度、看态度)不看技术的,因为它们需要的是能快速发展,适应企业文化的人,而不需要你那些所谓的精通和熟悉。
不要过于专著于技术,这里的技术指工作中用于开发的技术。在几年之后,当你只有.NET 可以和你的孩子分享的话,是不是太可悲了。在软件行业,技术虽然一定程度决定了薪水、决定了职位,但是我们的生活并不是100% 是工作,有时间为技术而发愁,为何不综合提升自己的其它能力呢?并且随着职位的上升,往往沟通能力、经济知识以及文学艺术修养比技术显得更重要,这个时候叹息自己过于专著技术往往为时过晚。
虽然国内很多公司的技术层次不同和文化也有差异,但是在大多数的时候公司或别人能教给你的东西很少,要学东西还是要靠自己主动。有的人一直觉得在公司学不到 东西,想换一个环境,往往他换了一个环境之后发现还是学不到什么东西。国内的项目大多还是急功近利的,不要期望有这么多微软研究院,空闲的时间踏踏实实学 一些东西比到处找工作强很多,做项目的时候多分享一下自己的心得给团队成员比抱怨团队技术实力差强很多。
在工作中,要始终提醒自己“谦恭”、“真诚”和“规矩”,谦恭真诚对别人,把规矩留给自己。技术再强也要“谦恭”,离开了“谦恭”的技术就会失去光芒,社会 再险恶也要“真诚”,一切虚伪会在“真”诚面前低头,职位再高也要“规矩”(不迟到,不早退,以身作则),否则再大的权力也只能变成人员的流失。如果能做 到这六个子,那么无论你的技术怎么样,无论你到哪里都会得到领导的重用,在事业上有所发展。
现在的你不再为面试而去搜索接口和抽象类的区别,而是在面试的时候告诉考官你并不知道它们之间的区别,但是愿意在一个月内系统学习面向对象的知识;为新技术来不及学习而烦恼,而是明确了自己最需要学习的技术,一边学习一边分享;为看不懂高深的技术文章而烦恼,而是拿起《C# 高级编程》踏踏实实从头到底边阅读边做试验;为项目不能提高自己的编码水平而发愁,而是在进度允许的情况下尽可能让项目变得可扩展、可维护以及高效;
„„„„
看到身边的一些人为技术所累,在技术的海洋中航行的很辛苦,因此有了本文。本文的主要目的是提醒大家找到方向,时不时回岸边休息一下,思考一下新的航向,不要迷失在技术的海洋中让自己筋疲力尽,在技术之外的有很多东西的意义远大于技术,请大家踊跃讨论„„„„
更新(本文或许过于杂乱,总结一下观点): 学习靠自己,不要期望别人教你什么,学习要主动;
不管水平高低,不要看不起自己,也不能看不起别人,学习要心态好; 不能不思进取,也不用让自己为技术所累,给自己多一点技术之外的时间; 如果时间不充裕,优先考虑学习基础的内容,同时也可以多关注一些新的思想; 如果别人能从你这里学到知识的话,那么你自己也一定学到了知识,请坚持分享;
经验分享
(九)给所有入门程序员的建议(1)--句句是诤言 希望大家认真读完
编了这么久的程序,一直想找机会总结下其中的心得和方法,但回想我这段编程道路,又很难说清楚,如果按照我走过的所有路来说,显然星不可能的!当我看完了云风的《游戏之旅**编程感悟》和梁肇新的《编程高手箴言》我突然瞄道我要从何说起,我要怎么说了!
从接触编程到现在已经至少要6年,虽然时间短,但我几乎每天都在编,而编程上突飞猛进的还星最近一两年,单纯编程上的进步,很简单就星经验,但你要理解才可以进步的快!这就星说,你的理论课要学好,才能学好编程,操作系统,网络原理,计算机体系结构,数据结构,编译原理,你哪个学的不好,你根本不配成为编程高手,我见过的高手,这些学的都不错!这些都星计算机的支柱,你连它的支柱都不了解,怎么编程,即使你编写的程序好——只有一个原因,你用的星高级语言或脚本语言,因为它们封闭大量低层语言细节,让你不用了解就可以编写,你不了解低层细节你咋成为高手!解释什么叫编程?
我觉得现在很多同学,根本不瞄道什么叫编程!我现在告诉你,单纯的编程,也就星就瞄道语法瞄识的编程,根本不叫编程,只会单纯的语法的编程连低级程序员都不如!
编程不仅仅星你对语法的掌握,你还要把各种技术混合到里面,这样才叫编程,你编程的时候,你应该问问自己,你的程序有算法吗?你的程序写的够简单吗?速度足够快吗?占用空间足够少吗?代码写的规范吗?语句写的标准吗?你的程序之间的结构合理吗?你类定义的合适吗?方法和属性合理吗?接口合理吗?等等等,包含很多东西!这就星高级程序员为什么赚这么多钱!要付出相当大的脑力劳动!
调试对你也很重要,一个程序高手,也星调试专家,其实调试很多方法,但大多数都星实践中得到的!
指正现在人对学计算机误区
现在我每天在和汇编,硬件指令,c和c++或一些低层API打交道,有些时候编程这个东西很难说清楚,只有你经历了,你才能感受到,你没有经历,就永远体验不到!
我现在要更正几个现在学计算机人的误区,我想回答的星,学什么才星学计算机!
学计算机的两个方向:一个星纯搞理论的,一个星搞实践的。搞理论的无可厚非的,大家都承认星学计算机。那么实践呢?我很难给出一个定义,但我会列出那些才星真正学计算机学的:
(1)编程,这里的编程,我要抛出FLASH,PHOTOSHOP,3DMAX等,它们虽然也有语言,但都星为了给美术人员提供的!也就星几乎封闭了大量的低层细节,对于一个学计算机的人来说,如果你努力学它们,你还星不要学计算机了,去学美术把!网页编程能接触到至少两种类型语言,HTML和ASP或JSP(PHP),HTML说实话,不应该星计算机人学的,你应该学的星ASP,JSP等!
按严格意义上讲(但实际没有这么严格)如果你的主要必修语言,不星c,c++,JAVA,或者硬件指令,都不算星真正学计算机的,之所以这么说,我举个例子,比如你用JSP,它星一个脚本语言,如果你用过这个语言,你认为你用好这门语言需要了解硬件结构瞄识吗?显然不用,如果你纯星JSP程序员,你需要只星,JSP语法,一些简单的JAVA语言,SQL之类的数据库瞄识,其余的你什么都不需要,至于分析流程,那星系统分析师的事,不要和编程混为一谈,我学JSP学了3个月,现学现买就做出了功能齐全的网上书店(当时星老师布置的作业),如果再努点力,就可以投如使用!所以说,学JSP根本就不需要太多的专业瞄识,不星学计算机的也很容易就学会!
学c++,我都学了好几年了,用它写程序都几十万行,我也不敢说我学的精通!就星因为它太灵活了!不同人,用的效果就星不一样!所以按严格意义上讲,如果你的主要必修语言,不星c,c++,JAVA,或者硬件指令,都不算星真正学计算机的,也就星说,学那些对计算机专业瞄识不需要太多了解的语言,就不叫学计算机的!
(2)
从事软件方法实践研究,这个纯星软件工程方面的,如果你没有容入一个大项目中很难体会它的重要性,想一想,一个程序,几十万,几百万行代码,能这么好的实现,并运行,它的功劳不封!
(3)
从事低层硬件开发,这里可能和搞电子的专业有些重叠,但事实就星这样,他们也星学计算机的!其余的,装系统了,装电脑了,用人家编好的软件实现些图片音乐等功能的,那都星计算机的门外汉,不要和真正学计算机的混为一谈!
我经常被问到:
你会盗qq不?我晕,学计算机的就要会盗qq? 你会装电脑不?虽然我会,但不会并不可耻 你会装系统不?虽然我会,但不会并不可耻 „„„„„„„„ „„„„„„„„
等等把,有好多,通过我上面解释,你应该理解学计算机的应该会什么,不会什么也星应该的!
正式入题,怎么学好编程!
世面上好象只有这两本星中国人写的关于编程心得的书,中国编程好的人很多,但写出方法很难!第一本《游戏之旅**编程感悟》前面几章写的星云风的编程经历,后面几章写的星编程经验!总的来说本书很容易读懂!《编程高手箴言》书很难,尤其写操作系统那章!正如作者所说,真正写一门编程方法学的书很难!本书前几张概括了当前中国软件面临的形式,我强烈建议看一下,写的很经典!以前我不瞄道程序和软件的区别星什么,现在我瞄道了!后面几张写的都星编程方法和编程要具备的瞄识!
总结他们两人所说的,我准备按照下面提纲来写编程方法!
1。如果你感兴趣,学计算机星一种光荣,如果你不感兴趣,那么它星地狱!2。理论对你很重要,尤其星你一名搞技术的程序工程师!3。学会自学,学会思考,学会合作与交流!
4。要想成为高手,一定要从底层学起,底层星什么?CPU,汇编等硬件指令!5。编程需要经验积累,学会调试对你尤其重要!
6。全局把握整个工程,具体到每个类的属性和方法以及各个类的关系!一定确保你设计的类和类模式和类间关系能够有效,利于修改和升级!概括说就星软件工程。下面我就分别说一下
一.如果你感兴趣,学计算机星一种光荣,如果你不感兴趣,那么它星地狱!
我经常听很多同学说,开始他对计算机很感兴趣,但随着大学里的学习,越来越感觉无聊甚至厌烦!你之所以这么想,其实一点也不怪你!从高中的应试教育到大学里的自由学习方式上的转变,我们几乎都不适应,一到大学,突然有一种解放的感觉,没有老师的强硬指示学习,自己根本不瞄道怎么学,学什么!所以说,教育对我们很不负责任!
如果你在大学以前已经瞄道编程怎么回事,那到没什么事情!但好象很少有人象云风这样从封就接触了编程教育!所以我们在没有上大学前几乎星零起步!
其实,按我的理解,刚上大学开始学编程有些晚了,之所以这么说,不星因为单纯的编程很难,如果你很努力,几年完全可以搞定,其他的你去公司的经验可以弥补!我这里想说的星,一个真正的程序员不单单要有强硬的编程实力,还要有强大的理论后盾!你只会编程,没有强大的理论做后盾,你也就不会把理论转化成实际的代码,你也不会做出高效,高技能的程序!在计算机理论中,图论,人工智能等等都星很难的理论,但如果你能把它们有效的用在计算机领域,功德无量!国人能做这点的很少,本来厉害的程序员就很少,有高尖端理论技术并把它应用的更星凤毛麟角!
(这里可以推荐大家一本书《游戏编程中的人工智能技术》,这本书抛开了传统的自动机,产生式,各种规则的传统的人工智能理论,而星讲的更前沿的计算智能——生物遗传算法,人工神经网络!这本书,不单纯讲理论,还用c++语言结合理论实现各种游戏程序!有时抽象的理论都星基于数学基础之上,如果没有一定数学基础星很难看懂的,但正因为它有数学证明星正确的,所以它星可行的!能把它用语言实现更星可观!)所以,如果你热爱计算机,在大学以前,就应该成为一个程序高手,而大学以后,主要专研各种技术的实现,和各种技术的学习,如果你把他留在工作里,可能很难,我的同学在参加工作后,很少有继续看技术书籍,因为技术书籍很难,不星一下两下就看懂的,有几个还有这样的耐力和精力去搞!这些怎么在编程上实现,都在等着老外,咱们COPY,这样我们的软件技术能强大吗?
可星在大学以前成为一个编程高手几乎不可能,我们没有良好的学习编程的环境,而且面对着中考,高考的各种压力,几乎没有机会去学习编程!其实,封学,初中,高学,那些课程没有必要象我们这样反复的复习,反复的作题,浪费了大量时间,我们要学会什么?学会一种技能,能够应付各种变化的技能,就星自学,学会思考,学会自己解决问题,学会团结合作!初等教育,打的口号很好,实际上,完全压制了这种学习方式!所以我们应该以最快的速度,在大学里容入一个热爱计算机的氛围!说到这又很难,当代大学生迷茫呀!不瞄道作什么,有些瞄道自己该好好编程,但光说不做!有些人,写了几段代码,出现了问题,不会调试,就放弃了!大家都这样,所以以寝室为单位没有人编程,逐渐以整个计算机学院为单位逐渐编程!确实我们的计算机老师,会编程的很少,我们应该瞄道,中国计算机引进并发展才短短20年,正星这样老一辈的,把这些计算机理论上确立,他们不会编程理所当然,大学的老师主要研究理论,国外的也星,因为理论太难了!
所以大学里学习编程要完全考自己,你要有信心,有意志把它学好才可以,而且这个过程星循序渐进的!以最快方式,找到你编程的爱好和兴趣!我介绍几个方法,学习方式,希望你能找到兴趣,起码我星这样做的,记住如果跌倒了,你要站起来
1.一定要和喜欢编程的,或编程厉害的,或经常编程的人,在一起,经常探讨问题!初学编程会有很多问题出现,你自己很难解决
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个,如果你做的程序很大,可以少些!以上,我把如果学习计算机入门和提起 你兴趣的方法告诉你了!我相信你按照我的去做,应该没有问题的!对于每个细节,我会在接下来详细为你们写出的!
经验分享
(十)数学对编程的重要作用
可能有很多朋友在网上看过google公司早几年的招聘广告,它的第一题如下了:{first 10*digit prime found inconsecutive digits e}.com,e中出现的连续的第一个10个数字组成的质数。据说当时这个试题在美国很多地铁的出站口都有大幅广告,只要正确解答了这道题,在浏览器的地址栏中输入这个答案,就可以进入下一轮的测试,整个测试过程如同一个数学迷宫,直到你成为google的一员。
又如Intel某年的一道面试题目:巴拿赫病故于1945年8月31日。他的出生年份恰好是他在世时某年年龄的平方,问:他是哪年出生的?这道看似很简单的数学问题,你能不能能快地解答呢?
下面则是一道世界第一大软件公司微软的招聘测试题:中间只隔一个数字的两个素数被称为素数对,比如5和7,17和19,证明素数对之间的数字总能被6整除(假设这两个素数都大于6),现在证明没有由三个素数组成的素数对。这样的试题还有很多很多,这些题目乍初看上去都是一些数学问题。但是世界上一些著名的公司都把它们用于招聘测试,可见它们对新员工数学基础的重视。数学试题与应用程序试题是许多大型软件公司面试中指向性最明显的一类试题,这些试题就是考察应聘者的数学能力与计算机能力。
某咨询公司的一名高级顾问曾说:微软是一家电脑软件公司,当然要求其员工有一定的计算机和数学能力,面试中自然就会考察这类能力。微软的面试题目就考察了应聘人员对基础知识的掌握程度、对基础知识的应用能力,甚至暗含了对计算机基本原理的考察。所以,这样的面试题目的确很“毒辣”,足以筛选到合适的人。
四川大学数学学院的曹广福教授曾说过:“一个大学生将来的作为与他的数学修养有很大的关系”。大学计算机专业学生都有感触,计算机专业课程中最难的几门课程莫过于离散数学、编译原理、数据结构,当然像组合数学、密码学、计算机图形学等课程也令许多人学起来相当吃力,很多自认为数据库学得很好的学生在范式、函数依赖、传递依赖等数学性比较强的概念面前感到力不从心,这些都是因为数学基础或者说数学知识的缺乏所造成的。
数学是计算机的基础,这也是为什么考计算机专业研究生数学都采用最难试题(数学一)的原因,当然这也能促使一些新的交叉学科如数学与应用软件、信息与计算科学专业等飞速发展。许多天才程序员本身就是数学尖子,众所周知,BillGates的数学成绩一直都很棒,他甚至曾经期望当一名数学教授,他的母校——湖滨中学的数学系主任弗雷福?赖特曾这样谈起过他的学生:“他能用一种最简单的方法来解决某个代数或计算机问题,他可以用数学的方法来找到一条处理问题的捷径,我教了这么多年的书,没见过像他这样天分的数学奇才。他甚至可以和我工作过多年的那些优秀数学家媲美。当然,比尔也各方面表现得都很优秀,不仅仅是数学,他的知识面非常广泛,数学仅是他众多特长之一。”。影响一代中国程序人的金山软件股份有限公司董事长求伯君当年高考数学成绩满分进一步说明了问题。很多数学基础很好的人,一旦熟悉了某种计算机语言,他可以很快地理解一些算法的精髓,使之能够运用自如,并可能写出时间与空间复杂度都有明显改善的算法。
程序设计当中解决的相当一部分问题都会涉及各种各样的科学计算,这需要程序员具有什么样的基础呢?实际问题转换为程序,要经过一个对问题抽象的过程,建立起完善的数学模型,只有这样,我们才能建立一个设计良好的程序。从中我们不难看出数学在程序设计领域的重要性。算法与计算理论是计算机程序设计领域的灵魂所在,是发挥程序设计者严谨,敏锐思维的有效工具,任何的程序设计语言都试图将之发挥得淋漓尽致。
程序员需要一定的数学修养,不但是编程本身的需要,同时也是培养逻辑思维以及严谨的编程作风的需要。数学可以锻炼我们的思维能力,可以帮助我们解决现实中的问题。可以帮助我们更高的学习哲学。为什么经常有人对一些科学计算程序一筹莫展,他可以读懂每一行代码,但是却无法预测程序的预测结果,甚至对程序的结构与功能也一知半解,给他一个稍微复杂点的数学公式,他可能就不知道怎么把它变成计算机程序。很多程序员还停留在做做简单的MIS,设计一下MDI,写写简单的Class或用SQL语句实现查询等基础的编程工作上,对于一些需要用到数学知识的编程工作就避而远之,当然实现一个累加程序或者一个税率的换算程序还是很容易的,因为它们并不需要什么高深的数学知识。
一名有过10多年开发经验的老程序员曾说过:“所有程序的本质就是逻辑。技术你已经较好地掌握了,但只有完成逻辑能力的提高,你才能成为一名职业程序员。打一个比方吧,你会XXXXX般武艺,刀枪棍棒都很精通,但就是力气不够,所以永远都上不了战场,这个力气对程序员而言就是逻辑能力(其本质是一个人的数学修养,注意,不是数学知识)。”
程序员的数学修养不是一朝一夕就可以培养的。数学修养与数学知识不一样,修养需要一个长期的过程,而知识的学习可能只是一段短暂的时间。下面是一些我个人对于程序员怎么样提高与培养自己的数学修养的基本看法
首先,应该意识到数学修养的重要性。作为一个优秀的程序员,一定的数学修养是十分重要也是必要的。数学是自然科学的基础,计算机科学实际上是数学的一个分支。计算机理论其实是很多数学知识的融合,软件工程需要图论,密码学需要数论,软件测试需要组合数学,计算机程序的编制更需要很多的数学知识,如集合论、排队论、离散数学、统计学,当然还有微积分。计算机科学一个最大的特征是信息与知识更新速度很快,随着数学知识与计算机理论的进一步结合,数据挖掘、模式识别、神经网络等分支科学得到了迅速发展,控制论、模糊数学、耗散理论、分形科学都促进了计算机软件理论、信息管理技术的发展。严格的说,一个数学基础不扎实的程序不能算一个合格的程序员,很多介绍计算机算法的书籍本身也就是数学知识的应用与计算机实现手册。
其次,自身数学知识的积累,培养自己的空间思维能力和逻辑判断能力。数学是一门分支众多的学科,我们无法在短暂的一生中学会所有的数学知识,像泛函理论、混沌理论以及一些非线性数学问题不是三五几天就可以掌握的。数学修养的培养并不在与数学知识的多少,但要求程序员有良好的数学学习能力,能够很快地把一些数学知识和自己正在解决的问题联系起来,很多理学大师虽然不是数学出身,但是他们对数学有很强的理解能力和敏锐的观察力,于是一系列新的学科诞生了,如计算化学、计算生物学、生物信息学、化学信息学、计算物理学,计算材料学等等。数学是自然学科的基础,计算机技术作为理论与实践的结合,更需要把数学的一些精髓融入其中。从计算机的诞生来看它就是在数学的基础上产生的,最简单的0、1进制就是一个古老的数学问题。程序设计作为一项创造性很强的职业,它需要程序员有一定的数学修养,也具有一定的数学知识的积累,可以更好地把一些数学原理与思想应用于实际的编程工作中去。学无止境,不断的学习是提高修养的必经之路。第三,多在实践中运用数学。有些高等学校开设了一门这样的课程——《数学建模》。我在大学时期也曾学过,这是一门内容很丰富的课程。它把很多相关的学科与数学都联系在一起,通过很多数学模型来解决实际的生产生活问题,很多问题的解决需要计算机程序来实现。我在大学和研究生阶段都参加过数学建模竞赛,获得了不少的经验,同时也进一步提高了自己的数学修养。实际上,现在的程序设计从某些角度来看就是一个数学建模的过程,模型的好坏关系到系统的成败,现在数学建模的思想已经用于计算机的许多相关学科中,不单只是计算机程序设计与算法分析。应该知道,数学是一门需要在实践中展示其魅力的科学,而计算机程序也是为帮助解决实际问题而编制的,因此,应该尽量使它们结合起来,在这个方面,计算机密码学是我认为运用数学知识最深最广泛的,每一个好的加密算法后面都有一个数学理论的支持,如椭圆曲线、背包问题、素数理论等。作为一名优秀的程序员,应该在实际工作中根据需要灵活运用数学知识,培养一定的数学建模能力,善于归纳总结,慢慢使自己的数学知识更加全面,数学修养得到进一步提高。
第四,程序员培养制度与教学的改革。许多程序员培养体制存在很多缺陷,一开始就要求学员能够快速精通某种语言,以语言为中心,对算法的核心思想与相关的数学知识都一笔带过,讲得很少,这造成很多程序员成为背程序的机器,这样不利于程序员自身的快速成长,也不利于程序员解决新问题。我在长期的程序员培训与计算机教学工作采用了一些与传统方式不一致的方法,收到了一定的效果。很多初学程序的人往往写程序时有时候会有思维中断,或者对一些稍难的程序觉得无法下手,我采用了一些课前解决数学小问题的方法来激励大家的学习兴趣,这些小问题不单单是脑筋急转弯,其中不少是很有代表意义的数学思考题。通过数学问题来做编程的热身运动,让学员在数学试题中激发自己的思维能力,记得有位专家曾经说过,经常做做数学题目会使自己变聪明,很长时间不去接触数学问题会使自己思维迟钝。通过一些经典的数学问题来培养学员的思维的严谨性和跳跃性。很多人可能不以为然,其实有些看似简单的问题并不一定能够快速给出答案,大脑也在不断的运用中变更加灵活的。不信吗?大家有兴趣可以做做下面这道题目,看看能不能在1分钟之内想到答案,这只是一道小学数学课后习题。很多人认为自己的数学基础很好,但是据说这道题目90%以上的人不能在一个小时内给出正确答案。
证明:AB+AC>DB+DC(D为三角形ABC的一个内点)。
最后,多学多问,多看好书,看经典。我在这里向大家推荐两部可能大家已经很熟悉的经典的计算机算法教材,它们中间很多内容其实就是数学知识的介绍。第一部是《算法导论》,英文名称:Introduction toAlgorithms,作者:Thomas H.Cormen,Charles E.Leiserson,RonaldL.Rivest,Clifford Stein。本书的主要作者来自麻省理工大学计算机,作者之一Ronald L.Rivest由于其在公开秘钥密码算法RSA上的贡献获得了图灵奖。这本书目前是算法的标准教材,美国许多名校的计算机系都使用它,国内有些院校也将本书作为算法课程的教材。另外许多专业人员也经常引用它。本书基本包含了所有的经典算法,程序全部由伪代码实现,这更增添了本书的通用性,使得利用各种程序设计语言进行程序开发的程序员都可以作为参考。语言方面通俗,很适合作为算法教材和自学算法之用。另一部是很多人都应该知道的Donald.E.Knuth所著《计算机程序设计艺术》,英文名称:The Art ofComputer Programming。
Donald.E.Knuth人生最辉煌的时刻在斯坦福大学计算机系渡过,美国计算机协会图灵奖的获得者,是本领域内当之无愧的泰斗。有戏言称搞计算机程序设计的不认识Knuth就等于搞物理的不知道爱因斯坦,搞数学的不知道欧拉,搞化学的不知道道尔顿。被简称为TAOCP的这本巨著内容博大精深,几乎涵盖了计算机程序设计算法与理论最重要的内容。现在发行的只有三卷,分别为基础运算法则,半数值算法,以及排序和搜索(在写本文之际,第四卷已经出来了,我也在第一时间抢购了一本)。本书结合大量数学知识,分析不同应用领域中的各种算法,研究算法的复杂性,即算法的时间、空间效率,探讨各种适用算法等,其理论和实践价值得到了全世界计算机工作者的公认。书中引入的许多术语、得到的许多结论都变成了计算机领域的标准术语和被广泛引用的结果。另外,作者对有关领域的科学发展史也有深入研究,因此本书介绍众多研究成果的同时,也对其历史渊源和发展过程做了很好的介绍,这种特色在全球科学著作中是不多见的。至于本书的价值我觉得BillGates先生的话足以说明问题:“如果你认为你是一名真正优秀的程序员读Knuth的《计算机程序设计艺术》,如果你能读懂整套书的话,请给我发一份你的简历”。作者数学方面的功底造就了本书严谨的风格,虽然本书不是用当今流行的程序设计语言描述的,但这丝毫不损伤它“程序设计史诗”的地位。道理很简单,它内涵的设计思想是永远不会过时的。除非英语实在有困难,否则建议读者选用英文版。
经验分享
(十一)给学习计算机的同僚们(初学者,进阶者,包括Linux爱好者)的学习建议
为什么我们要学习计算机,为什么我们要学习编程,有很多很多的原因,但当我们踏进计算机的世界里的时候,我们找到了可以任由我们发挥,任由我们施展拳脚的天地,我们有了一种对学习计算机,甚至是学好计算机的渴望,但是任何一门学科都不是那么容易学的好的,计算机更是如此,我想我们大多数人都是从编程开始学习的,逐渐形成了对学习编程的兴趣,但是如果想真正的学好计算机,单单学习高级语言是不能达到效果的,就算你说我只想学好一门高级语言,把它学的精通就可以了,但问题就是那么的简单么,我想不是吧。
计算机是一个整体,学习任何一门计算机课都是和其他课程联系在一起的,要学习就要有足够的深度和广度,不然不可能有深入的了解就像学习c语言一样,如果你想知道他是怎样在计算机的内存中分布的,具体是怎么运行的,就要学习汇编语言,当然计算机体系结构,计算机组成原理,是你理解计算机的基础,计算机大师knuth都非常重视汇编语言(汇编语言和机器语言是一一对应的),要想学好软件,脱离硬件是不可能,因为软件最终要靠硬件来运转的。当然了如果是初学者还是要一步步学的,如果你想知道c语言是怎么运行的,想了解指针和数组的真正区别,那多学一门语言汇编语言吧,人们都说汇编语言是与机器相关的,不能移植的,但想在的pc机上用的几乎都是AMD,和intel的处理器,他们有都是互相兼容的,所以指令集的体系结构都是IA*32当然了现在都有64位的处理器了,但是这并没有什么很大的区别,仅仅是位数变多了,所能表达的数字变大了,精度也变的更长了等等。就像学习高级语言一样学习汇编语言也是相通的,因为他们的功能都差不多,而且更加简单,你会发现在高级语言中的语法会在汇编语言中消失,仅存的就只是指令的书写格式(相当如词法吧,当然了我可能也说的不太对,因为对汇编语言学的不是很深入,所以现在也正在有计划的去学习)。如果你学习的java,vb,c#等等那么就请您多多看看c和c++吧,我们常常听说某种语言实现了垃圾回收机制,用某种算法不定期的把你程序中不再使用的内存回收掉,最好的例子就是JAVA了(关于它的一句话说的挺好,一次编译到处运行,非常适用于嵌入式计算机程序的编写),不过你能用JAVA语言写出内存回收的程序么我想应该是不可能,JAVA对于这方面做了太多的限制,但在c/c++中却没有,你可以用库函数malloc等等去分配内存,free去释放内存,c++中对应的是(new,delete)实现的跟方便些,你也可以用系统调用brk(其实库函数也是调用了他,只不过做了一些更加完善的工作而已)去分配,而且他可以直接去操作数据到位(&,|,~),如果说高级语言是汇编语言的一个子集的话,那么JAVA在这方面就是C/C++的一个子集,我并没有说java不用学,不好,而是在学习他之前应该多去学学C/C++,(注意语法不是特别的重要,重要的是你怎么能在学完语言以后去灵活的运用他),计算机体系结构对于你理解。
软硬件非常的重要给大家推荐一本书,书名 :计算机组成与设计——硬件/软件接口作者:DavidA.Patterson John L.hennessy 出版社:机械工业出版社,这本书很不错,能够很好的把软硬件的关系数清楚,而且不像一些国内的体系结构教材,看的非常的费劲谁然讲的都是很清楚,但不能从读者的角度去考虑问题,这本书会让你看的爱不释手的,恩,对于我来说却是如此,不适合初学c语言的,要有一定的c语言基础。我想还有一点要和大家分享一下,就是学习计算机切忌浮躁,不要像追是族一样,看到一项新出的技术就去学习,新技术会不断的变的,而且很容易让你迷失方向,一定要打好基础,关于计算机基础的书一定要多看,不要死记硬背,但你发现你需要死记硬背去记住书中的知识的时候,那么我可以给你个建议把此书放在书架里,去看一些能够引导你一步步的从本质上理解知识的书,首选一些计算机科学丛书,图灵丛书(机械工业出版社,人民邮电出版社,电子工业出版社),我们学校用的是清华大学自己出版的计算机书籍,虽说清华大学在工科方面很不错,但是出版的计算机书籍就我个人来说真的不怎么好,相对于国外的计算机书籍来说差的真是太远了,我很不明白为什么要用清华出的,有一本关于Linux/unix内核的书我觉得挺好的,书名是Linux内核源代码情景分析浙江大学出版的,我目前正在潜心学习这本书,虽然很难,但真的不错,很少有由我们自己写的关于Linux内核这方面的好书,这本就是不可多得的好书。说了太多关于计算机书籍的话题了,但我认为一本好的书籍真的能给我们很大的帮助还能从中得到快乐。如果你只想学习计算机去赚钱的话,那么你大可以不必去学习很多东西,对于你也没有用处,如果你是对计算机有着非常浓厚的兴趣的话,那么就塌下心来,一步一步去在计算机的海洋里傲游吧,真是一件美妙的事情。
现在我告诉大家自己认为的关于学习计算机的路程
(1)
c语言(可以去学谭浩强写的c语言的书,如果能找到K&R C 那就更好,自己是没有找到,要想进一步去学习的话去看 c缺陷与陷阱,c专家编程,这两本书很经典的)
(2)
c++语言(c和c++其实并不一样,可以说c++是继承了c,增加了面向对象的思想,如果能找到c++program languagec++之父写的就很好,不过自己没有找到,要想进一步去学习的话去看effective c++ more effective c++,挺不容易懂的,因为自己要看Linux内核所以没有多少时间去看,c++沉思录(c缺陷与陷阱 的作者与他的妻子)也非常的不错,还是没有时间去看,只看了200多页,讲的太好了,有时间自己一定会去看完的,这本书讲的主要是教你怎么运用C++语言去写出好的文章)算法和数据之间的结构的理解也很重要,我想如果你有了c++的学习经验学习数据结构应该不太困难,一直以来我都不是很明白抽象的数据结构(abstract data type ADT)的抽象是怎么回事是什么意思,之后看了c++沉思录才恍然大悟,抽象就是把想关注事务的部分拿出来,不关心的不去考虑,就像我们人类,人有很多属性,姓名,年龄,体重等等,当我们研究具体问题是也许只关心人的属性的某些方面,例如姓名,年龄,那么就把它拿出来也就是术语抽象,在c/c++语言就用用户自定义的数据类型来去定义人:struct people{charname[10];int age;};struct 是structure(结构)的缩写,这样理解就非常简单了么,所以c++沉思录非常的好。
(3)
算法与数据结构(有很多好的书籍,大家可以去找找,反正清华出的不敢恭维)
(4)
汇编语言,计算机组成原理,计算机体系结构 微机原理(我认为刚才我说计算机组成与设计——硬件/软件接口就很好的包含了这些内容挺不错的,当然了学习是无止境的。)之后才能开始os的学习,我认为OS是让你在学习计算机上有一个质的飞跃,因为现代的程序设计一般都是基于OS的,如果不了解OS,那么就不可能学好程序设计,就像建造房子一样,房子要建在地上,如果你不了解当地的环境,地质,这么怎么能建造好的房子呢?
(5)
操作系统原理的学习,数据库原理的学习(有一本挺好的书,自己是看完了一遍,电子工业出版社的操作系统设计与精髓作者 stalling 忘了具体怎么拼了,理论性很强,不过是一本好书,要理解性的看)。
至于网络原理,软件工程,通信安全,鉴于尚在学习中,就不说了。哦,还有编译原理,是一门教你怎么把语言翻译成汇编语言,机器语言的一门课,有很多很难的算法,LR算法就很不好理解,至于要什么时候学那就在学好语言和算法的基础上去学习吧。记住千万不要赶时髦去学什么VC,BC,包括MFC之类的,他们只是开发程序的工具而已帮你做了一些辅助性的工作,所以好好学习语言吧!还有就是对于什么等级考试一点作用都没有,如果要是我说现在的等级考试只是人家赚钱的一种方式,已经变质了,我不知道为什么不跟上时代的脚步,把它们给取消了,不止是计算机等级考试,英语等级考试也没有用,不管怎么说他都是一门纸上的考试,对于提高自己没有作用,反而会有反作用。如果你只是为了拿一个计算机考试的凭证,那我劝你还是止步吧,我们是为了学习计算机而学习计算机而不是为了学习计算机而去拿那个一文不值得证,不然我真不知道你学习计算机还有什么意思。如果真的是对计算机感兴趣那就塌下心来,一步一个脚印的去探索计算机世界的奥秘,多么美好的事情呀。很多人开始学习的人都是梦想成为黑客,用几个程序去攻击别人的漏洞,但什么是黑客,天才的程序员才能配的上,就像Linus等一样,我们的目的是去建造宏伟的建筑,而不是去炸毁他那是骇客所做的事情,如果你认为别人的建筑有不足之处大可以指出来。这只是我个人的意见,有不足之处请指出,谢谢了!
还有就是谈谈自己对于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(通用的应用程序编程接口,就是人们把各个方面常用的函数用某种语言编写出来供程序员使用,减少了程序员的负
第二篇:室内设计程序学习心得
室内设计程序学习心得
指导老师:向阳班级:艺设六班姓名:李陟学号:20092468
艺术,在人类文明的知识体系中与科学并驾齐驱。艺术,具有完全不可代替的学科系统。艺术与科学的理论研究是以艺术理论为基础向科学领域扩展的交融;艺术与科学的研究成果则通过设计与创作的实践活动得以体现。
设计艺术学科是横跨于艺术与学科之间的综合性边缘性学科。艺术设计专业产生于工业文明高度发展的20世纪。具有独立知识产权的各类设计产品,以其艺术与科学的内涵成为艺术设计成果象征。设计艺术的学科的每个专业方向在国民经济中都对应着一个庞大的产业,如建筑室内装饰行业、服装行业、广告与包装行业等等。每个专业方向在自己的发展过程中无不形成极强的个性,并通过这种个性创造以产品的形式实现其自身社会价值。其中室内设计是最独特最具个性的一个产业,我有幸学习了这门课程--室内设计程序。室内设计师建立在四维时空盖帘基础上的艺术设计门类,从属于环境艺术设计的范畴,作为现代艺术设计中的综合门类,其包含的内容远远超出的传统的概念。由于室内设计是一个相对复杂的设计系统,本身具有科学、艺术、功能、审美等多元化要素。在理论体系与设计实践中涉及到相当多的技术与艺术门类,因此在具体的设计运作过程中必须遵循严格的科学程序。
通过6周的学习,我对门课有了一些感触和体会,下面我就一一列举。
住所就是在人类和环境之间建立一个意义长远的关系。换而言之,住所就是由生活环境决定的。
因此,住宅环境反映了人们基于彼此关系上所表现出的个性和品位。
住房和内部结构的选择就是通过改变墙壁和入口的位置,反映出对独立居住空间的需要性。因此,独立的生活方式已经成为最值得重视的问题,而住所也不再是简单的居住空间了,而成了一种新型的住宅文化。
另一方面,由于家庭人数的减少和夫妻均工作的家庭及独身人群的增加,家庭观念渐渐的弱化,家庭成员之间的联系渐渐疏远,立刻建立一种新型的家庭观念就很有必要了。因此,家庭成员的快乐与亲情这样一种情绪面貌也更为强调了。所以,空间的情感取向正日趋强化,并加入了一些象征性的意义,即对于一个空间而言,情感以更甚于使用功能一样。由于社会变化,价值观、家庭模式、新增设施及建筑技术的改变,住所的功能应该多元化,这都需要建立新型的住宅文化和风格,将提供前沿性对策,并用于解决多种问题。居住空间的分类
住宅建筑的风格不是单一的,是依照群体水平、建造风格、楼层布局而定的。典型的住宅类型包括住宅、公寓、家庭房屋和经济住宅。然而现代人想要一种符合他们品位的个性化的住宅风格,以次取代那种只强调功能的单一风格。工作室式公寓有最新的附属设施,吸引了学生和单身人群。由于单身人的住宅需求量正在不断上升,这种趋势还在持续。这种住宅风格是基于生活方式的分析、价值观、偏向的变化上的。考虑到不同文化层次和生活方式,为了适应用户的行为和对环境的偏好,在建筑基本完工后,决定材料、颜色、分割空间,布置照明,家具的一项工作。实际上,必须提供一个适当的设计方案。居住空间的室内设计程序
人们都把室内设计说成是在建筑基本完工后,决定材料、颜色、分割空间、布置照明、布置家具的一项工作。实际上,在室内设计开展前,准备阶段是必要的,这样可以便于一些不确定的因素系统化并指导设计进程的开展。
设计阶段可以诠释为一种过程,设计师则和设计方向的决定可以说成是基础于这一阶段的。
居住空间的室内设计程序是由五方面组成:计划(规划)、基础计划(目的和系列设计)、基础设计(设计)、履行设计(总体协调)、施工和指导(完成和评估)。
1.计划(规划)
计划是一个收集信息阶段,以便了解用户的需求和特性,并会考虑到室内装饰中的预算和经济能力。而在美学志趣上,设计者和客户应改为特定的空间去确定一个统一的主题,所以设计者的作用就应该是客户的预算中去调整需求。因此,这个阶段需要设计者和客户进行充分沟通。
2.基础阶段(目的和系列设计)
这个阶段,是通过了解需求上的设计方向和受限因素,来决定单位空间的设计主题和设计气氛的时期。它表明了概念上的空间设计观念,通过结构、布置、照明、色彩、通道的图示去满足功能和美学上的需求。
3.基础设计(设计)
这一阶段在上一阶段的基础上,进行详细的布置和绘图(地毯、天花板、照明、家具、立面、剖面)。而对于家具安排,照明设备、材料和颜色的是党选择,都有必要和客户协商后再进行调整。只有对设计方向和内容满意,客户才会对设计充满信心。
4.实现设计(总体协调)
这一阶段产生的所谓的施工图,用来指导施工,是基础设计的最后决定。这是一个明确的施工方案,包括施工方法、装饰材料的决定、家具的挑选和布置、照明和色彩的选择,以及其他设备的陈列。这样一个详细地说明为的是实现正常的施工。
5.施工和指导(完成和评估)
这个阶段,设计者按已形成的施工图进行现场的指导。设计者应核对设计是否落实,是否准确反映用户的详细要求,家具的数量和尺寸也应该与空间大小对应。若发现了不足和遗漏处,设计者应该当场告诉施工者。
居住空间的构造和安排
关于居住空间的构造和安排,应该通过空间的数量和类型来了解空间的构造,通过空间之间的联系来了解空间的安排。并按照住宅活动的内容来给生活空间分类,在通过这种分类来划分居住空间。居住空间的构造有一个一体化的计划,这个空间计划始于空间的构造和分析的结果,并在同类活动中进行必要的装备和连接。所以,居住空间可以划分为公共空间、私人空间和服务空间。当这些空间被有机的连接后,有效的活动也就得以保障。如果空间被过度的重复,生活效率也就降低了。考虑到建筑方向、建筑尺寸和空间功能,各部分空间都应该以入口为中心来安排。因此,空间的结构和安排的风格成为了空间计划的基础。
由此我们已经知道科学的设计程序对于室内设计的重要性。要在设计的实践中严格遵守,首先必须在室内设计的教育中贯穿系统与程序的概念。虽然目前所有的室内设计专业课程都体现这样的概念,但是在进入专业学习之前先进行室内设计程序的专门教学,无疑能取得事半功倍的效果,这就是我们设立“室内设计程序”课程的意义。
第三篇:实质性程序学习心得
实质性程序总结心得
———赵彩虹
一、总体心得
(一)每张表头均包含客户名称、财务报表日、编制人及日期、复核人及日期以及索引号和页次。
(二)会计科目的审计目标通常包括存在或发生、完整、权利和义务、计价与分摊/准确性、截止、分类以及恰当的披露。
(三)各个会计科目均要有审定表、明细表和检查表。
通常根据企业提供的科目余额表、序时账编制审定表和明细表;对于各科目通常选择不包含损益结转的10个左右分录,选择原则通常是大额和异常的。
(四)各个科目的索引号是既定的,对其后附资料按照类别顺序编号;整本装订后加入归档目录以显示本册内容,对所有资料顺序编制页码并填于归档目录。
(五)各个企业审计均需获取营业执照、税务登记证、组织机构代码证;董事会决议、会议记录等。
(六)从企业获取的各项资料均需企业盖章,合同之类可以盖骑缝章。(七)复印重要科目大额、复杂、异常凭证。
(八)审计结论通常为:经查,未见重大、异常事项,期末余额(发生额)可以确认。对于特殊事项的处理过程也应记录于审计说明中。
二、对各科目的认识(一)货币资金
1.需企业提供存款及借款银行的全称、帐号、金额、地址、邮码以编制银行询证函。2.提供银行对帐单(全年12个月的),如有未达账项需提供银行存款余额调节表。3.存折、支票存根。
4.对库存现金进行监盘,通常是突击检查,填制现金监盘表并让相关人员签字确认。(二)应收票据
1.从企业取得应收票据明细表,包含出票日期、出票人、付款行、到期日等基本信息。2.复印全部票据并与明细表内容核对。对于某些票据明细的内容有缺失的应重点检查。
3.询问并检查票据权利是否完整,存在质押抵押贴现的需获取相关文件。(三)应收账款、预付账款、其他应收款
1.获取包含有客户名称、地址、电话、邮编的客户清单。
2.选择大额、异常、交易频繁的客户进行函证,函证金额需要达到期末总金额的80%左右。回函需直接寄至事务所。
3.对于未回函的部分可二次致函也可实施替代性测试,检查销售单、销售发票销售合同、出库单等证实应收账款的存在性。
4.对于发函客户编制回函确认表以控制所发函证的收回情况。5.复核账龄及坏账准备的计提并与资产减值损失明细核对。对账龄超过一年的需要分析不能收回的原因。
6.期末余额存在负数的需要重分类并填写调整分录。(四)存货
1.获取企业12月31日存货盘点表,对存货监盘并填制监盘表,相关人员签字确认。对于账实不符的查明原因并提前被审单位处理形成审计意见。2.对于制造业企业,填制存货倒扎表以核对营业成本。3.询问存货是否存在抵押,获取证明文件。
4.监盘时对存货的状态进行检查,复核是否应计提减值准备及金额多少。5.实施存货的计价测试。(五)固定资产
1.获取企业12月31日的固定资产盘点表,本期固定资产增加、减少明细表。必要时检查重要及本期新增固定资产。
2.获取电子版折旧计算表与自行核算的折旧核对是否相符,如不符,查明原因并提请管理层,出具审计结论。
3.各产权复印件(房屋需产权证;车辆行驶证;船舶需国籍证明),大额固定资产购置发票。
(六)在建工程
1.获取立项审批文件,竣工决算报告,本期转入固定资产明细。2.必要时实地检查在建工程。
3.已经资本化的利息确认方式说明(包括依据、计算方法、列支项目等,电子版)。(七)长期股权投资
1.获取被投资单位的审计报告。2.对核算方法正确性获取充分证据。(八)无形资产
1.土地取得土地使用权证,其他无形资产取得相关证明文件。2.无形资产摊销明细表。
3.土地使用权证及相关抵押担保情况的说明。(九)应付帐款、预收帐款、其他应付款
1.3年以上应付帐款、预收帐款、其他应付款未付原因及金额。2.选择部分供应商进行函证。(十)预计负债
1.预计负债计提的条件是否满足。(十一)长、短期借款
1.对银行借款函证。
2.获取借款合同及相应担保、保证、质押等合同。
3.根据借款合同信息计算本期计提利息费用金额及入账科目并与财务费用核对。(十二)应付职工薪酬
1.企业各月职工薪酬明细及对方入帐科目。
2.职工福利费、教育经费及五险一金计提比例及基数。3.较职工薪酬本年发生额与对方入账科目是否相符。(十三)应付利息
1.根据企业借款合同计算核对利息是否与企业计提相符。(十四)应付股利
1.取得企业股利发放批复文件。(十五)应交税费
1.获取全年各税种纳税申报表。
2.根据全年收入额及增值税税率或营业税税率测算应交增值税本期发生额是否正确。
3.测算城建税、教育费附加等是否和本期计提一致。
4.填制增值税计算表和应交增值税期末余额核对是否相符。(十六)递延税得税资产、负债
1.企业存在暂时性差异的说明并加盖公章。
2.计算金额是否正确。(十七)实收资本
1.如存在资本增减变化,查阅董事会决议、记录等资料。(十八)未分配利润
1.获取利润分配的董事会决议或上级通知文件。检查未分配利润会计处理是否正确。(十九)营业收入、营业成本
1.取得企业大额销售、采购合同。
2.获取收入及成本各月份分产品的明细表。
3.比较本期和上期收入成本及毛利率并填制明细表。
4.对收入进行截止性测试,比较销售发票、出库单、明细账日期相符情况。
5.对收入真实性和完整性分别从逆向和正向两个方面测试。(二十)营业税金及附加
1.按照各自计税基数和税率计算营业税金及附加的对应科目之和与本科目是否相等。(二十一)管理费用、销售费用、财务费用
1.获取期间费用各月分项目本期发生额。
2.分明细与上期发生额比较,分析异常变动情况。
3.选取资产负债表日前后10天的发生额进行截止性测试。(二十二)营业外收入、营业外支出
1.对于政府补助的营业外收入获取政府文件。
2.核查收支明细分类是否正确。(二十三)所得税费用
1.根据本年利润总额和税率重新计算所得税费用的正确性。
第四篇:程序文件学习心得2
学习心得
根据质保体系会议要求及学习计划,本周重点学习了《质量体系程序文件》的“无损检测系统质量管理程序”、“理化检验系统质量管理程序”、“热处理系统质量管理程序”和“质量记录控制程序”。
“无损检测”方面的学习;使我对无损检测工艺实施的条件、时机和过程控制更加清晰;在以后编制生产工艺过程中,对无损检测方面的考虑也会更加全面和谨慎。
“理化检验”方面的学习;让我感觉自己在这方面还有很多需要学习的地方;理化相关标准众多,实验条件和过程要求严格,实验的结论更是判定产品是否合格的重要依据,使我深感理化检验的重要性。
“热处理”方面的学习;由于之前是热处理负责人,所以对热处理方面学的比较多,通过本次学习,加深了对本控制程序的认识。以后要在特材的加热和热处理方面重点学习。“质量记录控制”方面的学习;其中有一句是:“质量记录要求完整、及时、正确、清晰且具有可追溯性”,我觉的这个很重要,而且是我们努力要做到的;不论是以后的体系审核、技术总结、还是责任划分都是重要的文字依据。
XXX
2012年5月13日
第五篇:程序文件学习心得1
学习心得
本公司《质量体系程序文件》共有22个控制程序,作为工艺员及理化负责人,主要涉及到其中的12个控制程序,并计划利用3周时间对其进行重点学习。
程序文件就是为了完成管理体系要素所规定的方法,用于支持管理手册的相关要求。通常包括活动的目的和范围,做什么和谁来做;何时、何地以及如何做;应采用什么材料、设备和文件;如何对活动进行控制和记录。其内容是描述实施管理体系要素所涉及到的各职能部门的活动。程序文件详细的规定了公司各个部门的过程职责,并指导各项管理工作的实际运行步骤和方法。
本周重点学习了“文件控制程序”、“顾客提供产品管理程序”、“工艺质量管理程序”和“焊接系统质量管理程序”;对“合同控制程序”和“采购与原材料控制程序”进行了了解性学习。通过一周的程序文件学习,受益非浅。这样的学习很有必要,不但要对程序文件学以致用,更重要的是通过这次学习,让我对自己的岗位过程职责、步骤、方法有了一个新的认识,意识上有了进一步的提高。严格的贯彻执行每个程序要求,必然会使我们的管理水平和产品质量提高一个台阶。
XXX
2012年4月29日