遇见sharon ’ 的文章存档

Instagram的技术架构

Instagram 被 Facebook 以10亿美金收购。团队规模:13 人。而在被Facebook收购前的一个月,整个团队才7名员工。

  • 2010年: 2位工程师
  • 2011年: 3 位工程师
  • 2012年: 5 位工程师

制胜法宝:

  1. 广泛的单元测试和功能测试
  2. 坚持DRY(Don’t Repeat Yourself)原则
  3. 使用通知/信号机制实现解耦
  4. 我们大部分工作使用Python来完成,只有逼不得已的时候,才会用C
  5. 频繁的代码复查,尽量保持“智慧共享”。(frequent code reviews, pull requests to keep things in the ‘shared brain’)
  6. 广泛的系统监控

Instagram的两个创始人

  • Mike Kriegerr:之前是一个颇为低调的工程师和用户体验设计师,他在一家名叫Meebo的创业公司工作了1年半。analytics & python @ meebo(在Meebo做分析,使用python );
  • Kevin Systrom:毕业后在Google的收购部门工作了一年,今年28岁,随后去到了一家从事旅行业务的创业公司Nextstop,没有计算机学位,没有接受过正式培训, 但他下班后坚持自学编程,在这家创业公司被Facebook以人才收购的方式收购后,Systrom又去早期的Twitter实习了一段时间。

下面一起来看下这个奇迹是怎样搭建的?Instagram的技术实现是什么?以下内容来自翻译。
阅读全文

JavaScript装逼指南

如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句“原来还可以这样写”呢?下面列出一些在JavaScript时的装逼技巧。

1. 匿名函数的N种写法

