Redis之父九条编程忠告
最近在学习redis,特地了解了一下redis之父Salvatore Sanfilippo ,而看到了一篇优秀的文章,总解分享之
个人解读总结如下
取巧编程品质key word:
- 过硬的编码能力
- 快速排查定位错误能力
- 过程-高专注度
- 不断总结积累形成套路
- 擒贼先擒王,重设计,
- 先重点,后次重要性优化
- 理论的重要性
- 底层原理的重要性
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
学会“投机取巧”——Redis之父九条忠告,如何成为“一打十”的程序员
据维基百科记载:“Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。根据月度排行网站DB-Engines.com的数据显示,Redis是最流行的键值对存储数据库。”
Redis 之父 Salvatore Sanfilippo,一名意大利程序员,大家更习惯称呼他 Antirez。本文为Salvatore所写,CSDN编译,具体讲述了其心目中成就一名“野兽级”程序员的可贵品质。
附一篇CSDN于2011年发布的Salvatore访谈文章。
Salvatore Sanfilippo (图片来自Usesthis)
坊间流传着“十倍程序员”的传说,所谓“十倍程序员”是指在同样时间内可以做“普通”程序员十倍的工作的程序员,而所谓“普通”是指那些擅长自己的领域,但不具有“十倍程序员”那样特殊魔力的程序员。更准确地说,普通程序员就是指那些具有平均编程效率的专业程序员。
在程序员群体中,对于“十倍程序员”的存在持有极度分化的观点:一些人认为这样的人绝不存在,另一些人则认为不仅存在,而且甚至存在“百倍程序员”。
如果你认为编程是一项线性工作(产出与劳动时间成正比的工作),那么显然“十倍程序员”是一种不合理的存在。一个跑步运动员不可能比对手跑得快十倍,一个建筑工人也不可能在同等时间建造十倍于别人的东西。然而,编程实际上是一项特殊的“设计”工作。此处设计不单指架构师的工作。即便不是项目的整体设计,当工程师具体实现它的时候,依然需要低层的实现策略的设计。
在我看来,程序的设计和实现不是一项线性工作。经验、代码能力、知识、对不重要事项的辨识能力都是不易量化的能力,这些能力的结合在程序开发中发挥重要作用,使程序员更高效。特别是当一个程序员需要全程参与到项目的设计与实现时,这些能力的优势更加明显。
越是以结果为导向的任务越能激发高效程序员的能力。因为在结果导向的任务中,高效的程序员能够找到自己的方式,用更少的投入达到同样的效果。他们可以从顶层改变目标的实现路径,有时甚至直接去掉不必要的模块,来减少工作量而不影响目标的达成。而相对要求严格的项目,则会使这种效应减弱,因为程序员不得不受到诸如“使用某某工具”,“通过某某算法”的限制。虽然如此,高效程序员在这种多限制的情况下仍有其优势:他们可以发掘细节处优化实现的办法。
在我二十年的编程生涯中,始终观察我身边的程序员,无论我的同事、学徒,还是Redis或者其他项目的贡献者,以指导他们高效地达到既定目标。很多人说我是个很“快”的程序员。鉴于我不是个工作狂,所以我想以我为例来说明如何高效编程。
以下是我认为影响程序员工作效率的最主要因素:
纯编程能力:不写一行多余代码
程序员的纯编程能力是程序员水平的最直接表现。在解决实际问题时候,程序员经常会被要求实现项目的某一个子模块,一个函数或者一个算法等等。令人惊讶的是,我发现在这个过程中,很少有人能够做到用最少的命令高效地完成任务。我甚至发现在很多团队中,竟然存在会忘记使用排序算法的不称职的程序员,这让他们甚至无法胜过虽然缺乏实践经验但理论完备的毕业生。
解读:强调的是过硬编码能力
经验:踩在前人的肩膀上
所谓经验,我指的是重复出现的任务的成熟解决方案。一个有经验的程序员知道如何处理各种任务。这可以避免重复设计,更重要的是可以避免设计错误,设计错误是程序员效率的最大敌人。
解读:强调积累及思考的重要性
专注:高效利用时间
对于任何事情,时间的有效利用都至关重要,许多内在和外在的因素都会导致程序员丧失专注度。内在因素包括拖延症、没有兴趣、缺乏经验、睡眠短缺等。外在因素包括频繁的会议、工作环境、同事的干扰等。提高专注度、避免打扰能够提高编程效率,这很好理解。有时,为了专注,需要狠下心来,采取较为极端的措施。比如邮件,虽然都会看,但只回复很少的一部分。
解读:专注
不要吝惜时间设计:防止推倒重来
很多时候,程序员非常不情愿看到的一种情况是,需要在一些无关紧要的功能上浪费大量的时间,但你又不得不去将这个无关紧要的功能实现,因为它牵扯着这个项目的主要功能。这种时候,就需要反思,在顶层设计的时候是否考虑周全。详细而缜密的顶层设计能够减少上述情况的发生,即降低模块间的耦合性。对于项目的设计者来说,意识到每一个细小的模块都有可能成为项目的瓶颈,这很重要。对于项目而言,最终的目标是合理的时间做最大的产出,那么实施重点就应该放在项目最主要的模块上。拿我设计Disque(一个开源的分布式消息队列)为例,我意识到只要提供最优的消息排列方式,至于项目其他锦上添花的方面都可以后续慢慢补充,例如,可用性、查询语言、客户端交互、简易性及系统性能。
解读:擒贼先擒王,重设计
简洁性:避免细节错误才是程序简洁的根本
简洁性意味着很多。为了理解什么是简洁性,首先来看看究竟可以多复杂?我相信导致复杂性有两个罪魁祸首,除了上面所说的不愿意花费过多的时间在设计上,还有一个是在设计过程中错误的累积。
思考一下程序实施的过程,所谓失之毫厘,谬以千里。一个初始的设计错误可能不会导致所在功能的重新设计,但可能会导致开发者需要在其他功能上做大量的工作来应对这个错误。因此,项目一步一步走向复杂和低效。
简洁性需要一步一步实现。程序员可以从最直接可靠的解决方式开始入手,用尽可能简单的方式实现功能,之后随着经验和编程能力的提高,程序员就有能力去优化设计了。
每次遇到不得不采取复杂的解决的方案的情况,开发者都应该花些时间想想如何避免这种情况的发生。只有在考虑了各种不同的方式,发现不得不走这条道路的时候,才继续在这个方向上前进。
解读:
完美主义:高效产出的最大阻碍
完美主义有两种类型,一种是追求至高性能的工程师文化,一种要符合个人趣向的执拗。两种情况都妨碍到程序员快速发布项目。完美主义和对外界评价的在乎会使程序员过多地将关注点放在一些细枝末节上,进而主观忽视项目的关键特性,例如程序的稳健性、简洁性、及是否能够按时交付。
解读:避免完美主义,讲究实际
知识:某些关键问题还是要依靠理论解决
当处理复杂的任务时:数据结构知识、对计算能力的极限的了解、对针对某个任务最行之有效的小众算法的了解,会帮助我们解决这些任务。对于开发者而言,对所有问题的所有解决方案都了如指掌这不现实,但对于某类问题的多数潜在解决方案都有所了解是必须的。例如,容许一定错误率,考虑概率集合基数估计量,可以设计一个优化的流的元素计数算法,避免复杂,缓慢,空间效率低下的缺点。
解读:理论知识的重要性
底层:熟悉计算机的脾性
即便我们使用的是高级语言,但不了解计算机的内部运行机制仍然会导致一些问题。有时系统会出现涉及到底层问题的工具或算法错误,导致整个系统的重新设计实施。深入理解C语言、CPU运算机理和操作系统内核会避免我们遇到在项目后期“推倒重来”的情况。
解读:底层的重要性
Debug能力:无需多言
寻找Bug总是非常耗费时间的。擅长发现、定位并合理地解决Bug,以及在编程过程中尽可能简化程序以减少Bug,这些素质将极大地提高程序员的编程效率
解读:实战快速定位能力
总结
对于我来说,一个拥有以上素质的程序员,能表现出“十倍”于平庸程序员的效率是绝不意外的。往往,他们在项目开始的可行性研究阶段就能做出正确的决策,这样一来,数倍于常人的效率是很容易实现的。这种方式我称之为“取巧编程”,意思是在开发过程中的每一步都选择最优化的解决方案,花费最少的努力获得最大的用户体验。
Redis之父九条编程忠告的更多相关文章
- Disque:Redis之父新开源的分布式内存作业队列
Disque是Redis之父Salvatore Sanfilippo新开源的一个分布式内存消息代理.它适应于"Redis作为作业队列"的场景,但采用了一种专用.独立.可扩展且具有容 ...
- Redis之父表示ARM服务器没戏!
ARM表示Neoverse N1平台和E1 CPU即将发布,Neoverse N1和E1采用7nm制程,并且为服务器和通信设备增加重要提升,拥有高可扩展性.高处理量以及高性能,将分别在2020年和20 ...
- C# Redis Server分布式缓存编程 --网络转载
这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...
- C# Redis Server分布式缓存编程(二)
在Redis编程中, 实体和集合类型则更加有趣和实用 namespace Zeus.Cache.Redis.Demo { public class Person { public int Id { g ...
- C# Redis Server分布式缓存编程(二)(转)
出处;http://www.cnblogs.com/davidgu/p/3263485.html 在Redis编程中, 实体和集合类型则更加有趣和实用 namespace Zeus.Cache.Red ...
- C# Redis Server分布式缓存编程(一)(转)
出处:http://www.cnblogs.com/davidgu/p/3262571.html 这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. ...
- C# Redis Server分布式缓存编程(一)
这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...
- Redis Server分布式缓存编程
这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...
- Redis 实战 —— 14. Redis 的 Lua 脚本编程
简介 Redis 从 2.6 版本开始引入使用 Lua 编程语言进行的服务器端脚本编程功能,这个功能可以让用户直接在 Redis 内部执行各种操作,从而达到简化代码并提高性能的作用. P248 在不编 ...
随机推荐
- 厨娘ui设计文档
厨娘ui设计文档 一.概述 中国的饮食文化从古到今源远流长.在生活日益丰富的今天,人们对饮食的要求不仅仅是温饱,更讲究健康和美味.近年来,饮食甚至成为娱乐的一部分,关于吃的流行用语层出不穷,可见在当今 ...
- NotePad++配置使之支持jquery、html、css、javascript、php提示
1.将以下文件复制到Notepad++\plugins\apis覆盖之前的xml文件 javascript.xml html.xml css.xml 2.打开notepad++设置>首选项& ...
- [转] C++ 和 python之间的互相调用
转载自:https://www.cnblogs.com/apexchu/p/5015961.html 一.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不 ...
- 10--Python入门--异常处理
在程序编写过程中,难免会有一些错误.python中有一些语句可以处理这些异常或者错误,使得程序能够运行,且识别到错误的位置 try..except函数,java中是try catch 在下面的例子中, ...
- 移动端键盘遮挡input问题
在开发移动端项目的时候测试提出优化问题,即: input 获取焦点弹出系统虚拟键盘时, input 被键盘遮挡问题(PS:此问题只在安卓手机上有,ios系统是有自动处理的). 解决办法为: 当 inp ...
- macbook 下hadoop伪分布式安装
1 准备原材料 1.1 jdk 1.8.0_171(事先安装并配置环境变量HAVA_HOME,PATH) 1.2 Hadoop 2.8.3 2 免密登陆配置(否则安装过程需要不断输入密码) 2.1 ...
- SQL-记录创建篇-006
创建记录: 自己添加记录: insert into table_name values(12,'张三',22) , values(1,'王五',32) insert into table_name(n ...
- javascript页面常用事件
事件名称 描述 onload和 onunload(已过时) 当用户进入或离开页面时就会触发onload和onunload事件,onload是页面所有元素都加载完之后才加载onload onfocus, ...
- 如何避免提交页面,信息未填写完善 就出现注册成功提示 基于js
基于bootstrip做好一个页面后,出现如下效果图 这个页面是未经过任何后端处理的页面,如果直接填写一个用户名 或者不填写任何东西都可以注册成功的,先来演示只输入一个用户名 就要可以注册成功的. 点 ...
- django 生产环境部署建议
参考django官方建议 一种优秀的作法是使用前缀/ws/来区分WebSocket连接和普通HTTP连接,以便修改配置后,使Channels更容易部署到生产环境中. 特别是对于大型站点,可以配置像ng ...