posted in 程序员之路 

        写博客会花费一些时间,因此有时会想为什么要写博客?
        因为感觉写博客是一个思考、总结的过程,有人说“读书说明你学会了学习,而写作说明你学会了思考”。通过写作,把学习的东西加以总结、凝练,真正变为自己的东西。
        第一次接触到博客是在CSDN的一个校园讲座上,讲座中那个CSDN讲师各种宣扬写博客的好处,什么找工作好找,什么因为一篇博文被IT大佬所赏识,blabla……反正一堆好处,当时就想写博客真是太特么牛掰了,高端大气上档次,于是兴冲冲的跑去申请了一个博客。
        博客申请初期也写什么特别有用的东西,只是转载一些技术文章以及一些杂文,再往后开始写一些简单的学习笔记,转载一些好的文章。再后来看到了一些牛人的博客,写得确实很好,再加上看了一些东西,也开始写一些博客了,写到现在,感觉不错。
        关于为什么要写博客,刘未鹏的博文“为什么你应该(从现在开始就)写博客”和池建强的博文“写作即思考”都有所讨论,对于他们的许多观点也感到十分赞同。当然自己还远远达不到他们的层次,不过有一点是mac君很赞同的,就是要学着开始写博客,或许一开始的时候质量不高,但这是一个开始。写作的过程就是一个思考的过程,写作会推动自己开始思考。
        感觉写作就是一个函数定义的过程。在写作的时候,往往会就某一个问题进行思考,这个问题自己已经思考过很多次,终于有一天自己觉这个问题已经想得小有成果了,可以进行一下总结了,于是就写了一篇文章。
        这就好比是在定义一个函数,或者定义一个类。在函数中,对这个问题的各种情况(函数的各种参数)进行了分析,因为要兼顾到不同的情况(不同参数),因此在定义函数的过程中就会进行一些思考。同时为了保持结果的准确性,就会对事物的推理过程有一个显性的思考的过程:毕竟这不是写私人的日志,而是要写给人看得,事物的推理要过得去才行。最后总结出了一些结论(函数的返回值),这样当再次遇到这个问题时,直接调用这个函数就能直接得到返回值了。另一方面,写出来的文章可以作为一个类来使用,类的一个特性是可派生:在这个类的基础上,可以对其他的一些东西进行思考,进而派生出一个更加复杂问题的思考,而这些思考可以写成另一篇博文(另一个子类),通过这样的方式构造对这个世界的理解。
        相比与只思考不写作的方式,写作一方面能够加深记忆的印象,另一方面对问题有一个更加明确的逻辑。刘未鹏在博文中有过一个比喻:思考的过程就好比是一个打着灯笼探路的过程,因为人大脑的能力有限的(科学测试人只能同时进行7+-2的思考),在探路的过程中往往会迷失了方向。如同在进行深度优先遍历时,走到一个“树”的子结点上回溯不到上层节点了,这时通过写作就能对事物进行一个更加深层次的把握。还有一个优势在于,博文写出来是给人看得,别人看了之后可能会有一个思想的交流的过程,思维的碰撞产生智慧的火花,这算是写作的意外收获了。

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/9884047

posted in OJ题解 

每年一到要找工作的时候,我就能收到很多人给我发来的邮件,总是问我怎么选择他们的offer,去腾讯还是去豆瓣,去外企还是去国内的企业,去创业还是去考研,来北京还是回老家,该不该去创新工场?该不该去thoughtworks?……等等,等等。今年从7月份到现在,我收到并回复了60多封这样的邮件。我更多帮他们整理思路,帮他们明白自己最想要的是什么。(注:我以后不再回复类似的邮件了)。

我深深地发现,对于我国这样从小被父母和老师安排各种事情长大的人,当有一天,父母和老师都跟不上的时候,我们几乎完全不知道怎么去做选择。而我最近也离开了亚马逊,换了一个工作。又正值年底,就像去年的那篇《三个故事和三个问题》一样,让我想到写一篇这样的文章。

几个例子

当我们在面对各种对选择的影响因子的时候,如:城市,公司规模,公司性质,薪水,项目,户口,技术,方向,眼界…… 你总会发现,你会在几个公司中纠结一些东西,举几个例子:

  • 某网友和我说,他们去上海腾讯,因为腾讯的规模很大,但却发现薪水待遇没有豆瓣高(低的还不是一点),如果以后要换工作的话,起薪点直接关系到了以后的高工资。我说那就去豆瓣吧,他说豆瓣在北京,污染那么严重,又没有户口,生存环境不好。我说去腾讯吧,他说腾讯最近组织调整,不稳定。我说那就去豆瓣吧,慢公司,发展很稳当。他说,豆瓣的盈利不清楚,而且用Python,自己不喜欢。我说,那就去腾讯吧,……

  • 还有一网友和我说,他想回老家,因为老家的人脉关系比较好,能混得好。但又想留在大城市,因为大城市可以开眼界。

  • 另一网友和我说,他想进外企,练练英语,开开眼界,但是又怕在外企里当个螺丝钉,想法得不到实施。朋友拉他去创业,觉得创业挺好的,锻炼大,但是朋友做的那个不知道能不能做好。

  • 还有一网友在创新工场的某团队和考研之间抉择,不知道去创新工场行不行,觉得那个项目一般,但是感觉那个团队挺有激情的,另一方面觉得自己的学历还不够,读个研应该能找到更好的工作。

  • 还有一些朋友问题我应该学什么技术?不应该学什么技术?或是怎么学会学得最快,技术的路径应该是什么?有的说只做后端不做前端,有的说,只做算法研究,不做工程,等等,等等。因为他们觉得人生有限,术业有专攻。

  • 等等,等等……

