让第一个版本的系统混乱一点,或许是件好事。

作者 | 黄峰达,CSDN 博客专家 Phodal

责编 | 唐小引

头图 | 作者绘制并授权 CSDN 使用

出品 | CSDN(ID:CSDNnews)

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

最佳实践很浪费时间

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

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

一个问题,三种方法实现

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

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

  • 画出甘特图

  • 画出特定的四象限

  • 调用 Web Components

  • ……

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

  • 创建占位符,渲染完成后,替换占位符;

  • 直接生成最后要渲染的 HTML;

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

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

起初,我只想创建个原型

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

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

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

一片混乱,真的很爽

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

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

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

好了,是时候重构

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

  • 开始重写之前的 markdown converter。

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

  • 重写系统。

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

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

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

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

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

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

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

没有新系统,哪来的 KPI?

感谢您的支持,祝您生活愉快,觉得赞同的朋友可以点个「在看」!

作者系列文章延伸阅读:

  • 程序员造轮子的正确姿势

  • 微前端如何落地?

  • 前端代码的整洁之道

  • 无代码编程时代下,程序员要失业了?

  • 更多精彩文章,可关注作者 CSDN 博客:https://phodal.blog.csdn.net/

作者简介:黄峰达(Phodal),ThoughtWorks Senior Consultant,CSDN 博客专家。长期活跃于 GitHub、CSDN,专注于物联网和前端领域。出版著作《自己动手设计物联网》,以及《Growth:全栈增长工程师指南》等六本电子书,并译有《物联网实战指南》。

【END】

更多精彩推荐

联合国为何 Pick 腾讯?

☞京东:网传通过 Bug 抢茅台是假消息;罗永浩回应带货价格非「全网最低」;Rust 文档团队解散 | 极客头条

☞红外光抗疫、成功预测新基建,投资 280 家企业的光学博士到底是谁?

前端机器学习:识别人脸,并在脸颊上画草莓

☞瑞幸咖啡自曝虚假交易 22 亿,App 反冲 TOP 1

☞在Kubernetes上部署一个简单的、类PaaS的平台,原来这么容易!

☞旷视提双边分支网络BBN:攻坚长尾分布的现实世界任务 | CVPR 2020 Oral

☞2020年,这20个大家都认识的加密交易所过得怎么样?

你点的每个“在看”,我都认真当成了喜欢

程序员为什么应该旗帜鲜明地反对“最佳实践”?相关推荐

  1. 35岁以后的Android程序员出路在哪里?大牛最佳总结

    背景 坐标广州,五年iOS开发经验. 最近面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年iOS开发经验,简历上写着精通Java,iOS,熟悉H5开发.没有具体的技术点. ...

  2. 在vim中写python程序_用 Vim 写 Python 的最佳实践是什么?

    先来晒个图:语法检查 如果用 vim8, 那么可以用异步检测的 w0rp/ale 代替 syntastic 了,再也不用羡慕 flycheck, 也不用因为语法检查而卡顿了. 关于 ale 这部分的个 ...

  3. 90后程序员职场报告:月薪普遍过万 超七成有房有车 女性程序员不足一成

    您知道吗程序员群体已经高达200万,学历和收入双高,月薪普遍过万,是北上广深最有机会购房的群体:社交圈子相对单一,能够忍受孤独寂寞:是理性的消费者,商家利用虚荣.从众心理的消费手段并不奏效,他们的世界 ...

  4. 万字泣血解析割韭菜内情,程序员别老想着做副业

    前言 最近有准备一篇干货,但想了想还是先放放,眼看年关将近,写点其他对大家有用的内容. 今年见了不少人被割韭菜,下半年尤为严重,这种情形甚至在技术行业蔓延,令人深感大环境的复杂变化,以及诸多同行对工作 ...

  5. 从程序员到项目经理(七):程序员加油站 -- 完美主义也是一种错

    追求完美是一种可贵的精神,完美主义也历来被认为是一种优秀的品格.可是在项目中,完美主义也是一种错,虽然是一种"美丽的错误".项目讲求平衡,要的是合格,而不是优秀:要的是70分,而不 ...

  6. python笔记本电脑推荐2020_最新版:2020年适合程序员的推荐笔记本电脑

    购买编程笔记本电脑时,一套明智的基准规格包括至少8GB内存,不错的SSD,强大的集成GPU和i5或i7处理器.尽管这些基准测试配置不错,但不足以帮助您找到最好的笔记本电脑.在本文中,我研究和编辑了程序 ...

  7. 优质的国外程序员网站

    在学习计算机编程相关技术时,必须知道一些有用的网站,以便随时掌握信息,了解技术前沿和学习新技术.下面是整理的一些国外干货网站列表.由于大多在墙外,部分网站可能需要梯子,请自备.下面开始技术之旅吧. 索 ...

  8. 给toB创业程序员的建议

     引言  有几个朋友在巨头里工作,技术和口碑都还可以,甚至靠薪资实现了轻度财富自由.这些精英工程师都在想投身IT企业服务方向的创业,我觉得这个趋势值得研究,写了这篇文章. " 曾经是一群找不 ...

  9. 史上最全!每个程序员必须知道的学习网站!

    在学习计算机科学(CS)时,必须知道一些有用的网站,以便随时掌握信息,了解技术前沿和学习新技术.下面是你应该访问的一些网站的不详尽的列表,十分建议收藏备用! 索引 当你遇到困境时 新闻 初学者的编码实 ...

最新文章

  1. 《AutoCAD 2016中文版室内装潢设计从入门到精通》——第2章 AutoCAD 2016入门2.1 操作界面...
  2. 基于FPGA的简易OFDM调制解调系统开发
  3. eclipse创建Maven的动态web工程
  4. 修改 IIS 队列长度
  5. 默认构造函数和拷贝构造函数
  6. linux下redis安装
  7. Linux 命令(108)—— ifconfig 命令
  8. tensorflow 基础: static shape VS Dynamic shape, get_shape VS tf.shape() , reshape VS set_shape
  9. 2020年下半年软件设计师上午真题及答案解析(个人见解+网络解答+持续更新)
  10. 信息学奥赛一本通1159:斐波那契数列
  11. 静默安装android,Android静默安装
  12. iphone和android照片传输,iphone和安卓手机之间如何传文件图文教程
  13. [4G+5G专题-132]: 传输层 - 以太网电缆的类型(Cat5,Cat5e,Cat6,Cat6a)
  14. 提高睡眠质量的东西,睡眠不好一定不要错过这几样东西
  15. JavaSrcipt学习(学习打卡Day6)
  16. 银行硬件维护维修工单小程序开发制作
  17. 2022年linux面经必备(持续更新中)
  18. Excel重复编号,1万个数据重复1到100编号
  19. IEEE 754 浮点数的详细分析
  20. 股票 江恩二十一条买卖法则

热门文章

  1. servlet 验证生命周期过程调用方法的次数
  2. json_decode和json_encode的区别
  3. 简单模拟QQ界面框架。
  4. c#划分目录和文件(小白的一点经验)
  5. Javascript脚本 : eval()函数
  6. [我总结]8月第二周总结
  7. 类增量学习(Class-Incremental Learning)领域部分经典论文汇总
  8. comsenzexp mysql密码_ComsenzEXP X3
  9. python ^ 操作在两整数加法运算中的妙用
  10. python遍历dataframe中的每个字符_pandas中遍历dataframe的每一个元素的实现