-
C'mon, It's Turing Machine! (Part 2)
(Followingthe 1stpart)
Write Your Own Machine
File
machines/an_irrational_number.machine
includes all the fundamental elements to create your own Turing Machine.- The lines start with semicolons are comments.
- Non-comment non-empty lines are m-configurations, each of them consists of 4 columns (separatedby verticallines), which in turn are:
- Name of current m-configuration.
- The symbol read from current square of the tape—m-configurations with same namecould behavedifferently while reading different symbols.
- Operations, separated by commas. Valid operations are:
- P{x}: Write {x} to current square of the tape.
- E: Erase any symbol in current square.
- L/R: move the cursor one square left/right.
- Next m-configuration—what should be done after current m-configuration?
Now, try to write your own machine, and run it!
What’s Next?
Universal Turing Machine, of course. (What else otherwise?)
(It requires reading Chapter 7 and 9 ofThe Annotated Turing. Although I haven’t started yet, I can feel it’s not an easy task. Any contributionwould be highlyappreciated.)
Meanwhile, I started building a web UI running Turing Machines withCompojure. Take a look at
web
folder. You can trial it with:$ lein ring server
It also makes sense to tidy it up and make it more interactive.
I also want to build an iOS application…but that’s another story.
You might want to try something more interesting, e.g. to write a general Turing Machine to determineany givenTuring Machine would halt or not; to solve theEntscheidungsproblem; etc.
Anyway, enjoy :D
-
行动中的战略
(商业读书会第十三期:What IsStrategy|HBR 1996)
战略对于企业的影响是长期的、逐渐显现的。例如某著名高科技企业,一直以来习惯于跟在同城竞争对手后面做老二,各种小小的差距日积月累,终于呈现截然的效果:当竞争对手获得近13%的销售净利率时,这家企业的净利率低了10个百分点——考虑到棉纺行业尚有近8%净利率,日子之苦可见一斑。于是同样是开拓新市场,这家企业的研发速度已经明显跟不上竞争对手。缺乏独特、清晰的战略定位,企业的可持续性堪忧。
波特的这篇文章是对《竞争战略》所述“基本战略”(Generic Strategies)的扩展,重点在讲战略定位。所谓战略,说穿了就是要与别人有所不同。运营效率(OperationalEffectiveness)是重要的,但仅凭运营效率——消除浪费提升效能——难以支撑较长时间的“与众不同”,因为提升运营效率本身是相对容易被模仿的。(丰田靠精益生产保持了相当长时间的领先地位,这是特例而非常例。)而且,基于运营效率的竞争是杀敌一千自伤八百,消费者会因此受益,但企业不能长期在这方面互相竞争。
运营效率讲的是“把事情做好”,战略讲的则是“做不同的事”。如何不同?波特给了几种方式:满足大量用户的特定需求;满足特定用户的全部需求;或是以特别的方式来接触某些特定的用户。
相比如何制定战略,波特更重视如何实施战略。这篇文章里他一直强调:要想与众不同,就必须做一些与众不同的事;如果你做的事都和竞争对手一样,你就不是与众不同的。这与众不同的事,首先就是有所为有所不为,也就是工作优先级与战略匹配。没有取舍的工作只会让所有人——顾客和员工——对战略产生迷惑,使战略既不能被理解也不能被落实。
在把行动与战略匹配的过程中,首先需要做到简单一致:行动应该符合战略目标。在同样的目标下,这些与众不同的行动应该彼此强化。最终所有人的所有行动都彼此相关,随时根据战略目标的指引优化工作。当一家企业如此将行动与战略匹配,战略就构成了企业的性格,它决定着每个人、每件事的如何想、如何做。这种企业性格是很难被复制的,它能构成企业的核心竞争力。战略的连贯性会使运营效率的改进也具有连贯性,有助于把与众不同的事做得更好。
因此当企业成长时,现在有效的企业性格是一笔重要的财富(而非负担)。成长的方向应该首先考虑深化现有战略定位,从而借力和强化企业性格;而不是扩展业务广度,从而淡化和冲击企业性格。拿句被用烂了的话叫“小胜靠智大胜靠德”,没有性格的企业是不能长久的。
-
C'mon, It's Turing Machine! (Part 1)
Spent about 10 hours, I wrote my first program withClojure: an implementation ofTuring Machineas described in Alan Turing’s famous paper ”On ComputableNumbers, With AnApplication To The Entscheidungsproblem”.
(Note: Charles Petzold’s bookThe Annotated Turingis a good point to understand Turing’s paper.)
Get Started
First of all, you need clone the codebase from GitHub:
$ git clone git://github.com/gigix/turing_machine.git
In order to build it, you also need installLeiningen—whichis pretty easy on my MacBook Pro with MacPorts:
$ sudo port install leiningen
Now you can build the codebase and see if everything works:
$ cd turing_machine/clojure && ./build.sh
You should see
turing_machine-1.0.0-SNAPSHOT-standalone.jar
being packaged, as well as a “tape” being printed as following:(0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1)
That’s the binary form of rational number 1/3 (0.010101…). You just executed a TuringMachine whichcalculates 1/3 and prints the result to a tape—actually we only calculate and display thestarting 10squares of the tape, because it’s simply impossible to finish the calculation, because it’sinfinite.
Calculate An Irrational Number
There’s another machine lays in
machines/an_irrational_number.machine
, whichcalculates anirrational number with following form:0.01011011101111011111…
You can run this machine with following instruction—the algorithm is more complicated, so youhave to runmore steps to see a reasonable shape:
$ java -jar turing_machine-1.0.0-SNAPSHOT-standalone.jarmachines/an_irrational_number.machine 1000
The starting part of the tape looks like following:
And here’s the “source code” (formal name should be “m-configurations”,in which“m” stands for “machine”) of this machine, which I will explain in moredetail in nextsection:
(To be continued…)
-
晒晒我的开源项目们
在等“bundle install”的时候闲着没事,打开我的Github,发现还有那么一些东西值得分享一下的。
啤酒游戏:《第五项修炼》里讲的啤酒游戏。多人协作游戏,适合培训时候用。培训详情请联系小刀。
合作的进化:这就是《合作的进化》那本书里讲的生存竞赛游戏。可以自己写新的策略放进来,看看重复囚徒困境中的最佳策略是如何被选择出来的。
Jungling:作为技术人员的TWer到客户现场启动一个新项目时需要注意哪些事?带上iPad和Jungling,你的丛林冒险手册就有了。
每天一小时:1.HourFor.Me的源代码。每天一小时,每月就能做成一件事。欢迎贡献,如果从代码里发现了漏洞,还望高抬贵手请勿攻击。
TRSS:TRSS的源代码。 把RSS同步到新浪微博(因为新浪自己的同步功能貌似不工作了)。后面还可以有很多发展,例如同步到各种微博之类的。同样,欢迎贡献代码,多谢请勿攻击。
jquery.image-preview:一个比较体面的图片预览插件,实现就像Google Images那样的效果:鼠标悬停在小图片上,小图片就会放大预览。主要的难点是当小图片位于页面边缘时,预览也要出现在合适的位置。
图灵机:这两天开始写的,照着图灵的论文,用Clojure实现一个原模原样的图灵机。后面也许还想在iOS上实现一个有图形界面的。
发现我的开源项目们有个共通的问题:虎头蛇尾。每个点子都没有耐性深挖下去。想写代码练手的年轻同事们可以找我啊,我这里要干的活很多的⋯⋯
-
事关激励:如何带领(并成为)骄傲的猫
(商业读书会第十二期:Google’sCFOon growth, capital structure, and leadership| McKinsey Quarterly )
这期的读书题目,我早已经读过了,有微博可为证。这事让我感到挺欣慰的:如果我读的东西越来越多,那么老师出的题目就越来越可能是我已经读过的。(广告:我的新浪微博都是从TRSS同步的,如果想讨论的话请用Twitter。)
在这个访谈里这位CFO讲了一些我们早就知道并且一直在做的事例如频繁的项目体检和反馈,以及一些我们早就知道不过没有做的事例如只有十亿人会用的产品才是值得做的产品。不过对我最有感触的,就是我在微博中引用的那句话,关于业务部门的观点——或者往大了说,如何激励知识工作者做正确的事。
简单地说,Google的业务部门设置就是没有业务部门设置——ThoughtWorks除了Studios这个产品团队以外也是如此。没有部门设置的直接效果就是没有部门墙和经典的“跨部门协作”。(我有个客户曾经很感叹地说:“真羡慕你们要做什么事就大家一起努力把事做成。”)更深层的意味在于:没有部门设置,就不给任何人考虑局部优化的视角,所有人都需要考虑“我做什么事是对全局最有价值的”。
一旦公司有了不同的业务部门,部门经理就会倾向于占据其中的资源。只有当所有人互相信任地站在公司而非部门的角度来做计划,才可能说出“对面那个团队比我们更需要这些资源”这样的话。
Dan Pink说,知识工作者的激励有三个关键词:Autonomy,Mastery,Purpose。刻意地不设置业务部门,实际上是在强化对“Purpose”的认知。德鲁克说,企业的价值都在企业之外,企业内部只有成本。道理很对,但我跟客户讲起来,他们只当我在讲笑话,因为强大的业务部门的存在已经让工作的目的不再是做对客户或者这个世界最有价值的事、而是做部门领导最希望看到的事。
DanPink讲的三个关键词其实组合起来就非常简单。就像我前阵子跟一个猎头MM说的,管理这群骄傲的猫其实很简单:你只要让他们知道他们所做的事有什么重要意义,不断用反馈给他们信心和帮他们改进,他们就会自己搞定所有事——当然如果这件事本身确实没有重要意义那么他们就不应该在做它。显然猎头MM也当我在讲笑话,不巧这个笑话跟Pink的调调还挺暗合的。
我经常跟人讲,在ThoughtWorks工作最大的好处是我可以绝对信赖这些人,他们叫我干什么我就会去干哪怕是叫我把手上的项目立即搞死我也不会犹豫,这让我的工作轻松很多。米高和郑晔最近一直在关注如何得到值得信赖的同事和如何让他们变得真正值得信赖,而我想说的是:有了这样的同事之后,你需要做的就是让他们明白目标,帮助他们提升自己,他们会自己把事情搞定。
至于传统意义上的“激励”(通常是钱和可以用钱买到的各种东西),它该来的时候自然会来的,根本不用操心。
-
每年读五十本书
最近我在1.HourFor.Me上的任务是“精读《The Annotated Turing》”。这本书慢慢读,一边记笔记,已经花了快一个月的时间。之所以能这么细细慢慢读一本书,因为我年初定下的读书计划已经达成了:今年到9月8日为止,已经读完了50本书。
一开始是源于跟小风同学的一次谈话。以前一直认为“读书破万卷”是文学的夸张,从来没有正经把“万卷”当回事。但小风同学说,古代的竹简看着体积大其实写不了多少字,一卷的字数大概也就相当于现在书的一章,平均说一本书有十卷也是大差不差的。这时再来算算,“万卷”就是一千本书,每年50本的话,二十年就读完了。
又到豆瓣看了一下去年的记录,杂七杂八有四十七八本。于是给自己定下一个计划:2011年要读50本书。实施计划的过程中,觉得50本是一个很好的目标:平均每周一本(加上一点缓冲),这能给自己形成一个持续的压力。如果是每年读10本的话(当然我随便哪年也不止读10本书),就是每个月一本(加上一点缓冲),压力是不持续的,说不定反而不容易达成。
总体说来,达成这个目标的过程并不困难:每天读5万字左右,每周就能干掉一本二三十万字的书。每周在豆瓣回顾一下阅读记录,可以看到这个月是否能达到至少4本的进度。在这个持续的压力下形成了习惯,于是总会这里那里多读一些,于是一年的目标只用三个季度就达成了。
读书的时间方面,回想一下有几个时间段是阅读成效比较稳定的。第一是工作时间,用工作时间读工作相关的内容,这是一举两得。第二是睡前的一两个小时,适合读篇幅大但不需要做笔记或做练习的内容。第三是上下班的通勤车上,今年这样的时间并不多,主要是在墨尔本的一段时间读关于度量和设计的书。第四是等飞机和坐飞机的时间,iPad起了大作用。第五是专题阅读,需要学某个技术或者需要给某个书写书评的时候集中一段时间来读。第六是马桶时间,适合读点轻松的,聚少成多也能读完一些书。
另一个问题是要有足够多的好书可以读。所以另一个需要关注的指标是想读列表增长的速度。今年一个好的实践是从各种文章、其他的书、其他的人那里得到更多好书推荐,所以想读列表保持着缓慢增长。而且因为对阅读速度越来越有信心(以前也有信心,但看到数据之后就更有信心),所以一旦对某个主题感兴趣就会把相关的好书全部加上,相信自己能读完。
总之,虽然今年的阅读目标顺利达成,这也只是“破万卷”的第一步。嗯,剩下的两个多月要继续保持阅读习惯。明年要继续达成50本的目标。
-
ThoughtWorks招聘咨询工程师
ThoughtWorks迫切需要既能写程序又能见客户的咨询工程师。如果你认为自己适合,请给我邮件: JXiong atThoughtWorks dotCOM。我期待和你一起工作。
这是一个怎样的职位:- 绝对有挑战性。我们服务各个行业最领先的企业,直接面对客户提供咨询,为他们解决各种(技术和非技术的)难题。
- 充满成就感。我们把世界最先进的软件开发技术和方法引入中国。我们不仅帮助客户,而且提升整个中国软件业的水平。
- 快速成长。背靠ThoughtWorks全球的智力资源(例如Martin Fowler和JimHighsmith),跟一群国内技术社区的领导者一起工作,这是国内罕有的技术人员成长的优秀平台。
- 合格的编程技能:有丰富的开发真实应用程序的经验(语言不限,Java为佳)
- 对企业应用的生产环境有所了解,有Unix生产环境下工作的经验为佳
- 看重软件卓越,从未停止追求把程序写得更好、让自己变得更强
- 敬业,勤奋努力,有强烈的责任心,重视对客户、对团队的承诺
- 大型企业系统的设计和架构经验
- 良好的沟通、演讲能力和直接面对客户工作的经验
- 对敏捷软件开发方法有所了解
- 社会责任感:追求用自己的工作让世界变得更美好
工作地点:成都/西安,但是出差会很多,可能80%时间出差。
-
西安办公室的苹果控们
为了做宣传材料,在西安办公室拍了一组片。回头来细细看,俨然可以做成苹果广告了啊⋯⋯不管是小美女QA还是结对编程的糙哥,我们都爱苹果!
每天早上的Standup和Code Diff也不能没有苹果!
一群糙哥一起听培训那就更不能没有苹果!
这一字排开,还真是气势恢弘啊~
-
行动派投资者:侠客还是强盗?
(商业读书会第十一期:How I Did It |HBR)
Oracle收购BEA,时代华纳拆分,微软收购雅虎未遂,Google收购摩托罗拉移动。这几件事有什么共同点?答案是在它们背后都有同一个人的身影:Carl Icahn。有人称他是资本市场的掠食者,有人说被他盯上的企业的CEO会打个寒颤。
Wikipedia对行动派投资者的介绍很清楚:他们在公开市场上大量买入某家企业的股票,凭股份代表公众投资者对企业管理层施加压力,甚至通过代理权争夺控制董事会,改变企业的经营策略——改变的方向有时不为盈利,但大多数时候就是为了提高股票价格而盈利。在Wikipedia列举的例子中,第一个就是Icahn的公司。
行动派投资者在获得董事会的控制权之后,常见的做法有两种:
- 促成分拆和并购,将重组出来的一些商业单元卖给有意的买主,从售卖资产的溢价中获利。
- 促使企业回购股票,从回购引起的市场正面反馈中获利。
纯粹从经济理论的角度来说,这两种行动实际上都是对非最有效利用的资源进行重新配置:分拆和并购是把一家企业并未最大化利用的资产交给更能有效利用的另一家企业来使用,后者为之付出的溢价就是对资产更有效利用的证明;回购是把无法用于再投资的现金返还给股东,使其能投资到其他企业。Icahn一贯声称他代表公众投资者的利益,最近的摩托罗拉的案例,不论媒体的评论还是当事人的评论似乎也都在建立他作为资本主义侠客的形象。
反对者的声音集中在一个问题上:对短期收益的过度追求会损害甚至彻底毁灭一家企业的长期愿景。HBR的这篇文章作者,曾任BlockBusterCEO的JohnAntioco认为,自己本来正在推进挽救企业的长期规划,但Icahn的介入彻底毁灭了这个愿景并最终导致BlockBuster于2010年9月破产清算。在文章后面,“BlockBusterOnline的1号员工”BenCooper也跟了自己的评论。他认为Icahn无视BlockBuster本身的转型计划而强行推进短期套利的策略,是导致这家老店最终成为“最糟糕的投资”(Icahn语)的原因。
但Icahn并不认为自己是谋求短期套利的强盗——他认为对冲基金是。在与发明了毒丸的Martin Lipton的一场讨论中,他认为自己所做的只是改善企业治理和增加管理层的责任感,而对冲基金“有可能走得太远了”。再一次地,大概这也是一个没有绝对正确答案、需要微妙权衡的问题:毕竟毒丸和权力过度的管理层造成的损害同样是饱受批评的。
况且说到底,像Google收购摩托罗拉移动这样让人感到世界在向前进步的案例,毕竟是值得高兴的。
-
什么是爹式开发?
这几天跟Simore在车上聊研发云和持续交付,聊来聊去就聊出了一个新概念:开发即交付——Development As Delivery,缩写DAD,也就是“爹式开发”。
免责声明:爹式开发绝大部分理念和实践是基于持续交付的。我们发明这个概念主要是为了搞笑。
在持续集成的场景下,每当程序员提交代码,就会触发一次完整的构建(包括编译、静态检查、部署、自动测试等),确保软件系统可用并且符合质量要求。但持续集成之后的软件往往仍然没有针对真实环境进行验证,没有考虑投入真实环境使用的各种问题,因此“符合质量要求”与“达到可发布水平”之间还有明显的距离,我们称之为软件交付的最后一英里。
为了解决这最后一英里的问题,我们有了持续交付。持续交付的核心是构建流水线:流水线越靠后的阶段,验证越接近真实环境。当一个发布候选版本最终通过正规的发布过程被部署在非常类似生产环境的UAT或者staging环境上然后执行了大量的自动化功能测试,我们就可以说:这个发布候选版本已经为交付做好了准备。
然而,问题是,我们为什么需要等到提交代码之后才做这一切?为什么不在提交代码之前就确认我刚编写的代码已经达到了交付要求,然后每个人都提交绝对高质量的代码?
其中一个重要的原因是历史相关的:我们已经太习惯于测试环境(尤其是与生产环境相仿的测试环境)的匮乏了。因为这样的环境是昂贵而不易获得的,所以我们要让它成为整个团队共享的资源;因为要让它被整个团队共享,所以我们要降低它的使用频率,所以要把它放在构建流水线的最后一环。
但研发云将改变现状。测试环境将不再昂贵:它可能仍然需要5台服务器,但由于每个环境的使用率只有10%,所以整体来说它没有那么贵。并且它也不再难以获得:云计算平台方便的开通(provision)加上自动配置工具例如Chef方便的配置(configuration),让我们只要一条命令加三十秒等待就能得到一套接近生产环境的测试环境。
于是我们的观念将发生一个根本性的转变。从前当我们讲“开发环境”,我们讲的所有东西都是基于“每个人一台电脑”这个假设。但这个假设不是必要的。我们每个人都可以有一整套生产环境来做开发。你仍然做单元测试,你仍然降低耦合,但此刻你不再与生产环境隔离——你随时身处在生产环境中,你随时可以看到刚写的代码在生产环境中如何工作,并且你写的所有代码将通过生产级别的验证之后才提交。
这时候我们已经不必再强调“持续交付”,因为我们的开发就是交付(Development As Delivery,DAD)。这就是“爹式开发”。
当然它不会那么容易就实现。一切使你无法做到爹式开发的障碍,我们都称之为“坑爹”。所以,在一个践行爹式开发的团队中,我们的口号就是“不坑爹”。
附录:由于爹式开发要求每个程序员充分了解生产环境,因此会极大地促进DevOps在团队中的推广。最终,爹式开发会造就一种新的、具备开发和运维全面技能的人才,他们会把开发和运维工作全部搞定。这些人开展运维工作的方式,称为“多技能运维模型”(Multi-skillOperationModel),缩写MOM,简称“妈式运维”。