《项目管理修炼之道》笔记

Thumbnail

随着团队规模的变大,成员之间合作的模式逐渐由单打独斗变成协作开发。 这时候会遇到很多意想不到的问题,项目管理的重要性也就显现出来了。 项目管理修炼之道 是一本讲技术类项目管理方法和实践的书。 从业者可以从这本书获得了有益的指导。 我在 Kindle 上面翻了好几遍,感觉受益匪浅,就把读书笔记拿出来供大家参考。 内容 核心内容是项目管理的生命周期和每个阶段的交付物: 项目章程 日程规划 开发(控制节奏) 结束项目,项目回顾 其他内容: 如何和投资者沟通 管理会议 控制项目节奏 关键字 项目定义:一个独特的任务或是系统化的流程,其目的是创建新的产品或服务, 产品和服务交付完成标志着项目的结束。项目都有风险,并且受制于有限的资源。 关键(章程) 驱动因素:功能集合、发布时间、缺陷等级,只能有一个 约束:环境、流程、人力资源、预算等,决定了规模 浮动因素 规划:带有项目发布条件的项目计划 日程安排:对工作项目的有序描述 发布条件:S.M.A.R.T.,需要一起协商 仪表盘 定性或者定量的方式,将结果公布出来 保持项目节奏的方法 快速开发 持续集成 自动冒烟测试 功能拆分和日程排期 按功能实现,而非架构 优先实现高价值功能 通过用户故事、角色和场景来定义需求 分离需求和 GUI 质量控制 复查:Code Review,结对编程 重构 项目成员的角色构成 项目经理 架构师 开发人员 测试人员 业务分析师 运维 我的问题和部分解答 Q:项目经理的职责是什么? ...

2014-08-31 · alswl

加班那点事儿

前段时间,一个好基友告诉我,他换了份工作,去了一家用户数据表现堪称吓人的创业公司去了。其中有一个细节引起了我的注意:他们在实行 996 的上班制度。即 9 点钟上班,9 点钟下班,一周工作 6 天。 同样实行这种制度的还有阿里的来往团队。当年(其实就是去年)在抢占移动端 IM 入口时候,马云都使用了红包政策,来往的工程师在高压之下,也实行 996 了制度。 我问过阿里的朋友,他们表示,整体加班情况的确比较多。我追问了一下加班效率,证实了我的一个猜想,有些个人是晚上加班没事干,尤其有些测试工程师,白天没活干,晚上活多,还经常等到 9 点之后才有事情。这个现象也许不是普遍的,但的确存在。 ...

2014-08-30 · alswl

痛、快、活

上个月回家,在亲戚家里和侄子聊天,他刚从大学毕业,在家人的帮助下面找了算是对口的工作,对工作之后的状态有一些茫然,看不到前途和未来,我问了一个问题: 你平时是怎么面对困难和挑战的? 犹豫了一会儿,他告诉我:「大部分时间都是逃避掉困难」。 这个问题反而让我自己开始思考:面对困难的时候,为什么更倾向于逃避,而不是挑战和面对? 困难和逃避 想要一点点对这个问题抽丝剥茧,要做的第一步就是,来定义「困难」和「挑战」。这两个词都意味着,面临的事情可能超出处理者当前的能力范畴。比如让一个游泳初学者去横渡长江,让一个厨师学徒工去做满汉全席,让一个幼儿去思索人生的意义,或者让一个工程师去管理一个技术团队。 ...

2014-08-11 · alswl

在 Raspberry Pi 上使用 AirPlay

Thumbnail

早在去年时候,我就发现有个叫做 Raspberry Pi 的玩意, 已经忘了是从那里得知这个东西。这个卡片大小的电路板是可以运行 Debian 的主机,提供了一个发挥自己想象的平台。13 年 南京极客行动 时候,Michael 好像还拿了一个板子参加比赛。 我对这个东西充满了兴趣,仅售 $39 的主机,小巧的机身, 可以充分发挥自己的想象力:离线下载,动作片播放器,家庭分享中心, 给侄子学习编程~想到这些可以发挥自己的创造力, 就迫不及待的要去采购并去尝试。 不过我还是理智的压抑住自己的情感,手头老是有更重要的事情要去做,实在不能再给自己多找一个精力分散的方向。 于是,我这么一压抑,就压抑了一年。 ...

2014-07-23 · alswl

读《如何高效学习》

