Skip to content

四火的唠叨

一个纯正程序员的啰嗦

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

酒桌上的计算机网络

Posted on 12/11/201106/23/2019 by 四火

alcohol 宴开始。

 

酒杯盛酒,酒杯碰撞,这是物理层;

你要根据不同人的外貌特征找到你要敬酒的人所坐的位置,这是 IP 协议(网络层);

你明白,敬酒的实际目的是加深感情,这在应用层,而这酒中的感情,才是报文的数据部分。

 

你和某位新见面的兄弟互相来回敬酒,这叫 TCP;

你给同一位好兄弟敬酒好多次,死命灌他,他也不回礼,这叫 UDP;

你对全桌的人说,来,咱们同归于尽,这叫广播;

你在对这一桌的人顺序挨个敬酒,这叫令牌环。

 

 

你对该兄弟说,初次见面,请多关照,请问阁下尊姓大名,敬酒一杯,这叫 SYN 报文;

这位兄弟说,同是天涯沦落人,

[……]阅读全文

Continue reading

CSS 也面向对象

Posted on 12/07/201106/23/2019 by 四火

css 最初接触到面向对象的 CSS 还是因为项目中的 CSS 已经超过八千行,缺乏约束和管理,在近期或者是不远的将来,有迫切的要求需要重构。在前端重构中,除了 JavaScript 重构,不妨再看一看 CSS 面向对象和模块化,这给我的工作提供了非常好的思路。

首先,我要说的是,在这个概念翻飞的年代里,固执地追求某些概念和涵义,并不能带来更优秀的设计和更高的生产力,面向对象是一种思路,或者说是一种方法论,给 CSS 重构带来一些启示,这就足够了,没有必要去纠结 OO CSS 的定义和严谨性。

我们的 CSS 代码遇到了什么问题?

重用性差,看着一个 CSS 的名称,很难说出哪些模块可能引用到了它,这个 CSS 是用作网页的哪些部分

[……]阅读全文

Continue reading

贫血模型和充血模型

Posted on 11/28/201110/08/2024 by 四火

这两个概念是早些时候 Martin Fowler 总结出来的两种常见模型设计类型,没有说谁好谁不好,为不同的模型类别选择合适的场景是设计者的工作。没有工具本身的问题,只有工具使用者的问题。

 

 

贫血模型是指领域对象里只有 get 和 set 方法(POJO),所有的业务逻辑都不包含在内而是放在 Business Logic 层。

 image

 

优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access Object。可见,领域对象几乎只作传输介质之用,不会影响

[……]阅读全文

Continue reading

提高数据库查询速度的几个思路

Posted on 11/27/201106/23/2019 by 四火

27 1、缓存,在持久层或持久层之上做缓存。

2、数据库表的大字段剥离,保证单条记录的数据量很小。

3、恰当地使用索引。

4、必要时建立多级索引。

5、分析 Oracle 的执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描。

6、表分区和拆分,无论是业务逻辑上的拆分(如一个月一张报表、分库)还是无业务含义的分区(如根据 ID 取模分区)。

7、RAC,值得注意的是,Oracle 的 RAC 在节点较多时有其不可解决的性能问题。

8、字段冗余,减少跨库查询和大表连接操作。

9、数据通过单个或多个 JOB 生成出来,减少实时查询。

10、从磁盘上做文章,数据存放的在磁

[……]阅读全文

Continue reading

由后端来类比前端设计的思考

Posted on 11/24/201106/23/2019 by 四火

design 有这样一句话被提起:

前端也有 MVC,DOM 树就是这个 M,CSS 就是这个 V,至于 C,非 JavaScript 莫属。

很高兴团队中有越来越多的人能够跳出某种语言、某种平台的局限性,站到抽象的层次上思考一些设计上的问题。在我的印象中,似乎前端开发总是容易给人以随意、混乱的感觉,可真的是前端技能不容易掌握吗?

大学里 Java 课程正儿八经学了 3 年,JavaScript 只字未提,只是课余时间凭借着兴趣自学,加起来也就两三个月。

前端代码更加灵活,无论是 HTML、JavaScript 还是 CSS,似乎任何一个初学者都可以轻松入门。可是越是看似简单的东西,就越难以精通地掌握,没有好

