编程王道,唯“慢”不破
人和人之间编程速度的差异还是很大的,有的程序猿写代码非常快,有的却常常是龟速。Jeffrey Ventrella 最近在一篇文章里探讨了这种编程速度的差异,他是绝对的龟速派代表,来看看他对编程速度的看法:
我爸常跟我说的一句话是,慢一点码,才能快点把程序写完。
我在旧金山很多家互联网公司工作过,现在已经 52 岁了,对于程序猿这个职业来说,我的年龄算偏大的。我写代码的速度近乎龟速,事实上,我更像是一个会写代码的设计师。
以前有一次,我和一些比较年轻的程序猿一起工作,他们信奉的编程宗旨是“速度快、更迭少”。我们在同一个 codebase 里合作,就像在共同煮一大锅汤一样。如果我们每个人都持续不间断的贡献代码,那么未来这个工程应该就会很美很壮观的呈现出来,但是并没有。
问题在于,这些年轻的程序猿们在心里其实有这么一种思想,他们觉得:
- 1、每个人都是可替代的;
- 2、没人应该对某一部分的具体代码负责;
- 3、所有人应该都可以任意修改整个工程的代码。
他们觉得,现在已经有了github这种神器用来管理异步时间内的代码贡献,只要每个人都持之以恒的贡献代码,工程和产品就会顺理成章的出炉了。
事实不是这样的。编程从来就不应该是拿工具来减少软件开发的时间的。
编程应该是一项有节奏感有韵律的运动。我倾向于把工程依照不同的规模和时间度量分成不同的涂层,每一个涂层再从探索、实验、error、临时变量这些细小的东西开始做起。有点像建设脚手架的形式。每一个涂层最终完成的时候是一段可以部署和扩展的 implementation-ready 代码。这种开发过程有点像是从策略到设计方案最后到完成一栋真正的建筑。
有时候当这栋建筑完成之后,我还会推倒重来一遍,因为我觉得我有更好的建筑方法。这种新的方法有时候是对的,有时候是错的,事实上除非真正去再做一遍,不然你永远无法知道究竟哪一种方法更好。
回到最初那锅汤的问题:在软件开发生态圈里,关于对整个设计流程产生推动与支持的混合思考是很重要的,没有这一部分的工作,再快的程序猿又能做出多好的设计?很多神经系统科学家相信神经元信息的流动在大脑的传导过程中会有一个短暂的堵塞和混响,这对思维和感知会有很重要的作用。编程的设计也应该是这样,需要时间。
慢速编程运动
慢速编程运动在维基百科里的解释是这样的:慢速编程运动是慢速运动的一部分,这是一种强调谨慎设计、高质量代码、软件测试和思考的软件开发哲学,反对混杂组装、布满 bug 的代码,以及过于快速的发布周期。
世界上的软件开发团队都在寻找更具预测性的工程项目,希望能促成更多的程序员拥有可持续性的职业生涯。他们提议了一些可以切身操作的实践方法,比如结对编程、代码审查和代码重构,以开发更可靠更健壮的软件应用。
在旧金山海湾地区,风险投资支持的软件开发正呈现出一种高烧般的热度。利益正驱动着软件开发以一种完全不自然的不对拍的节奏感在运动,它打乱了设计进化(design evolution)原本应有的周期节律和生物钟。关于这一点,Rushkoff在Present Shock里说得很明白了。
另一个问题在于,人们对科技越来越诡异的迷恋,以及开发人员对工具异常的狂热。大家总在说,为什么有的软件和应用做得这么烂?没错,确实很烂。烂的原因在于,太多一味求快的程序猿在忙着建设工具,然后用这个工具去支持和适配另一个他们建好的工具,然后再用这个工具去支持和适配另另一个他们建好的工具,然后再用这个工具帮他们写出更快的代码。
这就是我为什么觉得软件开发需要更多的“人”,而不是“工具”的原因。并且,这些人不仅仅只是帮忙做做外面的 UI 艺术之类的而已,应该要有更多的人深入软件开发的内部——确保软件更多的与人文产生共鸣和回响。
当我们谈论编程时,我们在谈论什么?
编程不是打字。
所有的程序猿都明白这一点,但是大部分人都容易忘记这一点。
在电脑前噼里啪啦、弹指挥间的感觉确实很爽,这种键盘上啪啪啪的快感却很容易让人忘记编程是一项脑力活动,而不是体力劳动。编程的真正奥义在于,把人类的思维、设计、语言、逻辑和精神创造以一种计算机可以识别和储存的方式记录下来。
我妻子有时会跑到院子里问我,你在编程吗?我说,对,我在编程。事实上我可能正拿着钳子修剪花盆里的花草,或者做做施化肥之类的事情。
植物、土壤、钳子,这些都是编程的好工具,正如键盘、鼠标和双屏幕一样。
目前,我们正在经历一个经济产业的转型期,从新兴到可持续发展之间的一次过渡。新的软件产品和商业模式是需要发展,但为了互联网行业发展的可持续性,这种速度应该降下来一些了。撸代码不仅仅只是在撸当下用户的需求,撸的更是未来某个行业领域的架构基础。代码应该在程序员的关爱下慢慢的、茁壮的成长。Like good wine。Like a baby。
编程王道,唯“慢”不破的更多相关文章
- CTF---Web入门第十六题 天下武功唯快不破
天下武功唯快不破分值:10 来源: 北邮天枢战队 难度:易 参与人数:10787人 Get Flag:2264人 答题人数:3373人 解题通过率:67% 看看响应头 格式:CTF{ } 解题链接: ...
- 实验吧_天下武功唯快不破&让我进去(哈希长度拓展攻击)
天下武功唯快不破 第一反应就去抓包,看到返回包的header中有FLAG的值,base64解码后得到下图所示 这就要求我们在请求头中post相应key的值,我直接在burp中尝试了多次都没有用,想起来 ...
- Redis 核心篇:唯快不破的秘密
天下武功,无坚不摧,唯快不破! 学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系统观.这样会很吃力,而且会出现一看好像自己会,过后就忘记,一脸懵逼. 跟着「 ...
- QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》
上周去听了QCon全球开发大会,其中有几场印象比较深刻的分享,除去几个比较概念化的话题,在Java技术演进这个Topic里的几个分享都是比较有干货的(但感觉工作中用不到) 首先是关于林子熠老师分享的冷 ...
- 实验吧--web--天下武功唯快不破
---恢复内容开始--- 英文翻译过来嘛,就是:天下武功无快不破嘛.(出题者还是挺切题的) 看看前端源码: 注意这里 please post what you find with parameter: ...
- 【笔记】如何查看HTTP请求头&&【实验吧】天下武功唯快不破
打开Chrome浏览器,点击右上角“三”按钮. 点击工具-----再点击开发者工具 找到Network选项框.以百度经验页面为例,点击任务选框来查看网络请求流 在Network框内会有所有的请 ...
- 【实验吧】CTF_Web_天下武功唯快不破
打开链接"http://ctf5.shiyanbar.com/web/10/10.php",从页面内容未发现明显信息,查看源代码发现"please post what y ...
- 唯快不破:Web应用的13个优化步骤
https://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=2651163004&idx=2&sn=2b1be8014abf19 ...
- 唯快不破:Web 应用的 13 个优化步骤
时过境迁,Web 应用比以往任何时候都更具交互性.搞定性能可以帮助你极大地改善终端用户的体验.阅读以下的技巧并学以致用,看看哪些可以用来改善延迟,渲染时间以及整体性能吧! 更快的 Web 应用 优化 ...
随机推荐
- mysql 移除服务,并在cmd下切换目录
实际中需要把注册的mysql移除, 一时忘了命令, 特此记录 在网上找的帮助 #Path to installation directory. All paths are usually resolv ...
- ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等
本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...
- Quartz.NET简介
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
- C#编程(五十二)----------有序列表
有序列表 如果需要基于对所有集合排序,就可以使用SortedList<TKey,TValue>类.这个类按照键给元素排序.这个集合中的值和键都可以使用任意类型. 下面的例子创建了一个有序列 ...
- c++ #ifdef的用法
http://www.tuicool.com/articles/mIJnumB #ifdef的用法 灵活使用#ifdef指示符,我们可以区隔一些与特定头文件.程序库和其他文件版本有关的代码.代码举例: ...
- 两个Activity之间共享数据、互相访问的另一种方式的实现
本帖最后由 勇敢的心_ 于 2010-9-29 11:51 编辑 本人从windows编程转过来学习Android开发,一直在想如果两个Activity之间能够像C#或delphi中的Form一样,可 ...
- Java 单例模式的常见应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- Android:客户端和服务器之间传输数据加密
Android客户端与服务器进行数据传输时,一般会涉及到两类数据的加密情况,一类是只有创建者才能知道的数据,比如密码:另一类是其他比较重要的,但是可以逆向解密的数据. 第一类:密码类的数据,为了让用户 ...
- Table中collapseColumns,stretchColumns
collapseColumns 设置需要被隐藏的列序号(序号从0开始) shrinkColumns 设置允许被首夺的列的序号(序号从0开始) stretchColumns 设置允许被拉 ...
- 全文居中及DIV居中
第一种方案(全文档): body { text-align: center; } body div { margin: 0 auto; } 第二种方案(某DIV): .testing- ...