notes of building complex software

背景

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

不分主题

继续阅读

reading note of mosquitto

背景

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

缺点

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

reading note of the totor library for python

背景

在 ziz 的时候,cto 的技术选型不合理,对使用技术缺乏必要的了解,采用了旧和大而笨重的中间件。因为 tcelery 的核心开发者不再维护代码,所以需要重新选择更加合适的技术方案。

阅读

原版的 tcelery 有几点问题:

- 对于redis的backend,存在race condition的情况,具体要参考下对应的git仓库的issue
- 对于超时的处理,如果worker跑这个任务运行的运行时间超过规定时间,客户端的连接就会卡死
- 代码时间有点旧了,作者mher也没有继续维护和做codereview的工作

后来认识了一个提交 pull request 的童鞋,因为作者没有维护采纳修改的缘故,他做了一版新的工具,totoro。现在的项目就是基于这个来开发的。

ps: segmentfault 有专门一个问题来讨论这个 bug 的,也可以去看看解决方案(其实是我自问自答啦)。

things to be concerned when you make a startup

背景

这是有关创业的第 N 本书,知乎出的集合,《创业时,我们在知乎聊什么》。

你为什么创业?

  • 冯大辉所理解的 “创业”,是一种对待工作的态度。
  • 不是说自己一定要单干,比如注册个公司,当个说一不二的老板,才是在创业。想明白工作是为了自己,而不是感觉在为别人打工,这就是创业。
    创业,就是一个更为积极、更为明确的工作态度。“我不在创业,就在去创业的路上。” 这是我刚加入阿里巴巴那段时间的签名。
  • 我只是不想虚度光阴。充实和富有挑战,才是自己骨子里最本质的东西。
  • 第一种人希望自己成为一个比降临人世之初更好的人,例如稻盛和夫。这种人往往希望每天都能过得更充实,能把每一分每一秒都用在提高自己、实现自己的人生价值上。
  • 第二种人,希望能好好地享受生活。只要自己和身边的人能够幸福快乐,就已经足够了。
  • 这两种人,并没有优劣之分。克里斯托弗・莫利有一句话说得很好:“只有一种成功 —— 能以你自己的生活方式度过你的一生。”
  • 胜间和代说过:“我们的人生设计应该是,尽量做自己擅长的事,把赚来的钱请别人做自己不擅长的事。”
  • 一个不成熟男人的标志是他愿意为某种事业英勇地死去,一个成熟男人的标志是他愿意为某种事业卑贱地活着。——《麦田守望者》

是否适合创业?

  • 思考力:这事儿你要想得明白,想得比任何人都深入和透彻。
  • 行动力:光说不练是假把式。你得设法把想法变成原型,把原型变成产品。你得设法找到志同道合的朋友和你一起拼命。你得设法弄来用户用你的产品,给你反馈。你得设法改进,以最快的速度和最高的效率。
  • 心气:不能瞻前顾后,不能怕这怕那,不能服软,不能认输,不能拖泥带水。
  • 时机:得要时机合适。市场没起来,你就会从先驱变成先烈。势头过去了,你就会从参与变成参观。
  • 所以对这种人,考验在于如何展现自己的个人魅力和领导能力,从而激发士气,而不是像吕布那样 “我有赤兔马,哪怕水淹”,让手下人心惶惶。

创业早期容易犯哪些错误?

  • 更重要的是机会。一个类别的新机会,时间窗口往往是有限的,从一个领域新开始到领域里出现成熟公司或大公司进入,导致不再适合创业,往往就一年多的时间。
  • 错误是什么,错误就像开车时走入的弯道,由于路段的原因,你也许不能完全避免,但是你可以多开多练,改进自己的入弯技术,加快入弯速度,选择漂移过弯、沟渠过弯等任何安全有效的过弯方法。所以看清前路,用你最熟练的姿势入弯吧。

