作者文章: Fenng

从开发者角度看国内 Android Market 的用户体验 (更新版)

近一段时间在发布丁香园 用药助手 Android 版的过程中把国内几个重要的 Android Market 用了个遍,每次要发布新版本的时候都要感慨一下:几乎所有的 Android Market 后台的用户体验都不怎么好。

信息各有一套

国内所有的 Android Market 和 Google 官方 Android Market 都是不”兼容”的,无论是产品的描述信息以及应用类别划分,每一家都是自成一套。比如,软件截图,各有各自的要求,尺寸、格式如果不一致的话,还要针对性的单独人工处理,对开发者的工作量无形中增加了许多。对产品的描述也是千奇百怪,有的支持富文本编辑,有的只支持普通文本。有的更新软件要求写更新内容,有的则不提示填写,如果自己想写的话,需要修改整个 App 的描述信息。再比如分类信息,丁香园用药助手在有的 Market 上只能列入到「生活」类,而在另一个 Market 或许就要被迫列入「其他」,因为实在找不到和健康或是医疗相关的类目。

目前未能捡到各家市场针对产品类目管理有改善。

版本控制问题

只有少数一两家对版本控制还算有点意识,多数都没有相对靠谱的版本控制机制。有放任自流派:开发者在后台任意更新版本;也有关卡审核派:让你处于一个无法修改也无法撤销的”审核中”状态,一旦发现错误,想更正只能等下一个版本。至于审核周期,也是千奇百怪,有的立等可取,有的需要人工联系「我们发布了一个新版本,抽空给审核一下吧」,也有的长达一周。

后台可访问性

有的后台访问速度慢(这是很难让我想通的问题),甚至应用截图都不能正常显示;而上传的接口,也有很多细节问题,比较离谱的是有几家居然不提示上传进度,整个上传过程中只能凭感觉,等待,刚好丁香园用药助手的软件包还比较大,有的时候遇到传输中断,简直令人抓狂。

Updated: 各家市场的可访问性的改进已经好很多了。不过中国移动市场(MM)依然烂的非常有艺术气息

界面信息混乱

第一次注册后提交软件的时候要把整个流程跑通还是比较难的,提示和术语都要理解半天才知道是怎么回事,文案差异性太大。登录到后台后,一个典型的情况是多数 Market 从后台找不到发布后的应用在前台的链接,比如应用汇。而有的 Market 更加离谱的是,后台还是传统的表格形式的展示,比如魅族。

Updated: 安卓市场(Hiapk) 的改进较为迅速。值得肯定。

数据不够准确

几乎所有的 Android 市场,统计信息都不是特别准确,有些甚至下载统计数天都不更新,有的甚至后台就不做数据统计,下载多少要前台页面自己去看。想得到靠谱的 Android 下载数据? 哦,你实际上得不到靠谱的 Android 下载数据,如果想统计应用打开的数据,最好是早点启用类似友盟这样的应用统计服务。

流程足够复杂

流程复杂这个主要是针对联通、移动、联想这些富有官僚气息的 Market 来说的,比如用户资质信息最多的有上百条信息要填写,你就折腾吧,没有几个小时,没有公司上下配合(还要营业执照副本什么的)你根本搞不定,在你提交应用之前你准会崩溃。所以,有些时候,对这样的市场不得不放弃,即使有用户真的要从这些渠道下载你的应用,也没办法。

Updated: 点名的这几家一如既往的不思进取。奉劝做 Android 应用的朋友绕路而行。
结束语

其实,倒也不只是国内的 Android 市场对开发者的用户体验差,Google 官方的菜市场也有很多问题,举个简单例子,一个文件包传上去之后,如果发现有问题,没办法替换,只能更新一个更高的版本上去(还要重新打包)。每天在网上看到网友数落这个网站用户体验差,那个网站用户体验差什么的,其实如果你去用一下这些 Android 软件市场,就知道用户体验差其实是没有底线的。

前几天参加移动开发者大会,发现 App Market 俨然已是各大互联网公司的标配,都在纷纷的推出自己的 Market ,恐怕以后还会更乱。据悉,已经有创业团队在开发一次性提交到多个 Market 的工具了,不知道什么时候能看到。很明显,这也是吃力不讨好的事儿。

也可能是每家 Android Market 都在拼前台的用户体验呢吧,真心期待国内 Android Market 能早日关注一下针对开发者和维护者的用户体验问题,这也是每个 Android 开发者期待的,让开发者有更多精力做应该做的事情。

EOF

此文作者:, 位于 Review 分类 标签: , on .
转载须以超链接形式标明文章原始出处和作者信息及版权声明.

Tuning Linode VPS-小规模低性能低流量网站优化实践

偶然看到以前写过的这篇帖子 『小规模低性能低流量网站设计原则』,重新发到微博上引起了一点反响,觉得有必要以 Linode VPS 为例再做个简单的优化实践说明,免得总有人问我,也顺便赚点点击量 :)

假定现在你已经有了一个基本的 VPS 可用,基本内存 512MB 。参考官方提供的各种安装指导将 LAMP 这个组合运行了起来,操作系统一般 Ubuntu ,Web 服务器 Apache ,数据库 MySQL ,然后是 PHP ,以及需要安装的应用软件,WordPress 、Drupal 或是 OpenCart 什么的,一步一步配置好,能够正常的浏览页面。按照官方指导文档操作的一个好处是会包括一些基本的优化一点的配置。不至于出现太大的错误。

一旦应用就绪后,登录到操作系统中,通过 top / iostat / free 等基本操作系统命令收集基准数据,做记录。收集信息越全面,对于后面的优化就越便利。优化没有魔法,只有合理的方法。

1.内存相关的调整
内部测试或是较小范围使用,可能这样也不会遇到太大问题。一旦访问人数多了一点,机器响应可能就有点慢了。对于 VPS ,第一步着手调整的就是各个组件对内存的使用。因为内存受限,对内存的使用一定要精打细算一点。记住一旦内存耗尽,一部分内存调用压到磁盘上,系统负载会飙升,一般就会挂掉。 一般来说,对于 LAMP 环境,以下几个地方要注意:

PHP 程序的内存相关的调整
PHP5 配置文件 php.ini 中 memory_limit 定义的值默认情况是16MB,该参数定义单个 PHP 脚本消耗最大的内存大小(大意)。如果程序某个页面需要的内存超过这个限制,访问者最可能遇到一个 HTTP 500 错误,查看 Web 服务器错误日志也可以看到。多数情况下,这个值需要做相应调整。比如设置为32MB,是否合适,需要做观察。有一个经验方法是观察 top 命令的输出,看相应进程的 SHR 字段的值,实际上总是尽量大一点点。但不能过大,一旦有个别程序写的不好调用的时候占用过多资源,会导致 VPS 挂掉。

经常有人问,这个服务器跑某某 Web 应用,能支持多少并发? 一个大致的思路是估算单个进程占用的内存,看系统能分配多少内存给应用程序,并发的量大致可以估算得到。但实际上,这个提问基本没多大价值。

另外,还有一个比较重要的参数需要修改 output_buffering 需要修改为 On 或是具体数值(eg, 4096)。修改配置后,检查是否生效(如何检查?)。另外,记住error_log的位置,随时查看。

MySQL 数据库内存占用
如果不确定 MySQL 内存使用情况,可以利用 MySQLReport 这个工具收集一下 MySQL 实例的信息报告,不同时间段多收集几次作为对比。然后相应的调整 key_buffer/query_cache_size 等参数的大小, 一次调整一个参数,重启动 MySQL ,继续抽取报告,分析数据,然后调整下一个参数。既然需要编辑配置文件 my.cnf , 建议顺手加大一点 max_connections 这个参数(为什么?)。

多数内存问题都是由数据库 I/O 引起,导致 I/O 问题多由不合理数据库调用有关(这么说严谨么?),解决不合理调用要么修改应用,要么通过查询缓存或是 Key-Value Cache 等办法缓解。这地方说来话长,假定 VPS 上基本不会有这么复杂的环境。

2. 影响 CPU 利用率的调整
这个主要针对 PHP 的 Opcode(Accelerator) 而言,解析、编译PHP代码是相当消耗CPU的操作。常见的要么是 APC, 要么是 eAccelerator 或是 XCache,在 Ubuntu 下安装配置都相对简单,参数调整简单搜索一下就知晓了。如果是 PHP 环境,那么一定要用 Opcode 减少 CPU 的负荷(为什么?)。至于用哪一个关系倒是不大,但前提是必须要有一个。

另外,张磊同学这篇 让进程运行在指定的CPU 对于特定需求的应用,很有借鉴意义。

3. 网络参数控制
修改 /etc/sysctl.conf 文件,增加如下几行:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

然后 sudo sysctl -p 使修改生效。使用如下一行命令观察半连接数量:

$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

其实一般来说,网络连接数不会成为最明显的瓶颈。但顺手调整一下也好,「不费电」。有人问,如果遇到 DDoS 怎么办忍着。

4. 应用程序相关的调整
比较流行的开源程序,不安装第三方插件的情况下,性能多少过得去。建议如果没有必要,不要启用过多的第三方插件,尤其是一些带有统计或是「智能」显示内容之类的插件能不用就不用。

这些开源程序也基本上都有面向前端优化的静态化解决方案,比如 WordPress 的 Cache 相关的插件,强烈推荐启用。有时间看看前端优化的实践建议。

Tuning_LAMP.jpg (图片来源)
优化最重要的是找到瓶颈,对症下药。前面已经说到了内存、CPU、网络,大致提了一点 I/O 问题,基本也就够了。PHP 的 Log , MySQL 的慢查询 Log ,Apache 的 Error Log ,常过滤看一下有没有新情况。

补充一点,别忘了修改 OS 的 ulimit 限制:

编辑 /etc/security/limits.conf 增加如下两行(具体数值大点小点问题不大):

*  soft  nofile 40960
* hard nofile 40960

编辑 /etc/pam.d/common-session ,增加如下一行:

session required pam_limits.so

编辑 /etc/profile ,增加如下一行:

ulimit -SHn 40960

重新启动 OS 即可生效。

Linode 后台提供了几个基本的统计图,基本够用。可以设置磁盘 I/O 过高的时候报警,系统会发邮件给你。注意看一下网络流量的使用。不要因为个别文件被盗链而将带宽消耗殆尽。

上面提到的不少修改建议不要照葫芦画瓢,知其然,还要知其所以然。每一步的调整多阅读系统手册,尤其是涉及到具体的参数数值,一定要针对实际情况修改。对基本的配置足够掌握之后,可以根据具体情况尝试性能效率的组件,比如用 Nginx/Lighttpd 替换 Apache ,但是要记住,如果 Apache 不是瓶颈的话,用传说中性能更好的 Web 服务器来替换无疑是折腾。

再次提醒不要过度优化,足够满足需求就行了。有更多的精力完全可以放在其他环节上。另外,如果基本的调整做过之后,想用最省事的办法改善性能,那么,直接向服务商购买额外的内存吧。

好吧,最后我想说的是其实这个优化思路并不局限于 VPS ,这个最小实践套路对于复杂的服务器环境也是基本适用的。 –EOF

Tip:页面不要引用太多的三方脚本。否则也会被拖慢不少。

丁香园技术团队是怎么招人的

不知道国内是否有创业团队招人是不费吹灰之力的,至少我了解到的绝大多数创业团队都面临招聘难的问题,而且不是一般的难。和一些中小互联网公司的技术负责人交流,也都会为招人的问题而诉苦,丁香园 作为创业团队当然也是这样。从去年年中我加入丁香园负责技术团队开始,招聘就是最大的挑战之一。今天在阅读完知乎上「创业公司应该如何招人?」这个讨论之后,在这里也想分享一下丁香园技术团队的招聘经验。

我们找什么样的人?

概括一下说,我们要找的人最后一定是个「能解决问题」的人。另外,需要有一定的自我驱动能力,不要事事都要别人来管理。一定程度上,我们力争把技术团队打造成「自我管理型」的团队,真正「有效率」的团队。

通过影响力吸引人

是否小的团队影响力一定小?是否足够有名气才有足够的影响力?当然不是,看你通过什么方式、什么渠道去影响什么人。比如对我们来说,Twitter 是相当不错的扩大影响力的工具,也是个非常好的招聘渠道,在长期认真经营之后,有必要进行合理利用。有很多给丁香园投递简历的人在之前都通过我的 Twitter 关注我在丁香园这家公司的动态,绝大多数人也都阅读过我的Blog上的文章,如果他们认为我是不靠谱的人的话,不可能投递简历过来。

Twitter、微博、Blog 等平台和工具是创业团队最应该利用好的渠道。谁让你没有其它资源呢? 这就是创业团队的局限性。我不喜欢用相对封闭的资源(比如学校的BBS)去发招聘信息,同时希望能找到的人有一点信息外向的意识,而不是只等着别人找到他/她。

通过价值观说动人

当然,投递简历过来只是第一步,重要的是沟通并确定是否是”志同道合”的人,是否认同这个团队做的事情,是否认同这家公司做的事情,是否认同这个行业,是否想让自己创造更大的价值 — 这些当然都要弄清楚。还要弄清楚候选人不单单为了一两个技术明星而过来,「慕名而来」往往是很危险的事情。

可能很多人会很反感”价值观”这三个字,别误会,在这里我只是想强调一下我们彼此共同认可的东西,我们是为了彼此认同的东西才共事,而不只是通过薪水去诱使人进入公司。同时,在面谈的时候我也会直接告之候选人丁香园技术团队的不足之处,甚至我们公司的不足之处。短期内我们给不出足够高的薪水,但我们力争中长期让你有足够的回报。甚至就拿办公环境来说,肯定不如一些大公司那么舒适。当然,有差距不要紧,只要真的能够逐步改进。

不作校园招聘 但招实习生

坦率的说,中小公司如果不是特别特别有魅力的话,跑到学校大张旗鼓的去做校园招聘,无论时间、人力还是物力,都实在是一种铺张浪费,而且,效果未必好,毕竟那是在和大公司直接在校园招聘市场竞争。

我们的做法是,通过 Twitter、Facebook 等网站寻找实习的同学(尤其倾向有能力「翻墙」的同学),提供不固定限额的实习岗位,提供成长环境和学习机会。值得一提的是,实习期间表现优异的话我们提前支付转正后的薪水。过去一年中,一共有 8 位同学来实习过(包括即将大三的也有),最终有四位同学留下来,正式加入了我们团队,在各自的技术方向上都有不小的进步,而且对团队贡献不小。

有效控制招聘成本

在今年年初的时候,技术团队的招聘停掉了在智联招聘、中华英才网等各个大型招聘网站上的招聘广告,我不是说通过这些网站找不到适合我们的人,而是因为隐性成本相当的高,不只是广告费用上的投入,还有简历筛选以及面试,都要投入很大的精力。去年2010年下半年还有通过这些网站在收集、筛选简历,2011年基本上就停掉了。不过,我们依然会在专业的技术网站上投递招聘信息,当然,免费的更好。

尽管之前曾经通过委托招聘的方式找到过非常好的人才,但以后将不再通过猎头进行招聘工作,主要是出于成本的考虑。另外如果花钱就能解决,那么还要我有什么用?

节省下来的招聘成本一部分用在推荐或是内部推荐的激励上。对于内部推荐,我们给出的是相当高的激励标准:一个月的薪水。有些特殊岗位的招聘,自荐也给奖励。我们不会去「高薪挖人」,这实在是很愚蠢的做法。对每个人来说,薪水和回报是自己的工作付出得到的,不是被挖了才有的。

随时随地做招聘工作

Facebook 前工程总监黄易山在总结 Facebook 研发文化中的宝贵经验中说道「永远将招聘作为你的第一要务」,于我心有戚戚焉。实际上,要我说出来我用了多少时间去做招聘,无法给出具体可靠的数据(如果有人给出你数字,要么公司足够庞大有闲人去做统筹,要么是在蒙人)。但有一点我可以保证:随时随地做招聘,时刻想着招人。比如,我在知乎阅读 iOS 相关问答的时候偶然发现一位不错的工程师的主页写着准备找工作,立刻联系… 最后又经过几次沟通之后成功说服他加入了我们团队。

不能等有了招聘名额再去行动,那样必然被动,创业团队不要做刻舟求剑的事情。有一点要说明的是,不作限制的情况下不是招到越多的人越好。这个似乎人人都明白,但是有些人一有点小权利就喜欢扩充地盘,盲目的认为自己管理的人越多就是权利越大,就越有晋升的机会,在大公司里面很常见,最终是人浮于事。这一点上我倒是很庆幸。

招聘工作永远要改进

每过一个季度会审视一下整个团队过去的招聘工作,如果发现过程有做的不够好的地方(比如招聘环节衔接上的疏漏)需要立即在下一个周期着手改进。招聘工作永远都不是完美的,但能做的更好一点为什么不做?

在这里也向曾经接触过的朋友们说一下:如果有做的不好的地方,还望见谅!

一年过去了,回头一看,团队规模已经扩大了整整一倍,四分之三是新人。当然,我们现在依然缺人。比如,现在依然在招聘移动应用开发的人才:

如果你对丁香园技术团队感兴趣,我们干脆一起谈一谈!

EOF

此文作者:, 位于 Startup 分类 标签: , on .
转载须以超链接形式标明文章原始出处和作者信息及版权声明.

Linux Ksplice,MySQL and Oracle

Oracle 在 7 月份收购了 Ksplice。使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性。现在该产品已经合并到 Oracle Linux 中。目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了?)

Oracle Linux

今天看到,Oracle 今后将只对 Oracle Linux Premier Support 客户提供 Ksplice 服务(refer)。毫无疑问,这个产品从一定程度上大大提升生产环境(尤其是数据库服务器)的安全性、可靠性和可用性,对购买了 Oracle 相关服务的用户来说,无疑这是个好产品,但对于 Linux 生态来说可能是灾难,尤其是 Red Hat,市场或许将进一步被 Oracle 蚕食,短时间内不太可能找到替代性的产品,看 fork 出来的 Ksplice 分支会怎样吧。Oracle 已经成为 Linux 操作系统市场上举足轻重的玩家,但是不交钱,用户没办法和 Oracle 玩儿。

MySQL 最重要的存储引擎 InnoDB 也控制在 Oracle 手上,当然 MySQL 也在 Oracle 手上。最近的有部分迹象表明 MySQL 部分功能即将闭源。MySQL 官方博客说部分插件只有商业版才会提供,比如 Thread Pool ,官方的测试报告显示,配置了 Thread Pool 的MySQL企业版,在4K个并发链接的情况下展示了良好的可扩展性(refer)。想使用? 交钱吧!

别忘了,Java 也在 Oracle 手里。

EOF

此文位于 OpenSource on by .
转载须以超链接形式标明文章原始出处和作者信息及版权声明.