汝之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践

2023-11-09 14:30

本文主要是介绍汝之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阿里云幸运券
“描述一个事物,唯有一个名词定义它的概念,唯有一个动词揭露它的行为,唯有一个形容词表现它的特征。要做的,就是用心去寻找那个名词、那个动词、那个形容词……”

—— 福楼拜 (Gustave Flaubert)

我想讲个故事。

很久很久以前(一般讲故事都是这样开头吧), 两个老工程师在一起聊天,谈各自生涯中最自豪的工程。其中一个先讲述了他的杰作:

“ 我们建造的桥,横跨一个峡谷,峡谷很宽很深。我们花了两年时间研究地质,选择材料。聘请了最好的工程师团队来设计方案,而这又花了五年时间。 我们签下了最大的工程队,委托他们建造基础结构、塔墩、收费亭,以及用于连接桥梁和高速公路的道路。桥面下层是铁路,我们甚至还修了自行车道。 那座桥花费了我数年的心血。”

另外一个听完之后,陷入了沉思,过了一会儿,说到:

“ 有一天晚上,我和一个朋友喝了点伏特加,然后我俩扔了一根绳子,越过一个河谷。呃…… 就是一根绳子,两头系在两颗树上。 河谷两边各有一个村庄,起初,有人加了个滑轮,用来传递包裹。然后,有人拉起了第二根绳子,勉强可以走走,虽然很危险,但小伙子们很喜欢。 后来,一群人重新修建了一下,使得更牢固。于是,女人们也开始从上面走,每天带着她们的农产品过桥。 就这样,在桥的另一边形成了一个市场。因为地方开阔,造了很多房子,慢慢地发展成了一个镇子。 绳索桥被木桥替代,这样就可以走马车了。 后来,镇上的人们修了一座真正的石桥。再然后,人们又把石料改成了钢材。 如今,那座钢构悬索桥依然伫立在那里。”

前一个工程师沉默良久,说到:“ 有意思。我那座桥建成大约十年后,被拆除了。事实证明我们选错了地点,建好的桥没人用。据说有几个野路子的家伙,在下游几英里处,拉了一根绳子,所有人都从那走。”

金门大桥(旧金山)

我很喜欢这个故事。故事的出处,在一款消息队列产品—— ZeroMQ 的官方指南第6章里。

说完故事,我想聊聊软件开发中,常常可以听到的一个概念 —— Best Practice :最佳实践。Wikipedia 上对其解释为:

A best practice is a method or technique that has been generally accepted as superior to any alternatives because it produces results that are superior to those achieved by other means or because it has become a standard way of doing things.

(最佳实践是一种:因其产生的结果优于其它选择下的结果,或其已经成为一种做事的标准,从而被普遍认可优于任何替代方案的方法或技术。)

这个概念源于管理学,然后在 IT 界泛滥。简而言之,就是所谓“正确的做法”。

最佳实践本身是美好的存在,犹如夜空中的一轮明月,照亮黑暗中的方向,指引着摸索前行的凡人。

但凡事有度,子曰:“过犹不及。”

腾讯云代金券

我今天想说的,就是这月亮的背面。(传说中,月球背面隐藏着…… 嘘~)

潮汐锁定导致月球永远以同一面朝向地球

首先,最佳实践容易带来思想包袱,让人无法专注于解决问题本身。

总是希望采用最好的技术方法,不愿意在不正确的做法上浪费时间,导致瞻前顾后,甚至裹足不前。此时的最佳实践,已然成为了一种毒药,一旦偏离了问题本身这个出发点,就会不知不觉走进“宏大构想”的思维陷阱。把简单的问题复杂化,阻碍了迈出第一步,直到能规划出“包罗万象”的解决方案后才肯动手,拖延症就这样来了,时间却走了。

你想好了未来每一天怎么过吗…… 没想好? 那……不活了?

其次,对最佳实践的执念容易让人钻牛角尖,将目标的重心带偏。

过度关注实施过程是否符合标准化,忽视了项目中其它重要的东西,比如用户体验,比如实际需求。就像故事里讲的那样:第一座大桥,几乎是教科书般的标准化路数,可产品落地后和客户需求却差了好几英里;第二个看上去很野路子,但精准地解决了痛点,从始自终都是紧紧围绕实际需求迭代,每一次的进步都可以产生效用,这才叫杀手级应用。

这让我想起了 Plan-9 的传说。

你听说过 Plan-9 OS 吗? 一款由贝尔实验室的极客们打造的用于完善 UNIX 不足的操作系统。什么不足?在 UNIX 的哲学中,有一条叫做 “一切皆文件” ,但实际上UNIX本身并没有严格遵从这一条。于是,Plan-9 OS 完美实现了这一点。然后呢……? 没有然后了。它从没进过市场,所以如果你没听说过它,一点也不奇怪。Plan-9 OS 没有解决任何现实问题,没人在乎 “一切皆不皆文件”。

这种执念的另一种表现就是工程师思维,沉迷于奇技淫巧中无法自拔,程序员尤其容易中招。

比如性能优化。“优秀的程序员应该榨干每一字节内存”,听起来很熟悉,不是吗?但经济学上来讲,边际效应决定了一次项目中,越优化性价比越低。有一个很容易被忽略的事实:硬件其实比程序员要便宜。

再比如对设计模式的崇拜。设计模式当然是好东西,但如果像强迫症一样使用它们,坚持用上它们才是正确的编程,就会导致按图索骥,强行让问题去适应设计模式,而不是让解决方案针对问题,这就本末倒置了。

我有个基友,C++ 极客。毕业后入了腾讯,积累了巨额财富后,自己创业了。当然,当老板可比写 C++ 难多了,于是现在又去积累巨额财富了。想当年和那厮聊天,言必出设计模式,没事侃正则,再没事就研究 GC 策略 (好像玩 C++ 的普遍这德性) 。前不久看他代码,差点没认出来,这家伙画风一转,现在连接口都懒得多用(估计看到这,某些狂热分子肯定在破口大骂:你什么意思,你说你没用面向接口编程?)那位兄台甚至都懒得多聊,轻描淡写来一句,“没心思,以后有需要再加。”

顺便扯一句,那哥们最近负责开发一款手游,他跟老板汇报的时候,预估的研发周期要12个月,然后老板跟他说:“好,12月出公测。” (哈~ 估计他肯定舌头打结把“12个月”说成了“12月”)。看到这的你,是否回忆起了你的老板?

这也是我接下来想说的关于最佳实践的另一个问题:项目实施。

工作数年,大小项目经历若干,慢慢体会到,一个项目的开发顺利与否,并不在于技术选型是否为最佳实践,更多的时候,取决于开发方案和技术储备之间的平衡。做项目毕竟是要讲方案落地的,如果最佳实践中的技术成本,超出了开发者的落实能力,那就是坑,这时盲从最佳实践无异于挖坟。如果是一个人的项目,抽时间恶补一通,兴许能填填坑,这取决于IQ。但要是一个团队,那就不是什么 IQ,EQ,QQ 的问题了,这中间产生的学习成本,集体培训成本,反复沟通成本,大量的初级错误,千奇百怪的代码,互相冲突引发的焦躁情绪,等等。这些负面的东西如果不能妥善的处理,足以抵消掉最佳实践带来的好处。别忘了,deadline 正在迫近。

我自己曾经在一个项目组里,强行推行 Git 做源代码管理,当时组里共9人,有7人只会 SVN,但我坚持 Git 是 “最佳实践”。要不说年少无知少不更事呢,罢了,后来的事情我不想回忆了…… 那次项目之后,我再也不在一群只会 SVN 的队伍里提 Git 了。

一个人做软件已经很难,比这更难的,是一群人做软件。

当尘埃落定,蓦然回首,最佳实践很可能没你想象中那么重要。它更多的是一种精神层面的求道,并非物质世界的必要。

扎克伯格 ( Mark Zuckerberg ) 于2004年在哈佛柯克兰公寓 ( Kirkland House ) 里写出 TheFacebook 的时候 ( 次年更名为Facebook ) ,用的是 “世界上最好的编程语言” PHP。这门可能是业界被吐槽次数最多的语言一直支撑着FB帝国的诞生,直到席卷全球。Stack Overflow 的联合创始人 Jeff Atwood 曾公开揶揄 Facebook 是一家 “召集全球顶级程序员在 Windows XP 上写 PHP ” 的公司。但这无所谓,十四年前的马克也不纠结。一直等到需要的时候 (2010年),Facebook自己动手研发了一个编程语言 —— Hack,来解决 PHP 带来的危机。

《社交网络》

最佳实践,关键在时机(Timing)。

如果说用 Facebook 这个 “根本不存在” 的网站来举例,纯属虚构的话,那我们来说点真实的例子,Web 技术的基石——HTML。由20世纪最重要的100人之一的 Tim Berners-Lee 创造的 HTML,其发明之伟大,足以单独开篇博文来赞美了,这里就不赘述了。

这样一个造福全人类的神作,本身的设计结构绝非完美,甚至可以用混乱不堪来形容。没有严格统一的约束,形同虚设的规范,标准化进程的难产。以至于在很长一段时间内,连自身元素的定义,都可以向浏览器厂商妥协。但是,种种被人诟病的存在,丝毫不影响 HTML 改变世界的脚步。你我今天能相会于园,皆仰赖它的诞生。

同样的例子还发生在 Web 世界另一个巨擎上——JavaScript。当今世界,Web 前端技术已经水银泻地般肆虐整个开发界,前端框架百花齐放、JS 衍生品鳞次栉比。所有这一切的背后,全都源于上世纪90年代横空出世的 JavaScript。

那么,JavaScript是最佳实践吗?

别逗了,如果有什么语言可以和刚才说到的 PHP 竞争一下谁被骂的次数更多,那非 JavaScript 莫属。这个仅花了十天设计出来的语言,打一出身就被贴上了怪胎的标签。混乱的标准,多样的实现,安全漏洞,语法随意,反人类…… 总之,JavaScript 和最佳实践半毛钱关系都扯不上,但它却是撑起当今互联网半壁江山的擎天柱。

所以,用最接地气地话来说,不管黑猫白猫,逮着耗子就是最佳实践猫。

汝之蜜糖,吾之砒霜。所谓最佳实践,其定义本身往往也是分歧的源头。什么是最佳?这个最佳是独一无二的吗?世界上有很多很多现实问题,可能根本就没有所谓的最佳实践。

请听题,世界上最好的编程语言是哪个?

第二题,世界上最好的文本编辑器是哪个?

朋友,这天还聊得下去吗……

最后,说一个我自己的故事。

很久很久以前,为了找一款满意的文本编辑器,我干了一件可能是前无古人,后不知道有没有来者的蠢事 —— 我打开 Wikipedia,搜索 “ text editor ” ,然后转到一个叫做 “ List of text editors ” 的页面,接下来的一个月,我几乎把当时那个页面上,所有我能下载安装的文本编辑器,全部试用了一遍……

嗯?你问我为什么这么做?呵呵,不把全世界的文本编辑器遍历一遍,我怎么知道哪个是最好的?

这事细节我不想再提了,我也不想回忆了。要不说年少无知少不更事呢,时至今日,我想不出比这更愚蠢的事了。WTF~~

这个页面上的表格行数逐年增多

如今,再有人问我最好的编程语言或者最好的文本编辑器的问题的话,我会说:

“朋友,要打架吗?”

这两个问题的最佳实践,唯有暴力。
腾讯云代金券

原文链接

https://www.cnblogs.com/sherrywasp/p/9436623.html

服务推荐

  • 私密代理ip
  • 隧道代理ip
  • 微信域名拦截检测服务
  • 微信域名在线拦截检测工具
  • 微信域名在线批量拦截检测工具

这篇关于汝之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376674

相关文章

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定