创业者应该具备哪些素质?

  • 创业者还应该更好地对待周围的人,诚实面对所有人,把 “止于至善” 当作创业的终极目标。时刻保持简单,实事求是。有足够的胸怀和气度,虚心,知道自己坚持些什么,可以放弃些什么,懂得放弃和分享。了解自己的擅长之处和弱点,努力提升自己,对未知的事物保持虚心和敬畏。建立一个组织,而不是一个团伙。知道自己的命运,努力去改变些什么,成为一个乐观的悲观主义者,对任何事都保持谨慎的乐观,但竭尽全力去实现目标。坚忍并且追求内心的强大。失败只会使自己离成功更近。乐于帮助别人,专注于自己的产品,知道乐于助人是一种美德并身体力行。追求产品的极致,让自己的产品有灵魂,通过自己的产品去实践自己的世界观。热爱并相信互联网,因为你是干这个的。
  • 老话说:“吃得菜根,百事可做。” 对创业者来说,肉体上的折磨算不得什么,精神上的折磨才是致命的,如果有心自己创业,一定要先在心里问一问自己,面对从肉体到精神上的全面折磨,你有没有那样一种宠辱不惊的 “定力” 与 “精神力”。
  • 一个创业者要懂得人情事理。老话说:“世事洞明皆学问,人情练达即文章。” 创业的首要目的是合理合法地赚钱,不是改造社会。改造社会是你发达以后的事,还需要你有那样的兴趣。创业更不是为了要跟谁赌气,非要如何如何,非要让对方觉得你这个人如何如何,你才觉得心里舒服,你那是自己为自己设绊。
  • 同学资源和同乡资源可并称为创业者最重要的两大外部资源。
  • 第二是职业资源。
  • 第三是朋友资源。
  • 创业本身就是一项冒险活动。要有胆量,敢下注,想赢也敢输,创业是最需要强大心理承受能力的一项活动。
  • 只有当老板舍得付出,舍得与员工分享,员工的生存需要、安全需要、尊重需要才能从老板这里都得到满足。员工出于感激,同时也因为害怕失去眼前所获得的一切,就会产生 “自我实现的需要”,通过自我实现,为老板做更多的事,赚更多的钱,做更大的贡献,回报老板。这样就构成了一个企业的正向循环、良性循环。这应该是马斯洛理论在企业层面的恰当解释。

亲历者说 李开复给创业者什么建议?

  • 所以不要那么多地去听周围的声音,什么职业是好的,你该成为什么样的人,而要更多地去思考我擅长做什么,我爱做什么。一个成功的公司,它的 CEO 做的一定是他擅长的事,并且是他爱做的事。
  • 都是一样,目标要宏伟,但是走出的每一步路,一定是一个非常具有针对性的、一年或者一年左右的一个短期针对性目标。达到了那个目标之后,自己走上了一个新的台阶,你可以再考虑下面走什么样的路;如果没有达到那个目标,你可以自省,是想办法让自己做得更好,还是需要找一个不同的方向。人生一定是不断地一步一步探索、迭代、学习出来的,要从碰到的每一个挫折中学习,然后得到成长。

如何才能不被那些大的互联网公司抢占市场?

  • 只是现代人不信神了,技术传播也太快,才没有产生一个什么网络氏。

创业早期必须重视的问题有哪些?

  • 光有产品和技术是不够的,要懂市场。
  • 我在上学期间,曾两次创业失败,毕业后先加入别的公司,学习创业。这是我人生中很重要的、也是十分正确的一步。
  • 创业成功的关键不在于点子,而在于能否很好地执行。创业者的执行力强意味着能够深入思考自己的产品,追究每一个细节;同时有一个团队共同运营这个产品,使产品能够快速迭代。创业公司应比业内大公司更加拼命努力,而大公司出来的创业者有时会有打工者心态,总有被动完成任务的惯性,缺乏主动思考、寻找和解决问题的能力。
  • 投资人不会因为创业者有领先的技术或专利而投资,他们更关心产品解决了用户的哪些需求、市场有多大、创业者的独特之处是什么,然后才会问创业者用什么技术满足了该需求。
  • 创业者没能投入全力孕育产品和经营公司,创业碰到困难时,就想把公司卖掉;或者总是抱有打工者心态,希望能达到董事会的要求,得到董事会认可,而不是主动冲到创业的前沿,去做自己应该做的事情,以证明自己、得到应得的回报。