[……]阅读全文

Continue reading

JavaScript 实现继承的几种方式

Posted on 11/17/201106/23/2019 by 四火

js

JavaScript 虽没有给出继承的关键字,但是我们依然能够拿出一些好办法实现。

1、原型链继承:

var Base = function()  
{  
    this.level = 1;  
    this.name = "base";  
    this.toString = function(){  
        return "base";  
    };  
};  
Base.CONSTANT = "constant";  
  
var Sub = function()  
{  
};  
Sub.prototype = new Base();  
Sub.p

[……]阅读全文

Continue reading

如何思考面向对象

Posted on 10/31/201110/08/2024 by 四火

Robert Martin 在学习了面向对象的语言,比如 Java、Python 和 Ruby 之后,看起来每个人都觉得自己在进行面向对象的编码。但是如果你仔细审视一下代码,你就会发现还是无意识地使用了很多过程语句。

静态方法

静态方法是最天然的过程方法,它和面向对象没有一点关系。好吧,我已经听见质疑的尖叫了,那么,我就来给你解释一下为什么。首先我们可以达成一个共识,全局变量和全局状态是魔鬼。如果你觉得前面说的静态方法的话会没什么可争论的,那好,我认为静态方法就应该返回一个常量,因为没有全局状态量(时间和随机数,这些都是全局状态量,所以不能算进去的,对象必须有不同的实例,但是对象图的连线是一致的)。

这就意味着静态方法要做什么

[……]阅读全文

Continue reading

同步、异步转化和任务执行

Posted on 10/24/201106/23/2019 by 四火

async 正如动静是相对的概念,有了它们,世界才充满盎然生气;变和不变也是哲学上的对立统一,在代码的世界里也一样;同步异步呢?

首先,来粗略地看看同步和异步各自有些什么好处:

同步的好处:

  • 1、同步流程对结果处理通常更为简单,可以就近处理。
  • 2、同步流程对结果的处理始终和前文保持在一个上下文内。
  • 3、同步流程可以很容易捕获、处理异常。
  • 4、同步流程是最天然的控制过程顺序执行的方式。

异步的好处:

  • 1、异步流程可以立即给调用方返回初步的结果。
  • 2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。
  • 3、异步流程在执行的过

[……]阅读全文

Continue reading

API 设计:CQRS(命令查询职责分离)

Posted on 10/23/201110/07/2024 by 四火

以下内容翻译自 CQRS by Martin Fowler,有一些修改:

 

CQRS(Command Query Responsibility Segregation)指的是命令查询职责分离。这是一种我从 Greg Young 处听到的模式描述。它的核心思想很简单,就是你在更新和读取操作时使用不同的模型,这样的话,会给整个系统的设计带来深远的变革。

 

人们和信息系统交互的主流行为就是对数据仓库 CRUD 的使用,我们构思一个可以供创建、读取、更新和删除的数据模型。简单来说,我们的接口提供出来的目的就是供存储和获取数据之用的。

 

现在我们要脱离这样一种模型,看

[……]阅读全文

Continue reading

程序员看法上的几个典型错误

Posted on 10/04/201110/01/2024 by 四火

1 今天我不谈抱负理想,也不谈具体的技术,我来谈几个看法上的典型错误。下面的这些问题都是我曾经遇到,或者是我的朋友们遇到过的问题,这些都是我个人的理解,希望对大家有帮助。

 

关于设计模式、设计原则

有人认为,熟悉了设计模式、设计原则,就学会了设计。其实,设计模式和设计原则,只是前人根据设计实践做的总结和提炼,设计,归根到底是要解决问题的,把具体问题的解决办法,经过一定的抽象,变成程序员的语言。

我见过一些人,他们知识渊博、见识广博,甚至理论可以给你阐述得冠冕堂皇,但是到了实际需要解决问题的时候,他们却拿不出巧妙的、优雅的办法,这是典型的象牙塔人。

另一方面,也有一些人看不起学习设计模

[……]阅读全文

Continue reading

如果不做软件

Posted on 09/22/201106/23/2019 by 四火

1 那,我想做什么?

 

我想要怎样的生活?

 

做一个歌手。充满魅力的舞台。钢琴?吉他?架子鼓?我爱清新的音乐,华丽的演唱。

