作者:flyfish 2014-2-25
维数
二维的世界
设想在桌面一张极大的纸上,上面有,三角形、四边形、五边形等等包括其他图形;它们能在纸面上自由移动,只是不能离开纸面做上下运动。一个三角形在纸上,从上看能看出它是三角形,然后到桌边,视线与纸平行看,能看到的只有线。二维世界的图形们,它们看对方看到的只有线。
一个小球在这张纸上滚动,突然掉地上了。这些二维世界的图形们它得出的结论就会是:小球已经不存在了。三维世界的人能看见小球还在了,只是掉在地上了。
1如何让二维世界的图形们感受到三维世界的存在?
2关系数据库的通常用二维表结构来描述事物和事物之间的联系。二维的思维可以表达出这个的世界吗?
3数组由类型名,标识符和维数组成的复合类型(Compoundtype),计算机只要空间无限大,是否可以表现出无限维的数组呢?
4我们的宇宙到底是多少维的?并不是所有的知识来自于我们的感官,因为人的视觉受限,人如何理解第三维之外呢?不识庐山真面目,只缘身在此山中。
不高效的Virtual,不是真实的,但被真实地使用着
1 Virtual Function虚函数不高效为什么还需要它呢?
在C++发源地贝尔实验室中,有大量的C程序员,最初发明C++的原因是让C程序员更高效率的工作。虚函数是可选的。如果不想让程序拥有一点的额外的开销,那就不用。在设计类时,不应该担心程序效率问题,在恰当好处时想用就用。在程序设计完成之后,如果要改进程序运行效率,那么就可以去掉可以不使用虚函数的函数。
抽象是为了易于理解,代码最重要的是要让人理解,而不是让机器理解。C++语言设计的目的是解决实际问题,要求实用,他不是追求最理想的抽象。
需要,而不过度使用。
MFC框架不是一蹴而就做成的,它不是一个抽象度很高的框架,抽象度过高容易损失性能,微软在抽象和性能之间做一个平衡。写代码是一件很具体的事,而编程方法很抽象。最难的事情是对尺度的把握,很多事情都在把握一个度,寻求某种平衡。
2面向对象的编程语言通常会引用生物学的进化论来说明,例如简单的继承关系,C++语言里面有个多重继承,而多重继承产生的菱形继承就像近亲结婚,编译器这关是通不过的。
而Java就不支持多重继承,Java为什么不支持多重继承呢?
答案是This is a design decision taken by the creators of java. The keywordis simplicity and rare use。
C++还要需要用Virtual解决这菱形继承问题。
3虚数
虚数(imaginary number)在数学中不是真实的数字,但被真实地使用。Imaginary这个词
源于笛卡尔用来辨识方式的非普通数的解。因为我们知道 i的平方=-1 ,从表示虚数的单词得知虚数是前人想象中的一个数,这想象中的一个数,它是什么我们不知道,但我们相信它的存在。计算器中为什么是无效输入呢?
编程语言的学习
学习编程语言这件事,没必要掌握关于语言所有的技术细节,弄本书放在身边当成字典,不会的时候,查查就可以了。编程语言中那么多知识也不可能全部记住,当时记住了,时间一长也就忘了。编程中最困难的部分不是学习语言的细节而是懂得如何解决问题。
要注意减轻脑的负担,就像C/C++运算符优先级,不需要记住,用的时候加上括号,一目了然。
开发流程
在软件开发流程中无论采用是瀑布,迭代,螺旋,敏捷等等何种模型,都不应该被教条使用,教条使用的东西容易反受其害。流程是在软件开发中自发出来大家认同的东西,不同的团队,不同的人总会产生不同的流程,甚至有别于任何团队的一种流程。俗话说适合才是最好的。
设计模式
在学习的时候,可已将GoF描述的23种设计模式用自己熟知的语言写一遍
但在真正进入在开发的时候没必要考虑代码需要采用何种设计模式,因为在编程过程中就会发现:这个地方采用什么什么模式,那个地方采用了什么什么模式,浑然天成。
直觉
问有的高人为什么要这样,答案只是感觉。这种答案没有说服力,但如果按照他那样做了确实可以解决问题。在“感觉”的背后是一个搜索引擎进行了针对性的特征匹配,在不断寻找解决问题方法的过程中慢慢的积累了经验,在恰当的场合就应用这些经验。代码写着写着就写出了直觉。
程序员这个职业
这个要看如何对待自己。
因为自我暗示具有“变现”能力。按自己的标准来要求自己去做,终究会变成“想成为的自己”如果有人想在自己的领域出人头地,就要认识到这需要几十年的坚持不懈的艰苦努力。心中有期待,花儿自在开。