最近,我在设计、开发、维护一个基于『文档代码化』思想的平台。因为丰富的 markdown 经验和文档化系统的设计经验,我在这个系统中实施了很多过去的一些想法。系统工作得很好,但是代码却显得一片混乱,因为系统过于复杂。而,我突然觉得这是一件好事。

最佳实践很浪费时间

对于敏捷开发来说,我只采纳了持续集成和持续部署的思想,即提交代码便发布到 GitHub Pages。但是,这也浪费了我很多的时间,而且我觉得没有必要,因为我已经有一个本地可以部署的脚本。我只需要在本地运行一下 deploy,那么就会在本地构建,并部署到服务器上。然而,为了最佳实践的理念,我还是花了半天的时间,研究了一下 GitHub Action,然后让它实现自动部署。

系统的 UI 采用的于 Angular 框架,因为我懒得搭建脚手架,而且我还有一些先前的代码可以复用。所以,我 copy / paste 大量的代码,这些代码大部分都是没有测试覆盖的。是的,你很少看到我的开源项目是没有测试覆盖的 —— 毕竟写单元测试也是要花时间的。过去,我们统计过一个相关的数据,在我们日常的开发中,我们差不多有 1/5 的时间花在了单元测试。所以,一周下来,我差不多一天的时间在写测试这件事上。

一个问题,三种方法实现

如开头所说,整个系统的核心是一个基于 markdown 的多功能渲染引擎。这部分的组件可以让你用 markdown:

  • 画出条形图、雷达图、思维导图

  • 画出甘特图

  • 画出特定的四象限

  • 调用 Web Components

  • ……

而为了实现这个功能,一共有三套不同的机制,当然了对于写 markdown 的人来说,它们是无感知的。这三种方法分别有:

  1. 创建占位符,渲染完成后,替换占位符

  2. 直接生成最后要渲染的 HTML

  3. 生成一个 ID,在渲染的过程中,根据 ID 替换元素。

所以,整个过程就相当于,是解决一个问题有三个方法,然后我都用了这三种方法。

起初,我只想创建个原型

起初,我只是想创建一个简单的系统,它只是一个简单的原型。而后,随着越来越多想法的产出,我创建了一个足够复杂的系统。所以,我起初设计的一系列要素都失效了。

我还有一堆糟糕的 SCSS 要管理,因为第一个版本设计的 CSS 体系,无法适用于新的架构。整个系统围绕在 markdown render 上,而这个 render 有大量的样式,就好像早期的多核 CPU 架构,只有一个 CPU 在工作,毕竟有大量的工作。

随着系统越来越复杂,我开始需要一个文档系统来管理这个文档系统,以便告诉我自己:系统里有什么功能?

一片混乱,真的很爽

是的,现在,现在虽然看上去界面很美观,功能也很强大。就好多是我们看到的其它软件系统一样,但是内部真的是一片混乱。如果你习惯了这样的系统的代码,那么你可能觉得这不是一个问题。

但是,我习惯了在项目中引用各种最佳实践。看了这样一个系统,觉得非常的爽 —— 大部分系统就是这样的:同样的时间压力之下,我做得也就那样。虽然,我的手速可能比大部分人还快,实现的功能可能更多。但是,这些都是无关紧要的。

如果没有充足的时间改善,我们的系统都变得一片混乱。没有符合未来变化的设计,更何况你可能没有时间设计。

好了,是时候重构

所以,经历了一系列的过程之后,我决定挑个合适的时候重建这个系统。

  1. 开始重写之前的 markdown converter。

  2. 将 markdown render 所有相关的组件提取为框架。

  3. 重写系统。

于是,我们就出现了第二个系统,它设计良好。它的灵感都来自于我们在做第一个系统中的感受。如果没有来自于我们第一个系统的经验,我们无法设计出第二个系统。

经验:快速验证概念,创造业务价值

事实上,我们在市面上看到的大部分系统,都是以如此的方式演进的:

  • 第一个系统,赚了钱,创造了价值,但是缺少各种最佳实践,生存周期短。

  • 第二个系统,设计良好,包含了各种实践,生存周期变长,但是慢慢变得臃肿

而我们的第二个系统很快将变成一个臃肿而缓慢的系统。

『第三个系统』由那些为 『第二个系统』 所累的人们创建。—— 《Linux/Unix设计思想》

没有新系统,哪来的 KPI?

这些不都是因为我们没有经验吗?哈哈

让第一个版本的系统混乱一点,或许是件好事相关推荐

  1. C# 系统应用之ListView控件 (三).添加ContextMenuStrip右键菜单打开删除文件

    在前面讲述过使用TreeView控件和ListView控件显示磁盘目录信息,但仅仅是显示信息是不够的,我们还需要具体的操作.在"个人电脑使用历史痕迹"项目中我还需要添加" ...

  2. 源码分享意义何在?为何很多官方软件开发商都会有破解版和bug版本的系统盛行?

    本文为伊凡原创所写仅仅代表伊凡个人观点,与一颗优雅草科技无关切不代表其立场,如若转载请留名谢谢 关于源码分享的一个小小的公告----经常会发布一些源码分享出来,这些源码并非都是我亲自所测试所写,但是源 ...

  3. 【重发】终于提交了项目第一个版本到git@osc了。兴奋ing

    2019独角兽企业重金招聘Python工程师标准>>> 今天终于提交了第一个版本到 git@osc 了.我的项目是一个基于JAVA的团队管理平台,用于管理软件开发团队的各种信息,例如 ...

  4. Spring Data 发布更改版本管理方案之后的第一个版本:2020.0.0

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 2020年10月28日 Spring Data自更改版本 ...

  5. 编译release版本签名系统

    出自: http://www.cnblogs.com/leaven/p/3860583.html 在我的第一篇博客里面 http://blog.csdn.net/jscese/article/deta ...

  6. android 汽车版本,安卓系统不断推陈出新 为何安卓车机仍固守2.3版本?

    说到安卓,提的最多的无外乎是稳定性.兼容性以及差异性优化,而对于安卓车机,除了这三点之外,还会考虑成本问题,小编今天就将从这四个方面来尝试回答上面提出的问题. 一.稳定性 低版本的系统在车机应用上具有 ...

  7. 华为系统鸿蒙系统更新时间,哪些机型可以第一时间升级鸿蒙系统?麒麟9000最有可能...

    原标题:哪些机型可以第一时间升级鸿蒙系统?麒麟9000最有可能 5月25日清晨,华为各大平台都推送了一条消息:期待已久的鸿蒙操作系统来了.此前,鸿蒙操作系统曾搭载于智慧屏产品中,其流畅体验以及便捷特性 ...

  8. openEuler 20.03 LTS面向RK3399移植系列(4)—验证和问题分析openEuler 20.03 LTS面向Firefly RK3399的第一个版本

    任务动机:验证openEuler 20.03 LTS面向Firefly RK3399的第一个版本(Linux kernel 4.4),分析现存问题,提炼下一步移植工作的需求. 任务描述:按照<o ...

  9. 如何做一个新产品的第一个版本:关于MVP和上线时间的权衡

    为什么第一个版本要是MVP?为啥要梳理MVP?书里(<精益创业>)告诉你,你需要用一个最小可行性的模型去验证需求.用最小的代价去验证用户是否买账,就算是验证出来是伪需求,也方便及时调整方向 ...

最新文章

  1. Mysql:mysql 控制台程序的提示符 prompt 字符串设置
  2. python tensorflow pytorch 深度学习 车牌识别
  3. 计算机无法识别文件夹,电脑提示错误:此卷不包含可识别的文件系统的解决办法...
  4. mysql administrator 备份 表_【转】如何使用 MySQL Administrator 管理/备份/还原 My SQL 数据库...
  5. 反思O2O演化的三个时代,大数据与智能化才是未来所在
  6. 使用 Docker Stack 部署多服务集群
  7. 【hortonworks/registry】NoClassDefFoundError: org/apache/zookeeper/Watcher
  8. C++内存泄漏的几种情况
  9. Python datetime time
  10. easyBCD多系统引导软件
  11. atitit. js 跨界面 页面 web cs 传值方法总结
  12. ROS安装教程(ubuntu18.04+melodic版本)
  13. cs6导入库闪退 flash_flash导入文件闪退 如何定位已关机的手机
  14. chrome 内核的浏览器pdf 字体显示问题
  15. 围棋棋手、电影、境界层次
  16. python 加注拼音-python汉字注音
  17. spring cloud day(6) gateway网关
  18. java win10窗口启动假死_win10底部任务栏卡死无响应解决
  19. Java //PP2.11 编写一个程序,提示输入一个代表总钱数的双精度值,然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数(假设10美元纸币为所需要的最大面额)。例如,如果输入的值为47.63
  20. hive存储处理器(StorageHandlers)以及存储格式以及hive与hbase整合

热门文章

  1. 04特性源码分析-ReentrantReadWriteLock原理-AQS-并发编程(Java)
  2. Python网站导航项目-2.项目创建与环境配置
  3. day2学python 数据类型+深浅拷贝+循环
  4. Revit中视图范围的应用及快速批量视图命名
  5. sql 注入_商洛学院司徒荆_新浪博客
  6. 你会算对象的大小么?不会的话就看看这篇文章吧
  7. 微信小程序基础之开源项目库汇总
  8. vue组件走马灯_vue文字横向滚动走马灯公告代码示例
  9. c++ 调用opencv+tesseract做图片文字识别
  10. 网站设计:600个经典网站... (转)