面向对象编程(OOP)已经不再重要_风闻
code2Real-有人就有江湖,有code就有bug2021-09-11 11:25
如果要参加大厂的技术面试,那么面向对象编程技术(OOP)是必考内容。
也许很多人在工作中会用到OOP,但是真要回答什么是OOP,或者OOP的本质是什么,可能会回答不完整。
有一次一个学生请教我一个编程问题,然后打开源码,问我怎么实现数据传输,是不是在修改一个类,或者增加一个类。
我看了一眼代码,发现类/class的成员变量全是公开/public的。
代码是这个学生的老师十年前写的,一看就知道这个老师还没有掌握OOP,没有考虑到封装隐藏问题,反正代码是一团浆糊。
反正我告诉学生尽量不要动老师的代码,不要修改老师写的类/class,然后帮着学生以最小的改动方式解决问题。
这里的学生都不是CS科班出身的,计算机知识都是自学的。
估计再过几年,学生不会为OOP烦扰了。
因为现代编程语言发现组合方式优于继承方式,如果OOP不再将继承列为重要特征,那么OOP将不再重要。
OOP火的时候,一切皆对象。
JAVA是标准的OOP编程语言,为了实现面向对象,java需要付出代码,为每一个对象添加96bit标识,因此一个32bit整型数,需要128bit存储空间。
继承讲究合法性、合理性,讲究根红苗正,在实现上不免叠床架屋,搞得异常复杂。
猫狗可以继承动物animal,但是机器狗能继承animal吗?
组合就没那么麻烦,只要能解决问题,可以随意组合,给老虎插上翅膀。
Go语言是面向值的编程,消耗的空间比java小。
类似地,rust也弱化面向对象编程技术,用组合代替继承。
IT的世界是一个快速发展的世界,与现实世界相比,世间一日,IT一年。
在IT领域,两年以上的算是七百年规划了。
他山之石,可以攻玉
从IT技术的发展脉络,可以预测人世间的发展趋势。
一个历史悠久的文明面临着继承与发展的问题。
人的精力有限,一方面要继承几千年传统,一方面要解决问题。
这两者如何平衡,其实没有标准答案。
很多人主张全面继承,不管是继承中国的还是西方的。因为继承可以不用为论证合理性、合法性操心。
印度认为自己继承了大英帝国的资产,因此想把阿富汗/中亚、西藏/东南亚等地纳入自己的势力范围。
土耳其认为自己继承了突厥的资产,想把中东、中亚、高加索、新疆等地纳入自己的势力范围。
继承解决了“我是谁”,“我从哪里来“的问题,但解决不了”我要到哪里去“的问题。
从编程语言的发展来看,组合优于继承,因为编程要是解决问题,不关心”我是谁,从哪里来“的问题。
现代软件发展永远是处在beta版,如果想等到正式版推出再使用,黄花菜都凉了。
因此现代软件发展对合理性、合法性看得比较淡,拼命提高试错频率,说不定什么时候撞大运。
例如官渡之战,袁绍与曹操陷入相持,谁到占不了便宜,但是曹操缺粮,很快就要失败了。
后来许悠献计,曹操带五千骑兵偷袭乌巢。
守乌巢的淳于琼有一万兵,觉得自己可能守不住,就派人向袁绍求援。
袁绍谋土分两派,一派主张救乌巢,一派主张打曹营围魏救赵。
袁绍觉得乌巢能守得住,自己打曹营也许能赚便宜。
但是袁绍没想到官渡地势狭窄,不利于大兵团展开,自己与曹操打了很长时间都没有打下来。
对曹营而言,多五千人少五千人没什么差别,不会因为曹操抽调五千人就守不住。
对于曹操而言,反正死守曹营会因为缺粮而失败,不如放马一搏,打下乌巢,让袁营也缺粮。
对于袁绍而言,最重要的是守住粮草,只要有粮,时间就在自己这一边,所以袁绍的最佳策略是救乌巢,而不是打曹营。
编程界也面临曹操那样的困境,死守一种编程语言/商业模式,也会因为缺粮而失败(IT是烧钱的行业,不缺粮才怪),与其那样,不如尝试新的技术/模式,打组合拳。
虽然失败率很高,但是一旦成功就能翻盘。
---------------------------------------
过去,西医治病喜欢找特效药。从青霉素到头孢,再到各种各样的靶向药,西医的神奇之处在于,要治某一种病,就去找某一种特别的化学成分,专门治这种病。
因为这样的成功案例太多,就容易让人误以为医学就应该如此:一把钥匙开一把锁,一种药物治一种病,简单又高效。
可实际上,使用多种药物组合的方式治病,往往能得到更好的效果。就算是西医,也常会使用简单的复合药物进行治疗。
其实,西医最近几年才开始重视药物组合治疗这个方向。那为什么如此显然的研究方向,一直没有火起来呢?要知道,鸡尾酒疗法是1996年被提出来的,距今已经二十五年了。
主要还是因为寻找正确的药物组合,对于西医来说并不容易。虽然相对中医,西医非常年轻,才两百年的历史。但是相对很多现代科学来说,西医其实也是一个非常传统的学科。一旦需要考虑多种药物组合,那么潜在的可能性会指数级别地增长。按照西医的要求,药物的组合需要有可解释性,也就是说,不但每个药物是干什么的要理解清楚,药物与药物之间的各种作用也要明白,这一下子就大大增加了问题的复杂度。
对于这样指数增长的复杂问题,西医并没有很好的工具进行处理——虽然我们知道,这是计算机科学比较擅长的领域,但是计算机对组合爆炸也没有太多的办法。
于是对于暂时处理不了的问题,现代科学一般本着严谨的态度,会选择先不去处理。这也就是为什么西医对于组合药物的研究还处于比较早期的阶段。
从医药学角度看,特效药已经山穷水尽了,组合药显示出一定的优越性。
中医则不一样了。因为野路子出身,中医不在乎可解释性,不在乎双盲实验,不拘泥于使用单味药,只要能够治好病就可以,一个方子里面可以包括十多种药材,里面有几个是南郭先生也没关系,用量多一点也没关系。因为不在乎科学的研究方法,所以有大量的直觉掺杂其中,有的是错误归纳,有的是局部搜索,有的是瞎猫撞了死老鼠,但不管怎么说,中医成功地从指数级别的可能性中,找到了一批行之有效的组合药方。
中医的思路其实与编程界很相似,都是野路子出身,美国有一类的程序员都不是科班出身的。
码农有时会从中医中得到启发,提高诊断/debug和开药方/solve能力。
IT为了生存可以无不用其极,而在现实中,因为各种传统势力,人们还是顽固地继承传统生活方式。
阿富汗经历三次大国入侵,仍然坚持传统生活方式。
近代,中华文明、阿拉伯文明因为满足于自己的文明模式,强调正统性,强调继承性,没有积极组合其它文明的优点,反而被西方超越了。
现在风水轮流转,西方陷入政治正确性的陷阱,强调继承性了:)