Learn More Study Less(如何高效学习) 讲的是作者斯科特·扬如何快速学习的方法和技巧。 我在 Kindle 上面阅读了这本书,并用书中的方法学习这本书,顺便做了一些笔记。 A. 目的 学习「整体性学习」方法,从而快速学习并且将学到的知识更高效合理的利用起来。 (所谓聪明,就是指学得更快,而且信息组织非常适合完成自己的目标)。 B. 整体性学习的定义 知识并非孤立,学习任何知识(概念、定义、公式、问题、观念、理论等)都需要联系。 C. 整体性学习的策略 1. 关键元素 建立结构(某个领域内,紧密联系的知识),让其中的知识尽可能多的联系。 通用结构:感知结构(视觉、嗅觉、听觉、味觉、触觉) 关系结构(群体关系等) 基础数学结构 时间结构(@alswl 自己横向扩展想到的) 利用模型(类似于知识框架和体系以及其他存储方式) 高速公路(在不同的结构之间进行联系,激发创造力) 2. 5 个学习的步骤 获取 关键:简化、容量、速度 理解 拓展 深度拓展:知识的深度,虽花费时间但有效 横向拓展:知识的周边,有相关性的拓展,需要借助模型 纵向拓展:跨结构的知识,比喻和内在化是一种手段 纠错 应用 (@alswl 可以想到软件开发中的需求获取、需求分析、需求挖掘、测试、 开发这些对应的另外一个软件开发结构中的联系) ...

2014-04-13 · alswl

hiredis 源码学习

前段时间学习 Redis 时候,听到 hiredis 的大名,正好也在做异步的学习,就找来代码学习一下。 我几乎不太会 C,仅限于最简单的语法,完全没有在生产环境中写过, 所以先看个 Client 简单代码,下次看 Memcached 代码应该会更顺畅一些。 Hiredis 是用 C 写的 Redis 客户端,对 Redis 协议进行了简单的封装, 同时提供了同步和异步的两种 API。Hiredis 的代码位于 https://github.com/redis/hiredis。 一分钟使用入门 同步 API 的调用方法: redisContext *context = redisConnect("127.0.0.1", 6379); reply = redisCommand(context, "SET foo %s", value); printf("PING: %s\n", reply->str); freeReplyObject(reply) redisFree(context); Redis ae 异步 API 的调用方法,使用 Redis 自己的 ae 事件库, 至于为什么 Redis 没有使用 libevent 或者 libev,可以参考 Reason, 中文翻译: ...

2014-03-30 · alswl

Java 运行参数调整

JVM 在线上运行的时候,可以调整一些运行参数,查看参数帮助如下: 运行 java -h 可以看到 Java 运行可调整的参数。 运行 java -X 可以查看 Java 支持的额外参数。 注意一些参数的默认开启在 JDK6 和 JDK7 之间会有差异,甚至在 JDK7 的不同 update 也会有差异,运行 java -XX:+PrintFlagsFinal 查看默认的参数配置。 参考: Java HotSpot VM Options The most complete list of -XX options for Java JVM Tuning JVM Garbage Collection for Production Deployments JVM -XX: 参数介绍 以下是一些经验调整: -d64 # 运行在 64 位数据模式下 -server # 选择 server VM -Xms1024m # 初始堆大小,直接固定到 Xmx -Xmx1024m # 最大堆大小,根据服务器性能和请求量调整,太大了会导致 GC 时间太长 -XX:+DoEscapeAnalysis: # 支持逃逸分析(将局部对象实例存储在栈上) # http://www.iteye.com/topic/473355 -XX:+UseTLAB # Use thread-local object allocation # 使用本地线程实例存储,可以减少堆共享锁的竞争 -XX:-RelaxAccessControlCheck # Relax the access control checks in the verifier # JDK7 默认不开启 -XX:+AggressiveOpts # Enable aggressive optimizations - see arguments.cpp # 启用最新 JVM 调优成果 -XX:+UseBiasedLocking # Enable biased locking in JVM # 偏向锁(建议去了解一下轻量级锁和偏向锁) # 优化单线程程序下面锁资源速度,不适合多线程(所以到底 +/- 我存疑) # http://www.iteye.com/topic/518066 -XX:+UseFastAccessorMethods # Use fast method entry code for accessor methods # 优化 get/set 方法 -XX:ThreadStackSize # Thread Stack Size (in Kbytes) # 经验值 4096 -XX:+UseLargePages # Use large page memory # 大内存分页 -XX:+UseStringCache # Enables caching of commonly allocated strings. # 启用缓存常用的字符串 -XX:+UseCompressedStrings: Use a byte[] for Strings which can be represented as pure ASCII. (Introduced in Java 6 Update 21 Performance Release) # 降低内存消耗,浪费一点 CPU # http://stackoverflow.com/questions/8833385/is-support-for-compressed-strings-being-dropped -XX:+OptimizeStringConcat: Optimize String concatenation operations where possible. (Introduced in Java 6 Update 20) # 优化字符串连接,对模板渲染操作应该会很有意义 -XX:MaxPermSize # Maximum size of permanent generation (in bytes) # 经验值 128m

