2011总结

2011总结
1月,全网消保项目发布,跟踪后续修改。跟进退款项目。
2月,第一次飞机出国,去了泰国,玩了曼谷,素林群岛,泰国还是要再去的,好玩的地方很多,很值得深入发掘。回来之后落地澳门,觉得澳门好小。 PS:第一次在机场过新年。
3月8,从淘宝离职,之后去北京游荡2周。访友+游玩。

4月11,入职新公司。
5月,回家看父母,一切无大碍。觉得父母老了,需要更多的以来我们了,肩上的担子更重了。
9月,中秋节去昆山扫墓,祭拜爷爷。
10月,国庆HK,澳门3日游。看看腐朽的资本主义。发现HK真没什么好玩的,以后还是走的远点比较好。
开始海购,买了一堆东西自用或者方便同事。

遗憾:
1,堆积了一堆书没来得及看,希望2012年腾出更多时间看书,学习技术。
2,开始身体锻炼,但是还不够坚持。
3,公司事务熟悉了,但是系统稳定性和架构上面努力还不够,明年还要继续加油。

进步:
1,tw和qq群里认识了一些好玩的人。
2,换工作成功。
3,MBP上面的软件开始正版化,购买了Papers2,Hazel,Snippets,TextMate。
so,明年就奔三了,继续努力。

【读书】版本控制之道-使用Git

版本控制之道– 试用Git

Git的优势:
1,分布式体系结构,完全断网操作;
2,分布与合作操作很容易,创建分支,合并分支简单快捷;

git通过对提交内容进行SHA1 Hash计算,得到他们的SHA1串值,作为每个提交的唯一标识。
使用版本库中的元数据产生提交名称。这些元数据包括提交者的个人信息及提交的时间戳。当然,产生相同哈希码的可能性也是存在的,但是这种可能性非常的低,可以忽略。从数学的角度考虑,可能性是2的63次方分之一。

ls| more 查看当前git目录的结构:

FETCH_HEAD #

HEAD #

ORIG_HEAD #

description #项目的描述信息

hooks #默认的hooks脚本文件

index #索引文件,git add后要把添加的项暂存到这里。(是工作目录树和版本库之间的缓冲区。)

info #里面有一个exclude文件,制定本项目要忽略的文件

logs #各个ref的历史信息

objects #这个目录非常重要,里面存储的都是git的数据对象

#包括 ,commits(提交),tree(树对象),blobs(二进制对象),tags(标签对象)

packed-refs #

refs #标识着你的每个分支指向那个提交(commit)

每个提交都是一个树对象。一个树对象可以引用一个或多个二进制对象。每个二进制对象都对应一个文件。更进一步,树对象也可以引用其他的树对象,从而构成一个目录层次结构。

如果通过git,ssh协议传输,服务器端会在传输前是把需要传输的各种对象先打好包再进行传输,而http(s)协议则会反复请求要传输的不同对象。

git把它所管理的所有对象,全部根据内容生成SHA1哈希串值作为对象名。这样的好处是:

1,git只要比较对象名,就可以很快的判断出两个对象的内容是否相同。

2,因为在每个仓库的“对象名“的计算犯法都完全一样,如果同样的内容存在两个不同的仓库中,就会存在相同的”对象名“。

3,git还可以通过检查对象内容的SHA1的哈希值和”对象名“是否匹配,来判断对象内容是否正确。

No delta, just snapshot

传统系统使用的是: 增量文件系统,(delta storge systems)

他们存储的是每次提交之间的差异。git正好相反,保存的是每次提交的完整内容(SNAPSHOT)。会在提交前根据要提交的内容求SHA1哈希串值作为对象名,看仓库内是否有相同的对象,如果没有就将“.git/objects”目录创建对应的对象,如果有就重用已有的对象,以节约空间。

SHA使用git hash-object来计算的。commit object内容是tree SHA,commiter/时间戳,author/时间戳。即使是tree SHA一致,后面两部分不同,最后的SHA就不同。

相关命令:

git init 初始化版本库

git add fileName 将文件加入版本库的索引(index),然后提交。

git commit -m “commit message” 提交文件,其中commit message作为注释。

git log 显示提交名称。git用来跟踪提交。

git status 显示工作目录树的状态,类似于SVN的工作拷贝。

git branch 创建分支,该命令需要2个参数:新分支名称和父分支名称。
git branch -d 删除分支,只是删除了分支的名字,并不会删除分支上的任何内容。

git tag 给Git中的代码打标签,该命令需要2个参数:标签名称和对应的分支。
标签以一个简单的名称(即标签名)来标记版本库历史中某个特定的点。

git checkout master 切换回主分支(切换分支)

git rebase(变基命令) 转换到那个分支的末端。把一条分支上的修改在另一条分支的末端重现。

git branck -d branchName 删除分支,只是删除了分支的名称,并不会删除分支上任何实际内容。只要标签还在,从标签到版本树起点的一连串提交记录就都在。

git archive 将标签对应的版本内容打包。

git mv srcName newName 移动文件

在文件.gitignore中设定本地忽略的文件名称

合并分支间的操作:

直接合并(straight merge):把两条分支上的历史轨迹合并,交汇到一起。
git merge alternate

压合合并(squashed commits):将一条分支上的若干个提交条目呀合成一个提交条目,提交到另一个分支的末端。
git merge –squash branchName

挑拣合并(cherry-picking):挑选另一条分支上的某个提交条目的改动到当前分支上。
git cherry-pick SHA1 ID
-n 参数标明创建提交前需要连续进行合并操作。

git blame fileName 查看特定代码块的历史信息

git revert 反转提交

git reset –hard HEAD^(复位2个提交)
–hard 会从版本库和工作目录树中同时删除提交。好像版本库中的删除键,并且不可以恢复。

改写历史:
1,重新排序提交:
git rebase -i HEAD~3 排列最新3个提交

2,将多个提交合并成一个提交:
git rebase -i versionID
调整好次序,将需要合并的pick修改为squash。

3,将一个大的提交分解为多个提交:
运行 git rebase -i HEAD~4
将需要修改需要分拆的提交 pick修改为edit
运行 git log –1显示最后一个提交。也就是需要编辑的内容。
git reset HEAD~ 撤销本次调教

git diff 显示等待提交的变更。 修改文件后单独提交。

然后运行 git rebase –continue 继续进行其他提交。

git branch -r 查看远程版本库的变动。

与远程版本库协作

Git与网络上的远程版本库通信,这里所说的网络可以是内部局域网,虚拟专用网或者是因特网。Git提供了三种与远程版本库通信的协议:

1,Git:
优势在于速度,在Git中是最快的网络协议。但比较麻烦的是它必须试用9418端口,而这个端口的通信一般会受到防火墙的限制。git与ssh的区别是,git协议无需加密,且是匿名的。

一种常见的方式是,开发人员使用git协议将远程版本库中的更新拖入本地版本库,而使用SSH协议将本地版本库中的更新推入远程版本库中。

2,SSH:
通过SSH访问,与直接通过文件系统访问非常相似。唯一不同的是,在指定远程版本库路径前,还必须为它制定域名服务器和用户名。

3,HTTP/HTTPS:
在Git中使用HTTP协议通信协议效率最低。但是它的好处在于,能通过严格的防火墙,且易于架设。

管理本地版本库

1,用标签标记项目里程碑

版本库里的标签就像书签,使用它们可以方便回到版本库上打了标签的点。在Git中,可以随心所愿地给任意打标签。标签最常用于给项目代码的发布版本做标识,以便以后在需要修正或功能变更时,可以通过标签或到该发布代码上。

Git标签是只读的,在Git中不能像修改分支的内容一样修改标签内容。

在代码发布过程中处理好发布分支,以便集中经历做好开发

2,发布分支的处理

发布分支通常只需要少许改动,往往侧重于Bug或逻辑修正, 很少会添加新功能。发布分支通常以RB_作为前缀并包含版本号。发布分支持续时间不长,通常只用于发布代码时的最终测试起家你,一旦该版本发布,应该使用标签标记项目,然后就可以删除该发布分支了。

高阶功能

压缩版本库 git gc

导出版本库 git archive

分支变基到新的基点

重现版本库中隐藏的历史 git reflog

使用二分法在版本库中查找引入Bug时间点 git bisect start, git bisect bad

PS:
git不会跟踪空目录。

newCreator 部分文章采集

newcreator收集

Newsstand 分析:

目前的数字出版品分为以下几类:

1,通用型(universal)。指的是一种通用的内容技术规格。EPUB3。

2,技术厂商独有的规格。Adobe Folio或许是占有率最高的一种。但是有一个隐形的规格,只能试用Adobe自家的生产工具生成,后续的提交也必须通过他们的服务,而每一项服务也需要支付Adobe相当的费用。

3,复杂的应用程序(App)。不是一般中小型出版商会采用的模式,但若遇到技术高强的团队,几个人呢或许真的能够开发出不错的应用程序。比较麻烦的是格式的制定,工具的整合。但这种模式可以作出截然不同,独个性的杂志。

4,简要性的应用程序。内容策略上多半属于“复合型”做法。需要一些额外的设置,但是需要的人力和技术比之前的几种低很多。

5,最后一种,就是直接拿print PDF上架,会直接用Zinio的方案。

资讯打包的方式,不管是App或Web,本身就构成了一份“刊物”的要素,我也希望它稳定的留在那里,等待读者安排时间阅读。这样的Web刊物,大概又分成2种:

1,完全以Web连接的方式存储,可以将他保存到iOS的主屏幕页面,能够取到离线内容,例如 Aside Magazine

2,内容虽然是HTML5 Web形态,但打包成App模式上架到App Store,读者可以下载,购买,甚至也能订阅。

这方案目前最大的问题是效能太差,使用的体验不及原生程序般顺畅。

W3C持续规划的网页规格,实际上也逐步让这种易读,更美观弹性的排版方式,获得更多支撑。

电子书的轻轨系统

自助出版平台:

每个作家站点都具备最基本的写作与制书机制,趋近于leanpub.com

作家站点真正的核心不是“制书”,而是“版权管理”,所以真正的重点是“授权机制”。所以要让整个系统得以运作,建立一个接近“虚拟经济人”的架构,当做加能够有方便的机制,合适的范本进行最有利的授权管理,就能够改变许多。

電子書真的需要 ISBN 嗎?

从目前各项发展看来,电子书的辨识将一分为二:一种是“显性的”,给网络,读者辨识之用;另一种是隐性的,给电脑系统辨识之用。前者是URI(Uniform Resource Identifier),后者则是UUID(Universally UNique Identifier)。

定位技术列举(LBS)

看到有介绍定位技术的帖子,按照自己的口味整理汇总一下,资料大部分来源于知乎,另外个人补充了一下资料。
常见定位技术有哪些?:这里
知乎讨论帖:这里

目前的定位精准度的顺序是:室内多点 WiFi AP > 民用 GPS 室外定位 > 室外 WiFi AP 定位 > 基站定位。
目前常用的定位方式有:GPS定位,基站定位,wifi定位,IP定位,RFID/二维码等标识定位,蓝牙定位,场景识别定位。技术上可以采用1种或多种混合。

1,关于GPS定位(A-GPS):
常见的GPS定位原理如下:由24颗工作卫星组成,位于距地表20 200KM的高度,均匀分布于6个轨道面上(每个轨道面4颗),轨道倾角55度。卫星的分布使得在全球任何地方,任何事都可以观测到4颗以上的卫星,并能保持定位解算精度的几何图像。这就提供了在时间上连续的全球导航能力。然后测量出已知位置的卫星到用户接收机之间的距离,综合多颗卫星的数据就可知道接收机的具体位置。由于卫星广播信道速率非常低,信号强度非常弱,这个时间通常会非常长。因此通过GPS定位时候,需要很长时间去定位。这也就是为啥GPS定位会先出现一个大圈的原因。

GPS卫星使用的伪码有2种:分别是民用的C/A码 (Coarse/ Acquisition Code11023MHz) 和军用的P(Y)码 (Procise Code 10123MHz) 。P 码因频率较高,不易受干扰,定位精度高,因此受美国军方管制,并设有密码,一般民间无法解读,主要为美国军方服务。民用精度为10米,军用精度约为1米。

优点在于无辐射,但是穿透力弱,无法穿透钢筋水泥。通常需要在室外看得到天的状态才行。而且需要多颗卫星才能定位,因此信号被遮挡或削减的情况下,会出现偏移。
如果我们在进行定位之前能够事先知道我们的粗略位置,查找卫星的速度就可以大大缩短。

A-GPS(asssted GPS)用来解决 GPS 设备冷启动定位缓慢的问题的。
A-GPS是一种结合网络基站信息和GPS信息对移动台进行定位的技术,既利用全球卫星定位系统GPS,又利用移动基站,解决了GPS覆盖的问题,可以在2代的G、C网络和3G网络中使用。但是,该技术需要在手机内增加A-GPS模块。

A-GPS对比单纯的GPS有以下优点:
1,缩短定位时间:利用移动网络传输GPS辅助信息,提高数据传输速度。
2,降低终端耗电:不需要全频道扫描。
3,提升了定位灵敏度:利用移动网络传输了GPS辅助信息。
4,借助移动网络定位,可在GPS定位失败时提供Cell ID定位结果。如被定位终端在室内或地下等环境时,无法实现GPS定位,则AGPS服务器会自动通过Cell ID方式获得被定位用户的粗精度位置提供给后台SP/SI,实现了定位服务的无缝连接。

iPhone就使用了A-GPS,即基站或wifi初步定位后,根据机器内存储的GPS信息来快速寻星,然后进行GPS定位。此外,iPhone4内置三轴陀螺仪,可以用来辅助定位。但是三轴陀螺仪定位的误差会随着时间逐渐积累。 详细可以看如下文章:三轴陀螺仪与加速度计如何辅助Iphone定位的:这里

2,关于基站定位(Cell ID定位):

Cell ID代表一个移动基站,可以通过查询转换成基站的具体地理坐标。然后收集多个基站的信息,确定具体位置,一般的三角定位也就是这样的。

3,关于wifi AP定位:
定位方式类似基站定位,不过是有客户端侦测附近的wifi信号和强弱程度,然后发送给服务器。服务器按照这些信息,计算出大概的位置。

PS:苹果使用的wifi定位服务:这里

4:关于RFID定位:

RFID:通过设置一定数量的读卡器和架设天线,根据读卡器接收信号的强弱、到达时间、角度来定位。目前无法做到精准定位,布设读卡器和天线需要有大量的工程实践经验难度大,另外从成本上来讲WIFI经济实用些。

【读书】黑客与画家

感觉就是一个随笔,讲述了各个方面,后面就是Lisp的介绍,最后介绍了流行语言的要素,故事性不错,最终留下因西藏的也就是Lisp的特性,如下:

为什么Lisp预言很特别,一诞生就包含了9种新思想。

1,条件结构(即if-then-else结构);

2,函数也是一种数据类型;

3,递归;

4,变量的动态类型。在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有。复制变量就相当于复制指针,而不是复制它们只想的数据;

5,垃圾回收机制;

6,程序由表达式组成。Lisp程序是一些表达式树的集合,每个表达式都返回一个值。

7,符号类型,符号实际上是一种指针,指向存储在散列表中的字符串。所以,比较两个符号是否相等,只要看他们的指针是否一样就行了,不用逐个字符比较。

8,代码使用符号和常量组成的树形表示法。

9,无论什么时候,整个预言都是可用的。Lisp并不真正区分读取期,编译期和运行期。

说Lisp语言古怪倒不是因为他的语法很古怪,而是因为它根本没有语法,程序直接以解析树(parse tree)的形式表达出来。在其他预言中,这种形式只是经过解析在后台产生,但是Lisp直接采用它作为表达形式。它由列表构成,而列表则是Lisp的基本数据结构。

【读书】程序员的思维修炼 -- 开发认知潜能的九堂课(3)(完)

第七章 积累经验
积累经验是学习和成长的关键--我们通过实践的方法学习,效果最好。
失败是成功的关键--但不是任意的失败,你需要管理好失败。你需要有良好的学习环境来帮助你,这样你可以更容易地从失败和成功中积累并应用经验。

第八章 控制注意力
你需要更加主动的管理思维,必须能够将重点放在你所需要的信息上,过滤掉身边大量的无用信息,在恰当的时候获取到恰当的信息。既不会被无关紧要的细节所迷惑,也不会错失任何微妙的线索。
注意力表现为关注感兴趣的领域。你可以仅关注相当少的事情,让在此之外的,事件和见解逃离你的注意。

需要平均20分钟返回到原来的工作状态。

第九章 超越专家
请记住老习惯依然存在,如果你又回到了以前的某个习惯,不要太责怪自己。大脑就是这样工作的。只要承认失误即可,按照新的想法继续
前进,当然老习惯肯定会再次发生,但是要意识到它的出现,并重新回到正确的道路上去。

认识你自己,认识当前时刻,认识你所处的情境。我认为失败的最大原因就是我们往往让事情自由发展。

世界:充满了复杂和丰富的细节。这是我们都在面对的挑战--完全看清世界,不断看清世界,和我们自己。

----------------------------------------------------
本书讲了很多关于大脑分析,习惯分析,思维定势,其目的就是让我们更加了解我们的大脑,了解我们的自身的习惯,行为的根本,无非就会涉及到GTD,个人时间管理,是一种大的观念规划。让我们拓宽思维,用程序的思维去讲一些非程序的事情,理解我们的大脑,提高自身的成就。

【读书】程序员的思维修炼 -- 开发认知潜能的九堂课(2)

第四章 利用右脑
我们容易忽略不寻常的或者感觉不舒服的想法,而这恰恰事很糟糕的事情。你丢弃的可能是一生中最有价值的想法。

多感官的反馈是增强理解和记忆非常有效的方法。

思维的两种方式天生就是一起工作的。例如,首先运用类比方法来解决关联性、理论性的问题,然后运用分析法来验证你的想法。不过请记住,这不是单向旅途,你需要回到R型以保持思维的流畅。R型是源头,你要给他自由、无限的空间。

不要太着急。解决问题时,学会轻松面对不确定的事情。进行创造时,坦然面对荒谬和不切实际的东西。学习过程中,不要太迫于学会和记忆,首先只是适应它。试着先理解其意思,掌握主旨思想。

隐喻(metaphor)源自希腊语metaphora,意思是“转移”,表示你正在以一种事实上不可能的方式把一个事物的属性转移到另一个事物上。

在任何情况下,幽默的能力都来自于发掘或扩展常规之外的关系,真正突破思维界限。

你的大脑存储着它接收到的一切输入。但是,虽然存储着,它不一定会索引这些记忆。

R型思维都在努力告诉你一些内心想要知道的事情。

一旦开始写作,一定要注意坚持不懈。不要为技术问题而分心。不必担心有些话是不是还需要润色,先把它们都写下来。

排版对感知具有很强的影响--无论是好是坏。

拥有创造力和问题解决能力的关键在于寻找思考问题的不同方式。不同的关联会强制R型发起不同的搜索,这样新的素材可能立即就会出现。

第五章 调试你的大脑
了解认知偏见
1,思维定势,只是看到一个数字就会影响你随后对数字的预测和决定。
2,基本归因错误,行为经常是对情景的响应而不是基本的个性使然。
3,自私的偏见,这种偏见使人们相信,项目的成功是我的功劳,失败则与我无关。
4,需要定论,我们对疑问和不确定性感到不舒服--这种感觉如此强烈,我们会竭尽全力解决未有定论的问题,移除不确定性,进而得出定论。
5,认知上的偏见,每一个人都根据自己的成见和喜好原则来选择相应的事实。
6,曝光效应,我们往往只因为非常熟悉某些事物而对它有所偏爱。
7,霍桑效应,人们在知道自己正被审视时,往往会改变自己的行为。
8,虚假记忆,大脑很容易把想象的事件和真实的记忆混淆。
9,符号约简谬论,
10,名词谬论,符号约简谬论的一种形式,认为给事物贴上标签就意味着能够解释或者理解它。但是标签只是标签,单靠命名并不会带来任何有益的理解力。

我们通过逻辑来证明,通过直觉去发现。 --庞加莱

第六章 主动学习
持续学习才是最重要的。
时间只能分配。主动安排你的学习,分配合适的时间,聪明的使用时间,你可以更具效率。
知识投资和金融投资的一个主要区别是所有知识投资都有些价值。即使你从来不会在工作使用某项技术,它也会影响你思考和解决问题的方式。

【读书】程序员修炼之道:从小工到专家

注重实效的程序员有哪些特征:
1,早期的采纳者/快速的改编者。具有技术和技术上的直觉,喜欢试验各种事物,给你一样新东西,很快就能把握它,并把它与你的知识的其它部分结合在一起。
2,好奇。
3,批判的思考者。
4,有现实感。会设法理解你面临的每个问题的内在本质。
5,多才多艺。尽力熟悉广泛的技术和环境,并且努力工作,以与各种新发展并肩前行。尽管你现在的工作也许只要求你成为某方面的专才,你却总是能够转向新的领域和新的挑战。
第一章 注重实效的哲学
注重实效的程序员的特征是什么? 能够越出直接的问题去思考,总是设法把问题放在更大的语境中,总是设法注意更大的图景。
注重实效的编程源于注重实效的思考的哲学。本章将为这种哲学设立基础。

我的源码让猫给吃了

注重实效的程序员对他自己的职业生涯负责,并且不害怕无知或错误,这肯定并非是编程最令人愉悦的方面,但它肯定会发生。
发生这样的事情,我们要设法尽可能职业地处理它们,这意味着诚实和坦率。我们可以为我们的能力自豪,但对于我们的缺点--还有我们的无知和错误--我们必须诚实。

软件的熵
破窗理论

石头汤与煮青蛙

足够好的软件

你的知识资产
经营你的资产
1,定期投资。
2,多元化,知道的不同的事情越多,就越有价值。
3,管理风险,
4,低买高卖,
5,重新评估和平衡

目标:
1,每年至少学习一种新语言
2,每季度阅读一本技术书籍
3,也要阅读非技术书籍
4,上课
5,参加本地用户组织
6,试验不同的环境
7,跟上潮流
8,上网

挑战:
1,这周就开始学习一种新语言。
2,开始阅读一本新书
3,出去和你的当前项目无关的人,或是其他公司的人谈谈技术。

第二章 注重实效的途径

重复的危害
重复是怎样发生的:
1,强加的重复,
2,无意的重复,
3,无耐性的重复,
4,开发者之间的重复,

第三章 基本工具
强力编辑
选一种编辑器,彻底了解它,并将其用户所有的编辑任务。如果你用一种编辑器进行所有的文本编辑活动,你就不必停下来思考怎样完成文本操作:必需的键击将成为本能反应。编辑器将成为你双手的延伸;键会在划过文本和思想时歌唱起来,这就是我们的目标。

文本操作

第四章 注重实效的偏执
何时使用异常
什么是异常情况
异常很少应作为程序的正常流程的一部分使用;异常应保留给意外事件。

第五章 弯曲,或折断
元程序设计
动态配置: 要配置,不要集成。
元数据驱动的应用:
将抽象放进代码,细节放进元数据。

好处:
迫使你解除你的设计的耦合,从而带来更灵活,可适应性更好的程序。
迫使你通过推迟细节处理,创建更健壮,更抽象的设计 -- 完全推迟到程序之外。
无需重新编译应用,你就可以对其进行定制。

编写单元测试
通过使测试代码易于找到,你是在给使用你代码的开发者提供两样无价的资源:
1,一些例子,说明怎样使用你的模块的所有功能。
2,用以构建回归测试,以验证未来对代码的任何改动是否正确的一种手段。
使用测试装备
不管你决定采用的技术是什么,测试装备都应该具有以下功能:
1.用以指定设置与清理的标准途径。
2.用以选择个别或所有可用测试的方法。
3.分析输出是否是预期(或意外)结果的手段。
4.标准化的故障报告形式。

第七章 在项目开始之前
需求之坑
完美,不是在没有什么需要增加,而是在没有什么需要去掉时达到的。

【读书】代码之道

1. 如何集中精力、避免打扰?

I.M.Wright提倡的方法是:在工作时,把邮件通知提示等都尽量关闭,然后安心做自己的工作;定期的(比如,每隔半小时)浏览收到的邮件,并且在查 看邮件时尽力把它完整处理掉,避免情境的切换。你可能会认为这样会导致某些低优先级的邮件浪费时间,但I.M.Wright却认为你在过后再次切换到这封邮件所消耗的精力和时间要比即时处理还要多。

I.M.Wright 提出要想避免被打扰,还可以“让自己消失”,去一个没人能找到你的地方,使用笔记本电脑和远程桌面安心工作,或者选择一个其他人不在的时候工作,比如早上早一点来公司,晚上回家用远程桌面工作。在这样一个安静的地方和时刻,你就可以抛开不必要的困扰,集中精力做一些工作。
笔者对这个观点非常赞同,也是自己之前亲身实践过的。一段时间以来,笔者坚持早上八点半到公司,此时偌大的办公区基本空无一人,然后带上笔记本电脑,找一个小会议室,一直工作到上午10点钟才回到自己的办公桌。这段时间非常的安静,不论上班的同事如何来来往往,笔者都不受干扰,集中处理一些事情,效率很高, 即使在平常工作时间,也会尽量多呆在安静的地方。同时,笔者发现一个有趣的现象:当我呆在办公桌的时候,时不时的就会有同事询问各种各样的问题,小到一个域名对应的IP地址,大到项目计划的制定。但是,一旦我呆在会议室工作时,这些口头的问题就不翼而飞了,小的问题同事们可以独立解决,大的问题会通过正式 的邮件和会议进行交流,这样大家的工作效率都会有所提高——因为极大减少了彼此的情境切换次数。

2. 平衡工作和生活
这个话题对程序员来说有些沉重和苦涩,软件开发似乎是个工作和生活严重失衡的职业。不过,I.M.Wright认为这不是命运注定,他在应聘微软的时候,就向未来的上司提出,他非常顾家,需要保证正常的工作时间,早上送孩子上学,晚上回家用餐,而老板完全同意了他的要求,并且说话算话。I.M.Wright提出了一个平衡工作和生活的五步原则:

1. 了解并接受你选择的生活方式。
2. 跟你的管理者一起设置一些基本原则。
3. 不要默默妥协。
4. 必要的时候使用“远程访问服务”和远程桌面访问。
5. 抛开分离造成的精神分裂错觉。

具体的说,你需要了解你自己,好好思考一下你的工作目的是什么,事业和生活的优先级是什么,你的忍耐程度是多大,一旦把这些问题想明白了,你就会在平衡问题上做出正确的选择;把自己制定的原则告诉你的上司,不要担心你的工作和前途,在第一步时你已经把这些问题和限度考虑清楚。I.M.Wright发现这种交流反倒会使你赢得上司的尊重,因为你具有强烈的自信和清晰的价值观;在工作中,偶尔的破例是可以容忍的,但是如果经常出现超出原则的情况,你就需要找机会重申你的态度,因为一旦你很容易就妥协了,上司会认为你并不在意你自己指定的原则(如果连你自己都不在乎,又能指望谁来在乎呢?)。他可能会提出越来越多的要求,直到你的原则一退再退,你原先的努力就白费了;如果你热爱自己的工作而且的确很重要,可以在家里通过远程访问等方式访问;不要试图把工作和生活分开,保持一个统一的心态,避免情景切换。

【读书】高效程序员的45个习惯

第一章 敏捷 -- 高效软件开发之道
敏捷开发宣言:
1,个体和交互胜过过程和工具
2,可工作的软件胜过面面俱到的文档
3,客户协作胜过合同谈判
4,响应变化胜过遵循计划

敏捷方法可以快速地响应变化,它强调团队合作,人们专注于具体可行地目标(实现真正可以工作的软件),这就是敏捷的精神。

它要求团队中的每一个人(包括与团队合作的人)都具备职业精神,并积极地期望项目能够获得成功,它并不要求所有人都是有经验的专业人员,但必须具有专业的工作态度 --每个人都希望尽最大可能做好自己的工作。

精辟概括:
敏捷开发就是在一个高度协作的环境中,不断地使用反馈进行自我调整和完善。

敏捷工具箱
1,Wiki:用来协作,实现知识共享。
2,版本控制:
3,单元测试:用代码来检查代码。
4,自动构建:全自动化,持续集成。

第二章 态度决定一切

专业的态度应该着眼于项目和团队的积极结果,关注个人和团队的成长,围绕最后的成功展开工作。集中精力,你是为做事而工作。

实行代码复审,不仅有助于代码更好理解,而且是发现bug最有效的方法之一。

另一种防止代码难懂的重要技术就是单元测试。帮助你很自然地把代码分层,分成很多可管理的小块,这样就得到设计更好、更清晰的代码。

第三章 学无止境

如何跟上技术变化的步伐?
1,迭代和增量式的学习。每天计划用一段时间来学习新技术,它不需要很长时间,但需要经常进行。记下那些你想学习的东西。
2,了解最新行情。最新的博客列表请参考 pragmaticprogrammer.com
3,参加本地的用户组活动。
4,参加研讨会以。
5,如饥似渴地阅读。

第四章 交付用户想要的软件

提早集成,频繁集成。

第六章 敏捷编码

良好的面向对象设计原则建议:应该编写内聚的代码,要保持代码条理清晰,告知,不要询问。最后,通过设计能够根据契约进行替换的系统,可以在不确定的未来中保持代码的灵活性。