Skip to content

四火的唠叨

一个纯正程序员的啰嗦

Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接
Menu

这样的傻事,其实并不遥远

Posted on 08/02/201406/23/2019 by 四火

最近有这样一条热门微博:

content

这样的故事真是精彩。最后一句“ 我想那是我此生唯一写垃圾代码的心安理得的一次机会了”,我明白至少作者还是有追求的。

任何 KPI 要合理都是无比困难的,这里的故事看起来有些极端,但就是一个简单地拿“ 代码量” 数据统计来量化绩效指标的办法。这样的恶果公司最终会自己承担。

我曾经在这篇文章里面谈到过,统计指标是有价值的,但是如果设置这些量化指标给程序员套限,则是违背客观规律的行为。我称它们为反软件、反人类的。

我所见到的量化的指标皆是如此。程序员本来就是在利用死板的代码和数据,创造一些工具,完成一些重复性和可以预期的劳动

[……]阅读全文

Continue reading

层次

Posted on 07/19/201406/23/2019 by 四火

level

以下文字,看看就好,笑笑就好。

最近在被一个问题折磨,大致上是,公司内部某些技术更替的关系,要把原有的一个鉴权的组件 A 淘汰掉,迁移到一个新的替代品 B 上,我估摸着也就一天时间搞定它绰绰有余了。没料想一猛子扎进去就没那么容易出来了,替换完成以后的测试傻了眼,发现了一个诡异的问题,于是追根溯源,把牵涉进来的林林总总一一拖出来检查排除枪毙,环境比较复杂,debug 起来又比较头疼,折磨了三天半的时间;最后还靠这个替代品 B 的问题列表里面,有某下游产品的工程师跳出来说是这个替代品自身有问题,分析代码怀疑是如何如何的一个 bug,于是我也按照这个思路修改它的代码,编译并且打上补丁以后,才发现确实修复了我遇

[……]阅读全文

Continue reading

Hadoop 的 Map-side join 和 Reduce-side join

Posted on 07/13/201406/23/2019 by 四火

hadoop join

Hadoop 中连接(join)操作很常见,Hadoop“连接” 的概念本身,和 SQL 的 “连接” 是一致的。SQL 的连接,在维基百科中已经说得非常清楚。比如 dataset A 是关于用户个人信息的,key 是用户 id,value 是用户姓名等等个人信息;dataset B 是关于用户交易记录的,key 是用户 id,value 是用户的交易历史等信息。我们当然可以对这两者以共同键用户 id 为基准来连接两边的数据。

首先,在一切开始之前,先确定真的需要使用 Hadoop 的连接操作吗?

如果要把两个数据集合放到一起操作,Hadoop 还提供了 Side Data Distribution(data sharing)的方式,

[……]阅读全文

Continue reading

又是一届世界杯

Posted on 07/02/201406/23/2019 by 四火

2014 World Cup 每届世界杯都挺想发发牢骚的,但是说着说着就偏离主题了。在 06 年世界杯的时候写过这篇文章,而到了 10 年世界杯,则是这篇。无论如何,这个传统要发扬下去。

1998 年世界杯是我看的第一届世界杯,98 年以前我看足球的回忆似乎很淡薄,只有甲 A 尤其是上海申花的些许回忆。当时我大概对是上海申花和球员申思的脑残粉,每周买申江导报(买这份报纸有一个重大原因是一块两毛钱但是却厚厚一叠)首先就要翻到足球的版面,喜欢这支球队是因为离家近,也能和大连万达、北京国安统领中国足坛。申思的任意球脚法我后来认为即便拿到世界上也算是非常出众的,很多人会笑话这样的看法,不过他退役前后一共参加了两届世界任意球大师赛,一次第二,一次

[……]阅读全文

Continue reading

运行时动态增加枚举类型

Posted on 06/30/201406/23/2019 by 四火

enum 最近在使用一个内部框架的时候,希望能够在运行时指定枚举类型,却发现这是一件挺麻烦的事情(不找别的替代方式,就是要动态增加 enum 的类型),方法也不正统,不过作为有趣的尝试,研究研究也无妨,下面的内容主要来自于 《Java – create enum instances dynamically》这样一篇文章。在一切开始前,如果你想问,为什么非要增加/改变 enum 类型?其实这是一个非常好的问题,多数情况下这是应对被避免的,但是这不在今天我的讨论范围内。

一、方法 void addEnum(Class<T> enumType, String enumName),用于增加一个枚举类型:

&n

[……]阅读全文

Continue reading

泛型传递

Posted on 06/09/201410/08/2024 by 四火

chain 最近在读代码的过程中,经常遇到一些利用泛型来对调用链中的参数进行类型约束的情形,特指对于调用链中后面环节的参数类型和返回值,由前面环节的参数类型来确定,我草率地把它称作泛型传递(技巧很简单,但是用得好会很有趣;我不知道这个东西正儿八经的名字叫做什么)。

在说这个事情以前,对于 Java 的泛型,还是和其它语言中有些许的不同,这里需要结合使用方法泛型和类泛型,如有不明,对于其中的使用可以参考这篇 《泛型趣谈》,而其实下面要说的内容,其实也就是这篇文章中提到的 “链式调用”。另外,也顺便提一句,“泛型” 和 “范型” 可是完全不相干的东西,相差十万八千里(若有混淆,关于 “范型”,可以移步阅读这篇文章)。

很多

[……]阅读全文

Continue reading

Hadoop 的 Secondary Sorting

Posted on 06/04/201406/23/2019 by 四火

map-reduce 这几天项目中使用 Hadoop 遇到一个问题,对于这样 key-value 的数据集合:id-biz object,对 id 进行 partition(比如根据某特定的 hash 算法 P),分为 a 份;使用数量为 b 的 reducer,在 reducer 里面要使用第三方组件进行批量上传;上传成文件,文件数量为 c,但是有两个要求:

  • 上述 a、b、c 都相等,从而使得每个 partition 的数据最终都通过同一个 reducer 上传到同一个文件中去;
  • 每个 reducer 中上传的数据要求 id 必须有序。

最开始,想到的办法是,为了保证 reducer 中的批量上传,需要使得传入 reducer 的 key 变成一个经过 hash 算法 A 计算得到的

[……]阅读全文

Continue reading

西雅图第一周

Posted on 05/26/201406/23/2019 by 四火

IMG_20140516_061844 上周四才到的西雅图,这两周日程排得很满,一直抽不出时间来写点东西,终于赶上一个周末,得以稍作整理。下周开始,生活应该可以渐渐进入正轨,在此以前,我还是写写缺乏营养的流水账吧。

下飞机后住进临时的 apartment,第一天一直睡到下午三点半,我醒来的时候还在考虑是不是赶不上 8、9 点钟的早饭了,在睡意中看了一眼时钟,吓得顿时清醒了。这一觉让我后悔好一阵子,生物钟彻底混乱了,时差倒得乱七八糟,白天不困,晚上还睡不着,头昏脑涨,折腾了五、六天才好。我好几年前,读书的时候,有过不少失眠的经历,我总是有这样的体会,有很多东西就像睡眠一样,平时感觉不到,但是失去了才觉得拥有它也是幸福的。

在西雅图的生

[……]阅读全文

Continue reading

Java 多线程程序的测试

Posted on 05/06/201406/23/2019 by 四火

work

这个问题最初来自于一封公司内部的话题探讨邮件,再加上了一些我的理解。

首先,需要明确的是,用 Java 通常构建多线程安全的程序 “非常” 困难,如果还没有体会到 “非常” 的话,阅读《Java Concurrency in Practice》(中文名叫做《Java 并发编程实战》,在我的书单里面,我认为它基本是最好的系统介绍 Java 并发的书了)可能可以改变你的看法。

多线程的基础

基础是王道。对于任何一门语言都是如此,有的基础部分是和语言无关的,也有一部分是和 Java 语言相关的。这里我不过多展开,但是我想提一提对于 JSR 规范的理解。通常我们认为 Java 是一门啰嗦、冗长,容易使用,而且不容易造成破坏的语言

[……]阅读全文

Continue reading

Dynamo 的实现技术和去中心化

Posted on 04/28/201406/23/2019 by 四火

Amazon Dynamo 是分布式的 key-value 系统,最近阅读了 Dynamo 最初的论文 《Dynamo: Amazon's Highly Available Key-value Store》,本文想聊一聊它的去中心化(decentralization)。既有阅读相关材料后对其实现的理解,也有自己的思考,其中如有不正确言论欢迎指出。

中心节点

通常,我们见到的分布式存储结构都是具备中心(总控)节点的,比如 Google File System(GFS),包括了中心的 Master 和数据节点 Chunck Server;再比如 HDFS,包括了中心的 Name Node 和数据节点 Data

[……]阅读全文

Continue reading

程序的库设计

Posted on 04/21/201406/23/2019 by 四火

think 最近在 Stack Exchange 上面看到一个帖子,是问程序库设计的指导原则的,“What guidelines should I follow while designing a library?”,有趣的是,很多人都在谈论面向设计,各路 API 设计,还有程序语言设计,唯独搜索 “程序库设计”,无论中文还是英文,Google 还是百度都找不到太多内容。但是我想,没有程序员会否认库设计的重要性吧,我想在这里结合这个帖子谈谈我的想法。

在这个帖子里面,votes 最高的回答,提到了这样几类 tips,我在下面简要叙述一下,其中基础的部分包括:

  • Pin Map,明确你期望库主要用来做什么,但不要把它定得

[……]阅读全文

Continue reading

北漂两年来的思考

Posted on 04/17/201406/23/2019 by 四火

beijing

最近需要处理很多搬家的事情,比较忙碌,但就在这快要离开北京的日子里面,也腾出不少零散的思考时间,考虑的问题杂七杂八,远远谈不上系统性。人总是要在大的变化来临的时候产生感怀的情绪,有更深的话题可谈,这也是为什么文人也需要体验和历练。这篇文字(只算文字,算不得完完整整的文章)我简单和零散地记述一下我来北京以后对于生活的一些思考,和以前的自己观念上有所不同的地方。

勤奋

中国人是普遍讲求勤勉、忠诚以及低调的。对于世界普遍对于中国人的认识,也往往带有这样的标签。我也曾经大致赞同这样的品质,但是很多观念的理解认识都和眼界有关系,这样的观念也在变化。最明显的就是,勤勉未必总是一件好事。

熟悉我的

[……]阅读全文

Continue reading

一段集合操作的不同语言表达

Posted on 04/09/201410/08/2024 by 四火

看到这样一条微博,觉得挺有意思,就记录在这里:

所谓对比,Java 真是足够啰嗦:

weibo

图不清楚,我来再叙述一下。要做的事情就是,把原有列表里面的每个元素都变成大写的,再放到一个新列表里面去。

这是 Java7 的版本: 

List list = Arrays.asList("andy", "michael", "thomas");
List list2 = new ArrayList<>();
for(String s : list)
	list2.add(s.toUpperCase());

 这是 Java8 的版本(移步阅读:《Java8 集合中的 Lambda 表达

[……]阅读全文

Continue reading

在家办公,你还有多远?

Posted on 04/04/201406/23/2019 by 四火

WFH

先上一段全球最著名的“ 在家办公” 的公司——37Signals 的宣传视频(最近他们网站变成了 Basecamp;他们有一本书《Rework》让我很喜欢,当时甚至还写了摘录,他们去年出的书《Remote》居然已经有人翻译了放在网上,感兴趣的话可以去简书看一看):

在家办公是一个经常被讨论的话题。当然,在很多软件公司甚至是一个禁忌的话题。但是,越是这样的话题,越有趣,不是吗?

对于绝大多数软件公司来说,无论算不算具备浓厚工程师文化的公司,在家办公(work from home)都应当是一个不可以缺少的组成部分。我不相信尝试把软件资产锁在公司大

[……]阅读全文

Continue reading

也谈谈全栈工程师

Posted on 03/29/201410/01/2024 by 四火

thinking

纵使目标再大,人的精力有限,于我来说,早些时候远大目标隐约是 “成功的软件工程师” 这个样子,但是目标是需要逐渐细化的。这些年我渐渐对自己的定位和未来有了一个清晰一点的认识。确实我有很强的观点,觉得软件工程师需要有足够的全面性,在 《我眼中的工程师文化》中我也说 “工程师文化,不是只有权力的一面,它对工程师的要求,是每个人都要足够能干,都要做许多的事”……

但是,全面性不代表没有专精、没有方向。深度和广度统一的问题已经有许许多多过往的人和我说过了,不存在一个在某一领域精深的牛人但是知识却很窄,也不存在一个博学大师但是却没有一个自己擅长的领域;而方向更是不可回避的问题,以前和朋友开玩笑总结 [……]阅读全文

Continue reading

多重继承的演变

Posted on 03/19/201410/08/2024 by 四火

think

本来想告一段落别写编程范型的东西,但是这个话题最近发现很有意思,就拣出来唠一唠。从中除了能看出很多有趣的语言特性,观察不同语言的设计,还可以发现程序语言的发展过程。这里谈到的语言特性,都是从 C++的多重继承演变而来的,都没法完整地实现和代替多重继承本身,但是有了改进和变通,大部分功能保留了下来,又避免了多重继承本身的问题。

C++的多重继承

这个问题我觉得需要从老祖宗 C++谈起,我记得刚开始学 C++的时候老师就反复教育我们,多重继承的问题。比如说二义性问题,也就是说,两个父类如果定义了同名的方法,调用它的时候编译器就不知道怎么办了。

但是需要说清楚的是,多重继承确实是有其使用场景的,

[……]阅读全文

Continue reading

编程范型:工具的选择

Posted on 03/10/201410/08/2024 by 四火

programming language 这是我写的关于编程范型的文章中最后一篇。

在 《编程的未来》里面提到过,很多时候脑子里的算法还是不容易转变成代码,大部分情况下这不是你编码技巧的问题,而是编程语言的问题,或者更严格地说,是编程语言选择的问题。除了复杂性这个软件唯一的敌人,其它真正的困难,早就被数学家们解决了,如果问题和它的解决能够用数学轻松地表述出来,那计算机只是工具而已。极端地说,如果有合适的工具,那么就选择一个;如果没有,那么可以创造一个。仅此而已。

工程师的乐趣,大抵在解决实际问题上,既有解决问题的成就感,也有解决问题的过程。而为了解决问题,又需要分析问题,选择合适的工具,再来使用工具解决问题这几部分。我们对于各种设计模

[……]阅读全文

Continue reading

中国梦太遥远,还是说点实际的吧

Posted on 03/05/201406/23/2019 by 四火

dream 算不得文章,随便谈谈而已。

“ 中国梦” 是不久前热炒的词,中华民族伟大复兴神马的,尤其在最近那件云南的事情发生以后,微博上满是讨论。很显然,从小就被灌输的正能量,也是和崇尚“ 集体”、“ 共同”、“ 国家”、“ 民族” 的价值观匹配的;事实上,这也是和“ 美国梦” 的重要区别,美国梦强调天赋人权,每个人都有同样的生存、自由和追求幸福的权利。

但是事实总是和书本上不一样。优米网上有一篇揭示中国现今十大问题的文章,从食品安全、房价、物价到恶性事故,可谓针针见血。看着

[……]阅读全文

Continue reading

借助 AngularJS 写优雅的代码

Posted on 02/27/201410/08/2024 by 四火

AngularJS

接触 AngularJS 还真有点碰巧,在用 JQuery 写数据绑定的时候,我被数据对象和 DOM 之间的同步整烦了,要写一大堆方法绑定和取值/设值的代码逻辑,丑得要死。简单说来,就是:

  1. 数据对象发生变更以后,要及时更新 DOM 树;
  2. 用户操作改变 DOM 树以后,要回头更新数据对象。

这个问题还是举例来说清楚一些,比如我定义了这样一个 queryObj:

{name: "sally", price: 30}

现在有这样的 DOM 对象:

<input type="text" value="sally" />
&lt

[……]阅读全文

Continue reading

编程范型详解

Posted on 02/24/201410/08/2024 by 四火

programmingLanguage

在上一篇文章 《再谈榔头和钉子》,提到了设计模式和编程范型,相较于设计模式,编程范型往往和语言本身强相关,一种特定的语言,只适用于一种或者几种编程范型。它类似于一种编程风格,也决定了程序员是如何去认识程序的结构、交互和执行的。编程范型是程序员大脑中在设计编码阶段预先考虑到的内容,但是相较于满街跑的设计模式,这个过程往往下意识地被忽略。另外,如果你现在在思考编程范型的时候,脑海里只有“ 面向对象” 和“ 面向过程” 这两者跳出来,那可能是真的被糟糕的面向对象教材毒害太深了。

在维基百科的编程范型页面右侧,有一个相对比较完整的列表:

  • Action

[……]阅读全文

Continue reading
  • Previous
  • 1
  • …
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • …
  • 23
  • Next

订阅·联系

四火,啰嗦的程序员一枚,现居西雅图

Amazon Google Groovy Hadoop Haskell Java JavaScript LeetCode Oracle Python Spark 互联网 前端 华为 历史 同步 团队 图解笔记 基础设施 工作 工作流 工具 工程师 应用系统 异步 微博 思考 技术 数据库 曼联 测试 生活 程序员 管理 系统设计 缓存 编码 编程范型 英语 西雅图 设计 评审 问题 面试 项目

分类

  • Algorithm and Data Structure (30)
  • Concurrency and Asynchronization (6)
  • System Architecture and Design (43)
  • Distributed System (18)
  • Tools Frameworks and Libs (13)
  • Storage and Data Access (8)
  • Front-end Development (33)
  • Programming Languages and Paradigms (55)
  • Testing and Quality Assurance (4)
  • Network and Communication (6)
  • Authentication and Authorization (6)
  • Automation and Operation Excellence (13)
  • Big Data and Machine Learning (5)
  • Product Design (7)
  • Hiring and Interviews (14)
  • Project and Team Management (14)
  • Engineering Culture (17)
  • Critical Thinking (25)
  • Career Growth (57)
  • Life Experience and Thoughts (45)

推荐文章

  • 谈谈分布式锁
  • 常见分布式系统设计图解(汇总)
  • 系统设计中的快速估算技巧
  • 从链表存在环的问题说起
  • 技术面试中,什么样的问题才是好问题?
  • 从物理时钟到逻辑时钟
  • 近期面试观摩的一些思考
  • RSA 背后的算法
  • 谈谈 Ops(汇总 + 最终篇):工具和实践
  • 不要让业务牵着鼻子走
  • 倔强的程序员
  • 谈谈微信的信息流
  • 评审的艺术——谈谈现实中的代码评审
  • Blog 安全问题小记
  • 求第 K 个数的问题
  • 一些前端框架的比较(下)——Ember.js 和 React
  • 一些前端框架的比较(上)——GWT、AngularJS 和 Backbone.js
  • 工作流系统的设计
  • Spark 的性能调优
  • “残酷” 的事实
  • 七年工作,几个故事
  • 从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)
  • 一道随机数题目的求解
  • 层次
  • Dynamo 的实现技术和去中心化
  • 也谈谈全栈工程师
  • 多重继承的演变
  • 编程范型:工具的选择
  • GWT 初体验
  • java.util.concurrent 并发包诸类概览
  • 从 DCL 的对象安全发布谈起
  • 不同团队的困惑
  • 不适合 Hadoop 解决的问题
  • 留心那些潜在的系统设计问题
  • 再谈大楼扔鸡蛋的问题
  • 几种华丽无比的开发方式
  • 我眼中的工程师文化
  • 观点的碰撞
  • 谈谈盗版软件问题
  • 对几个软件开发传统观点的质疑和反驳
  • MVC 框架的映射和解耦
  • 编程的未来
  • DAO 的演进
  • 致那些自嘲码农的苦逼程序员
  • Java 多线程发展简史
  • 珍爱生命,远离微博
  • 网站性能优化的三重境界
  • OSCache 框架源码解析
  • “ 你不适合做程序员”
  • 画圆画方的故事

近期评论

  • + 1.943624 BTC.NEXT - https://graph.org/Ticket--58146-05-02?hs=9a9c6f8dfe3cdbe0074006e3e640b19b& on 所有文章
  • Anonymous on 闲聊投资:亲自体验和护城河
  • 四火 on 关于近期求职的近况和思考
  • YC on 关于近期求职的近况和思考
  • mafulong on 常见分布式基础设施系统设计图解(四):分布式工作流系统
  • 四火 on 常见分布式基础设施系统设计图解(八):分布式键值存储系统
  • Anonymous on 我裸辞了
  • https://umlcn.com on 资源链接
  • Anonymous on 我裸辞了
  • Dylan on 我裸辞了
© 2025 四火的唠叨 | Powered by Minimalist Blog WordPress Theme