2014-03-22 · alswl

Redis 到底有多快[译文]

Thumbnail

原文地址 http://redis.io/topics/benchmarks。 拖了一个半月的稿子~ Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求。 (类似于 Apache ab 程序)。你可以使用 redis-benchmark -h 来查看基准参数。 以下参数被支持: Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] -h <hostname> Server hostname (default 127.0.0.1) -p <port> Server port (default 6379) -s <socket> Server socket (overrides host and port) -c <clients> Number of parallel connections (default 50) -n <requests> Total number of requests (default 10000) -d <size> Data size of SET/GET value in bytes (default 2) -k <boolean> 1=keep alive 0=reconnect (default 1) -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD Using this option the benchmark will get/set keys in the form mykey_rand:000000012456 instead of constant keys, the <keyspacelen> argument determines the max number of values for the random number. For instance if set to 10 only rand:000000000000 - rand:000000000009 range will be allowed. -P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline). -q Quiet. Just show query/sec values --csv Output in CSV format -l Loop. Run the tests forever -t <tests> Only run the comma separated list of tests. The test names are the same as the ones produced as output. -I Idle mode. Just open N idle connections and wait. 你需要在基准测试之前启动一个 Redis 实例。一般这样启动测试: ...

2014-02-23 · alswl

从 SVN 到 Git,找回丢失的历史

前段时间在将公司的 SVN 项目迁移到 Git 上面去,遇到一个很少见的问题: 有一个小伙伴使用 git-svn 做 rename 操作时候,将一个目录 svn mv 了, 导致新目录只存了最近几个月提交历史,丢失了历史信息。对团队开发而言, 历史提交是非常宝贵的财产,我们想了一些办法,把这些数据提取出来。 # 找出丢失之前的版本,列出丢失目录上层的操作记录。 svn log -l 2000 svn://log4d.com/trunk/apps/ios/ | less # 将重命名之前的版本拷贝到一个临时目录 svn copy svn://log4d.com/trunk/apps/ios/nami@43252 svn://log4d.com/trunk/apps/ios/nami_lost # 准备现有代码到 Git git svn clone svn://log4d.com/ -T trunk/apps/ios/nami -t tags -b branches -r 13532 nami # 修改 .git/config 来加入丢失的历史数据 Remote [svn-remote "svn-lost"] url = svn://log4d.com fetch = trunk/apps/ios/nami_lost:refs/remotes/trunk-lost # 并抓取 Remote 内容 git svn fetch # Rebase 新代码到恢复过来的历史记录上 git checkout master git rebase --committer-date-is-author-date trunk-lost 其中注意的是手动添加一个 svn-remote 地址为历史数据副本地址。 还有就是 rebase 时候参数 --committer-date-is-author-date 可以保证 rebase 不会造成提交时间被修改,方便回溯。 ...

2014-01-21 · alswl

Goodbye 2013, Hello 2014

Thumbnail

2013 年末,我给自己制定了几个年度目标: 离梦想更近一步 找一个靠谱的姑娘,我感觉她需要我,我也需要她了 成为一个为百万用户级别提供技术支撑的人物,要能独当一面 帮助网站进行性能优化 制定规则,平衡猥琐实现和优雅 继续写博客,分享积累 + 翻译文章 关于感情 先来谈谈感情,我和她在一起一年半了,虽然偶尔有小摩擦,但总体上面还是非常幸福的。 找到一个能产生共鸣,生活兴趣相近,相互欣赏的人太难了。一定会珍惜的。 关于工作 再谈谈协作,相当艰辛的跨过了去年年末的痛苦挣扎,然后看待事物和进行平衡选择时候 就没那么痛苦了。我的一大问题就是,从小认为人或事都可以非黑即白,这种决定性的判断, 会让我在处理事情时候,失去对重心的控制,有可能花费大量时间在细枝末节的地方。 2013 年初时候,我甚至想一度放弃,而熬过来之后,工作就又变得非常开心, 现在可以包容别人的不同意见,尝试寻找相同共性(虽然处理的能力还不够)。 ...

2013-12-31 · alswl