你知道“茴”的四种写法吗?ε=(・д・`*)ハァ… 扯淡,但你或许不知道匿名函数的好几种写法。一般情况下写匿名函数是这样的:

(function(){})();

但下面几种写法也是可以的:

  • !function(){}();
  • +function(){}();
  • -function(){}();
  • ~function(){}();
  • ~(function(){})();
  • void function(){}();
  • (function(){}());

当然,这样的写法,没有什么区别,纯粹看装逼程度。

2. 另外一种undefined

从来不需要声明一个变量的值是undefined,因为JavaScript会自动把一个未赋值的变量置为undefined。所有如果你在代码里这么写,会被鄙视的:

var data = undefined;

但是如果你就是强迫症发作,一定要再声明一个暂时没有值的变量的时候赋上一个undefined。那你可以考虑这么做:

 var data = void 0; // undefined

void在JavaScript中是一个操作符,对传入的操作不执行并且返回undefined。void后面可以跟()来用,例如void(0),看起来是不是很熟悉?没错,在HTML里阻止带href的默认点击操作时,都喜欢把href写成javascript:void(0),实际上也是依靠void操作不执行的意思。
阅读全文

基于JAVA的简易缓存系统

背景

几乎任何一个应用,特别是WEB应用,缓存都是非常重要的一块内容,在过去的一段PHP开发中,比较常见的使用缓存的例子如下:

1、根据一个key从缓存中取值
2、如果取到值,则直接返回这个值
3、如果没取到值,则根据业务从solr或是db或是某一段业务逻辑中取值,然后再把这个key-value存入缓存

以上步骤在每一个需要的地方都进行一遍。逻辑其实没有问题,代码跑起来也是OK的,就是看起来有点ugly,不够优雅,扩展性也不好。
阅读全文

如何写好CSS?

真正的问题是什么?

CSS即层叠样式表,所以一层一层覆盖其实是其本质特征。真正的问题在于维护,许多人认为CSS仅是样式,不是代码,无需维护,所以任意书写,只要将自己需要的样式的优先级设为最高即可,才导致了深层级CSS的出现,因为每次添加一个样式就必须比以前的优先级高才能在页面看到。深层级不仅造成维护性降低,可读性也是一个问题,人不是机器,无法很优雅的按优先级阅读,所以很难确认一个样式用于哪里,其实还存在许多的冗余样式,在任何地方都被覆盖的样式。这样的代码在扩展性上,一开始反而是有优势的,因为添加一个新class,无需担心影响其他地方,但慢慢随着项目规模的增大,页面增多,需要复制样式的地方也越来越多,它们之间又存在微小的差异,设计的更改,需求的变化,这一切都会将这种快餐式的CSS推进柏油坑。因为难以维护,所以无法响应需求,所以无法复用,只能复制,恶性循环。

正如上面所说的,问题在于可读性、维护性、扩展性、复用性这几个方面。所以只要提高它们就能解决问题, 虽然这么说,也不是如此简单的。先来谈谈在CSS中,这些概念都有着怎样的意义。

可读性

有人认为CSS不是程序,不需要可读性,有人认为CSS只要写出来就有可读性,因为很简单。抛开各种预处理器不说,原生CSS结构确实简单,没有需要编程的部分,但仍然可能导致混乱。原因有二,一是CSS可以层叠,其中涉及到了优先级和作用范围,如果写的不好,人很难读出其中的意义,二是CSS属性众多,加上CSS3引入了很多用法独特的属性,一个选择器可能包含几十个属性。比如下面这段我随便写的CSS代码:

span {
    -webkit-box-shadow: 6px 4px 4px red;
    -moz-box-shadow: 6px 4px 4px red;
    box-shadow: 6px 4px 4px red;
}
div span {
    border-width: 4px;
    border-style: dotted;
    border-color: blue;
}
#box {
    border-left: 2px solid red;
    border-bottom: 2px solid red; 
}

 

乍一看也没什么,都是border,大致能看出来这段CSS只是为了添加一个红色的阴影让box看起来比较立体。但中间的部分似乎是捣乱的,你可能会说这太傻了,看不到吗。是的,当这3部分散落在上万行的CSS中时,肯定看不到。于是有人很自然的想起了我们可爱的浏览器,没错,在浏览器中可以快速找到作用于目标的CSS样式,但这也是万恶之源。首先我假设你不知道中间那部分东西是为了什么而写的,因为你是靠浏览器找到它的。然后剩下两种可能,不管三七二十一改了再说和看看它为什么存在。前者悲剧的可能性是100%,后者悲剧的可能性是90%,因为你已经掉坑里了,很快我们会发现要修改它还牵扯到了另外的地方,接着在浏览器中探索到另一个莫名其妙的样式,当你弄懂全部的时候,你应该已经把上万行的代码弄了个一清二楚了,也许最幸运的是,浪费了几个小时的时间发现只需要修改一行就能达到目的。
阅读全文

你是编程中的“快枪手”还是“慢悠悠”?

一般而言,有两种类型的开发者。一种编码速度快,喜欢一大段一大段的组合代码,然后看它是否能顺利运行,这是编程中的“快枪手”,还有一种在朝着目标前进的时候比较淡定,他们会确保他们所写的一切代码都是精心设计的,可维护和可扩展的。因为这个原因,使得他们在速度上显得比别人慢,所以是“慢悠悠”。

两者之间的区别是,前者完成的效率更高,但代码的错误率更大(除非他们特别幸运),而后者代码的错误率就少多了,并且易于扩展和维护。亲你是哪一种呢?
阅读全文

redis 数据结构综述

这里所说的数据结构是针对 redis 内部存储 key-value 的,其他诸如 redis 配置相关的数据结构,不在此篇讨论范围。

一览 redis 数据结构

dict,哈希表,redis 所有的 key-value 都存储在里面。

// 哈希表(字典)数据结构,redis 的所有键值对都会存储在这里。其中包含两个哈希表。
typedef struct dict {
    // 哈希表的类型,包括哈希函数,比较函数,键值的内存释放函数
    dictType *type;

    // 存储一些额外的数据
    void *privdata;

    // 两个哈希表
    dictht ht[2];

    // 哈希表重置下标,指定的是哈希数组的数组下标
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */

    // 绑定到哈希表的迭代器个数
    int iterators; /* number of iterators currently running */
} dict;

redisObject,任何 value 都会被包装成一个 redisObject,redisObject 能指定 value 的类型,编码方式等数据属性。
阅读全文

MySql注入科普

默认存在的数据库:

      mysql       需要root权限读取
      information_schema       在5以上的版本中存在

测试是否存在注入方法

假:表示查询是错误的 (MySQL 报错/返回页面与原来不同)
阅读全文

Clojure 编程语言

充分利用 Eclipse 的 Clojure 插件

Lisp 是一种编程语言,以表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况。Clojure 是一种运行在 Java™ 平台上的 Lisp 方言,它的出现彻底改变了这一现状。如今,在任何具备 Java 虚拟机的地方,您都可以利用 Lisp 的强大功能。在本文中,了解如何开始使用 Clojure,学习它的一些语法,同时利用 Eclipse 的 Clojure 插件提供帮助。

本文介绍了 Clojure 编程语言。Clojure 是一种 Lisp 方言。本文假设您不熟悉 Lisp,但需要您具备 Java 技术方面的知识。要编写 Clojure 程序,需要 Java Development Kit V5 或更高版本以及 Clojure 库。本文使用的是 JDK V1.6.0_13 和 Clojure V1。此外,您还需要利用 Eclipse 的 Clojure 插件(clojure-dev),因此还要用到 Eclipse。在本文中,我们使用了 Eclipse V3.5 和 clojure-dev 0.0.34。相关链接,请参见 参考资料

什么是 Clojure?

不久前,要想在 Java Virtual Machine (JVM) 上运行程序,还需要使用 Java 编程语言来编写程序。但那个时代已经一去不复返了。现在更多的选择,比如 Groovy、Ruby(通过 JRuby)及 Python (通过 Jython),带来了一种更为过程化的脚本式的编程风格,或者它们各自拥有独特的面向对象编程特色。这两种都是 Java 程序员所熟悉的。也许有人会说用这些语言与用 Java 语言编写程序没什么区别,只要习惯不同的语法就可以了。
阅读全文

为生活可以忍,侮辱技术行不行?

几年前追《叶问》,当我看到叶问2时就被洪金宝的一句话给震撼住了:“为生活可以忍,侮辱中国武术就不行”。

前段时间我也听到了类似一句话,是一个程序员朋友说的,这厮气鼓鼓的在QQ签名上写了一句话,后来被我转到微信朋友圈里了。这句话是:为生活可以忍,侮辱技术就不行。

于是我通过QQ,用脑残的表情跟他聊了一番(原谅我其实一直是一个很八卦而且好奇心很强的人),发现大概情况是这样的:

这位年入30的姜姓程序员在一家中小型软件公司做一线开发外加项目管理,平时上班沉默寡言,大家基本可以理解为“逆来顺受型”,按照他的说法:要还贷款、上老下小要养,因此工作上任何不顺心的事都可以忍受,什么都可以丢,工作不能丢。我估摸着他的收入还是可以的,因为那是一家虽小但是很有“相关背景”的公司,论前途谈不上,但是不太会差钱。

姜姓程序员给我举了几个“为生活可以忍”的列子:
阅读全文

如何编写好的jQuery代码

讨论jQuery和javascript性能的文章并不罕见。然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码。好的代码会带来速度的提升。快速渲染和响应意味着更好的用户体验。

首先,在脑子里牢牢记住jQuery就是javascript。这意味着我们应该采取相同的编码惯例,风格指南和最佳实践。

首先,如果你是一个javascript新手,我建议您阅读 《给JavaScript初学者的24条最佳实践》 ,这是一篇高质量的javascript教程,接触jQuery之前最好先阅读。
阅读全文