程序员为什么应该旗帜鲜明地反对“最佳实践”?
让第一个版本的系统混乱一点,或许是件好事。
作者 | 黄峰达,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个大家都认识的加密交易所过得怎么样?
你点的每个“在看”,我都认真当成了喜欢
程序员为什么应该旗帜鲜明地反对“最佳实践”?相关推荐
- 35岁以后的Android程序员出路在哪里?大牛最佳总结
背景 坐标广州,五年iOS开发经验. 最近面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年iOS开发经验,简历上写着精通Java,iOS,熟悉H5开发.没有具体的技术点. ...
- 在vim中写python程序_用 Vim 写 Python 的最佳实践是什么?
先来晒个图:语法检查 如果用 vim8, 那么可以用异步检测的 w0rp/ale 代替 syntastic 了,再也不用羡慕 flycheck, 也不用因为语法检查而卡顿了. 关于 ale 这部分的个 ...
- 90后程序员职场报告:月薪普遍过万 超七成有房有车 女性程序员不足一成
您知道吗程序员群体已经高达200万,学历和收入双高,月薪普遍过万,是北上广深最有机会购房的群体:社交圈子相对单一,能够忍受孤独寂寞:是理性的消费者,商家利用虚荣.从众心理的消费手段并不奏效,他们的世界 ...
- 万字泣血解析割韭菜内情,程序员别老想着做副业
前言 最近有准备一篇干货,但想了想还是先放放,眼看年关将近,写点其他对大家有用的内容. 今年见了不少人被割韭菜,下半年尤为严重,这种情形甚至在技术行业蔓延,令人深感大环境的复杂变化,以及诸多同行对工作 ...
- 从程序员到项目经理(七):程序员加油站 -- 完美主义也是一种错
追求完美是一种可贵的精神,完美主义也历来被认为是一种优秀的品格.可是在项目中,完美主义也是一种错,虽然是一种"美丽的错误".项目讲求平衡,要的是合格,而不是优秀:要的是70分,而不 ...
- python笔记本电脑推荐2020_最新版:2020年适合程序员的推荐笔记本电脑
购买编程笔记本电脑时,一套明智的基准规格包括至少8GB内存,不错的SSD,强大的集成GPU和i5或i7处理器.尽管这些基准测试配置不错,但不足以帮助您找到最好的笔记本电脑.在本文中,我研究和编辑了程序 ...
- 优质的国外程序员网站
在学习计算机编程相关技术时,必须知道一些有用的网站,以便随时掌握信息,了解技术前沿和学习新技术.下面是整理的一些国外干货网站列表.由于大多在墙外,部分网站可能需要梯子,请自备.下面开始技术之旅吧. 索 ...
- 给toB创业程序员的建议
引言 有几个朋友在巨头里工作,技术和口碑都还可以,甚至靠薪资实现了轻度财富自由.这些精英工程师都在想投身IT企业服务方向的创业,我觉得这个趋势值得研究,写了这篇文章. " 曾经是一群找不 ...
- 史上最全!每个程序员必须知道的学习网站!
在学习计算机科学(CS)时,必须知道一些有用的网站,以便随时掌握信息,了解技术前沿和学习新技术.下面是你应该访问的一些网站的不详尽的列表,十分建议收藏备用! 索引 当你遇到困境时 新闻 初学者的编码实 ...
最新文章
- 《AutoCAD 2016中文版室内装潢设计从入门到精通》——第2章 AutoCAD 2016入门2.1 操作界面...
- 基于FPGA的简易OFDM调制解调系统开发
- eclipse创建Maven的动态web工程
- 修改 IIS 队列长度
- 默认构造函数和拷贝构造函数
- linux下redis安装
- Linux 命令(108)—— ifconfig 命令
- tensorflow 基础: static shape VS Dynamic shape, get_shape VS tf.shape() , reshape VS set_shape
- 2020年下半年软件设计师上午真题及答案解析(个人见解+网络解答+持续更新)
- 信息学奥赛一本通1159:斐波那契数列
- 静默安装android,Android静默安装
- iphone和android照片传输,iphone和安卓手机之间如何传文件图文教程
- [4G+5G专题-132]: 传输层 - 以太网电缆的类型(Cat5,Cat5e,Cat6,Cat6a)
- 提高睡眠质量的东西,睡眠不好一定不要错过这几样东西
- JavaSrcipt学习(学习打卡Day6)
- 银行硬件维护维修工单小程序开发制作
- 2022年linux面经必备(持续更新中)
- Excel重复编号,1万个数据重复1到100编号
- IEEE 754 浮点数的详细分析
- 股票 江恩二十一条买卖法则
热门文章
- servlet 验证生命周期过程调用方法的次数
- json_decode和json_encode的区别
- 简单模拟QQ界面框架。
- c#划分目录和文件(小白的一点经验)
- Javascript脚本 : eval()函数
- [我总结]8月第二周总结
- 类增量学习(Class-Incremental Learning)领域部分经典论文汇总
- comsenzexp mysql密码_ComsenzEXP X3
- python ^ 操作在两整数加法运算中的妙用
- python遍历dataframe中的每个字符_pandas中遍历dataframe的每一个元素的实现