1

关于抽象

 2 years ago
source link: http://wwj718.github.io/post/%E9%9A%8F%E7%AC%94/about-abstract/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近捡起《CODE COMPLETE》,从头开始读。
虽然在校期间读过一些,再次捡起来的时候,依然是被各种惊艳到,酣畅淋漓。
近1000页的纯技术砖头能写得这般生动,也实属罕见。
难怪有读者在亚马逊评论道:这是程序员可以带到荒岛的唯一一本书。
简直是可以就着咖啡看月色的好书。

《CODE COMPLETE》第五章谈论软件构建中的设计时谈到抽象。

精妙之极。

作者说道:

抽象是一种能让你在关注某一概念的同时可以放心忽略其中一些细节的能力–在不同的层次处理不同的细节。任何时候当你在对一个聚合物品工作时,你就在用抽象了。当你把一个东西称为“房子”而不是由玻璃,木材和钉子构成的组合体时,你就在用抽象了。当你把一组房屋称为“城镇”时,你还是在用抽象。

我在阅读edX源码前,其实没有怎么认真阅读过大型项目,虽然也在github上翻阅过一些项目,不过基本凭借笔记和记忆可以就弄清大多细节。

初次面对edX的时候,就像你一贯打小兵打得顺手,前头来了个大boss,手足无措。

阅读的过程颇有捡了籽麻,丢了西瓜的感觉。

前不着村,后不着店的。

问题的症结在于,一直抓着细节不妨,基于这样一个错误观念–“它们是相互关联的”。

这正是20世纪软件工程面临的危机之一,软件工程的复杂度越来越高,而我们的智力却有局限。

如何降解复杂度?

抽象让我们可以放心地忽略其中一些细节,这样我们就能将注意力每时每刻只关注某一方面。

可为何忽视细节却不会带来麻烦呢,这便是20世纪的软件工程致力于解决的为题。

为了降解复杂度,人们折腾出了许多的抽象工具,面向对象技术便是其中之一。

有些概念虽然常常与面向对象纠缠不清,诸如封装,诸如信息隐藏,我觉得它们实际上很独立,不局限于某种编程范式内。

他们更像一种启发式思维,而不是具体的方法论。

抽象这东西实际是一种思维工具。

它独立于语言,甚至独立于编程,它是一种思维方式,几乎对处理一切事物都能起到降解复杂度的作用,有一种掉入山洞,偶得秘籍的感觉。

今天上班的时候,试着用这种思路去理解edx,面对这个盘然大物,之前束手无策,在代码丛林里,其实颇有盲人摸象的感觉,一直不见森林。

在大胆抛开细节后,居然可以理出头绪了。

其实之前何曾不想抛开,可是抓不准什么是可以丢弃的信息。

而在了解了 设计人员在设计时,其实也用了这些思维工具,剩下的细节就是了解隐藏信息和封装之类具体的技巧了,如此一来可以很快理解设计人员的思路。

这样,我们可以穿梭于各个层面。分析系统架构时,站在高层(只看接口),而深入细节时,才进入代码。

站在高层分析时,使用图示,而深入代码时,记录出入口数据。

第一次感觉到你能用你的思维本身来对抗复杂度。它是实实在在的工具啊!简直削铁如泥一般,虽然看不见摸不着。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK