Trade Off

supercalifragilisticexpialidocious

《REWORK》学习笔记之效率篇

效率篇

「赞同的错觉」中提到:

如果你一定要说明某事,那就务实一点。不要描述它长什么样子,直接画出来;不要解释它的声音如何,直接哼出来。要尽一切可能去掉那些抽象的东西。

这就是我们要求尽量贴近实际的原因。只有这样才能让人真正理解你的想法。这就好像当我们在书中读到某些角色描述时,每个人都会联想到不同的形象。但如果我们实际上看到这些人了,我们就都回准确地之道他们到底长什么样子。

「退出的理由」中提到:

退出之前,问问自己:

  1. 为什么要这么做?

  2. 你在解决什么问题?

  3. 这真的有用吗?

  4. 你加上去的东西有价值吗?

  5. 这种改变真得会起作用吗?

  6. 这种方法更简单吗?

  7. 有其他更值得做的事情吗?

  8. 这样做值吗?

同时,要用于亮出你的结论。有时候放弃其实是一步好棋,即使你已经为之投入很多努力,也不要继续把大好的时间浪费在不值得做的事情上。

「打岔是效率的敌人」中提到:

你应该打到一种旁若无人的境界。长时间的单独工作能使你达到最高效率。当你不再为了不同的任务去切换思维时,你能干完一整车活儿。有没有注意过自己在飞机上那种零打扰、无网络的状态下能达到怎样的工作效率?.

要达到这种旁若无人的警戒是需要时间的,而且还要不被打扰。就好像快速动眼睡眠REM. 一样一种多梦的浅睡眠状态. :人不会直接进入快速动眼睡眠状态,你得睡着才行。一旦在这种浅睡眠状态中受到打扰,你就会彻底醒过来,有得重新入睡。快速动眼睡眠是真正神奇的梦幻睡眠时段,与此同理,人们处于那种旁若无人的境界时,效率也会出奇的高。

一个成功的独立时段意味着戒掉八卦瘾。在这个时段内,封锁即使聊天工具、挂掉电话、关闭邮箱、叫停会议。惟一能做的就是闭嘴、干活。你会惊讶于自己居然能干这么多活。

同样,当你需要与人合作时,要采用被动交流工具,比如用电子邮件这种不需要立即回复的交流方式,去代替那些会打断别人工作的方式,比如电话、开会之类。这样一来,别人能在方便的时候再回复你,而不是被迫立即放下手头的事情来回复你。

你的生活被各种干扰包围着,只有你自己才能去发起反击。

「会议有毒」中提到:

假设安排一个长达1小时的会议,有10人参加,则实际上这是一场花费了10小时的会议,而不是1小时。你是在用10小时的生产力来换这1小时的会议。而且,如果算上方下工作、走到会议室开会、然后又走回办公室重新开始工作的这个过程中的思维转换时间,实际上会议的成本是15小时。

简单几条规则,让会议更加有效:

  1. 放一个闹钟,闹钟想起,会议结束。

  2. 与会人员尽量精简。

  3. 议程尽量明晰。

  4. 从明确的问题开始讨论。

  5. 不要去会议室,就在出现问题的地点开会,直面现实,提出切合实际的改进建议。

  6. 以明确的解决方案结束会议,并安排好由谁负责实施。

「刚刚好就是真的好」中提到:

我们总能用简单平常的方法去解决问题。这也就意味着不需要超炫的表现,你没有机会炫耀你的超强技术。你只要找个办法把问题解决就行了,赶紧去办下一件事去。这种方案也许没发为你带来声声喝彩,但是能让你不断前行。

「速战速决」中提到:

积累动力的方法就是完成一项任务,然后紧接着去完成下一项任务。没人愿意被困在一个看不到尽头的任务中。把人困在长达9个月并且毫无成就的项目中,等于是拿钝刀子杀人,迟早会耗尽你全部精力。想要保持良好的势头和持续的动力,就要养成“积跬步以致千里”的习惯。哪怕是微小的进步也能让你士气大振。

「不要逞英雄」中提到:

要谨记:最明显的解决方案有可能就是适时退出。人们容易自然而然地把放弃和失败联系起来,但有时你就该这么做。如果你已经在不值得做的事情上浪费了很多时间,那就赶快走开。失去的时间是再也找不回来了。现在最糟糕的事莫过于继续浪费时间。

「该睡觉时就睡觉」中提到:

长期熬夜带来的代价:

  1. 顽固不化。

  2. 缺乏创意。

  3. 士气低落。

  4. 情绪失控。

「预估的都是垃圾」中提到:

把大项目分解成小任务。越小的任务越容易预计。你可能还是会犯错,但错的肯定不会像预测大项目那么离谱。如果某个任务所用的时间比预计的长两倍,那么最好把它从长达数月的大项目拆解成耗时几周的小项目。

不断地把你的计时范围拆分成小块,把一个长达12周的项目重整成12个耗时1周的小项目。不要妄自揣测某个任务大概需要30个小时以上的时间来完成,直接把它砍成几个大约6~10小时的小任务。然后一步一个脚印地努力前进。

「罗列问题,不得解决」中提到:

在此我们对事务的优先级别也有个小小的建议:不要按照序号或标签来排序。千万别说“这件事的优先级别比较高,那件事的优先级别比较低”。同理,不要说“这是第三件事,这是第二件,这是第一件,这是N件……”诸如此类的话。这会使你陷入一大堆迫在眉睫的任务中,这不是真正的优先排序。

相反,要把看起来最重要的事情放在清单的上端。然后把第二重要的事情放在清单中挨着上端的位置。这样一来,你就能够按照事情的轻重缓急来进行排序,这样就足够了。

「决策宜小不宜大」中提到:

重大决策很难落实,也很难修正。一旦做出重

《REWORK》学习笔记之进阶篇

进阶篇

「条件受限是好事」中提到:

“我没有足够的时间、钱、人手、经验。”不要再做无谓的抱怨了,“少”不是什么坏事。“条件受限”貌似缺陷,实为优势。有限的资源能激发你在现有条件下完成任务的能力。没有一点浪费的空间,一切都需要你发挥最大的创造力。

在你高唱“始终不够”的悲观论调之前,请试试看自己利用现有的资源能走多远。

2011年4月16日星期六,天气不错,不冷不热。

「从核心出发」中提到:

要判断出你的事业的中心。在你的创业等式中,那个部分是绝对不能被拿掉的?如果有些东西即使没有了,你也能把事情干下去,那这些东西就不是事业的中心。当你发现事业的中心时,你就会恍然大悟,然后你应该把所有的精力都集中在这个中心上,把它做得越强越好。这是你未来成功的基础。

「不要过早关注细节」中提到:

细节会导致差异,但过早纠结于细节则会引来异议、多如牛毛的会议以及延期。你会迷失在不重要的环节中,浪费时间去做一些持再要变的决定。因此,请忽略细节──至少是在一段时间内。先把基础打牢,再去操心其他的事情。

你只有在真正开始后,才能认清到底哪些细节才是最重要的。到那时你才能看清哪些方面需要多花些时间。缺什么补什么,不要操之过急。

「做出决定就是取得进展」中提到:

你要让自己进入“选择”进行曲中,当你进入状态,开始一个接一个地做出决定时,就为自己的事业注入了动力、鼓舞了士气。决定就是进步。你作的每一个决定都构成了伟大事业的基础。事业不是建立在“回头再说”之上,而是建立在“搞定”之上的。

你不会靠一个决定过上一辈子。如果当时的决定不合适,以后还可以改。

「当好博物馆长」中提到:

一个伟大的博物馆,不必在一间房子里挂满全世界的艺术品,那不是博物馆,是仓库。真正成就一个伟大博物馆的,是那些不在墙上展出的物品。要是有人不认同,这就涉及要请博物馆长出面,清醒地决定哪些东西该留下,哪些东西该放弃。这是一个取舍的过程。从墙上取下的东西比留在墙上的东西多的多。最好的选择就是多重选择条件筛选后得出的交集。

「在问题上少投入点精力」中提到:

当遇到困难时,人们的本能反应都是加大投入:增加人手、延长时间、加大投资,这一切做法只是使问题变得越大。正确的方法应该是反其道而行之:削减。

所以,少做一点,你的项目遭受的损失不像你想像的那么大。事实上,这是一个使情况好转的绝佳机会。你要被迫使出雷霆手段,筛选出真正有价值的东西来。

如果你不断推迟最后期限、提高预算,你就会在这条错误的道路上一直走下去。

「关注不变因素」中提到:

很多公司都关注即将到来的大事件。它们热衷于新鲜热辣的事物,追逐最新的潮流和技术。

这是一条愚人之路。一旦踏上这条路,你就会关注时髦、放弃本质;把注意力放在不断变化的事物上,而不是持久的事物上。

你的事业的核心应该建立在不变的基础之上。你应该投资那些人们现在需要并且10年后仍然需要的事物。

要记住,时尚会凋零。只有当你聚焦于长久的功能时,你才会发现自己把握住了永不落伍的东西。

「音乐就在你的指尖流淌」中提到:

就用你现在手头有的或者能负担得起的,然后开始做吧。工具不重要,就用现有的工具也可以做得一样棒,音乐就在你的指尖流淌。

「卖掉副产品」中提到:

可能你做得不是生产制造这一行,这就使你很难发现自己有副产品。木材公司的人能发现生成中的废料,他们不会忽视锯末。但是你就看不到,甚至可能压根就不认为你的工作中会产生副产品。这就叫短见。

「立马就上线」中提到:

想象一下:如果你的业务必须在两周内推出,你会砍掉哪些部分?有意思吧,这样一个问题能够让你变得更专注。你一下就意识到有许多事情是你不需要做的。而你真正要做的事就变得显而易见了。一旦设定了最后期限,事情就变得格外清晰了。采用这种方法,你就能让直觉发挥作用,告诉你“我们不需要这个”。

《REWORK》学习笔记第一辑

2011年4月13日星期三,天气稍热。

如果你是一个正统的企业家,看过《REWORK》的引言部分可能就不敢再往下看了,因为这看起来和自己经历的事情几乎全然不相符!虽然我没有这方面的经历,但在周围环境的熏陶下也渐渐成为一个“正统”的人,即使是我这样的“半个”正统之人看起来都要惊起一头冷汗,那些打拼过来的人们是什么样子就可想而知了吧:)不过这样的开头确实让我对后面的内容产生了一种向往。我喜欢把正反两面的因素都拿到手里分析分析,或许还有另外的“景致”!

「新的现实」中提到:

今天,任何人都可以创业,过去无法企及的工具如今触手可得。过去要价好几千美元的技术如今只要几块钱甚至能免费使用。现在一个人能干过去两个人、三个甚至正各部门的活儿。几年前那些一般人拿不到的材料如今看起来也不过如此。

你不必每周花费60、80甚至100个小时去工作,10~40个小时已经足够了。你无须耗费必生的积蓄,也不必担心冒船超载的风险。你完全可以在依靠正职工作带来的现金流养活自己的同时,去创立自己的事业。你甚至不需要一间办公室就能创业,如今人们可以在家工作,或者和千里之外素未谋面的陌生人合作。

「忘了“现实世界”」中提到:

“现实世界”并不存在,那只是个借口,只是某些人为了开脱自己的无所作为,跟你一点关系都没有。(现实世界指的是这句话中的:“这在现实世界中完全行不通。”当你向人们介绍一个新创意时,人们总是这么说。)

「哪来的从错误中学习」中提到:

成功才是真正靠得住的教材。做成一件事之后,你会知道这条路行得通──然后捏你就会再次这么做,而下一次,你也许还会做的更棒。

失败并不是成功的先决条件。一份来自哈弗商学院的研究报告表明,那些已经成功的企业家们再创辉煌的可能性远比常人大的多。而那些初次创业就失败的企业家们继续创业的成功率则于初次创业者一样

「计划即瞎猜」中提到:

这并不是说你应该无视未来,或者不应该对未来的挑战作未雨绸缪的准备。预防练习总是值得去做的。只是不要觉得自己必须把这些问题白纸黑字地写出来,或者为此纠结不休。大多数情况下,人们不会再去多看一眼自己长篇大论写下的计划,篇幅庞大的计划书最终都会成为文件柜里的化石。

无计划地工作看上去挺悬,但是盲目遵循不切实际的计划,后果则更加可怕。

「何必壮大」中提到:

你有没有发现小公司都想要变大,而大公司却梦想变得更敏捷、更灵活?记住,一但公司做大了,要想再缩小,就在所难免地要进行裁员、打击士气,还要完全改变业务模式。

无论是谁,只要他所运营的公司能够持续发展、保持盈利,不管规模大小,都是值得骄傲的。

「工作狂」中提到:

如果你只是为工作而工作,那么你就会丧失判断力。你的价值观和决策方式都是扭曲的。你没有能力去判断哪些工作值得做、哪些工作该放弃,最后搞的自己筋疲力尽,而一个筋疲力尽的人是无法做出明智的决定的。

工作狂实际取得的成就并不比正常人高。他们自诩为完美主义者,但这仅仅代表他们浪费了大量时间去关注次要的细节,而不是推动下一项任务。

工作狂不是英雄。他们没有力挽狂澜,不过是浪费时间而已。真正的英雄早已想出办法、搞定一切,然后回家了。

「挠自己的痒处」中提到:

想要创造一个伟大的产品或某项卓越的服务,最简单直接的办法就是做你自己想用的东西。设计你了解的产品──你就能很快发现它到底好不好用。

这种“解决自己实际问题”的方法最大的优势就在于能让你爱上自己的产品。你十分了解其中存在的问题以及其价值所在。除此之外别无他途。毕竟你(很有可能)会为这件事奋斗很多年,甚至付出余生,所以,最好还是做自己真正关心的东西。

「着手做点什么」中提到:

在你的人生中真正有意义的是你做了什么,而不是你想做过什么、说过什么或者机划过什么。

你觉得自己的想法很有价值?那么就试着把它卖掉,看看能有什么收获。基本上你什么也得不到。想法如果不付诸实施,那就永远只能是一个想法而已,每个人都有奇思妙想。

「“没时间”不是借口」中提到:

把看电视或者玩魔兽的时间腾出来完成你的创意;把晚上10点上床改成11点上床,我们不是怂恿你通宵达旦或一天干足16个小时──我们要说的是,每周匀出一些业余时间来,九族股区你去做些事情了。

一旦这样去做了,你就会明白自己的激情和兴趣到底是真心实意,还是三分钟热度。晚一步成,你照样回去上班、按时睡觉。浪费着点时间还是挺划算的。

当你拥有某种极强烈的渴望时,你就能挤出时间来──不管你身上时候还背负着其他责任。事实上,大部分人的渴望并不那么强烈。于是他们拿时间当借口来进行自我保护。

如果你总是认为找不到完美的时刻而困扰,那么,完美的实际永远都不会出现。

「画砂为界,立场明确」中提到:

有主见方能成大事,创业并不只是一个产品或一项服务那么简单。你必须心怀信念,要有主心骨,要了解自己到底是为什么而奋斗,并且要让世人明白你的信念。

坚定的信念能为你赢得超级粉丝,他们会为你马首是瞻,会舍身保护你,他们充满激情的口碑传播将胜过世上的一切广告。

如果你的说法没有引起任何人的心烦意乱,只能说明你的推广力度可能不够。(也可能带表你比较无趣。)

如果连你都不知道自己到底相信什么,那么一切都会成为悖论,你做任何事情都能被人反驳。然而,一旦你的立场坚定了,那么该如何决策就显而易见了。

举例说明立场坚定:全食超市(Whole Foods)坚持想顾客销售最优质、最天然的有机食品。他们决不会浪费时间去一遍遍地讨论该如何决策。没有任会问:“我们能卖些带人造香料的产品吗?”无庸置疑,答案非常明确。这就是为什么人们在这家公司买不到可口可乐或力士架的原因。

另一个列子是坐落在芝加哥街头的Vinnie’s Sub Shop面包店。他们在优质的面包上涂抹自制的罗勒酱,然后出售。想要吃她们家的面包,你最好早点去。想知道他们什么时候关门么?柜台里的女士会告诉你:“面包卖完了我们就收工。”他们一般都是一大早从街边的面包房进货,拿最新鲜的面包回来做原料。这批面包一卖光(通常是下午2~3点),就关门。他们当然可以再去进一批面包回来接着做。但这批面包就不如早上的新鲜了。如果面包不新鲜,就做不出绝味的三明治。如股区不能卖让自己倍儿有面子的食物,那赚再多的钱又有什么用呢?

和街头的普通三明治餐厅相比,你是不是更愿意到这样一家店里就餐呢?

(我特意搜索到了那个让Jobs也没吃成饭的餐厅,叫Flour+Water,相信这家餐厅也是很有特色的,可以去官网看看他们的菜:)

「不可能的宗旨」中提到:

坚持某种信念并不是仅仅是把它写下来。不但要相信它,还要让它成为你的一种生活方式。

「万不得已不筹资」中提到:

不管你创办的是什么类型的企业,都要尽可能少花别人的钱。花别人的钱听起来很美,实际上是你落入了圈套。理由如下:

失去控制权。

“套现离场”的想法会压倒“创建优秀公司”的梦想。(投资人想拿回他们的钱,通常是3~5年。一旦合伙人脑子里只想着快点把钱套现出来,长期的可持续发展就成了泡影。)

用别人的钱容易上瘾。(没有比花别人得得钱更舒服的事情了吧?一旦你花完了再去要时,他们就会再从你手中多拿走一些股份。)

融资都不是好买卖。(刚刚起步时,谈判中完全没有优势。在参悟交易中往往举步维艰。)

客户不再荣登“图腾柱”。(花别人的钱,会使你的事业最终去迎合投资人,而不是客户。)

筹钱极其费神。(筹钱需要花费好几个月的时间去研究法律条款、签订条款等,而这些时间本来就应该被用于创建伟大的事业。)

「要成就事业,不能只是创业」中提到:

创业之初不要有任何依赖思想。相反,要创立真正的事业。真正的事业永远与现实的问题息息相关,比如说帐单和员工薪水。真正的事业从创始的第一天开始就要求你去操心如何盈利的问题。真正的事业拒绝创业者用“没关系,创业嘛!”这样的借口去掩盖深层次的问题。一开始就要去做真正的事业,这样才能大大提高成功率。

「破釜沉舟」中提到:

你需要的是承诺策略,而不是退出策略。你应该考虑的是如何把项目做起来,而不是如何跳船逃生。涂过你的整个策略都是建立在逃跑的基础上,那么你一开始就不会走得太远。

「条件受限是好事」中提到:

“我没有足够的时间、钱、人手、经验。”不要再做无谓的抱怨了,“少”不是什么坏事。“条件受限”貌似缺陷,实为优势。有限的资源能激发你在现有条件下完成任务的能力。没有一点浪费的空间,一切都需要你发挥最大的创造力。

在你高唱“始终不够”的悲观论调之前,请试试看自己利用现有的资源能走多远。

CSAPP学习笔记第二辑

虽然可以使用优化编译器,但对于严谨的程序员来说,能够阅读和理解汇编代码仍然是一项很重要的技能。

gcc -O2 -o p p1.c p2.c

-O2是告诉编译器使用第二级优化。第二级优化是性能优化和使用方便之间的一种很好的妥协。 程序计数器(%eip)表示将要执行的下一条指令在存储器中的地址。 C中的聚集数据类型,例如数组和结构,在汇编代码中是用连续的字节表示的。即使是对标量数据类型,汇编代码也不区分有符号或者无符号整数,不区分各种类型的指针,甚至于不区分指针和整数。

gcc -O2 -S code.c

 加上-S就能看到C编译器产生的汇编代码。

pushl %ebp

表示把寄存器ebp中的内容压入程序栈中。

机器实际执行的程序只是对一系列指令进行编码的字节序列,机器动产生这些指令的源代码几乎一无所知。

要查看目标代码文件的内容,反汇编器(disassembler)的价值无法估量。

在unix系统中,用objdump可以启动反汇编器。

IA32指令长度从1~15个字节不等。

指令格式是按照这样一种方式设计的,从某个给定位置开始,可以将字节唯一地译码成机器指令。例如pushl %ebp 是以字节值55开头的。

编译器有时会在代码中插入一条nop指令,是为了填充存储该过程的空间。

Intel术语“字”表示16位数据类型。 在过程(Procedures)处理中,对前三个寄存器(%eax,%ecx,%edx)的保存和恢复惯例将不同于接下来的三个(%ebx,%edi,%esi)。最后两个寄存器(%ebp,%esp)保存着只想程序栈中重要位置的指针,只有根据栈管理的标准惯例才能修改这两个寄存器中的值。

指令的操作数分为三类:

一、立即数($123,$-134),由一个$符号加上数字,数字可以是十六进制。

二、寄存器(%eax,%ebx)。

三、存储器,根据计算出来的存储器地址访问某个存储器位置。

一般寻址格式:Imm(E(b),E(i),s)其中Imm是立即数偏移,E(b)表示一个基址寄存器,E(i)表示变址寄存器或者叫索引寄存器,s是伸缩因子,只能取值1、2、4、8. 计算方法:Imm+E(b)+E(i)xS

IA32对于mov指令的要求是不允许两个操作数都是存储器位置。

movsbl、movzbl的区别:    

1
2
3
4
5
6
%dh = 8D     
%eax = 98765432     
movb %dh,%al    //%eax = 9876548D     
movsbl %dh,%eax    //%eax = FFFFFF8D     
movzbl %dh,%eax    //%eax = 0000008D movzbl用0填充eax的高24位;
movsbl用dh中的最高位填充eax的高24位。

至于为何是填充eax的高24位,原因是movsbl、movzbl的源操作数是字节长度(就是这里的dh),而这条指令会执行扩展32位,就是把目的操作数的高24位进行相应的扩展操作。

根据惯例,所有返回整数或指针值的函数都是通过将结果放在寄存器%eax中来打到目的的。

LEA指令是将有效地址计算出来放到目的操作数中而不是取出结果放入,虽然它看起来和mov的感觉差不多:) 在for循环中初始化一个变量比如int i = 0..汇编中一般是这样做的:xorl %edx,%edx因为变量与自身做异或总是得到0的。

乘除法相比较而言是比较高级的操作,一般乘法是把一个数放入%eax,再与另一个数相乘,如:imull 12(%ebp),此处假设另外一个乘数在%ebp偏移12的地方,结果分别放在%eax和%edx中,分别保存了结果的低32位和高32位,最好根据实际情况(机器大端、小端)压栈。

除法类似,只是结果中的商保存在%eax中,余数放在%edx中。

CSAPP学习笔记第一辑

第一章

一个C语言程序从源代码阶段到可执行阶段需要经历这几个步骤: 源文件—->经过预处理器(cpp)成为.i文件—->经过编译器(cc1)成为.s文件—->经过汇编器(as)成为.o文件,所有函数调用都成为.o这样可重定向的目标程序—->最后由连接器(ld)链接成成为可执行文件。cc1这名字真好听:)

系统设计者的主要目标就是让信息在各种设备之间“拷贝速度”尽量快。显示一行“hello,world”的过程主要是从磁盘—->主存—->显示设备传递。

文件是对I/O设备的抽象表示,虚拟内存主要是对贮存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。

一个进程下的多个线程共享这个进程的代码和全局数据,多线程之间比多进程之间更容易共享数据,因此线程一般比进程高效。

虚拟地址空间由多个区(area)构成:程序代码和数据、堆、共享库、栈、内核虚拟存储器(占有1/4/)。

第二章

计算机使用二进制对所有数据进行编码。(这就是为什么学计算机的同学们能够用两只手数到1024而非计算机专业的同学们只能数到10:)

这里有三种最重要的数字编码:无符号(unsigned)、二进制补码(two’s-complement)、浮点数(floating-point)。

大多数计算机采用8位的块(或者叫字节)作为最小的可寻址存储器单位。存储器就象是一个很大的数组,每一个元素就是一个字节。

十六进制的转化:把每个十六进制数分别转化为二进制即可。例如:

1
2
3
4
5
6
7
0x173A4C
1:0001
7:0111
3:0011
A:1010
4:0100
C:1100

开头的0x是十六进制的标示,无需翻译。二进制转化到十六进制是要从右侧开始,每4位二进制数换成一个十六进制,因为取的是4位二进制数,所以不可能超过15,就能够换算成十六进制的0~F。

用一个数除以2或者16取出余数就能得到相应的二进制或者十六进制编码,不过要倒序书写余数!!!

对于一个字长为n位的机器而言,虚拟地址范围是0~(2的n次方)减1,一共是2的n次方字节。所以32位计算机的内存最大是2的32次方,即4GB。

C语言中的指针使用机器的全字长,即可能是32位长度,占用4个字节(32位计算机)。

可移植性的一个方面就是使程序对不同数据类型的确切大小不敏感。

不同的计算机对于字节的存放顺序不同,分为大端法(big endian)、小端法(little endian),不同的处理器可能选择不同,还有一些处理器用哪种取决于CPU加电启动时确定的字节顺序,随机的:)比如0x01234567这个数字,大端法机器会这样存放:01、23、45、67。而小端法机器会这样存放:67、45、23、01(每一组数据还是正常的读法,只是要从右边开始读不同的组:)

~a不是a在|运算下的逆元(相信学完离散数学就知道什么意思了:)

是不是很……?!

交换两个数的值(技巧性炫耀,没有性能上提升):

1
2
3
4
5
6
void swap(int x , int y)
{
   x = x ^ y;
   y = x ^ y;
   x = x ^ *y;
}

移位运算要注意结核性,x<<j<<k的结核性是(x<<j)<<k,而且还要注意优先级,1<<5-1应该是这样计算的:1<<(5-1)!!!所以只要不确定就加上括号,这样肯定安全,而且可读性也是比较好的。

右移运算分两种:算术右移和逻辑右移。算术右移在左边补充n个最高有效位的拷贝,逻辑右移是在左边补充n个0.对于无符号数的右移必须是逻辑的(补0),而几乎所有的编译器/机器组合都对有符号数据使用算术右移(拷贝最高有效位)

(此处略去xxx行,实在不想学习各种数字的定义和表示方法,承认不愿意钻研数学。不过虽然数学很难懂,但数学是死的,今天学一点明天就会少一点:)

自己的技术还差得远

虽然别人感觉我的技术水平挺高的,不过我自身却一直都没这样想,有时候也是喜欢说得多做得少,毕竟说一件事是很简单的,要是真的要自己去做,我可能就很难完成了,不过凭借自己的责任感也会弄出点结果,只是过程是艰辛、痛苦的,不想回忆自己的那些过程,虽然不少人认为这是美好的回忆。

看过几个Google的面试、实习生题目,原本的打算全部破灭,真得是很有难度,虽然想暑假去瞻仰一下Google的风采,不过先看也得看看现实的东西──你是不是匹配Google的标准?你是不是能够受得了Google那种技术生活?捎带着点感伤的我可能还差得远呢!

前天去参观了大学里的招聘会,虽然周围都是些大四的同学,我也想试试自己是否基本达到企业的要求。其中有四五家面向计算机专业学生招聘的单位,其中大多数是做网站的。我和一个招收软件开发的单位聊了几句,他们可能打算找我,不过了解到我不是毕业生后就没办法了。我还是有几个能拿得出手的能力,只是在这种小范围还行,到了Google那里,直接清零:(

情况就是这么严峻,既然自己想从事技术路线,那就不要再执迷不悟了!!!从头开始学起吧,汇编、C、C++、数据结构,暑假里用Java做点东西防止遗忘,没有扎实的功底,即使去了某些单位实习也很难积累到什么经验──现在面对的问题基本上是从未涉及的,只是边看前人的经验边研发,这似乎已经成了我们公认的事实,这样搭建出来的作品是能短期交付,但对于自己没什么益处,对于“客户”,长远看来也不是什么好事,还有其中的那种痛苦感……

希望这些话,我能听进去吧:)

从OS的角度学习时间管理

OS的重要性不想再赘述,不过对于一个物理硬件,好的OS能够更大程度发挥其性能,这其中绝对不能缺乏好的设计模式以及优秀的各种调度算法。这里的一切几乎都是编程的理想学习材料,不过对于这样庞大的材料需要好好解读,否则可能根本领悟不到其中的真谛。

时间管理是我个人一直推崇的一种必备技能,自己也看过几本这方面的书,不过都不得要领,感觉书中讲得很多都无法在现在社会环境中普遍适应,所以读着读着就感觉那是作者在说教了。

那么在优秀的OS架构中我们除了能够学到高超的编程技巧外,还可以对里面的一些概念进行抽象,使其能够应用到更多的方面中来,比如我感觉有些东西就能够应用到时间管理上!

这里先说一点,以后如果有新的体会再分享。

目前在单核心的CPU中,OS还是只让CPU在某个时刻只允许处理1条指令,那么我们人也应该如此。你每天要做很多事情,但你只有一个大脑,虽然这个大脑的工作效率非常高,复杂度也远远高于OS的任何调度算法之和,但一次只处理一件事的思想还是应该采纳的。传说有人做过实验,当然是传说,不知道出处。如果同时做多件事情,所需要的时间会比一件件做多出30%,这已经不是一个小数目了。这条经验告诉我们,日常工作中应该集中力量完成当前的这件事情,然后才是下一件,否则你看上去像是在并发执行多项任务,最后实际算下来多花了很多时间,这样就很难保证质量了。而且人类和机器不太一样,人类容易遗忘,机器和我们一样需要记住某些已经计算过的数据,不过机器有PCB,我们有什么呢?读书的话应该是读书笔记吧,其他方面就是备忘录了,总之要保持单一工作就好了!

一个函数的接口演化

那天下午打算做个推荐饭菜的应用出来,上机课期间把雏形做好了,现在除了不能自由添加数据以外别的我还都满意,当然不谈UI设计。

介绍一下其中有一个地方的函数接口,就是用来显示“已经有的主食和菜”的两列列表,数据库中分成两个表,一个是主食,一个是菜,相关字段都是一样的──id,name,price加入price是为了提前设计下一个版本,似乎稍微有点过度设计?一开始这样设计没什么问题,相应的PHP函数是available($foodtype,&$array_xx);这样传递的数组进入后把数据push到数组中,再利用数组显示到网页上,这个函数本来并不负责echo,foodtype分别是数据库中的表名,这样传递进mainfood或者dish就能分别抓取相应表的数据。

接着发现主食中有些可以作为单独一顿饭的东西,比如西红柿鸡蛋面这个,光吃这一种就可以了,再推荐饭菜不合理,于是考虑了主食分级,加入面条类、包子类等,这样数据库中就增加了两个字段──parent、occupy。parent是保存它上级的id,occupy是标记是否可独占,如果独占就不会再推荐菜了。相应的函数就演化成了两个,因为目前不想让dish中的数据分级,所以原来的处理dish表中的数据还是可以的,mainfood中的数据需要一个单独的处理函数,索性叫echo_mf吧,参数还是传递进去一个数组,这个函数有两个主要功能──一个是把这个分级结构显示到页面上,另一个是把所有的子项目和没有子项目的父项目添加到数组中,前台shuffle这个数组来随机显示一个。

我想下一步很可能是这两个函数的整合,即dish也分级后,这两个函数就都可以整合成第二个的样子,因为他们的工作就是一样的了。

现在的mainfood输出还有些问题,原本想的是这样──有米饭、包子等类别,其中包子类中还有各种各样的包子,而米饭就是这一种,所以按照概率来算,父类(米饭、包子)被选择的概率应该是一样的,而只有选到了包子才会去各种包子中选择一个,就是所有选择各种包子的概率之和应该与米饭同样大,现在却不是这样,我把最末端的数据和没有子项目的数据一并放在一起,这样显得冷落了米饭等没有子项目的父类……到底要不要改回来呢?再看看吧。

坏味的简单分析

软件工程的设计是一种抽象概念,设计的最终体现是源代码。

软件需求总在变化,本来一个简单的程序,经过几次需求变化就需要添加上很多额外的参数来控制流程,这时根本不可能期望修改接口,因为这时很多模块可能已经在使用你,如果你进行了更改,依赖你的所有代码都需要重新编译,这在一个庞大的项目中简直就是灾难!

所以,出现坏味的根本原因就是一开始的轻视设计,又加上不断的需求变化,项目中不可避免的一些依赖,导致需要利用hacks这类方法来躲避灾难,而越是hacks,越是在让项目腐烂!!!

那么敏捷开发者这帮神人是如何做的呢?他们遵循原则、模式等等。敏捷设计是一个过程,而不是事件。在不断变化中,他们能够利用变化,而其他人却被变化弄得不知所措。那么我们期待以后的敏捷原则介绍吧!我总感觉这和Unix里面的KISS有相同的意思。

修改ssh登录方式

1
2
3
4
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
UsePAM no

这样就能有的用rsa登录有的用密码登陆了!