做一个医生。病人的眼神,这是世界上最单纯直接眼神。关于健康和爱的神圣故事。

做一个咖啡吧老板。我爱咖啡,我爱在浪漫的咖啡吧里品味香醇各异的感觉。嗯,那样的话我大概有机会爱到极致了。咖啡在苦中浓郁,有时候,喝咖啡就是在品味生活。

 

呵呵,不过,我想我大概会一直坚持下去。

我找不到放弃和变卦的理由,我爱软件,梦想还是没有动摇过。

软件是一件用 0 和 1 两种符号在巧思匠心下凝聚而成的艺术品,没有任何一类事物可以这样神奇地将数字的理性和艺术的感性结

[……]阅读全文

Continue reading

不,这样的 DTO!

Posted on 09/11/201110/08/2024 by 四火

R.Martin 本文翻译自 Oh No! DTO! by Robert C. Martin,这篇文章很短,强调的内容简单得不能再简单,也许大家早就意识到,但是,我依然可以在很多产品的代码里面找到文中所说的 “教条” 的影子,我说不清为什么,在这里有激烈的讨论,你们说呢?

 

本周我在教授 XP(极限编程,译注)的课程,我们要写给当前的应用写 FitNesse(一种测试工具,译注)的基础测试代码。其中一位程序员使用了 RowFixture(一种测试结果比较的工具,译注),这种工具需要使用 DTO(数据传输对象)并且要求其中的变量都为公有的。这时候这位程序员提出了质疑:“DTO 应该使用私有的变量和一套相应的 get

[……]阅读全文

Continue reading

我面试别人的常见方式

Posted on 09/08/201106/23/2019 by 四火

interview 工作需要面试了一些人,主要还是找合适的开发人员为主,我本人不能算很有经验,但是也有一些自己总结的路子。

要找怎样的人?

简单说,我要找适合工作的人。找适合公司和适合岗位的人,不一定要最优秀的,不一定要最出色的;但是一定要有基础、能学习、肯干,并且有一定的吃苦能力,性格不难于融入团队,短期内不轻易离职的人。

会进行什么对话,问怎样的问题?

七步曲。

1、热场,聊聊地点、家常,看看最基础的沟通能力,也帮助被面试者放松,正常反映自己的情况。

2、询问经历,包括学习经历和工作经历,尤其是实际项目经历,并就项目情况展开询问,可以了解擅长领域和工作经验。

3、简要介绍一下相应职位的工作情况,做什么业务,

[……]阅读全文

Continue reading

JavaScript 并发下载

Posted on 08/21/201106/23/2019 by 四火

在 IE6/7 里 JavaScript 会从两个方面阻碍页面呈现:
script 标签下面的网页资源在 script 加载完之前会停止请求、下载。
script 标签下面的 html 元素在 script 加载完之前会停止渲染。

在 ie6/7 firefox2/3 Safari3 Chrome1 和 opera 下 script 标签会阻碍下载:

image

虽然在 ie8,safari4,chrome2 下 script 可以并发,但依然阻碍了其他资源的下载:

image

有 6 种方法可以使 script 与其他资源并行下载:

  • XHR eval — 通过 XHR(XMLHttpRequest 对象) 下载 script,然后用 eval 方法执行 XHR 的 r

[……]阅读全文

Continue reading

IE6,别急着说再见

Posted on 08/12/201110/02/2024 by 四火

没有一款浏览器能比 IE6 给前端开发更带来困扰了,IE6 的 Bug 和对标准的无视(其实 IE 各个版本都习惯于对标准的无视)已经到了令人发指的地步,
比如 IE6 的 JavaScript 解析在 GZip 压缩下问题一堆,微软自己都说没有办法,换浏览器吧;
比如 IE6 对样式的规定乱七八糟,看这个;
比如 IE6 上使用 PNG 还要加上一个带来 N 多挂死问题的滤镜……

终于微软也忍不住了,要专门给 IE6 清理全球最困难的钉子户中国开小灶了:
http://theie6countdown.cn/

微软自己都说了:

能为大家服务十年,已付出了我毕生的心血,尤其感谢中国,中国人民最可爱,因为直到今日,依然对我不离不弃。
可我得说,我还

[……]阅读全文

Continue reading

杂记:Java 的无锁编程和锁优化

Posted on 08/07/201106/23/2019 by 四火

Peterson 算法(Dekker 算法的演化),这个算法设计得很巧妙,理解的核心就是搞清楚三个标志位是怎样控制两个方法对临界区的访问的:

volatile int flag1 = 0; //主观因素:flag1 表示方法 1 自身是否要求进入临界区   
volatile int flag2 = 0; //主观因素:flag2 表示方法 2 自身是否要求进入临界区   
volatile int turn = 1; //客观因素:turn 取 1 和 2 分别表示当前临界区针对方法 1 还是方法 2 开放  
  
void fun1(){   
  flag1 = 1;   
  turn = 2;   
  while

[……]阅读全文

Continue reading

Javascript Memoizer

Posted on 06/20/201106/23/2019 by 四火

以下来自 John Hann 的实现,这段代码引起了我的注意,它用巧妙的方法把方法调用的结果缓存起来了。

代码解析:

// memoize: 使用 memoization 来缓存的通用方法 
// func: 要被缓存的方法 
// context: 方法执行上下文 
// Note: 方法必须是外部可访问的,参数是可字符序列化的 
function memoize (func, context) { 
	function memoizeArg (argPos) { //参数表示原始方法中参数的位置 
		var cache = {}; //这个缓存的 key 是参数,value 是执行结果 
		retu

[……]阅读全文

Continue reading

JavaScript 重构攻略

Posted on 05/15/201109/25/2019 by 四火

flash

[Updated 11/3/2017] 文章写在好多年前,由于时代和自身技术水平的限制,很多文中的观点都已经不准确。现在有好的多的方法和工具来完成 JavaScript 重构。

一、模块划分和命名空间

通常我们的团队中,开发人员在 Java 语言层面具备相当的技术素养,经验丰富,而且有许多成熟的、合理的规约,类型繁多的代码隐患检查工具,甚至在团队间还有计划内的评审和飞检。但是前端的代码不似后台,就像一个没人疼的孩子,不仅仅容易被低估、被轻视,导致质量低劣、可维护性差,技能上,更缺少优秀的前端开发人员。

JavaScript 是前台代码中重要组成部分,随着版本的延续,产品越做越 [……]阅读全文

Continue reading

我们的时间去了哪里?

Posted on 04/26/201110/01/2024 by 四火

clock 做一个大型的 WEB 项目已有近两年,兄弟姐妹们总在忙忙碌碌中度过,看似很充实,可是当每个版本结束,我想我们又完成了一件大事,可是紧张的项目周期加上持续的加班,客户和一线还是对版本质量不满意。看到完成的作品时,我总有一种感觉:投入了相当大的人力,团队成员也兢兢业业,按说时间应该绰绰有余才对,可是实际上为什么我总觉得版本紧张,我们的时间怎么那么容易就被消耗掉了?

 

内耗之事

不可否认当一个团队人数越来越大,就越需要流程来约束人、管理人,可是团队越大,就越容易产生沟通、交流的内耗,尤其是流程产生的内耗。项目经理或者团队 Leader 能够及时识别出这样的内耗,就显得尤为重要。

流程的内耗,比

[……]阅读全文

Continue reading

从错误页面的角度看用户体验

Posted on 04/09/201106/23/2019 by 四火

阶段一:
系统错误信息乃至错误堆栈被抛到页面上。
这是最原始的容错界面,在现在的网站中依然偶尔出现,这是糟糕的和不安全的,相信现在没有一个负责任的 UCD 专家会容忍这种现象的发生。

阶段二:
引导到简单的错误提示页面,例如:“系统忙”、“页面不存在” 和 “出错了”,或者一个简单的弹出框提示用户。
无论界面是美观还是简陋,这种方式都是原始的,并且是易于实现的。这是网站 UCD 的底线,如果您希望您的网站简单和质朴,那么这样实现并没有什么不好。

阶段三:
提示页面不仅仅是告知用户错误,还能够给出一定的建议,或给出一定的引导,以帮助用户在出错的情形下更快地修正错误,找到正确的页面。
这在相对复杂一些的网站上出现,通常

[……]阅读全文

Continue reading
  • Previous
  • 1
  • …
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 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