我个人觉得,如果是非计算机科班出生的人不会做选择,不知道怎么走也罢了,但是我们计算机科班出生的人是学过算法的,懂算法的人应该是知道怎么做选择的

排序算法

你不可能要所有的东西,所以你只能要你最重要的东西,你要知道什么东西最重要,你就需要对你心内的那些欲望和抱负有清楚的认识,不然,你就会在纠结中度过。

所以,在选择中纠结的人有必要参考一下排序算法。

  • 首先,你最需要参考的就是“冒泡排序”——这种算法的思路就是每次冒泡出一个最大的数。所以,你有必要问问你自己,面对那些影响你选择的因子,如果你只能要一个的话,你会要哪个?而剩下的都可以放弃。于是,当你把最大的数,一个一个冒泡出来的时候,并用这个决策因子来过滤选项的时候,你就能比较容易地知道知道你应该选什么了。这个算法告诉我们,人的杂念越少,就越容易做出选择。

  • 好吧,可能你已茫然到了怎么比较两个决策因子的大小,比如:你分不清楚,工资>业务前景吗?业务前景>能力提升吗?所以你完全没有办法进行冒泡法。那你,你不妨参考一个“快速排序”的思路——这个算法告诉我们,我们一开始并不需要找到最大的数,我们只需要把你价值观中的某个标准拿出来,然后,把可以满足这个价值的放到右边,不能的放到左边去。比如,你的标准是:工资大于5000元&&业务前景长于3年的公司,你可以用这个标准来过滤你的选项。然后,你可以再调整这个标准再继续递归下去。这个算法告诉我们,我们的选择标准越清晰,我们就越容易做出选择

这是排序算法中最经典的两个算法了,面试必考。相信你已烂熟于心中了。所以,我觉得你把这个算法应用于你的人生选择也应该不是什么问题。关于在于,你是否知道自己想要的是什么?

排序算法的核心思想就是,让你帮助你认清自己最需要的是什么,认清自己最想要的是什么,然后根据这个去做选择

贪婪算法

所谓贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择(注意:是当前状态下),从而希望导致结果是最好或最优的算法。贪婪算法最经典的一个例子就是哈夫曼编码

对于人类来说,一般人在行为处事的时候都会使用到贪婪算法,

  • 比如在找零钱的时候,如果要找补36元,我们一般会按这样的顺序找钱:20元,10元,5元,1元。

  • 或者我们在过十字路口的时候,要从到对角线的那个街区时,我们也会使用贪婪算法——哪边的绿灯先亮了我们就先过到那边去,然后再转身90度等红灯再过街。

这样的例子有很多。对于选择中,大多数人都会选用贪婪算法,因为这是一个比较简单的算法,未来太复杂了,只能走一步看一步,在当前的状况下做出最利于自己的判断和选择即可。

有的人会贪婪薪水,有的人会贪婪做的项目,有的人会贪婪业务,有的人会贪婪职位,有的人会贪婪自己的兴趣……这些都没什么问题。贪婪算法并没有错,虽然不是全局最优解,但其可以让你找到局部最优解或是次优解。其实,有次优解也不错了。贪婪算法基本上是一种急功近利的算法,但是并不代表这种算法不好,如果贪婪的是一种长远和持续,又未尝不可呢?

动态规划

但是我们知道,对于大部分的问题,贪婪法通常都不能找出最优解,因为他们一般没有测试所有可能的解。因为贪婪算法是一种短视的行为,只会跟据当前的形式做判断,也就是过早做决定,因而没法达到最佳解。

动态规划和贪婪算法的最大不同是,贪婪算法做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

动态规划算法至少告诉我们两个事:

1)**承前启后非常重要,**当你准备去做遍历的时候,你的上次的经历不但能开启你以后的经历,而且还能为后面的经历所用。你的每一步都没有浪费。

2)是否可以回退也很重要。这意思是——如果你面前有两个选择,一个是A公司一个是B公司,如果今天你错失了B公司,那到你明天还能不能找回来?

比如说:你有两个offer,一个是Yahoo,一个是Baidu,上述的第一点会让我们思考,Yahoo和Baidu谁能给我们开启更大的平台?上述的第二点告诉我们,是进入Yahoo后如果没有选好,是否还能回退到Baidu公司?还是进入Baidu公司后能容易回退到Yahoo公司?

Dijkstra最短路径

最短路径是一个Greedy + DP的算法。相当经典。这个算法的大意如下:

1)在初始化的时候,所有的结点都和我是无穷大,默认是达不到的。

2)从离自己最近的结点开始贪婪。

3)走过去,看看又能到达什么样的结点,计算并更新到所有目标点的距离。

4)再贪婪与原点最短的结点,如此反复。

这个算法给我们带来了一些这样的启示:

  • 有朋友和我说过他想成为一个架构师,或是某技术领域的专家,并会踏踏实实的向这个目标前进,永不放弃。我还是鼓励了他,但我也告诉他了这个著名的算法,我说,这个算法告诉你,架构师或某领域的专家对你来说目前的距离是无穷大,他们放在心中,先看看你能够得着的东西。**所谓踏实,并不是踏踏实实追求你的目标,而是踏踏实实把你够得着看得见的就在身边的东西干好。**我还记得我刚参加工作,从老家出来的时候,从来没有想过要成为一个技术牛人,也从来没有想过我的博客会那么的有影响力,在做自己力所能及,看得见摸得着的事情,我就看见什么技术就学什么,学着学着就知道怎么学更轻松,怎么学更扎实,这也许就是我的最短路径。

  • 有很多朋友问我要不要学C++,或是问我学Python还是学Ruby,是不是不用学前端,等等。这些朋友告诉我,他们不可能学习多个语言,学了不用也就忘了,而且术业有专攻。这并没有什么不对的,只是我个人觉得,学习一个东西没有必要只有两种状态,一种是不学,另一种是精通。了解一个技术其实花不了多少时间,我学C++的目的其实是为了更懂Java,学TCP/IP协议其实是为了更懂Socket编程,很多东西都是连通和相辅相成的,学好了C/C++/Unix/TCP等这些基础技术后,我发现到达别的技术路径一下缩短了(这就是为什么我用两天时间就可以了解Go语言的原因)。这就好像这个算法一样,算法效率不高,也许达到你的目标,你在一开始花了很长时间,遍历了很多地方,但是,这也许这就是你的最短路径

算法就是Trade-Off

你根本没有办法能得到所有你想得到的东西,任何的选择都意味着放弃——当你要去获得一个东西的时候,你总是需要放弃一些东西人生本来就是一个跷跷板,一头上,另一头必然下。这和我们做软件设计或算法设计一样,用时间换空间,用空间换时间,还有CAP理论,总是有很多的Trade-Off,正如这个短语的原意一样——你总是要用某种东西去交易某种东西

我们都在用某种东西在交易我们的未来,有的人用自己的努力,有的人用自己的思考,有的人用自己的年轻,有的人用自己的自由,有的人用自己的价值观,有的人用自己的道德…… …… 有的人在交换金钱,有的人在交换眼界,有的人在交换经历,有的人在交换地位,有的人在交换能力,有的人在交换自由,有的人在交换兴趣,有的人在交换虚荣心,在交换安逸享乐…… ……

每个人有每个人的算法,每个算法都有每个算法的purpose,就算大家在用同样的算法,但是每个人算法中的那些变量、开关和条件都不一样,得到的结果也不一样。我们就是生活在Matrix里的一段程序,我们每个人的算法决定着我们每个人的选择,我们的选择决定了我们的人生

2012年就要过去了,祝大家新年快乐!

插图来自电影 Life of Pi

插图来自电影 Life of Pi

(全文完)

