刻意练习

practice

最近几期的文字有越写越长的趋势,我觉得这不是个好兆头,个人以为微信公众平台的文章不易太长,短而有趣,能引发思考最好。太长我写起来费劲,用时也长,你们读起来也累不是?最近时间实在是不够用啊。

这几天在读一本打鸡血的书,叫做《哪来的天才》,副标题是练习中的平凡和伟大,英文名称:Talent Is Overrated︰What Really Separates World-Class Performers from Everybody Else。还没读完,有点感想和大家说说。

这本书和把《时间当作朋友》有些类似的观点,但写作风格完全不同。老外写书不像国内作者那样直接表达自己的观点,而是通过大量的研究和实验来动之以情晓之以理,最后说出自己的想要表达的东西,弯弯绕绕挺有趣,但有时看起来也蛮繁琐的。书中的观点有这么几个:

  1. 凡是取得伟大成就的人无不经过艰苦卓绝的努力(貌似是废话)
  2. 天赋没那么重要,即使是对莫扎特和老虎伍兹来说(这个……)
  3. 成就并不简单的来自于勤奋(一万小时理论也不是随便能搞定的)
  4. 刻意练习的重要性(Deliberate Practice) 后续还有一半的内容没读完……

书中的核心思想就是强调刻意练习的重要性,什么是刻意练习呢?它既不是工作,也不是玩乐,其特征是:通常有明确的目的和计划;为了提高绩效,常常需要老师的帮助;能够反复多次;可以持续获得结果的反馈;很累而且枯燥无味。

大家感受一下,反正我思前想后,对照自己的职业生涯,我不得不承认人家说得有道理。坚持的重要性就不用说了,估计大部分人都是半途而废的专家,而常常拿兴趣说事的人,也得反省一下,奋斗的过程并不像很多书本里描绘的那么美妙,很多琐碎的枯燥的事情和练习,都等着我们去做,不做就无法提升。另外针对性和计划性也很重要,老师也是,很多找教练练习羽毛球的人显然比我们这些打野球的进步迅速,而他们的练习方式就是拿好几桶羽毛球不停的练同一个动作……

书里还有一些有意思的内容,等我看完再表吧……

今日Mac技巧:

最近两期讲了Objective-C的一些特性,很多人表示看不懂,很多人表示不过瘾,要求再讲讲Block、GCD、runloop、KVO、离线、Rest等等,我觉得这些点都可以讲,但是大家不要指望通过微信公众平台就把某一门技术学好了,微信平台本身就不适合长篇累牍,写着累看着也累,而且不适合贴代码,我这儿介绍的技术,都是点到为止,告诉大家有这些东西,真正想深入学习的,网上资料多的是。不怕没书,就怕不读!

今天讲两个小Tips:

1、用Spotlight搜索的时候,搜到文件时,我们有时候会需要打开该文件所在的文件夹,这时候按住command键,点击文件即可打开Finder,并定位到该文件所在文件夹。

2、Finder是OS X系统中的常驻程序,一般不需要退出,如果想重新启动Finder时,有一个简单的方式,按住option键,右键点击Dock上的FInder图标,底部菜单会出现重新开启的选项,点击即可。同样的操作对其他Dock上的程序是强制退出。

复用和抄袭

computer-maintenance-300x300

昨天的微信是晚10点左右发送的,写了盗版和付费的问题,结果到凌晨也没发出去,不知道为什么,可能是微信审核人员休假去袅,按理说这个内容不该犯禁啊(当然,你永远不知道自己是否踩线,因为没人告诉你线在哪里,理在哪里)。基于这种微信抽风和个人写作时间不定的情况,我新增加了一条规则,晚上11点之后如果大家还没有收到Mac技巧,回复 t,可以收到当天的微信。如果发现还是昨天的那条,要么是我忘改了,要么是确实没写。
(看昨天的“Mac上的软件付费”,回复103,看当天的,回复 t)

今天聊聊软件的复用和抄袭,本来想用复用和复制做标题,觉得有标题党之嫌,而且意思也不明确,遂改为复用和抄袭。

文字上的抄袭相对容易辨识,你复制了别人的文字说是自己写的,在现在这个互联网时代已经很容易被发现了。我所关注的几位微信平台的作者基本都是原创,即使有引用也标注的清清楚楚,这一点技术人还是毫不含糊的,而持续的原创也是吸引读者的重要原因之一,否则你也很难拥有成千上万的读者。

但是在软件层面,复用和抄袭就不是那么容易分辨了。比如复用被骂抄袭的,抄袭了说自己是复用的等等。这个主题其实挺大,我简单说说。
软件复用是一个久远而不过时的主题,其主要目的就是复用已有的软件技术(收费的或免费的),建立新的软件系统,提高生产力和质量。复用是软件开发领域一直倡导的,从早期的代码复用、算法复用,到现在的组件复用、框架复用、服务复用、计算复用、资源复用等等,我个人近些年也一直在做这方面的工作,复用的宗旨就是让程序员写最有价值的代码,而不是写重复的代码!

与复用相对的是NIH综合症,NIH(Not Invented Here)的意思是“非我所创”。得了这个病的人,症状是所有的东西都要自己写,永远不使用现成的代码、库、框架、服务,因为那些是别人写的。他们的口头禅是我可以写的更好。且不论能不能更好,单是推倒别人的系统重写一遍这件事,就只是模仿而不是创造,大部分时候都是无用功,徒增代码和浪费时间。无论大小,每个组织几乎都有NIH患者,得了这个病怎么办?一得治,二药不能停。

真相就是:无论你从事什么领域的工作,无论你有多么优秀,聪明伶俐精力旺盛锐意进取,但是漫漫人生路,时间和精力都是有限的,合理利用世界上其他人的劳动成果,方可成就自己的事业。

那什么是抄袭呢,我觉得可以从产品和技术两个方面去看。

从产品层面,看到一款具备优秀创意和功能的软件产品,你研究一下,然后做了一个一模一样的复制品,改改名称和语言,就说是自己的创意和产品,这毫无疑问是抄袭,就像大家说当年的微信1.0抄袭Talkbox一样,有阵子业界还为此类抄袭起了个洋名叫微创新。但是如果你看到了这款产品,经过研究,激发了你新的创意,你在这个产品的基础上做出了一个全新的东西,那就不再是抄袭了,就像没人说现在的微信抄袭Talkbox一样,因为大家都忙着学习微信的创新呢。

技术层面相对简单一些,使用商用和免费的技术和组件做自己的软件,都是复用;把别人的技术拿过来说成是自己的成果,都是抄袭。

有优秀的框架和组件不去复用自己写的,是愚蠢;把别人的东西拿来改改说成是自己的,是无耻。

今日Mac技巧:

上次讲OC那篇收到诸多好评,今天接着聊吧。

Objective-C与Java一样,不支持多重继承,但是通过分类(Category)和协议(Protocol)可以很好的实现代码复用和扩展。这期技术内容聊聊Objective-C的Category(分类)。
Objective-C提供了一种与众不同的方式——Category,可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
实现起来很简单,我们举例说明。

SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end 

 
这是类SomeClass的声明文件,其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下,为该类增加一个hello的方法,只需要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和实现文件中用“()”把Category的名称括起来即可。声明文件代码如下:

#import "SomeClass.h"
@interface SomeClass (Hello)
-(void)hello;
@end

实现文件代码如下

#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
        NSLog (@"name:%@ ", @"Jacky");
}
@end 

其中Hello是Category的名称,如果你用XCode创建Category,那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯,将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。
调用也非常简单,如下:
首先引入Category的声明文件,然后正常调用即可。

#import "SomeClass+Hello.h"
SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 

执行结果是:
name:Jacky 

Mac上的软件付费

apple-2

关于这个问题,有很多位读者曾经问过,为什么在Windows上软件都是免费的,到了Mac都要付费才能用呢?所以昨天就决定写写这个话题,结果刚才在微博上被一个ID叫做批判性思维启蒙的恶心到了,此货发了一条微博,内容如下:

在我儿子帮助下把iPad越狱装了个PP助手,看着那么多不要钱的软件想着以前竟然花钱买软件简直是痛不欲生啊,不越狱的苹果简直就是一颗生苹果啊!

我的感受:

  • 批判性/思维/启蒙,都是多好的词,全被这货侮辱了
  • 这儿子也很可怜,从小就不知道偷盗为何物

好吧,今天就说几句软件付费的问题。

以前有朋友看我用Pixelmator处理图片,问我从哪下载的,我说从App Store上啊,付费软件。他说啊,你们Mac什么都要钱,你看Windows上的PhotoShop都是免费的。

当时我就崩溃了,PS软件无论是在Win上还是Mac上,都是相对较贵的个人软件,只是国内盗版严重,居然很多人不知道这是付费软件。嗟夫杯具。

Windwos操作系统和Office软件的盗版流行,我个人以为和微软的定价策略和垄断政策还是有一定关系的,十年前一套Windows和Office和现在的价格差不多,对于当时的工薪阶层还是有压力的,但是盗版为微软形成了全面的垄断市场,反正微软在中国市场钱也没少挣,人家对于这点损失承受得起,毕竟还有广阔的国际市场。

国内的个人软件开发厂商就惨透了,盗版毁掉了我们的通用软件整整十年,早期做通用软件的公司要么倒掉,要么转行做企业软件和互联网。我在洪恩软件的时候,我们研发的个人教育软件,在整个市场上只有10%或者更低份额是正版,其他全部是盗版。大量做通用软件的公司死掉,金山这种大型软件公司存活并发展,但是也并不是靠通用软件盈利。

在这种环境下,国内用户也就乐得笑眯眯的做盗版和用盗版,殊不知摧毁的是民族软件工业。

反观国外,如果一个程序员开发了一款不错的个人软件,基本上就可以衣食无忧了,比如Mac上的TextMate1.0,总共卖了10几万份拷贝,一份39欧元,大家算算这个程序员的收入,最终他把TextMate 2开源了,因为不需要卖钱了嘛,而且这兄弟成为富翁以后基本上不再对TextMate改进了,结果开源后,大量爱好者开始加入开发,新特性不断增加,目前发展非常好。这就是个非常良性的生态圈,也是目前大量程序员肉身翻*墙的原因。

我个人也用过盗版,但我始终知道这是不对的,说白了和偷东西没有太大区别。转到Mac上之后,发现Mac上也有大量的免费软件可用,另外收费软件也完全可以承受,操作系统才100人民币多,类似Office的Pages/Keynote/Numbers可以分别购买(128),其他很多个人软件都是几块钱/十几块/几十块,只有一些很少用到的专业软件才成百上千,所以我在用Mac之后,逐渐变成了正版用户,我想这也是大量的普通用户和程序员开始转向使用Mac的一部分原因吧。

今天周末,不扯太多了,关于软件盗版和付费,我的看法是:

  1. 盗版肯定是不对的,如果用了盗版软件,至少要有愧疚之心。如果你是个穷学生,学习软件开发用了盗版软件,谁忍心责备你呢?但大家千万不能无耻到“批判性思维启蒙”那样,不仅误己,而且误人。
  2. 程序员也是要吃饭的,你们每个人在自己的电脑上使用的每个软件都是程序员一行行的代码起敲出来的。
  3. 在经济实力允许的基础上,尽可能用正版,尤其是程序员。程序员不支持程序员,还怎么指望别人呢?

今天被脑残气到,不写技术了,大家晚安吧。

神奇的程序员—王小波

goldtime

从昨晚到现在大概收到了1500多条反馈意见,也没法统计了,大体上看了下,差不多是3:3:3的比例,喜欢看随笔的,喜欢看技术和一样都不能少的。那就维持现有风格,可能每篇文章在随笔和技术内容上各有侧重吧。另外tips类型的Mac技巧已经讲了很多了,后续的技术内容略有进阶,不喜欢的自动忽略吧,想看tips的,记住回复 m。

(昨天最奇葩的一个回复是俩字:退订,然后人家就退订了,言出必行,赞!)

喜欢读书的人,我想对王小波都不陌生,他是中国最富创造性的作家之一,他是中国近半世纪的苦难和荒谬所结晶出来的天才,他英年早逝。他的作品对我们生活中所有的荒谬和苦难作出最彻底的反讽刺。他还做了从来没有人想做和做也没才力做到的事:他唾弃中国现代文学那种“软”以及伤感和谄媚的传统,而秉承罗素、伊塔洛·卡尔维诺他们的批判、思考的精神,同时把这个传统和中国古代小说的游戏精神作了一个创造性的衔接。(以上部分摘自百度百科)

我读过王小波三部曲黄金时代,白银时代和青铜时代,读过沉默的大多数,读过红拂夜奔,读过似水六年,但是最近才知道,原来王小波是一个伪装成作家的程序员(这位同学不用站起来了,不知道这是调侃么)。

  • 王小波很早就接触了计算机,1988年毕业于美国匹兹堡大学东亚研究中心,获硕士学位,那时就知道Macintosh,玩过IBMPS/2。
  • 90年学习FORTRAN,开始进行数据统计,并开始在北大教统计学。
  • 91年搞了个用调整字模发生器方法输出汉字的系统,并发出嗟叹:嗟夫,不过现在我对微机已无兴趣,因为发现写小说也可赚到钱。一代天才作家终于开始写小说了,但他依然没有停止编程的脚步。
  • 92年开始写C,“用C编的软件已经用熟,并做出了各种写小说的工具,别人的软件已不用了。现在主要是写书赚钱。从今年初开始写长篇,首先做了写长篇的专用软件,现在基本调通,开始写了”。
  • 93年开始搞汇编,“下决心买了一台286,这些日子在改造软件,作了不少汇编工作。其核心是它在虚拟保护方式(virtual address protected)下工作,以便利扩展内存(expandedmemory)”。
  • ……

如果王小波不那么早辞世,估计会有更多伟大的文学作品和软件产品留下。谁说文科生不懂技术?谁说程序员不能写书?这才是技术与人文的完美结合啊,你们感受一下……

点击底部的{原文},查看王小波的软件历程。

今日Mac技巧:

1、更简单的禁用通知的方式

经过多位童靴提醒,我们可以通过按住option键,点击右上角的通知按钮,即可禁用或恢复通知系统。

2、Objective-C的消息机制

上次讲了一些Objective-C的历史,很多童靴觉得不过瘾,今天为大家介绍下这门语言的消息机制。

Ojbective-C的语法设计主要基于Smalltalk,除了提供传统的面向对象编程特性之外,还增加了很多类似动态语言Ruby、Python才具有的特性,例如动态类型、动态加载、动态绑定等等,同时强化了消息传递机制和表意(Intention Revealing Interface)接口的概念。

消息传递模型(Message Passing)是Objective-C语言的核心机制。在Objective-C中,没有方法调用这种说法,只有消息传递。在C++或Java中调用某个类的方法,在Objective-C中是给该类发送一个消息。在C++或Java里,类与类的行为方法之间的关系非常紧密,一个方法必定属于一个类,且于编译时就已经绑定在一起,所以你不可能调用一个类里没有的方法。而在Objective-C中就比较简单了,类和消息之间是松耦合的,方法调用只是向某个类发送一个消息,该类可以在运行时再确定怎么处理接受到的消息。也就是说,一个类不保证一定会响应接收到的消息,如果收到了一个无法处理的消息,那么程序就是简单报一个错。甚至你可以向一个值为nil的空对象发送消息,系统都不会出错或宕掉。这种设计本身也比较符合软件的隐喻。   在表意接口(Intention Revealing Interface)方面,Objective-C也是设计的比较出色的语言。面向对象语言的特性之一就是通过API把实现封装起来,为上层建筑提供服务。但是需要注意的一点就是,你封装的API最好能够让调用者看到接口描述就知道怎么使用。如果为了使用一个API必须要去研究它的实现,那么就失去了封装的意义。Objective-C通过显式的API描述,让开发者不自觉的写出满足表意接口的API,比如下图中的API描述。 objcapi 上图中描述了一个传统意义的实例方法,但和Java或C++不同的是,其方法关键字由多个字符串组成,在这个例子是insertObject和atIndex,(id)anObject和(NSUInterger)index分别表示参数类型和参数名称。整个方法看上去就像一个英语句子,我们可以很容易的知道,这个方法就是在索引为index处插入一个对象。如果你是从其他语言转到Objective-C,那么开始的时候会感觉这种写法有些繁复,但是一旦理解并习惯了你会感受到其巨大的好处,这种写法会强制你写出优美易读的代码和API,而且有了XCode强大的提示功能,再长的方法也是一蹴而就。

后续讲讲Objective-C的多态和继承。与Java一样,Objective-C一样不支持多重继承,但是通过类别(Category)和协议(Protocol)可以很好的实现代码复用和扩展。

一生有几个好朋友

friends

昨天冒着臭鸡蛋和西红柿的危险尝试发了一篇纯技术探讨的文章,结果遭到部分小白了激烈的阻击,比如:

太专业了,不懂,严重申诉
今天的文章太难了,要想读懂,我得查好多资料
挖。。。什么也看不懂噎!耶耶耶~
拜托,说点能听懂的

当然也有鼓励的:

最近正在学习这门语言,表示确实觉得重头到尾都体现消息传递,开始不太理解。看到这篇文章,有点感触,谢谢。
以后技术性更强些会更喜欢
我每天都在阅读你的文章,每次都能获得一些新知识,非常感谢你!希望今后能多分享一些oc或xcode知识。再次感谢!每天等着阅读你的文章,等待是一种期盼,一种思念,更是一种享受,有你,我的夜生活更加精彩!(我不得不说,这一段有点肉麻,你们该看出来我自己是编不出这样么优美的文字滴)

Mac技巧写到现在,已经完全不是我的初衷了,读者估计有一部分是冲着扯淡来得,一部分是学习技巧的,还有一部分是干嘛的来,不知道。做个调查,如果您是来看扯淡的,回复“扯淡”,你是来看技术的,回复“技术”,两者都看的,回复“扯淡加技术”,如果以上都不是,你得告诉我你是来干嘛的?有时间的读者,回复一下,以便我做内容的调整。

每天要写一半人文一半技术,是很残酷的事情。当你扯得正嗨的时候,突然看见冷酷的“今日Mac技巧”,你就知道还有一部分冷冰冰的技术内容要写,每到此时我就想起了王朔的一本小说,一半是火焰 一半是海水。

进入正题:

随着年龄的增强,人会越来越怀旧,于是有很多人开始积极的组织同学聚会,大学的、高中的、初中的,小学估计少有人记得了,没听说搞小学会的。对于类似聚会,我偶尔参与,但一向敬而远之,由此也挨过不少骂,比如清高啊,不合群啊等等,虽然我完全不是这个意思,但是不会有人听你解释。

我个人的想法是,在现在这个社会上,能够把身边的亲人和朋友照顾好,就非常不容易了。人的一生如白驹过隙,会经历很多人很多事,大家一起共事的时候相濡以沫,不同路了就相望于江湖。没必要十年不见不联系,在同学会上称兄道弟,然后再等候下一个十年。

人这一辈子,亲人不说了,真正的好朋友,不会超过一只手。什么是真正的好朋友?就是无论多久不联系,遇到困难的时候你会想到他;你会为这样的朋友甘心付出时间和资源;你能够随时向这样的朋友借钱,而且确定他会借给你;你的一部分生命,由这样的朋友组成。

生命和时间有限,所以这样的朋友,谁都是只有几个而已。

今日Mac技巧:

1、如何合并Safari的窗口?
打开了多个Safari窗口,如何合并呢?ctrl+command+w,可以把所有窗口以标签页的方式合并为一个窗口,点中标签页拖拽,可以在窗口之间移动标签。

2、如何禁用通知?
很多时候写作或写代码,不希望被打扰,这时候就需要把OX S的通知关掉,双指从触控板右侧滑入,呼出通知中心,在最顶部有一个显示提示和横幅的开关,关掉就会禁止通知,不过第二天会自动回复这个通知设置。

3、Finder的工具栏
我们可以把文件和程序拖到Finder的工具栏上,以便随时打开。但是想移除时会发现点击鼠标拖动是没法把这些图标移除的,这时候只要在点击拖动时加上command,你就会发现这些图标被destory了。

苹果的语言

apple8

申明:今天的文章技术性强一些,不喜欢的……可以申诉

最近连续被问到学习Objective-C的问题,比如我原来学的是C或C++,学Objective-C行吗?这门语言语法怎么那么古怪呢?现在学Objective-C有前途吗?
好吧,今天简单说说苹果的当家语言Objective-C。

首先说明一下,技术这种东西很难说学哪个更有前途,而且以前有一期也说过,如果你准备以技术手段谋生或实现你的理想,基本不可能只懂一门语言。就目前来看,Objective-C似乎是薪酬较高的语言,但是这个阶段迟早会过去的,就像当年的Java一样。一门语言只有掌握的足够深入,才有机会探讨它的前途和钱途。
想要看得远,必须站得足够高。吐槽完毕!

Objective-C是C语言的扩展,设计思路上借鉴了Smalltalk的面向对象和消息机制的思想。从我个人使用过的面向对象语言来看Obj-C是对消息传递支持的最彻底也最显式的。Objective-C的类中定义的方法都是消息传递,而且类和消息之间是运行时绑定的,运行时编译器把消息发送转换成对objc_msgSend方法的调用。其它的C++、Java、Python、Ruby都体现得不明显,更倾向于对象的封装和抽象。

Objective-C和C++基本上是两门语言,没有太大的关系。Objective-C本身是静态语言,编译后就是机器码,执行效率很高,但引入了很多类似Python、Ruby的动态特性,像动态类型推断,id,selector,block等特性,所以又非常灵活。用惯了Java或C++会觉得Objective-C的语法很怪,但如果你用学习新事物抛弃旧思路的方式去学习这门语言的话,你会很快爱上它的消息式的编程风格,加上XCode,无论是写Mac应用还是iOS应用,都会非常得心应手。

关于苹果为什么采用Objective-C的问题,说明一下,其实不是苹果采用了Objective-C,而是乔布斯创建的Next公司的操作系统NextStep采用了Objective-C作为原生语言。
Objective-C在计算机编程语言中有着不短的历史,80年代初Brad Cox和Tom Love发明了Objective-C,1988年乔布斯的Next公司获得了这门编程语言的授权,并开发出了Objective-C的语言库和NEXTSTEP的开发环境。NextStep是以Mach和BSD为基础,Objective-C是其语言和运行库。后来的事大家都比较清楚了,苹果买了NextStep,乔布斯回归苹果,NextStep也成了Max OS X的基础。以后发展越来越好,Objective-C反而成了苹果的当家语言,现在基本上是苹果在维护这门语言的发展。

随着苹果的APP帝国不断壮大,这门语言也得到了长足的发展,从1.0到2.0,从面向对象的C语言扩展,到内存引用计数管理,属性管理,引入块的概念,实现自动引用计数,优化编译器,简化语法等等。Objective-C在2011年和2012年分别获得了TIOBE评选的年度语言,目前排名第四。
苹果CEO库克在2012年的WWDC大会上宣布,苹果已经为全球开发者支付了超过50亿美金的分成收入,时至今日,估计已经远远超过50亿了,对于开发者来说,这是一门能够独立创富的编程语言。

还有一点不能不提,第一台万维网的Server就是一个叫蒂姆·伯纳斯-李的大牛在NextStep上写的,包括浏览器。所以,咱们得感谢Objective-C,要不然还不知道互联网会发展成啥样呢……