Software Engineering is NOT an Engineering

dreaming-in-code

周六把《梦断代码》(Dreaming in code)看完,一直在思索这本书的主题是什么,想了半天也没有头绪。翻到书一开始的《作者的话》,看到这么一句:「它提出问题,讲述故事」,啊哈,确实如此,作者回避给任何问题一个标准答案,甚至一点倾向都没有,以一个中立的观察者来讲述故事。好的书不仅在于传递知识或观点,更重要的是引发思考。这正是我给本书五星的原因。

整本书主线在描述Chandler项目的故事,不断从项目的各种现象中挖掘软件开发中的各种问题,并旁征博引其他项目的故事,罗列大家对问题的各种观点和方法,但是几乎所有提到的问题直到今天都没有明确的结论,比如卡普尔和卡兹维尔的对赌:2029年会不会有计算机通过图灵测试。

Continue reading

Posted in 技术学习 | Tagged , | 1 Comment

数组、链表和Cache污染

在hishscalability.com上看到一篇文章:Strategy: Stop Using Linked-Lists(这文章写的挺烂,只列结论没有具体分析),正好上周看到了一篇讲同样事情的文章为什么python标准库没有链表。两篇文章主题都是让大家写代码的时候少用链表,多用数组,主要原因是locality,局部性差的后果轻则cache miss,重则page fault。数组由于存储在连续空间里,其局部性显然是好过链表。

还记得大学操作系统课上老师说过:「局部性是编程里最重要的概念之一」,当时听的一知半解,现在算是有些感觉了。

回到链表的问题。我们通常在什么情况下用链表呢?根据教科书上的大O复杂度,经常增删元素的情况下要用链表。这种场景下如果用数组替代链表,带来的overhead是数组的整体移动,按照流行的说法,内存拷贝很快,但是内存拷贝有一个被人忽略副作用:被拷贝的内存进了CPU Cache(Cache污染),数组越大,污染的越厉害。现在CPU的L1 Cache大改是4~32KB,随便一个稍微大一点的数组就可以把整个L1 Cache全部污染。Cache污染使得程序的局部性被破坏。废话几句,内存相对于CPU来说,速度非常慢,CPU速度一直保持摩尔定律,而内存速度涨速甚缓。现在服务器CPU动辄2G 16核,而内存还不到2GHz,正因为如此才有了L1/L2/L3 Cache。

如何解决数组在插入删除时的Cache污染问题呢?


Continue reading

Posted in 技术学习 | Tagged , , , | Leave a comment

This is not the end, this is not the beginning

最近状态不是很好,负能量堆到积爆表,静下心来看书写点东西才是出路。给瞎折腾的这两年,做个总结吧。

一些Practice和总结

充分单元测试能帮助项目快速推进。看起来单元测试会增加开发时间,但事实上大多数时候它不但会缩短当前功能开发到release的时间,还能为后续的功能的开发做铺垫。

单元测试覆盖率必须保证绝大部分业务逻辑被覆盖。实践起来就是,除了一些异常分支,覆盖所有可以覆盖的代码。这样单元测试才能起到哨兵的作用,在写新逻辑和重构代码的时候,保证一旦旧代码的正确性被破坏,单元测试马上fail预警。如果单元测试的覆盖率不够,是无法被依赖的。单元测试的作用得在覆盖率达到一个比较高的值的时候才能完全展现。

单元测试有助于提高代码质量。由于需要考虑代码的可测试性,有利于促成依赖注入(DI)、控制反转的设计。控制代码之间的耦合程度。站在开发者的角度来说,test case有助于提高开发者的编码和设计能力。一点经验是慎用单件(Singleton)。单件其实就是OO世界的全局变量,所有使用单件的代码都会和它强耦合,在测试的时候难以隔离。项目中遇到很多复杂繁重的单件,需要大量时间初始化,严重拖累了test case的执行效率。

Continue reading

Posted in 技术学习 | Leave a comment

捡起你们的节操

前几天和朋友聊天,聊到某知名公司应用刷榜,最后得出一结论:想在圈子里混,得不断降低自己的底线。现在整个行业底线低下,不得不感谢某些大公司以身作则,充分展示了什么叫「没节操」。其中更甚者,不但没节操装有节操,还不停指责其他公司没节操。

  • 3Q大战,360推出QQ保镖,通过系统钩子的方式改变QQ的运行方式,QQ随即弹框「我们做出了一个艰难的决定」,要求用户卸载360,否则无法使用QQ。
  • 3B大战,百度通过user agent封锁360旗下所有浏览器通过百度,360隐藏UA,百度推出安全控件,禁止用户使用360浏览器登录其商业系统。
  • 360「补丁门」,将360安全浏览器安装包,伪装成微软windows补丁(KB360018)通过360安全卫士推送给用户。

看到上面的光荣事迹,不禁赞叹各大公司石破天惊的想象力和创新能力。「用户」这个词成为了流氓们的如意金箍棒,没事的时候高举用户至上的大旗,一旦事关核心利益,马上将用户当作手牌,一张张打出去。

整理了一下种种没节操的代表行为:

  • 抄袭
  • 未经允许的用户信息收集(扫盘、扫注册表各种扫),窃取用户隐私
  • 不显示来源或者不能设置取消的弹窗、android上没有来源的通知
  • 没有可取消勾选项的捆绑、首页修改
  • 应用刷榜
  • 雇佣水军引导舆论(TG原创)

这些行为既损害用户利益,又破坏行业风气。建议大家一旦遇到其中任何一条,立即给拉黑这个产品,并且给所属公司带上流氓公司的帽子以观后效。

Posted in 技术学习, 随笔 | Leave a comment

PaaS 还要等多久

再次经历过一次蛋疼的上线之后,我强烈的感觉到PaaS系统对于解放生产力的重要作用。check out代码,修改配置文件,编译打包,依次部署到所有机器,重启服务。不停地和op同事check,dev和op都生怕出什么纰漏,上一次线不知道要掉多少头发,严重影响身心健康。如此提心吊胆,真的做了什么高难度的事了吗?

仔细想想,其实大都是重复的体力劳动,这种事情最适合交给任劳任怨的计算机去做,运维部署的自动化,是项目敏捷化不可缺少的部分,而自动化的最佳方法莫过于使用PaaS。

其实老外已经享受PaaS服务诸如Amazon AWS、Google App Engine以及微软Azure带来的种种便利很久了,Netflix、Instagram、Pinterest等一堆知名公司都在使用Amazon AWS,方便稳定、低沉本、高可伸缩。面向国内用户的PaaS服务却迟迟没有成型,大家都后知后觉,直到最近,阿里云的PaaS服务才有些影子。说的严重点,PaaS服务的缺失直接导致了公司的IT成本的浪费,降低公司竞争力。

从另一个角度来看,无论大小公司,把部分非核心业务外包给专业的第三方公司是趋势。视觉设计外包、测试外包已经是十分流行,PaaS带来的「IT外包」也势在必行。只有这样,企业才能集中精力在核心业务上。

Posted in 技术学习 | Leave a comment

站着把钱赚了

周末看了极客公园了对李学凌和阿北的访谈。有几个关于互联网商业模式的观点非常有启发,于我心有戚戚焉。

先说说李学凌的观点。他把互联网用户分成两种:草根用户高富帅用户。草根是互联网的参与者,他们为自己使用的服务买单(比如网游玩家、QQ X钻用户等等);高富帅是互联网的观察者,一群铁公鸡,别想从这帮人手上赚到钱。李学凌所说的草根用户,其实是最早一批在互联网上主动付费的用户。我的理解这类人一般是:1.20~30岁 2.网游用户 3.深度QQ会员,可以说是腾讯和网游培养了这部分用户。到二线城市随便找个网吧,里面玩各色你不认识网游的人、在视频区聊天的人很大可能就是传说中的草根用户。

同时,他把互联网公司也分成草根型公司高富帅型公司。草根公司打通了直接从用户手中收钱的渠道,直接赚使用服务用户的钱。高富帅公司,通过各种转移支付的手段赚钱,一般是广告,外行人一般搞不清楚他们怎么赚钱。

李学凌认为目前草根公司在赢利上有比较大的发展空前,他并没有细说原因。我很认同他的观点,说一下我自己的理解。

Continue reading

Posted in 技术学习 | Leave a comment

2012 —— a Year of Reborn

2012,a year of reborn。

12年最大的进步之一是对阅读更深的理解,主要分为阅读的目的和方法。阅读的目标是获取结构化的知识,而不能仅停留在离散的观点中。更进一步这些结构化的知识应该对工作生活也指导意义。方法上,区分长短、深浅阅读等不同阅读形式,有目的的阅读,合理分配阅读不同内容的时间,做记录和梳理,由点到线,由线到面。

Continue reading

Posted in 随笔 | Leave a comment

关门

看完了《怪诞行为学》,整本书其实没什么原理性的东西,基本是本故事书,但是「多种选择的困境」这一章深深击中了我。

哲学家埃里希·弗洛姆在1941年写了一本书《逃避自由》。他说,在现代民主制度下,困扰人们的不是缺乏机会,而是机会太多,令人眼花缭乱。这在今天的社会里表现的更明显。人们不断提醒自己,我们可以做到一切,可以成就自己期望的一切。问题在于是否能实现这一梦想。我们必须尽一切可能全面提高自己;我们必须对生活中的一切加以尝试;必须在有生之年把人生必看的1000种东西全部看遍,就算看了999中也不行。随之而来就产生了一个问题,这样做下去,难道不会把自己搞得劳累不堪、心力交瘁吗?弗洛姆描述的这种诱惑,我认为,就是我们看到的那些参与者所遭受的诱惑,他们正在手忙脚乱地从一扇门冲向另一扇门。 ——《怪诞行为学》 P117

其实这一章所说的道理也很稀疏平常,无非是项羽破釜沉舟灭秦、驴子站在两个一样大的谷堆前不知道吃那一堆然后饿死之类的故事。但是这章之所以能出现在《Predictable Irrational》里,是因为人们即使知道这些道理,还是会下意识的在大量的选择前摇摆不定。打开尽可能多的门似乎是人的本性:尽力维持和所有人的关系,不想错过任何新闻、段子,听过每一首好听的音乐,杂志、图书一本也不落下,关注各种技术、行业动态……任何一扇门关上,我们都会很不舒服。

K.K.在《科技想要什么》科技的轨迹一章中说,科技发展和生物进化一样,都是趋向选择的多样化,「文明就是稳步远离没有选择」。但是站在个体的角度上来看,选择的过度丰富是一个不折不扣的灾难。如今我们买任何一个东西,小到牙膏洗发水,大到房子汽车,都是一件痛苦的事。厂家和广告商充分利用人性的弱点进行五花八门的营销,我们不得不在信息极度不对称的状态下做出选择。另一方面,各式各样的选择占据了打量时间和精力,选择的困难导致我们过度关注选择本身,而不是为什么要选、选了以后干什么。

经过2012这一年的胡乱折腾,自己还站在原点上。这一年里我几乎没有做出任何有意义的选择,而是在不断地打开一扇又一扇的门,在一只脚还没跨进门里的时候又转向了另一扇。就像《怪诞行为学》里描述的那个捡金币游戏一样:有好几个屋子,每个屋子里都有一些金币,在指定步数中捡的越多越好;但是你不知道哪个屋子金币最多,并且如果如果一定步数内没有到一个屋子里捡,这个屋子就会消失。玩家在一个屋子中捡金币时,看到其他屋子的门不断缩小,会情不自禁的不停切换屋子,以至于忘记游戏的目的是捡金币,游戏就变成了一个保持所有屋子不消失的游戏。

2013,注定是一个艰难的一年,这一年里需要做的最重要的事就是:把多余的门通通关上,选择一扇门走出去,走下去。

Posted in 读书笔记 | Tagged | Leave a comment