(转载本站文章请注明作者和出处 酷壳 – CoolShell.cn ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 以支持公益事业 ===——

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/9294305

posted in 体系结构 

          组合逻辑电路可以有若个输入变量和若干个输出变量,其每个输出变量是其输入的逻辑函数,其每个时刻的输出变量的状态仅与当时的输入变量的状态有关,与本输出的原来状态及输入的原状态无关,也就是输入状态的变化立即反映在输出状态的变化。时序逻辑电路任意时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关。也就是说,组合逻辑电路没有记忆功能,而时序电路具有记忆功能。
          时序逻辑电路简称时序电路,它是由最基本的逻辑门电路加上反馈逻辑回路(输出到输入)或器件组合而成的电路,与组合电路最本质的区别在于时序电路具有记忆功能。时序电路的特点是:输出不仅取决于当时的输入值,而且还与电路过去的状态有关。它类似于含储能元件的电感或电容的电路,如触发器、锁存器、计数器、移位寄存器、储存器等电路都是时序电路的典型器件。

 

转自:

等待

http://blog.sina.com.cn/s/blog_9d38f2eb01012a4v.html

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/9170291

posted in 程序员之路 

 

锐哥准备为大家烹饪红烧鲤鱼,小丫主动要求跟锐哥学习烧鱼,这也使小蔡和大熊非常感兴趣变得积极主动。锐哥首先要求他们把配料准备好,小丫又进行配料准备任务分工,没有的配料分头到超市购买。用料如下:

鲤鱼(一斤半到两斤的鱼最好)、蒜头两头整的、姜片5~6片、小香葱3根、小红辣椒10个左右,分两段切(超市有的卖盒装的),辣豆豉(可用老干妈代替)1大匙、豆瓣酱2大匙、盐少许、鸡精1小匙、料酒1匙、清水2碗、1两纯瘦肉馅、植物油少许。

锐哥让他们注意,收拾鱼的时候要将鲤鱼鱼腹两侧各有一条与细线一样的白筋去掉,可以除腥味;在靠鲤鱼鳃部的地方切一个小口,白筋就显露出来了,用镊子夹住,轻轻用力,即可抽掉。大家七手八脚很快备齐了用料。

时间:6月10日 17点 地点:锐哥家 人物:锐哥、小蔡、大熊、小丫

锐哥边烹饪鱼边讲解说:“首先将收拾好的鲤鱼控干水,最好准备一条干净餐布或者厨房专用纸巾再将鱼上的水分吸干,油入锅烧热,把准备好的鱼放里面煎至黄色再翻面煎成黄色,将鱼装盘待用,如果你手艺到家,鱼也可以一直放在锅里进行别的程序操作。再将肉馅放入锅里炒,直到变色,放少许料酒,再接着放豆瓣酱还有老干妈和肉馅炒匀,这时姜片和整粒的蒜也放进去小炒一分钟,把煎好的鱼再放进去,加两碗水放入小红辣椒。

“这会可以放一点点盐,因为豆瓣酱和老干妈里都有盐味,再放鸡精粉盖上锅盖,改中小火烧至汤快收干时把鱼装好盘,里面的汤剂留在锅里,把切好的小香葱放入锅里翻炒两下关火,将汤剂淋到鱼上。这道菜就做成了,看似复杂,其实材料都准备好做起来又快又简单。”

小丫品尝了一口称赞:“锐哥的手艺真不错!味道好极了,色泽红亮,蒜香浓郁,皮焦肉嫩,咸鲜微辣。”很快大家一起吃完了饭。

锐哥:“大家注意到没有,其实烹饪鱼的过程与一个人的职业规划的过程相似,从配料收集→加工→实现目标(红烧鲤鱼)。另外,职业规划非常重要的一点是要学会角色分析能力。大部分人在长期的工作中趋于麻木,对自己的角色并不清晰。但是,就像任何产品在市场中要有其特色的定位和卖点一样,在职者必须让自己有一些过人之处,让自己的价值和成绩得以体现并受到认可。”

小蔡:“在第一次钓到鱼的时候,我感悟到的就是因为对软件行业不了解,所以缺少一根结实的线将自己与梦想有序地串联起来,因此很难深刻体会到目标在自己掌控下挣扎时的力量。那么,通常程序员如何对自己的角色做分析呢?”

锐哥顺手在纸上画了几个图,说:“确切地说,你应该问程序员通常的发展路线是怎样的?你们可以看看这个图(如图3-1所示),当一个初步的职业规划方案已经成型时,如果制订者目前已在一个软件公司工作,那么,对他来说进一步的提升非常重要。首先要做的则是进行角色分析,反思一下这个职业环境对个人的要求和期望是什么,如何使自己在单位中脱颖而出。

1936235.jpg

图3-1

“通常,软件技术人员的职业发展有几个选择:专注于技术,成为技术专家;转型到技术型销售、技术支持等;随着技术成长,从技术性管理到高级管理。这是大家都看得清楚的方向,也都在向这些方向的金字塔尖努力。

“就像烹饪鱼一样,每一个阶段目标都需要你进行角色分析,找出这一角色需要的‘配料’,当你注意收集技术、素养等相关‘配料’后,就会成功烹饪出你所需要的目标鱼。前提是你一定要了解自己的特点和优势,就好比黄瓜种子是不可能培育成西瓜一样。”

锐哥继续说:“这归根结底,都是以技术为基础。在扎实的技术基础上(高级软件工程师),如果有着比较强的抽象设计能力,又打算专注于技术开发,架构师是个好的选择;如果性格更适合做管理,情商能力突出,技术型管理应该是下一步的方向。这种发展规划属于‘瘸腿走路’的类型,各有侧重主攻发展的职业方向,也是目前一般程序员普遍采用的发展路线规划。”

小蔡认真地看着图说:“程序员职业规划还有这么多学问!我看到每个角色配合的学历,那么学历和认证证书真的很重要吗?还有必要花钱参加社会技术培训吗?”

锐哥:“决胜点在于长期的点滴积累,认证证书、成绩、丰富的经历是求职的表面文章,在目前软件行业里不是很看中这个,真正的‘内功’是需要规划的。至于培训,我倒是很建议直接加入软件公司,你就会学到很多实际的东西。不过,学历教育虽然在职业生涯里不是主要的,但是随着职位的提升却有很重要的意义,能辅助拓展你的职业发展空间,而不是以此为阻碍从而失去更多的机会。 ”

“已经工作两年以上的程序员可以有几种基本的职业规划:技术专家、软件架构师、实施顾问或销售。其中程序员最主要的发展方向是资深技术专家,无论是Java、.NET还是数据库领域,都要首先成为专家,然后才可能继续发展为架构师。尽管架构师的职位可以工作一辈子,待遇也非常好,对于科班出身的程序员最为适合,但这种工作职位非常有限,因为在中国目前的IT行业,架构师需要的条件比较复杂,而且需求量也比较少,这也是我国软件行业走向国际并有待成熟的因素之一。”

大熊指着另外一张图说:“这个是综合才能型发展路线图(如图3-2所示),我听说目前国内缺乏的是管理能力和专业知识技能并驾齐驱的IT人才。是不是指着这种复合型人才?”

1936237.jpg

图3-2

锐哥说:“是的,特别是懂得运用目标管理技术的项目管理人才,既掌握核心技术又有全局掌控能力的项目管理人才,非常难找。我建议对于大多数人来说,首先是要专,只有在技术方向上做得比较深入,才能适当做工作调整,把自己转变为某个领域的专家。

“然后,根据自己的情况,决定自己做软件架构师还是高级的顾问销售,另外一部分人可能就会走向管理,这和个人性格与情商有关。软件优秀的管理者都必须懂得技术,掌握核心技能的人才向管理岗位转型有很大的优势,因而提升管理能力成了转型的关键。譬如,当唐骏还是微软一名普通程序员时,就从公司发展的角度考虑,向老板提议开发了中文版Windows,最终使他从几万名工程师中脱颖而出,成为部门经理。正如他所说,虽然是程序员,但自己不能只把自己当程序员,你可以为老板和公司着想。

“调查研究后,带着解决方案去找老板,就会得到老板的重视和信任,所以一定要增强工作主动性和参与性。无论是软件开发还是项目管理,国内员工大多只是做好份内事或完成交派任务,很少能主动发现问题。其实,只有拥有更高眼界,才能谋取大发展。

“总之,程序员要根据本身的基本素质、技术能力选择开发层次,由低到高,逐步发展。也是一名程序员本身具备相应素质的循序渐进的发展轨迹,包括很强的技术背景和综合管理才能等素养,这也就是所谓‘两条腿走路’的职业规划发展路线。”

小蔡:“原来技术转型还有这么多学问,受益匪浅。我打个比方,如果只是一名程序员,但仍需要站在项目经理的层面上看自己的工作,这样才能更好地合作,融入团队中,并且锻炼自己的思想境界,从而提高自己。”

锐哥:“小蔡说得是。另外,在未来发展上首先确定自己的发展方向和研究方向,在学习技术的同时还要为以后做准备,做好以后的技术转型。广度和深度是相对的,先广还是先深实质上从某种意义来说取决你的工作性质,如果你是从事单一工作的,多半你会短暂先深,因为这是你立足的根本;而如果你选择的职业是综合性的,比如管理、讲师等,那么你必然要先有广度才可以,但一段时间后,你都要转入深度,只有你在某一方面或领域有一定的深度后,你才能继续寻求广度,否则,你将什么都会,但什么都不精,这样的人在市场上是最难以立足的。”

大熊:“这张程序员发展路线图挺有意思,国际人才型(如图3-3所示),一定要求外语口语流利吧?”

1936239.jpg

图3-3

锐哥:“是的。如果说前面‘两条腿走路’要求的综合能力成分多,随着国际化相互联系越来越紧密,那么国际化人才可以说是当前更为便捷的程序员职业规划发展之路。目前,国际化软件项目经理是人才市场上炙手可热的人才,有丰富经验、外语口语好的软件项目经理是抢手的香饽饽,供不应求,薪水自然也是水涨船高。最重要的是,一个优秀的项目经理可以在这个岗位上长久工作下去,并且有向高层进一步提升的可能。外语好、技术又好的程序员发展路线很广,是目前国内外软件企业需要的热点人才。”

小蔡:“锐哥跟我们说了这么多,感觉对程序员、对软件行业的整体发展路线清晰了很多,但是我该用什么方法进行选择呢?”

锐哥:“要想正确地选择,你得必须充分地了解、分析自己,你要学会SWOT职业规划自我分析法。”

总结与提升

成功与失败的区别在于,成功者选择了正确而失败者选择了错误。因此,我们常常能够看到一些天赋相差无几的人,由于选择了不同的方向,人生却迥然相异。选择正确的方向尤为重要,希望不同的程序员根据自己不同的优势和特点能画出适合自己的程序员职业规划图。

软件开发也是有层次区别的,比如,按层次从高到低通常可分为:

系统开发:如操作系统、数据库系统、服务器系统开发;

专业开发:如网络安全、游戏、人工智能开发;

应用开发:如MIS、BI、ERP等系统开发;

普通开发:如网站、简单应用系统开发。

不同的层次,难度系数不一样,对技术要求、个人素质要求也不一样。要成为系统开发者、专业开发者、高级应用开发者,需要有很高的专业知识和很强的逻辑、抽象、空间思维能力,这就要求具有很好的基础,同时具有较大的提升潜力。而要成为简单开发者和初级应用开发者则相对容易些,正是这样,才使很多人走上了软件开发的道路。

(责任编辑:董建伟)

转自:http://tech.ccidnet.com/art/3089/20090908/1880563_1.html

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8986086

posted in 程序员之路 

    一直以来中国教育以“填鸭”式的教学风格而闻名,最近在看了几本英文翻译过来的书后特别有感触。

    甭管学生想不想学,学了能不能消化,学了会不会用,只是一味的教授知识。

    上了(6+3+3+2)年的学终于对如何学习有了一点自己的感悟,在此与大家分享。

   

**    中国填鸭式教育造成的问题:**

    有人把学习总结了一个 "3W学习原则":Why、 What 、Why

    Why:为什么要学习这个知识,以及知识为什么是这个样子而不是那个样子的。

    What:这个知识究竟是什么样的。

    How:如何应用学到的知识。

    个人感觉只有从这3个角度认识了知识,学习了知识才能算是真正掌握了知识。国内的教学往往偏重的是 What 概念性原理性的讲解,以及 如何做题。关于 Why 和 How的部分却少有提及, 而Why 和 How,才是真正能够激起一个人学习兴趣的,而课堂上几乎不讲这些,学生也习惯了不问,最终在"填鸭式"的教育中逐渐失去了对学习的兴趣。

    为什么说 Why 和 How才是真正能够激起一个人学习兴趣的部分?我是这么理解的:知道了Why ,知道了为什么要学习这个知识,才能够体会到 学习这个知识的必要性。知道知识为什么是这个样子的,而不是那个样子的,才能够打心底里认同学习的知识,才能够体会到前人智慧的伟大之处,才能够油然的产生一种对知识的渴求。 知道了How,才能够知道学到的知识有什么用,才能够感觉到学习之后自己的一点一点的成长,才能够感受到自己应用知识解决问题之后的成就感。

    比如在大一和大二期间学习了 工科数学分析、计算机导论、数字电子、汇编语言, 学这几门课有共同点:

    1. 不知道为什么要学习这门课。尤其是数字电子,讲课老师显然不是学计算机出身的,只管将讲他的课,至于为什么要学习数字电子,对学习计算机的学生有什么用,为什么前人要总结出这些概念,一概不管。颇有种"我讲我的课,你们只管学,不要管为什么"的感觉。因而学习中一直很迷茫。

    2. 听着听着就听不懂了。课程一开始能听懂,但听着听着就听不懂了,而且作业不愿意做,上课不愿意听,根本没有一点兴趣。

    3. 考前抱佛脚,考完试就忘的差不多了。因为大部分考试知识都是考前一个周突击的,死记的知识学得快,忘得也快。

    总之,这种学习 自己不喜欢的东西的感觉是非常痛苦的。

    直到后来看了 Charles Petzold的《编码的奥秘》一书,才理解了为什么要学习 数字电子 和 汇编语言,并 唤起了对 计算机组成原理和 操作系统 浓厚的兴趣。因为他在这本书中阐述了 为什么要学习这几门课,为什么前人要总结出这些知识点,学习了之后有什么用,在看完书后,我不禁生出一种仰天长啸的感觉。如果当初上课老师按照这本书的思路,怎么会学的那么痛苦?!

    这个学期又学习了 计算机组成原理 ,由于这门书的原因,自己上课一直听的比较愉快,因为自己知道为什么要学习 这门课,学了有什么用,这些知识处于自己知识框架的哪一个部分。反观身边的同学,一如既往,学习的十分的痛苦,因为他们就根本不想学习这些知识呀!每每想到这些,我都十分庆幸遇到了这本书。

 

**    如何在这种"填鸭式"的教育中学习**

    在高中化学中,学习了两个概念"定性"和"定量",学习知识,既要定性的学习,又要定量的学习。好比学习一个化学方程式,只有知道了反应物和生成物是什么,才有可能 定量 的计算生成物。如果直接就定量的学习肯定会不适应。

    在中国这个现实环境中,课堂上只"定量"的教授知识,却不"定性",即不教授 Why 和 how,既然我们改变不了环境,只好适应这个环境,现在的关键问题就是:如何"定性"的学习,即如何知道学习知识的必要性,如何应用知识,进而激发对学习的兴趣?我认为可以从两个方面着手:

    1. 多看科普书籍。 这里的所谓的科普书籍就是指的那些 浅层次的讲授知识,扩大人的知识面,却不深层次的探究每个问题的书,也正是这类书能够引起人们对某些问题深深的好奇,引起人们对学习的兴趣。如之前提到的《编码的奥秘》一书,只是就某些知识做了"定性"的讲解,让人们知道为什么要学习这门知识,这门知识有什么用?至于深层次的探究——“定量”学习,正好放到课堂上进行。

    关于这些科普书籍,通常有这几种特点: 国内的不如国外翻译过来的,国外翻译过来的不如直接看英文原版(虽然我没能做到)。当然不否认国内也有一些好书。如何才能从茫茫书海中掏出这些 珍贵的书籍?

    一个好的途径就是 上豆瓣,在豆瓣上你可以看到每本书的评分,无数人已经对这本书做出了评分和书评,通过这些评分和书评,就能够权衡这本书究竟有没有必要读,适合什么阶段的人读,以后要注意的问题等。 

    2. 多实践。 记得有一个很牛的学长说过, 动手实践是学习最快的方式,因为为了使用知识而学习知识,这种感觉是非常棒的。在实践过程中,你不仅获得了学习的动力,更在实践过程中深入的理解了知识。

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8914696

posted in 体系结构 

最近学习了 计算机组成原理,老师 问了一个问题“计算机如何执行第一条指令?”

又看了一本书《30天自制操作系统》,因此在这好好总结一下计算机开机以后的整个引导过程。

Part 1. 引导过程详解

① 第一步,开机直接访问BIOS ROM的0xFFFF0。

        开机以后,CS寄存器置为0xFFFF,IP寄存器置为0x0000。这样一来,CPU就会要求访问地址为0xFFFF0的这个地方。这个地址实际上不是内存的地址,它被 地址控制器(实际上是南桥北桥)映射到 BIOS ROM里,而这个地址的ROM中存放着一条跳转指令。

        参考:http://bbs.csdn.net/topics/370117602

        http://blog.csdn.net/mxdlove00/article/details/8821377

② 第二步,访问BIOS ROM中的初始化程序。

    0xFFFF0中这条跳转指令,跳转至BIOS ROM的某个地址。从这开始是一段初始化程序,把这段程序复制到内存中执行。

  作用:一方面 初始化硬件(如内存等);另一方面 从硬盘加载引导程序(具体方法是 从0柱0面0扇区开始寻找,如果扇区最后是”55 AA”,则说明找到该引导程序,否则继续寻找下一扇区,直到找到引导程序),找到引导(boot)程序之后 复制到内存的 0x07c00——0x7dff(复制到该地址的原因参看 http://blog.csdn.net/mxdlove00/article/details/8811060 )中,然后跳到该地址执行引导程序。

        参考: 《30天自制操作系统》

        http://bbs.csdn.net/topics/370117602

        到此为止,一切都是硬件自动完成的,是不可改变的。

        从下面开始,执行的程序可以由程序员自由控制了。

③ 第三步,引导程序开始执行。

        引导程序把操作系统硬盘读入到内存中,并跳到内存操作系统开始地址

        多说一点,在《30天自制操作系统》中是这么做的,把软盘中10个柱面的内容都读到内存中,推算(软盘在内存的开始地址+操作系统在软盘中的相对地址=操作系统在内存中的地址)出操作系统的开始地址,然后跳到该地址。

        参考:《30天自制操作系统》

④ 第四步,开始执行操作系统程序。

        开始执行操作系统程序。

Part 2. 引导程序示意图

 SouthEast

        ① 开机访问0xFFFF0地址

        ② 跳转到BIOS ROM的初始化程序

        ③ 把BIOS ROM中的初始化程序复制到内存中执行

        ④ 初始化程序 首先初始化硬件,然后在硬盘中找到 引导程序。

        ⑤ 将引导程序复制到 内存的 0x07c00,并执行

        ⑥ 引导程序 将硬盘的内容复制到内存中。

        ⑦ 跳到内存中操作系统的开始地址,

        ⑧ 开始执行操作系统。

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8883269

posted in 体系结构 

BIOS 中断呼叫

维基百科,自由的百科全书

跳转至: 导航 搜索

BIOS 中断呼叫是一组功能,提供DOS程式与一些软件(例如启动程式)去使用IBM_PC兼容机BIOS的功能。一些操作系统系统引导的时候也使用BIOS以检测并初始化硬件资源。

目录

 [隐藏

[编辑]中断调用

若要调用中断,可以使用X86汇编语言INT指令。 例如,如下的x86汇编语言指令可以使用BIOS的0x10中断向屏幕打印一个字符。

mov ah, 0x0e
mov al, '!'
int 0x10

[编辑]BIOS中断向量表

中断 描述
INT 00h CPU: 除零错,或商不合法时触发
INT 01h CPU: 单步陷阱,TF标记为打开状态时,每条指令执行后触发
INT 02h CPU: 非可屏蔽中断, 如 系统自举 时发生内存错误触发。
INT 03h CPU: 第一个未定义的中断向量, 约定俗成仅用于调试程序
INT 04h CPU: 算数溢出。通常由INTO指令在置溢出位时触发。
INT 05h 在按下Shift-PrintScreen或BOUND指令检测到范围异常时触发。
INT 06h CPU: Called when the Undefined Opcode (invalid instruction) exception occurs. Usually installed by the operating system.
INT 07h CPU: Called when an attempt was made to execute a floating-point instruction and no numeric coprocessor was available.
INT 08h IRQ0: Implemented by the system timing component; called 18.2 times per second (once every 55 ms) by thePIC
INT 09h IRQ1: Called after every key press and release (as well as during the time when a key is being held)
INT 0Ah IRQ2:
INT 0Bh IRQ3: Called by serial ports 2 and 4 (COM2/4) when in need of attention
INT 0Ch IRQ4: Called by serial ports 1 and 3 (COM1/3) when in need of attention
INT 0Dh IRQ5: Called by hard disk controller (PC/XT) or 2nd parallel port LPT2 (AT) when in need of attention
INT 0Eh IRQ6: Called by floppy disk controller when in need of attention
INT 0Fh IRQ7: Called by 1st parallel port LPT1 (printer) when in need of attention
INT 10h 显示服务 - 由BIOS或操作系统设定以供软件调用
AH=00h 设定显示模式
AH=01h 设定游标形态
AH=02h 设定游标位置
AH=03h 获取游标位置与形态
AH=04h 获取光笔位置
AH=05h 设定显示页
AH=06h 清除或卷轴画面(上)
AH=07h 清除或卷轴画面(下)
AH=08h 读取游标处字符与属性
AH=09h 更改游标处字符与属性
AH=0Ah 更改游标处字符
AH=0Bh 设定边界颜色
AH=0Eh 在TTY模式下写字符
AH=0Fh 取得目前显示模式
AH=13h 写字符串
INT 11h Installed by the BIOS; returns equipment list
INT 12h Installed by the BIOS or operating system; returns Conventional Memory Size
INT 13h 低阶磁盘服务; installed by the BIOS or operating system; called by software programs
AH=00h Reset Disk Drives
AH=01h Check Drive Status
AH=02h Read Sectors From Drive
AH=03h Write Sectors To Drive
AH=04h Verifies Sectors On Drive
AH=05h Format Track On Drive
AH=08h Get Drive Parameters
AH=09h Init Fixed Drive Parameters
AH=0Ch Seek To Specified Track
AH=0Dh Reset Fixed Disk Controller
AH=15h Get Drive Type
AH=16h Get Floppy Drive Media Change Status
INT 14h Routines for communicating via the serial port. Used by software programs.
AH=00h Serial Port Initialization
AH=01h Transmit Character
AH=02h Receive Character
AH=03h Status
INT 15h Miscellaneous (System services support routines)
AH=4FH Keyboard Intercept
AH=83H Event Wait
AH=84H Read Joystick
AH=85H Sysreq Key Callout
AH=86H Wait
AH=87H Move Block
AH=88H Get Extended Memory Size
AH=C0H Get System Parameters
AH=C1H Get Extended BIOS Data Area Segment
AH=C2H Pointing Device Functions
AH=E8h, AL=01h (AX = E801h) Get Extended Memory Size(Newer function, since 1994). Gives results for memory size above 64 Mb.
AH=E8h, AL=20h (AX = E820h) Query System Address Map. The information returned from e820 supersedes what is returned from the older AX=E801h and AH=88h interfaces.
INT 16h Implemented by the BIOS or operating system. Provides routines to be called by software programs which communicate with the keyboard.
AH=00h Read Character
AH=01h Read Input Status
AH=02h Read Keyboard Shift Status
AH=10h Read Character Extended
AH=11h Read Input Status Extended
AH=12h Read Keyboard Shift Status Extended
INT 17h Print Services - used by software programs to communicate with the printer
AH=00h Print Character to Printer
AH=01h Initialize Printer
AH=02h Check Printer Status
INT 18h Execute Cassette BASIC: True IBM computers contain BASIC in the ROM to be interpreted and executed by this routine in the event of a boot failure (called by the BIOS)
INT 19h After POST this interrupt is used by BIOS to load the operating system.
INT 1Ah 即时的时钟(RTC)服务 - called by software programs to communicate with the RTC
AH=00h 读取 RTC
AH=01h 设定 RTC
AH=02h 读取 RTC 时间
AH=03h 设定 RTC 时间
AH=04h 读取 RTC 日期
AH=05h 设定 RTC 日期
AH=06h 设定 RTC Alarm
AH=07h Reset RTC Alarm
INT 1Bh Installed by the operating system; automatically called by INT 9 when Ctrl-Break has been pressed
INT 1Ch Called automatically by INT 08; available for use by software programs when a routine needs to be executed regularly
INT 1Dh Not to be called; simply a pointer to the VPT (Video Parameter Table), which contains data on video modes
INT 1Eh Not to be called; simply a pointer to the DPT (Diskette Parameter Table), containing a variety of information concerning the diskette drives
INT 1Fh Not to be called; simply a pointer to the VGCT (Video Graphics Character Table), which contains the data for ASCII characters 80h to FFh
INT 41h Address pointer: FDPT = Fixed Disk Parameter Table (1st hard drive)
INT 46h Address pointer: FDPT = Fixed Disk Parameter Table (2nd hard drive)
INT 4Ah Called by RTC for alarm
INT 70h IRQ8: 由 RTC 呼叫
INT 74h IRQ12: 由鼠标呼叫
INT 75h IRQ13: Called by math coprocessor
INT 76h IRQ14: 由第一个 IDE 控制器所呼叫
INT 77h IRQ15: 由第二个 IDE 控制器所呼叫

[编辑]相关

[编辑]外部链接

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8869964

/** * RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS. * LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/ /* var disqus_config = function () { this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable }; */ (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://chenzz.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })();