notes of building complex software

背景

这是我一直收藏在 evernote 里面的,架构设计方面的合集。后面会不定期更新一些比较好的设计文章,然后我也在想有没办法像湾区日报那样,做得比较自动化,那就太棒了。

不分主题

继续阅读

reading note of mosquitto

背景

之前在游戏公司的时候,需要自己搭建一套推送服务,顺道研究了下一些开源实现。mosquito 的代码库,代码量少,而且也写得比较好懂,对推送协议的实现也是比较 ok 的,所以就撸了一番。虽然后来没用上,但是还是把当时的一些想法记录下来。

缺点

- 基于poll的事件模型,没有epoll的性能好
- 内存分配策略简单,来一个生成一个,存在优化空间
- 比如改用初始2倍,到达一定数量后,以后每次改用增加额定数量的算法
- 数据结构过于简单
- 常用结构为单向链表,查找耗时为O(n),存在性能问题
- 内存占用过大
- 没有使用数据库,数据都堆在内存里面,可能无法应付大数据量
继续阅读

notes of learning erlang

背景

之前因为要想实现一个基于 DHT 网络的站,就找了一些代码实现,发现一个前辈写的 erlang 实现,好奇也看了起来,顺便学了下 erlang。

感悟

  • erlang 太有趣啦,通过模拟进程创建,看到内存和 CPU 资源是怎么被吃掉的,給人很直觀的感覺哇~而且 erlang 同时支持事务和热代码替换,这两项特性碉堡了啊!!!
  • erlang 的并发编程模式,其实我觉得写起来还是读起来都非常的通俗,上手也不难,但有些约定有点反人类,或者语法有点多,约定俗成的东西还要靠看书来回忆…
继续阅读

the 36 rules for startup

背景

孙陶然老师写的创业指导,《创业 36 条军规》。有幸拜读,记下一些警醒的话语。

内容摘录

军规 1 – 不是每个人都适合创业

  • 对于大多数人而言,在自己的爱好、特长和市场需要之间选择一个适合自己的公司、适合自己的岗位去打工是本分。
  • “枪声一响预案作废”
  • 为了解决困难,你会动用所有可能动用的关系来帮忙,从借钱到借力,周而复始。
  • 作为创业者,你必须给下属以信心,越是艰难时刻下属越寄希望于你,很多时候真得打肿脸充胖子。你不可以显示自己的软弱和无助,你甚至必须随时表现出信心满满的样子来为下属鼓劲儿。
  • 柳总(柳传志)讲过,成功的领军人物应具备 4 个素质:(1)目标高远,意志坚定。(2)心胸开阔,情商要高。(3)企业利益放第一位。(4)学习能力强,爱学习而且会学习。
  • 直接降低自己的社会交往层次,导致缺失很多经验和知识,而且这个过程是不可逆的。

军规 2 – 梦想是唯一的创业理由

  • 不要把上市当做创业目标,不要为谋生而创业,更不要为那些华丽的大道理而创业,梦想是唯一的创业理由。另一方面也不要把创业想得有多神秘、多么高不可攀,创业只是一种生活方式而已,成功失败都是一种人生体验,要学会享受创业过程。
  • 乔布斯说:“人的时间都有限,所以不要按照别人的意愿去活,这是浪费时间。不要囿于成见,那是在按照别人设想的结果而活。不要让别人观点的聒噪声淹没自己的心声。最主要的是,要有跟着自己的感觉和直觉走的勇气。”
  • 很多人往往因为有一技之长就想创业,其实专长和创业完全是两码事。
  • 创业是跑长跑,创业路上等待你的将是无穷无尽的挑战,所有的路都是没有走过的路。即便是对于连续创业者,一次新的创业也是一次全新的征程。设计得再好的商业模式也需要你随机应变,根据市场情况随时作出调整。一切都充满未知,比的是耐力、智慧和运气,这也正是创业的魅力所在。
  • 创业是一个不断试错的过程,不断发现哪条路走不通,最终找到一条走得通的路你就成功了。
  • 不管你选择哪一种生活方式,日子每天要过,事情每天要做,年龄每年要长,不用想那么复杂,也不用给自己界定太明确具体的成功时点。
  • 从开始创业的第一天起,就要学会享受创业过程。创业路上充满未知,不论是顺利还是波折,都是一种体验,要学习享受这些体验,等到退休的时候回味这些体验。千万不要有等创业成功后享受生活的想法,一旦你开始创业,你永远不可能有满足的那一天,除非你退休,否则你总是这山望着那山高,永远停不下来。
  • 不要把上市当做创业的目标,实际上 99% 的企业是上不了市的。如果你有创业梦想,just do it,即便失败了,so what?

军规 3 – 学先进,傍大款,走正道

  • 36 条创业军规归根到底就是一条:学先进,傍大款,走正道。要善于向优秀的同行学习,要追求与强者合作,要坚守规范经营的原则。投机取巧看似占便宜,其实是吃大亏,出来混总是要还的,走正道才是成功的捷径。
  • 优秀的管理者最重要的特征是正直感
  • 虽然市场竞争其实是争夺消费者的 “心智” 之战,但是很多企业还是习惯将焦点放到竞争对手身上,期望通过对竞争对手的 “战斗” 来获得营销的胜利。
  • 个人认为好公司的 5 个标准是:(1)公司所提供的产品或服务对社会和人的作用是有正向价值的。(2)公司奉行善的、正义的价值观。(3)公司的治理结构符合现代企业制度。(4)公司运转健康,可持续发展。(5)员工对公司的认同度和满意度高。
  • 我们失败就是因为我们认为自己是特殊的。我念高中的时候就悟到一个真理,最高深的物理学原理和最高深的哲学原理是一致的,万事万物的原理相通,“世事洞明皆学问,人情练达即文章”。不管你从事哪个行业,你需要遵从的规律很多都是相同的。
  • 进步的捷径就是直接学习那些已经成功的企业和人,学习他们已经被验证了的行之有效的方法,与学习理论相比,学先进更加清晰明了。
  • 业务上,如果能够和大企业合作,则更容易获得相对比较稳定的生产经营环境,并且能够随着大型企业集团的发展而发展。
继续阅读

note of optimization for zdlive web sites

前言

zdlive 是我大四实习的一家公司,当时在那边负责前端模块,写了蛮多的笔记,现在整理出来~=)

相比起后台的优化,前台的优化一般都会被忽视,但其实在用户发起一个页面请求,到页面最终展现给用户,前端所占的比重是非常大的。看了《高性能网站建设指南》,还有《构建高性能 Web 站点》的部分章节,针对 zdlive 的页面,可以做如下优化尝试。

优化的指导方针共有 13 条,结合 zdlive 讲。

减少 HTTP 请求

一般我们的网页会有如下三种,图片、css 文件、js 文件和 html 文件。当用户在输入输入网址的时候,浏览器会向服务端发起一个 http 请求。当这个 html 文件被下载到客户端之后,其他的组件才开始下载,我们以 zdlive.com 为例。

可以看到,所有的组件下载,都是等到第一个文件载入完毕后再发起的,而这里的每一项都是代表着一个 http 请求。

对于一个页面来说,多个 http 头并没有什么关系,但对于响应速度和稳定性要求高的,比如 zdlive 的首页,尤其是 gprs 这样坑爹的网络下,多个 http 头,意味着速度慢,请求失败的几率会很大,页面显示不完整等等问题。

那我们要做的就是减少 http 请求了。

方法有如下几种:

  • 减少图片。目前比较常见的做法是把多张图片整合到一张图片里面,然后利用 css 的技术,比如 background 的定位来做到共享图片的目的,这种技术叫做 CSS Sprites。  坏处有 2,定位麻烦和单张图片的大小会很大,这样用户请求到完成的时间就会比单张小图片要久。

对于我们的首页来说,这种做法还需要实际测试下。

  • 内联图片。对图片进行 base64 位的编码,这样图片就可以和 html 文档一起下载到客户端了。

坏处是 Base64 位压缩以后,图片的大小会变大。但结合服务端的 gzip 压缩,减少客户端的 8 个请求,还是可以尝试下的。

  • 合并脚本和样式表。