亲历者说 王兴:快速找到新方向

  • 我第一反应是想搞明白怎么回事,希望能够尽快恢复运营。一方面持续努力和监管部门进行沟通,另一方面给自己定了界,希望以半年为界,不能无休止地 “耗” 下去。
  • 如果不弹新闻窗,流量上不一定能超过新浪。这就是说,有时候弱需求的产品,并不是说不是好产品,但是对渠道的依赖比较大

有项目和少量投资,怎么寻找技术合伙人?

  • 哭穷:没用的,别人跟你不熟的话,一般不会管你。创业的时候不要跟员工说太多自己多难做,多辛苦,别人不仅不会同情你,你还会失去士气,让他们失去信心。
  • 在互联网行业,一个好的技术人员,有四五年经验又有悟性的,大都年薪在 30 万元甚至以上,不要觉得 “贵” 了,“便宜” 的干不了创业技术核心的活。相应的界面视觉设计人才,应该也差不多。而且这
  • 想邀请一位对项目有重大价值的朋友,但他要求不错的工资,也要不错的股份,这合理吗?
  • 一个用指头就可以指导的定律是,给他的是股份还是期权,如果是期权或者是小于 2% 的股份,就应当作为雇员处理。
  • 如果是合伙人:在初创阶段,合伙人应当承担经济上的风险,也就是说,不拿工资奖金或者少拿是完全正常的。但是在有现金收入后应该尽快恢复正常的工资水平。
  • 如果是雇员:雇员要求比在大公司还要高的工资水平是合理的,因为他们承担了一部分的风险。风险主要包括公司倒闭所导致的失业和失业期无法得到正常的补助(被正常公司开除会有一到两个月的工资作为补偿),还包括在创业公司工作失败后对于雇员个人的职业计划的影响[考虑一到两年后在正常公司的晋升机会和薪资提升(每年 10% 到 20%)]。取决于授予雇员的股份和期权比例的不同,这部分的风险可以全部或者部分地通过股份或期权得到补偿。
  • 对于创业公司来说,我们常常会混淆雇员与合伙人的身份,这样造成的结果可能是,我们在互相合作的过程中造成的误会,最终一步步分裂我们的关系,造成了并不愉快且无法弥补的结果。所以从一开始,就应该分配好各自的角色,设定每一个角色应该承担的责任和应该得到怎样的福利。我们需要承诺,但是并不需要不切实际的承诺。创业公司在招聘时和应聘者的互相博弈中,不仅要让他们看见公司的 “美”,也要把 “丑” 展现出来。

几个朋友合伙创业,如何分配股权?

  • 这些技术性因素不是全部,甚至是次要的,人的因素才是最重要的。团队分配股权,从根本上讲是要让创始人在分配和讨论的过程中,从心眼里感觉到合理、公平,从而事后甚至忘掉这个分配,而集中精力做公司。这是最核心的,也是创始人容易忽略的
  • 绝大多数情况下,对于一个创业公司的创始人,保持控制力和获得经济回报难以两全其美。因为一个初创公司需要获得外部资源来创造价值,而获取外部资源通常要求创始人削弱其控制力(例如,不做 CEO,让别人加入董事会)。
  • 技术:互联网业是一个创新频度高、小企业成长快的行业,同时互联网技术的演进速度也是非常迅速的,互联网技术的门槛,与以硬件为主导的传统科技业相比,是日益降低的。因此随着互联网公司的不断涌现,独有的技术专利和技术机密在互联网行业越来越难形成竞争的门槛。

想请一个资历和能力都很强的人来做创业团队的顾问,以什么形式合作会比较好?

  • 周源一直觉得,愿意帮助早期团队的人都不是为了具体利益,或者说如果以某种具体利益的方式来体现他的帮助,觉得会非常奇怪。
  • 互联网从来都是 3 年一小浪,10 年一大浪。
  • 第二,利益分配一般有项目薪资、月薪资、股份三种,如时间点、周期明确,建议按项目走,如不确定,按月走(基本都不确定)。常见的是月薪资 + 股份的形式,纯粹薪资可能要求会比较高,顾问有了股份也可以绑定利益促进投入。
  • 海岩所著《大染坊》中陈六子结交苗瀚东的故事可供借鉴。

天使投资一般占多少股份,怎么算?

  • 创业者要少拿钱、少出让股份
  • 越早期的项目,其项目或产品的成功更多依赖于创始团队,所以大多数投资者谈投资,言必称团队比产品重要。
  • 我们的做法是,统一标准,20 万元 8%,投资前估值 230 万元。是的,在你一行代码未写的情况下,一个团队一个 idea,估值 230 万元,标准化了。

看 BP(商业计划书)的人最想从中得到的是什么?BP 应包含哪些内容?

  • 从蒋亚萌的角度来说,他会看商业计划书里的两个内容:一是写了什么,二是怎么写的。
  • 事实、数据、判断和洞察。
  • 其次,公司的增长最好来自市场本身的增长,而非抢夺竞争对手的份额。
  • 再次,公司有机会成为市场中具有支配地位的第一或第二。
  • 第一,一个最简单的思考竞争优势的框架:(一)用户愿意为你的产品或服务付的价格;(二)成本。一个公司要么的能够让用户为类似的服务付更多的钱,要么能以更低的成本满足需求。
  • 第二,竞争优势能否持续。这样公司可以在一段相当的时间内,获得超额的利润和回报。
  • 首先包括公司有一个仔细思考过的业务和产品发展计划步骤。达到每个目标需要什么样的资源和多长时间。这样团队可以以最少的稀释获得发展所需的资源。
  • 如果有对赌和反稀释条款存在,找这类人绝对是下策。

如果有机会和天使投资人进行面对面沟通,该准备些什么?

  • 其实沟通是一种能力展示,能力主要包含三方面:1.大格局:对产业的理解,用户的理解,解决问题的清晰思路、战略发展规划和竞争应对;2.细节把控能力:你需要举几个具体的例子来表现你在行业中的经验以及用户的了解深度,最好有之前做过的实际案例;3.团队:团队的能力搭配是否能够满足做成这件事。

投资人通过哪些方面来判断一个早期创业者的好坏?

  • 13 年前我曾和雷军共事,至今他的风格没有太大改变,但是格局感让人敬佩。

好的投资人应该是什么样的?

  • 我反对创业者与投资者签对赌协议,因为这种协议破坏的是信任关系。

假如没有天使及 VC 的投资,创业公司如何活下去?

  • 因此前期你打算做某一个项目,不论它发展潜力有多大,你还得准备至少 18 个月的资金去做,产品出来后,你要营销推广,你要运营,在你项目赚钱之前,你可能已经用了好几个月的时间。

亲历者说 周鸿 :创业者应该签对赌协议吗?

  • 融资价格高也并不代表真正的成功,融资只是一种手段,最重要的还是要把你企业的产品和市场做好。
  • 投资人很喜欢我,因为他们都从我身上赚了很多的钱,但是我也感觉得到了他们很多的帮助。我记得刘少奇说过一句话:“吃小亏占大便宜,有的人是占小便宜吃大亏。”
  • 此外,证监会是鼓励并购对赌的,这是对股民利益的保护措施。
  • 上述条款,只是一个例子,实践中,对赌条款各种各样,企业家必须要做模拟推演,考虑比较极端的情况,而且尽可能拒绝个人资产连带责任的情形。

30 人~50 人的团队,如何提高团队管理能力?

  • 执行力是落实工作和实现目标的能力,一是如何能制定合理的可量化的目标,二是执行人的能力是否可以胜任,三是如何检查和评价目标完成情况,四是奖惩是否合理且可操作。
  • 惩罚不是必需的,尤其对于创业团队,士气和激情更重要,可以根据目标完成情况进行奖励,对一个团队而言,表扬比惩罚的激励作用要好,不适合的人要淘汰。
  • 如果一个人在他的岗位上做不好(不是在上升的过程中),那么最好的办法是把他换到更合适的地方去。
  • 家庭第一,工作第二,家里有事,可以马上放下工作。这点让大家很有安全感。事实表明,当家庭和工作发生冲突时,大家都能处理得很好,不会让工作做不下去。
  • 在工作上,我喜欢有挑战性的工作。一个新创意,一款新产品,从构想变成现实,这样的成就感会有多大!保持创业的心态,危机感令人清醒和保持激情,这样锻炼出来的人不容易被这个社会淘汰。看看那些在公司安逸了多少年的员工吧,他们越来越没有跳槽的自信。
  • 林肯说过,幽默是一种润肤膏,它使我避免了许多摩擦和痛苦。

the one thing

背景

看到书单君的推荐,就拿过来看看

一些有趣的观点

  • “每次获得巨大成功的时候,都是我专注于一件事的时候。获得成功,只需要做对的事,而不是做对每件事。”
  • 做好一件恰当的事,其能量足以推动数件事,甚至更多。12有人还专门就此做过验证。2009 年11月13 日, 魏捷斯多米诺公司在荷兰吕伐登市进行 一场破纪录的表演——4491863块多米诺骨牌接连倒下,盛况空前。这场表演里,每一块骨牌释放的能量积聚起来,将高达94 000 焦耳,相当于一个成年男子做 545次俯卧撑。每一块骨牌都代表一个单位的潜在能量,骨牌越多就代表积累起更多的能量。积起一定量的骨牌后,轻轻一触就能激发 出惊人的效力。
  • “更明确一点儿来讲,大部分的待办清单其实是‘存活清单’,只能帮你应付日子,对迈向成功毫无帮助。”
  • “也就是说,对成功而言,分配也是不公的,小因成大果的事屡见不鲜。只要恰到好处地付出,就会获得最佳结果。绝大部分所得恰恰是靠较少部分付出而获得的。”
  • 我们不是时间太少、事情太 多,而是一直在暗示自己要同时做更多的事。
  • 伏尔泰曾经写道:“判断一个人,要从他提出的问题而不是给出的答案出发。” 对待工作和生活,同样如此,我们如何对自己提出问题,决定了我们未来将如何生活。
  • 作者提供了一个适用于所有人的关键问题:我做了哪件最重要的事,才让生活变得更简单或是让其他的事都不再必要了?
    • “我能做的最重要的事是什么?”
    • “做了这件事就会……”
    • “…… 让其他事变得更简单或是不必要了。”
  • 关键问题会在人生中的不同阶段引领你找到你最重要的那件事。在不同的时期,你只需要转移自己的注意力,重新思考关键问题到底是什么。
  • 用倒推法设立目标
  • 一个好问题通常有四种构成
    • 大而广 - 第一象限。大而具体—“我如何做才能使销量在半年内增加一倍呢?”
    • 大而具体
      • 第二象限。大而广 —“我如何做才能使销量增加一倍呢?”
    • 小而广
      • 第三象限。小而广 —“我如何做才能增加销量?”
    • 小而具体
      • 第四象限。小而具体 —“我如何做才能使今年的销量增加 5% ?”
  • “若同时追两只兔子,你一只也抓不到。”

来源

write your asm code

最近对 “底层” 着迷了起来,找了一本深入理解计算机系统和王爽的汇编语言,开始啃了起来。

其实大学的时候也上过汇编的课,而且是用那本异常坑爹的 IBM80X86,上了一个学期的课,还不如我这两个礼拜啃的汇编。

汇编语言其实一点都不底层,只是平时写脚本写多了,不适应罢了。

你要明白一点,“底层” 编程体验对你非常非常重要,1010101010 其实能给你一种其他不同的视觉去看待
自己写的代码,非常 cool,不是么…….

不过说回来,豆瓣评论有不少吐槽,集中在版本较旧,而且保护模式没讲…… 保护模式?额,其实我也没去查……
倒是同事过来跟我吐槽说,看完这本最好再去看下那本 80×86 之类的书。

嗷嗷,所以呢,了解 “底层”,体会底层编程体验,重新学习汇编,是件好事,虽然做那些练习题很耗时间,但值得啦~

The big django

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

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

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

继续阅读

the little scheme

Introduction

scheme, a dialect of lisp.

Notes

  • The law of Car
    The primitive car is defined only for non-empty lists. The cdr of any non-empty list is always another list.
  • The law of Cons
    The primitive takes two arguments. The second argument to must be a list. The result is a list.
  • The law of Null?
    The primitive null? is defined only for lists.
  • The law of eq?
    The primitive eq? takes two arguments.Each must be a nonnumeric atom.
  • The First Commandment
    Always ask null? as the first question in expressing any function.
  • The Second Commandment
    Use cons to build lists.
  • The Third Commandment
    When building a list, describe the first typical element, and then cons it onto the natural recursion.
  • The Fourth Commandment
    Always change at least one argument while recurring. It must be changed to be closer to the termination. The changing argument must be tested in the termination condition: when using cdr, test termination with null?.
  • The Fifth Commandment
    When building a value with +, always use 0 for the value of the terminating line, for adding 0 does not change the value of an addition.
    When building a value with x, always use 1 for the value of the terminating line, for multiplying by 1 does not change the value of multiplication.
    When building a value with cons, always consider () for the value of the terminating line.

jq-sourceCode

我想没什么比阅读 john Resig 的 JQ 库更让人觉得亲切的了。

从一开始接触 js,到做一个小小的 demo,最后做一些面向单页 app 的应用,jq 库这个熟悉而又陌生的脚手架一直陪伴着我们。

而我总是会有一种阅读的冲动,每次遇到不懂的东西,我想起的第一个念头,不是怎么用,而是,它怎么实现的。于是,你就开始折腾各种框架了,不是么?

那种拨开眼前迷雾的感觉,那种看得真切的感觉,是前所未有的快乐,也许,那就叫做思考的乐趣吧。

## 为什么阅读
当然了,这个世界上,js 库多的是,jq 并不是最优秀的那个。我阅读的原因是:

  • API 文档详细清晰
  • JQ 写得很优雅(可以参考资料那一节的书籍推)
  • JQ 库使用简单,社区人多,万一读不懂可以请教前辈
  • JQ 库特有的对浏览器兼容,可以了解到很多浏览器的兼容问题
  • 大部分的库都类似的,可以精读一个,以通其他
  • 项目中大量运用到这个库,是项目的基础组件(这个倒是很实际的 XD)

## 怎么阅读

## 还可以怎么做

  • 不读 JQ 库,从实践中体悟
    大一的时候想着要通读一遍 jq 源码,最后没坚持下来,原因是,原来我连用的都没用过这个库 =.=。
    能在具体的项目中去大量使用这个库,并尝试去理解它的设计思想也可以。世界上还有其他很好的库的,
    而且实现起来,也不会有 jq 那样的晦涩难懂…
  • 读一些小型的库
    163 邮箱的 harry 大四的时候也尝试看 jq,不过他更推荐看一些小型的库帮助自己去理解一些 js 的运用。
    确实,小型库小巧,但能让你看懂,并运用在自己的项目中。
  • 看设计模式
  • 做其他有趣的应用
    是的,你是热爱编程才做这一行的,对么 XD

## 参考资料