分类目录归档:开发

创业公司开发资源整理

工欲善其事,必先利其器。

技术方面,与大公司什么都自己做的方式相比,创业公司需要综合各方资源,节省成本,集中人力来处理核心业务。现在开源组件与第三方服务非常多,从中取得优秀的为我所用,可以很大程度上提高生产力,毕竟每一个优秀的工具都不是一蹴而就的。以下是我们用过的一些:

1. App 统计分析

2. App 社会分享

UI上ShareSDK 感觉更好一些,不过都可以定制,界面上都不支持iPad。

3. App 消息推送服务

Android 平台使用第三方推送服务是一个不错的选择。

4. 用户反馈

5. 调查报告

6. Code Review

7. 网站统计分析

8. 云测试

9. 云服务

10. 安全

11. 第三方邮件发送服务

12. 快速搭建博客/论坛/电子商务网站等

13. 代码管理

14. 项目管理

  • Trello:http://trello.com 小型项目管理、文档管理、Bug管理等都够用了。
  • 更多管理工具以后单独做一个专题。

15. 论坛与社区

16. 网站探测工具

17. iOS, Android, WP 平台界面规范、图片和图标资源等

18. 招聘

最后更新:2013-7-30 持续迭代中。

如有更好的工具建议、或者对以列出工具的评论,欢迎告诉我们,会一并分享出去。

「体验之美」是一个以用户体验为核心的知识「开源」项目,聚焦在移动互联网的设计、开发和创业领域,包括网站(tiyanzhimei.com )、微信公众账号(ID: tiyanzhimei)和知乎专栏 (zhuanlan.zhihu.com/design)。

转载请注明:「体验之美」知乎专栏 zhuanlan.zhihu.com/design

完成任务与团队精神

很多从大公司出来的人已经习惯了这样一种工作氛围:运营做运营的事、产品做产品的事、开发做开发的事。团队之间几乎没有交集,仅仅通过项目经理把大家联系起来。

同样也养成了这样一种工作方式:我只负责完成上司给我安排的任务,安排的少就混日子,安排的多就加班。工作被任务绑架,没有乐趣,缺乏动力。

但是,我们会发现,最终脱颖而出的都是那些少数人,那些不仅仅以完成任务为目标的人。他们想的是如何让自己更好,让产品更好,让团队更好,让公司更好。在这样的视角下,可以做的事情自然就多了,动力也足了,做事也会更有乐趣,更有挑战。

机器般运转的大公司如此,创业阶段的小公司更是如此。创业,比起做产品、做市场、找投资这些事情,更重要的是建设团队。创业公司里大家都是伙伴,是最开始那一帮人,肩负着所有的责任,而不仅仅是完成某一项任务。公司有不足之处一定要提出来,大家一起改正,朝正确的方向走。

做为开发,通常都会有紧凑的开发任务。但同时由于项目节奏等问题,有的时候我们会处于等待状态,无事可做。如果只是想着自己的那部分任务的话,好像确实无事可做了。但是切换一下身份,真的无事可做了吗?最起码我可以列出以下具体的事情:

1、我之前有没有什么技术上的总结或者感想?是否能够记录下来分享给大家?

2、我是否能给最美应用(http://brixd.com/nice)、体验之美(http://blog.zuimeia.com)贡献一部分自己的力量?

3、我之前有没有累积的困惑?是否觉得之前做的某件事情不够完美?是否可以更细致地去了解?

4、我是否可以学习些iOS开发、Android开发、后台开发的内容,让自己的能力更全面?

5、我是否可以学习些产品、运营、设计方面的知识,让自己的视角更全面?

希望在这个团队的前进过程中,每个人都能找到自己的节奏,真正的融入到团队,快乐的生活,快乐的工作,没有一个人掉队。

App如何更新数据

大部分以内容为主体的App,都不会把所有数据存储在App中,而是将数据存储在服务器端,从服务器中获取/更新数据。

具体情况具体分析,我们需要根据业务场景、数据量大小等,为App设计不同的获取/更新数据方式。

  • 几种常用的数据获取/更新方式

1、通过服务端数据接口,全量刷新数据。

数据更新频繁的条件下可以使用这种方式,比如新浪微博。
数据量特别小的时候也可以使用这种方式,每次重新取全部数据代价不大。

2、通过服务端数据接口,增量更新数据。

增量更新数据可以大幅度降低网络流量,降低服务器压力。
增量更新需要服务端与客户端做一些约定。
比如可以按时间更新,服务端每次数据发生变化(增删改)都需要记录更新时间。数据不允许物理删除、只可以逻辑删除。客户端根据更新时间取得该时间之后发生变化的数据并存储到本地。
另外可以通过版本号的方式对数据进行更新,客户端先从服务器端取得版本号,如果版本号变更了,则重新取数据,这应该算是一种半增量更新的方式。

3、使用WebView嵌入Web页面,实时更新数据。

这种情况实际上等同于网站的效果。
缺点是WebView目前性能上还差一个档次,需要较长的响应时间。另外每次访问需要下载整个页面内容,流量较大。
优点是跟网站一样,可以快速修改部署,可以在服务端定制包括UI在内的整个页面内容。

4、使用WebView嵌入Web页面,Web页面存储在本地,实时更新Web页面。

支付宝采用此结构。
对比3来说,4的优点是不用每次都重新下载html/css/javascript,仅需在页面发生更新的时候,重新将整个页面打包下载更新。
页面内的数据依然可以使用数据接口的方式获取。

  • 客户端什么时候更新数据

1、某些特定场景触发更新。
例如打开应用、应用从后台进入前台、用户登录、用户进入某一页面。

2、子线程定时更新数据。
专门起一个线程用来更新数据。Android下经常采用此种方法。

通常数据的获取/更新是异步的,首次打开应用除外。

 

开发在做什么?

开发者

之前经常有同事、朋友或者家人在问我一些类似的问题:

1、”你们在做些什么?”

2、“你们做的东西我们不懂”

对于外行人来说,不了解开发是完全正常的,毕竟开发是一个相对比较专业的职位。
对于互联网公司其它职位人员,例如产品、设计,不了解开发在做什么是不正常的。
尤其是对于创业公司,说明是流程上出了点什么问题。

  • 问题产生的原因

原因是双方面的,提问者与被问者都有问题。

提问者的问题:

1、不懂技术,这里指的技术不是指具体的系统架构或者编码执行工作,也不涉及到具体的语言或者工具细节。应该说是“技术常识”,比如说基本的技术可行性空间及产品开发流程。技术常识的获取其实是很容易的。多看看36氪之类的科技类博客,并且不绕过其中的技术概念;与技术人员的日常沟通;合理的利用搜索引擎。都会让你看起来更懂一点技术。

关于这一点有个笑话挺有意思的:在一个互联网公司里,产品、设计、运营人员认为工程师是无所不能的。在工程师中,女工程师认为男工程师是无所不能的。在男工程师中,普通工程师认为高级工程师是无所不能的。剩下那个高级工程师,每天在谷歌上绞尽脑汁地搜索各种问题。

有的时候别人懂得更多,就是更会用一点搜索引擎而已。

2、缺乏完整的项目经验。不懂技术是问题2产生的原因,而缺乏项目经验则是问题1产生的原因。在一个项目完成之后,有的人可以掌握整个项目流程,有的人还是局限于自己的那点点工作。这倒没有什么好坏之分,但是在创业公司,有一定的项目管理知识,能向自己的领域周围伸出一些触角,会大大提高项目流畅度与质量。

被问者的问题:

开发者应该更多地分享专业领域内的知识,毕竟这对于大部分人来说,是一个神秘的领域。这也是我写这篇文章的原因。“你都没说过,我怎么会懂呢?”。

那么,回到正题,开发者究竟在做什么,或者应该做些什么呢?

  • 从技术部职位划分上来看

通常在大公司技术职位有:前端工程师、iOS工程师、Android工程师、运维工程师、测试工程师、后台工程师。
运维这一块又可以划分为SCM(配置管理)、SQA(软件质量保证)、DBA(数据库管理)、服务器管理、安全管理。
后台工程师按语言划分:Java工程师、C/C++工程师、Python工程师、Ruby工程师等。
后台工程师按职能划分:程序员、架构师、项目经理、算法工程师。

当然,在大公司跟创业公司完全不一样,可以说是两个世界。大公司像是一台机器,每个人是一个零件,只需要专注于自己的那一小块领域。而创业公司要求每个人都是多面手,一个人可以解决所有问题。

但是这对开发人员只是在“写代码”这个言论有所澄清。

  • 从产品开发流程的演变来看

刚开始的时候,互联网产品开发并没有那么细致的分工,基本就是一个或者几个人凑在一起,大家既懂技术又懂产品,不懂的一起做做也都懂了。
也没有那么多换个壳到处都可以用的思想与方法论。大家一起研究用户需求,搭建产品概念,画UI,写代码。这是非常高效的一种工作方式。

后来逐渐划分为产品、开发这两个职位。一部分的产品开发人员脱离技术,去做一些产品需求相关的工作。

后来苹果强势崛起,产品开发流程中加入了“设计”这一环节,强调用户体验。

无论产品、设计、开发,都是产品整体开发流程中非常重要的环节。

这里我所疑惑的,是做这些事情的人而已。一些老的互联网从业人员,经历了这些流程变更,视角非常全面,能力也非常全面。
而现在新入行的年轻人,有的一出来就当产品经理,不懂技术也不懂设计。有的一出来就当工程师,只会写写代码。有的一出来就当设计师,只会在界面上思考问题。

流程上的细化让新入行的人视角变得狭窄,事实上的合作效率也变得更低。有的时候还会造成团队间的对立。

这时候正确的做事方式应该是:

1、明确自己所做事情的价值。
2、在产品开发流程中积极地与其它人沟通,获取一些沟通需要的知识。
3、对未知的事物保持敬畏,不要人云亦云,尊重与理解他人所做事情的价值。

在一次次的产品开发流程中,一个人应该变得视角更加全面,善于沟通,懂得从全局思考问题。

这里我所强调的是技术人员需要懂产品、懂用户体验。
产品最后从你手上诞生,如果你的所做仅限于实现,而不是思考如何将它变得更美好,那这必将是一件毫无灵气的作品。

  • 从开发者的日常工作来说

1、产品开发工作,这是最具体的一部分。包括技术可行性研究、技术方案研究、架构设计、编码开发、测试。
2、产品运维工作,包括产品上线发布、服务器搭建与维护、代码维护、数据库维护、查看log、查看用户反馈、Bug fix等。
3、技术积累,技术不是一朝一夕的事情。一个互联网公司要想基业长青,技术的积累是非常重要的,它让一家公司有足够的底蕴。这也是Google、Amazon这样的公司与其它IT公司的重要区别。
4、新产品、新技术的跟进与研究。这个应该是所有人都需要做的。对于一个开发来说,我相信大部分人不会满足于去实现一个功能或者产品。每一个开发首先是一个独立开发者,能够完成从用户研究、需求分析、产品设计、系统架构、编程开发、上线运营的整个流程。在其它环节有可以信任的人担任的条件下,可以专注于系统架构/编程开发环节,但是对产品本身的质量依然需要把控。
5、多接触生活,多体验世界的美,产品的美。也省的别人老说咱们是左脑思维者,不够文艺。举两个网站作为例子:
最美应用:http://brixd.com/nice
体验之美:http://blog.zuimeia.com

  • 为什么像淘宝这样的网站需要几千工程师开发与维护?

这也是很多人的疑惑,理论上只是做个网站,一个人就可以搞定了。
这里直接链接一个知乎的答案:http://www.zhihu.com/question/20303645

工程师的生活

今天和几个同事出去吃饭,席间大家各种开玩笑。
不知道谈到什么话题,一个同事说:但是你没我们那么阳光~
另一个同事紧接着说:所以你是程序员~~

这其实是一种正常的不能太正常的玩笑,但是却引起了我对一些社会环境的思考,我觉得有必要跟大家说明一些问题。
这些台词的潜台词,显然会让人联想起一种各种论坛描述的场景:程序员->加班->苦逼->生活灰暗->不阳光。

首先我先否认“程序员”这种职位提法。这种忽略思维过程,仅将最后执行的一部分工作作为职位描述的说法过于肤浅。
(抱歉,看完“黑客与画家”一书后,我的看法发生了改变,是我没有理解程序员所包含的意思,程序员这种说法一点问题也没有)。
所以,请不要用“写代码的”、“美工”这样的词汇,最起码应该用“工程师”、“设计师”,或者用一些抽象的提法“造梦师”、“寻梦师”也不错。

那么,话说回来,工程师的生活是否真如人们描述的那么灰暗无光呢?

首先,以我接触到的人来说,我工作4年,做过开发、项目管理、产品等职位(我承认做得都比较浅),接触到的大部分技术人员都有这些特征:幽默、乐观、具有产品大局观、注重细节。当然,有的时候难免入戏太深思维转不过弯。少部分人是技术的执着与狂热者,迈向技术专家的路子,成为互联网公司最为倚重的中坚力量。

其次,工程师的生活跟普通人也没什么差别。该吃饭时吃饭,该睡觉时睡觉,该加班时加班,该泡MM时就勇敢上。普通人可能以为工程师是绝对左脑思考者,注重逻辑,远离生活。实际上大部分工程师业余爱好一点儿不比普通人少,文艺范的工程师满大街跑。提到文艺范,这里顺便推荐个网站。
最美应用:http://brixd.com/nice

为什么接触到的跟社会舆论差距会这么大呢?我一直在思考这个问题。

原因一,我之前是在大公司,大公司比较强调技术积累,产品稳定的前提下对技术创新支持的倚重逐渐加大。而小公司或者一些创业公司,以实现目标为导向,考虑的并不长远。但这个应该算不上原因,因为实现目标为导向,是整个团队的事情,是创业初期的必然过程,跟工程师职位没什么关系。

原因二,工程师这个职位相对来说有点门槛,普通人难以理解其价值。毕竟不懂产品的人都可以说产品怎么怎么样、不懂设计的人可以说设计怎么怎么样、但是不懂技术的人却无法说架构或者代码怎么怎么样。由于技术脱离普通群众,加上工程师习惯的冷幽默。这个职位被一部分人妖魔化,再加上人云亦云的天性,这种现象其实是非常可悲的。

原因三、普通人应该没什么意愿去妖魔化这个职位,只是人云亦云而已。那么源头还应该是工程师本身。因为互联网行业的崛起,社会需求量太大,新入行的工程师难免做一些低级、重复的coding工作。由于视角低、也没有前进的意愿,自己对这个职位产生了排斥情绪,这种情况在中国也不是少数。很多初级程序员你能从骨子里看出他们的自卑。相反,在高级技术人员看到的是更广阔的视角,更深刻的认识,更骄傲的姿态。这种情况,想必日后在产品、设计这种相对较新的职位也会碰到。

在我看来,在一个创业团队中,做什么相对都没那么重要,重要的是你认可自己的价值、认可别人的价值。愿意主动地去沟通解决问题,而不是拘泥于自己的专业领域。如果你是工程师,你的优势在于先啃下了一块最硬的骨头,这会成为你以后做事的良好基础。

做什么都一样,如果你是朝专业化方向发展,那么你的成就取决于你钻的多深,你的优势在于会成为各个公司哄抢的宝贝,你可以坐地起价,并且清闲的生活。如果你是朝综合化方向发展,那么取决于你散发的光芒有多大,每个人都可以将自己的光环笼罩别人,无论是产品、设计、还是技术。

如果你知道在中国,李彦宏、马化腾、周鸿祎、雷军、丁磊、李开复、求伯君、史玉柱、张朝阳都是技术出身,也就是俗称的程序员,你还会觉得程序员的生活灰暗无光吗?还是你的视角太狭隘?

CocoaPods-iOS项目第三方库管理利器

一、简介

每种语言发展到一个阶段,就会出现相应的依赖管理工具, 或者是中央代码仓库。比如:

  • Java: maven,Ivy
  • Ruby: gems
  • Python: pip, easy_install
  • Nodejs: npm

随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,这个工具叫:CocoaPods

二、安装

这里的安装环境是 MacBook Pro OSX 10.9

不推荐使用 Mac 系统自带的 ruby,
ruby 安装方式:

http://about.ac/2012/04/install-ruby-with-rbenv.html

ruby 安装完成后,使用 ruby 的 gem 命令即可下载安装 cocoapods:
$ gem install cocoapods
$ pod setup

三、使用

使用时需要新建一个名为Podfile的文件,以如下格式,将依赖的库名字依次列在文件中即可

platform :ios, 5.0
pod ‘AFNetworking’, ‘~> 1.1.0′
pod ‘AFDownloadRequestOperation’
pod ‘SSZipArchive’
pod ‘GDataXML-HTML’
pod ‘WebViewJavascriptBridge’, ‘~> 3.0.0′
pod ‘SDWebImage’
pod ‘SMPageControl’

然后你将编辑好的Podfile文件放到你的项目根目录中,或者如果工程中已经创建Podfile文件,在项目目录下执行如下命令即可:

pod install

如果你要查找需要的第三方库是否在CocoaPods中存在,执行如下命令即可:

pod search 第三方库名

现在,你的所有第三方库都已经下载完成并且设置好了编译参数和依赖,你只需要记住如下2点即可:

  • 使用CocoaPods生成的 .xcworkspace 文件来打开工程,而不是以前的 .xcodeproj 文件。
  • 每次更改了Podfile文件,你需要重新执行一次pod install命令。