对于一个文件来说,通常会有多个脚本文件和样式文件,分开是模块管理的需要,但有时候也可以结合在一起,合并下载。但这个单个文件大小,和多个 http 请求头之间的怎么去权衡,我还不是很清楚。 ## 使用内容分发网络 内容分发网络的意思是说,假设我们公司现在有多台服务器,一些专门用来跑应用支持,一些专门用来给用户下载文件的,比如 img 文件、mp3 文件等等。而这里,内容分发网络就是指这些用来下载的服务器了。只是,他们现在都在北京这个地方,如果这些被用户用来下载文件的服务器能部署在全国各地,那对于用户来说,更近的服务器,就意味着更短的相应时间和更快的下载速度。

拿 douban 的豆瓣 FM 来说,当我发起访问的时候,实际上我听的歌曲并不是在北京那边的服务器给过来的,倒是从广州这边的服务器下载的。

具体测试,可以用下抓包工具查看 ip 地址信息,海富推荐用 fiddler2。

继续阅读

码农(第 13 期)– 图灵社区

背景

献给那些喜欢阅读和创造的读者~=)

阅读笔记

  • 像这样获取和变更程序本身信息的功能,被称为反射(Reflection)。
  • 无论是 ActiveRecord 的示例,还是 Builder 的示例,都通过元编程技术对无法预先确定的操作进行了应对,这样一来,未来的可能性就不会被禁锢,体现了语言的灵活性。我认为,这种灵活性正是元编程最大的力量。
  • 我的看法是,一个追求卓越的程序员应该广泛尝试多种语言,但如何他真的这样做了,他一定会在遇到 Common Lisp 时停下来,因为他发现这门语言是最强的,也是最美的,并且学习过程也是最艰难的,艰难到以至于学成之后,再没有精力也没有必要去学其他语言了。
  • 程序员知道如何让计算机进行演绎推理,因为计算机能够理解其中涉及的数学。但如果想让计算机进行人类赖以生存的这种推测性的(而又常常是正确的)常识推理,就得发明一种全新的数理逻辑。而这正是约翰・麦卡锡为自己设立的目标之一。
  • 通过这种方式,表不仅能够表示构成科学和工程的标准数学结构,还能表示构成语言的语句结构。
  • 我们连书面提案都没准备,申请就得到了批准。很幸运,当时麻省理工的电子研究实验室刚刚与美国军方签署了一份无固定目标的双向合作协议,而相应的资源还没有到位。我想这种灵活的资源调配正是美国的人工智能研究起步领先于其他国家的原因之一。
继续阅读

rabbitmq reading note

背景

之前在 game workshop 的时候,有做这方面的技术调研,了解了下这方面的技术细节。不过阅读的内容都存在 Evernote 里面,趁着翻阅的时候,把资料再掏出来。

blog

继续阅读

The big django

我总是有种冲动要把一个框架给撸一遍才 happy,但我发现这样把自己累得半死,还吸收不良……
特别是当我遇到了神奇的 Django,她的完备,资料齐全,开发方便,社区活跃,让我很 high 得撸了好几个月….. 好吧,其实是项目需要…..

但就像有些人说的一样,当一个框架的文档完备到让人发紫的时候,是不是也意味着他很难改变?
额,有点,Django 给我的感觉是,开发的程序猿是来写配置文件的,已经脱离了传统意义上的开发。那种感觉,
就像你去写 rails 一样,一切都安排好了,按着套路去填就好了。

吐槽完了,其实我是来记笔记的……

继续阅读

webpy-cherryServer-analytics

Introduction

So you want to how web.py works?

In this article, I will walk through the web.py’s simple server, which is adopted from CherryPy.

Things you need to know

what is a web server?

In my words, a web server is simply a request/response manager.
It listens to comming requests from the client, and dispatches requests to the appropriate application based on the rules.
Then it gets responses back from the same application and send back to the client later.

There are a couple of things we need to go deeper.

  • What is a request?

When a user clicks a link or post a form, a request has been created. How?

继续阅读