###一次“漂亮的设计”引发的反思

我记得刚开始写程序时,特别想写优雅的代码,做漂亮的设计,完美的抽象。为此还经常与别人争到面红耳赤。

印象最为深刻的一次,是在写服务器代码,我用C实现了一套C++面向对象的开发方式。

漂亮的抽象,C的继承,大家都觉得很NB。但我却发现大家的开发效率反而下降了,错误也多了。

当时我就在思考:这样“漂亮”的设计,真的正确么?

Linus大神醍醐灌顶的教诲

这样的困惑一直持续到我看到一篇文章后才彻底解决。

这篇《Linus炮轰C++》的文章彻底说出了我的心声——有兴趣的同学可以去搜索一下——我在这里摘抄一部分Linus的话:

“漂亮的”库特性比如STL、Boost和其他彻头彻尾的垃圾,可能对你们的程序有所“帮助’“,但却会导致:
1.当库无法工作时无穷无尽的折磨;
2.低效的抽象编程模型。

可能在两年之后你会注意到有些抽象效果不怎么样,但是所有代码已经依赖于围绕它设计的‘漂亮’对象模型了,如果不重写应用程序,就无法改正。

如果你想控制系统,去玩Monotone吧。他们确实使用了“真格的数据库”;使用了“漂亮的面向对象库”、使用了“漂亮的抽象”。可是说老实话,所有这些对某些计算机专业人士而言富于吸引力的设计决定,其最终结果确是一堆可怕、难以维护的垃圾。“

说得更具体一些

——简单和清晰的核心数据结构, 非常精益(lean)且颇具雄心的代码管理着它们,将”简单胜于花哨” 这一方法发挥到极致。

——有意识地不抽象数据结构和算法,因为它们恰恰是Git核心的全部要素。

说实话,当时看完后我大声叫好,心里不由得佩服起来。

真正做到了从解决问题的本质出发,简单核心的数据结构,摒弃所有花哨的、不实用的动作。

代码很NB,但真的很难维护

我们都见过令人叹为观止的设计:模板内还有模板,各种接口抽象和重载,各种高级语言新特性写法,各种抽象的概念等等。

设计理念非常先进,但是维护起来很难,因为确实看不懂!也不知如何基于它来写代码,似乎怎么写都会弄脏整个设计。

我认为,作为一名架构师此时更应该思考的是:

###如何才能解决当下的问题?

提供出一个简单的机制,让不同水平的人能在框架下同时工作,把复杂留给自己,把简单留给别人。

框架设计尽可能接近真实的问题需求,不做过多抽象,这样方便大家理解,更利于大家在你的框架下很好地工作,把每个人发挥出来,而不要是把架构设计的像智力玩具。

###如何衡量框架设计的好坏

好的框架设计,要能开发出特定需求的稳定产品,这是设计的第一要务。产品稳定非常重要。

好的框架设计开发出的软件产品,要容易维护,能快速定位错误。容易维护就是简单、流程清晰可查,没有太多的抽象。

好的框架设计,能让团队快速的展开工作,不相互制约和影响。

好的框架设计,完成特定功能的想法不要会太多,简单自然解决当下问题即可。

比如git, 就是分布式版本管理工具;protobuf 就是协议的编码解码;redis,nginx等就是完成特定功能的框架。

开发者了解了使用需求,也就了解了框架主要逻辑。

从问题本身出发,解决问题,不过度抽象,让框架回归解决问题本身。

结语

老子所说的“道法自然”,即是说:

道所反映的规律是自然而然的

代码框架之道,也就是指自然而然的解决当下问题

原创连载《第1篇:道法自然 》相关推荐

  1. [原创][连载].基于SOPC的简易数码相框 - Nios II SBTE部分(软件部分) - 从SD卡内读取图片文件,然后显示在TFT-LCD上...

    实在很抱歉,时间紧张,我只讲怎样从SD卡内读取bin文件(二进制文件),然后现在TFT-LCD上. 准备工具 1. Image2Lcd.zip 操作步骤 步骤1 寻找或制作240x320的图片 简单起 ...

  2. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  3. python连载第11篇 if 语句

    #python连载第11篇 if 语句 #if单个选择测试,两个print是一个代码块,所以都要执行 age = 17 if age > 10:print("you are old e ...

  4. python连载第12篇 for循环 源码+ 答案

    #python连载第12篇 for循环 ''' Python函数 range() 可以自动生成一系列的数字, 但是range()函数本身包含开头数字1,但是不包含末尾数字4 用for循环可以提取产生的 ...

  5. python原创第十四篇~判断,循环实战训练+答案

    2017-12-07 09:23:55 December Thursday the 49 week, the 341 day #原创第十四篇~判断,循环实战训练 题目:一个整数,它加上100后是一个完 ...

  6. 鸿蒙IPC摄像机,【HiSpark IPC DIY Camera试用连载 】第二篇 视频的人脸检测

    [HiSpark IPC DIY Camera试用连载 ]第二篇 视频的人脸检测, 本帖最后由 瑟寒凌风 于 2021-1-14 00:13 编辑 实在的,ipc本身就带有这个功能,只要摄像头出现画面 ...

  7. STM32MP157系列教程连载-硬件设计篇3:STM32MP1微处理器之时钟篇

    STM32MP157系列教程连载-硬件设计篇3:STM32MP1微处理器之时钟篇 一.RCC系统概述 本文涉及的内容主要包含在以下几个文档中,文档可从ST官方网站与意法半导体stm32中国下载. 序号 ...

  8. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下) <量化 ...

  9. STM32MP1系列教程连载-硬件设计篇1:初识STM32MP1系列微处理器

    STM32MP1系列教程连载-硬件设计篇1:初识STM32MP1系列微处理器 一.与一只蝴蝶的邂逅 时间退回至2007年9月,对于刚步入大学的笔者而言,微控制器的含义仅仅局限于文字.而在同年的6月意法 ...

  10. Arduino传感器连载之温度测量篇

    Arduino传感器连载之温度测量篇 来源:http://www.hzhike.com/School/2016/201607/20160711100131.html 温度是我们经常接触到的物理量,能够 ...

最新文章

  1. 常用[js,css,jquery,html]
  2. 算法导论-动态规划(dynamic programming)
  3. docker挂载NVIDIA显卡
  4. 华为云 和 阿里云 跨服务器搭建Hadoop集群
  5. JPA在MySQL中自动建表
  6. [libGDX游戏开发教程]使用libGDX进行游戏开发(12)-Action动画
  7. GridViewDetailsView对XML文件增删改
  8. NopCommerce支持友好路由
  9. 专业RAW图像处理软件Capture One Pro 22
  10. Hello!SCDN
  11. SVN:本地项目与SVN项目进行关联
  12. Linux 命令 | 常用命令 tree
  13. 安防综合管理平台/视频资源汇聚平台
  14. 哪种工业仓库扫描枪适合您?
  15. 临床试验中的样本量估算---实践篇
  16. 用户态与内核态之间的切换
  17. 神秘AI变脸软件风靡全球,让你秒变身迪士尼在逃主角
  18. python基于PHP+MySQL的连锁商店仓库管理系统
  19. 【Pytorch】torch.Tensor.expand_as()与torch.Tensor.expand()使用与比较
  20. 学校BBS上C版总结的月经贴,感觉很不错

热门文章

  1. 电脑文件不小心删除了怎么恢复?
  2. 查验身份证 (15 分)一个合法的身份证号码
  3. 已阅论文汇总:迁移学习
  4. 文档库建立php,PEAR:使用PHPDoc轻松建立你的PEAR文档_PHP
  5. 准备蓝桥杯--dyx--特殊的数字
  6. qemu虚拟机模拟固件环境搭建
  7. oracle中sql%rowcount的作用
  8. 视频图像压缩编码之预测编码
  9. 《鬼武者3》内存代码修改全篇
  10. 【Next7.2.0版权声明大改动】仅需一步!开启内置版权声明(跟繁琐的自定义版权声明说拜拜~)