今天遇到一位读者问技术问题,结果回复的时候发现人家把消息接收关了,那您问的哪门子问题啊,害的我白敲半天字。这个情况遇到好几回了,记住,如果你想收到回复,请把帐号详细资料里的接受消息选上。
最近在帮着几个朋友看项目,发现了一个很有意思的现象。被企业客户蹂躏的不像样子的兄弟,想做面向个人消费者的互联网服务;在个人消费者的市场里或默默无闻或头破血流的开发者,想去企业软件市场试试水。
我想说的是,都不容易,因为容易的事已经被别人做了。另外,个人消费者和企业这两件事,真心没必要割裂来看。
企业客户确实难伺候,比如互联网服务的开发者可以这样:爷就不支持IE6了,爱他喵用不用。而企业软件的客户可以这样:爷就用IE6怎么啦,不支持别想验收。 大家感受下是不是有点不一样。而且企业客户还有两件宝,就像太上老君的金刚圈一样,随时扔出来砸晕你,第一是有问题了要免费的咨询和交流,更牛的直接要方案,别谈钱,谈就远了;第二是开始干活了要专家。哪那么专家,专家都砌砖呢,砌的好的都忙着呢!大家再感受下。
虽然环境恶劣,但仔细分析一下,企业客户是很真实的,你的软件确实帮助他解决了问题,就能够保证自身的现金流,有了现金流,你就可以做其他的事情了。想挣钱,就别怕干脏活累活,创业公司活下去最重要。单纯做互联网当然阳春白雪了,几十万上百万的用户给你虚幻的存在感,但是一旦VC的钱没了,这些存在感就烟消云散了,过去两年里,那么多公司和服务,用着用着就没了。
所以我觉得吧,完全可以以战养战,做做企业软件产品和项目,先自己养活自己,同时积累技术和经验,以期伟大产品的诞生和长治久安。(最近读贝塔咖啡鸦总的文章,他们似乎在走类似的路子,不知道猜的对不对)。
下周谈谈互联网和企业软件的融合趋势,欢迎拍砖。
再推荐三个微信帐号吧,相对人文一点的:
1、贝塔·朋友
betacafe
我记得原来叫贝塔咖啡来着,咋能改名呢?肯定是裙带关系!这个账号由江湖人称鸦总的白鸦维护,沉寂了一段,最近重新出山,基本上每天都更新,而且文章质量有越来越好的趋势,产品内容多一些,现在也谈谈人生扯扯淡。
2、听甘德霜讲故事
igandeshuang
差不多隔天更新,主要说一些八卦的历史话题,偶尔也会说说别的,读起来也蛮有意思的,喜欢历史八卦的关注下。
3、戏里戏外
beyondthewall
互联网有一道墙,但是有那么一扇窗,偶尔透出一丝暖暖的微光。这帐号就干这事,其中的系列法源寺外史很好看。
今天下载了@tinyfool 做的App「新杂志」(还未正式发行),基于iBooks Author相关技术,其中首批创刊号包括了「小道消息」「戏里戏外」「Mac技巧」的部分内容,非常好看。在杂志中Mac技巧更名为「MacTalk」,算是大众一点吧。等正式发行了,我会推荐大家去看看。
今日的MacTalk,讲OC的第三个新特性:属性合成
每个开发人员对property都很熟悉,我们需要为类定义属性,编写getter和setter方法。那么我们在Objective-C中是如何进行处理属性呢?很简单,首先在h文件中定义属性:
@property (strong) NSString *name;
然后在m文件中使用@synthesize指令实现属性的accessor方法和定义实例变量ivar:
@synthesize name = _name;
@synthesize的含义是,如果没有进行重载的情况下,编译器会根据读写属性自动为类实例变量_name生成getter和setter方法。当然,你也可以用@dynamic指令指定该属性的相关方法由开发人员实现。
这样看起来是不是已经很简单了?但是没有最简单只有更简单。现在我们可以省略掉@synthesize name = _name; 这一行,完全交给编译器去实现。也就是说在h文件中声明属性name后,就可以直接在实现文件中使用该属性的getter和setter方法,并使用实例变量_name。并且编译器会根据属性的可读和可写自动判断是否提供setter方法。
那么在这种情况下,如果你声明了@dynamic的属性,编译器该如何处理呢?所有synthesize相关的特性将不再起作用,你需要自己去实现属性的相关方法。
总接一下属性合成的新特性:
- 除非明确说明,否则属性相关的accessor方法(getter和setter)将自动生成。
- 除非所有的accessor方法提供实例变量,否则实例变量(例如_name)会自动生成。
- 如果使用了@synthesize,并没有提供实力变量名的话,会自动生成。
- 如果使用了@dynamic,那么自动合成无效,需要开发者自己实现。
- Core Data的NSManagedObject及其子类不使用默认的属性合成功能。