月度归档:2008年12月

关于产品设计的思考

前些天在37signals的主页,看到他们又出新产品了。Highrise,一个CRM管理工具。我虽然对CRM了解的不多,却也看过几个其他的CRM。那些CRM给我的感觉都是十分复杂。Highrise倒是出奇的简单,在我看来简单到就和一个通讯录差不了多少了。

然后又去翻看了下那本讲述他们产品设计理念的Getting Real

或许就如书中讲的一样,现在的大多产品不是功能太少,而是有着太多不必要的功能。

一个产品要增加功能是很容易的,将世面上同类型的软件浏览一遍,看看别人都有些什么功能,这样你很容易就可以得到一长串的功能列表。人们总是想当然的觉得功能越多越好,但功能的增加在很多时候也意味着使用复杂度的增加,同样随之而来的还有开发的工作量以及延期的危险。

很多时候我们都是理所当然的认为别人有的我们也要有,却很少真正想过到底哪些才是用户真正需要的。

我以前的公司曾有一套OA系统。直到用了很久后我才发现里面居然有提供通讯录和日程安排,因为这些功能根本就没人用。这个系统虽然提供了非常多的附加功能,但真正在使用的也就公告、工作流和站内消息(后来站内消息也基本上被邮件给取代了)。

我开发过的产品也存在类似的问题。人们真正用的也就里面一两个核心功能而已,那些花了很大力气开发的功能,事实上根本就没什么人用。当然,有些是商务上的考虑,那些所谓的功能只是忽悠客户而已。

每个人都有自己的边界,对于公司而言,每个公司也都有自己的边界。37signals是一个小得夸张的公司,他们甚至没有专职的产品策划(不知道现在有了没)。在我看来,对于这样的公司,团队中的每个人都应当参与到产品的策划中。他们擅长的小型团队的协作开发,这在一定程度上也是他们的边界。也正是如此,他们此前开发的产品都和小型团队的协作有关。在一定程度上说,他们是他们产品的目标客户。

就他们现有的客户类型而言,我想他们应当用不到CRM管理系统。也就是说,他们可能不是自己产品的目标客户。不知他们是怎么提取需求(Getting Real)的,或是有请专门的咨询师?

后记

乱七八糟的想了不少,然后写出来也是乱七八糟。或许是我无法做到所谓的Getting Real。

老照片的演示站点重新开放

今天在服务器上将老照片给部署好了,关闭许久的老照片终于再次开放了。
由于使用mod_rewrite似乎有些问题,我将静态问题统一放在了另一个域名下,但这却引出了一些其他问题。以前写程序的时候没有注意到静态文件的问题,直接将静态文件的位置给写死了,此外还有部分其他问题。不过修正后终于跑起来了。
在经过上次的修正后,依旧存在部分css兼容性的问题。不管了,至少大多页面看上去还是正常的。
http://lzpian.haoluobo.com/

GoogleCode上的SpringSide2vik项目建好了

本想将代码先整理下,不过似乎也没多少整理的必要。为项目新添加了netbeans的项目配置文件,这样使用netbeans的用户也可以方便的打开工程了。另外还做了个简单的视频演示,空间太烂,似乎要花挺久才能下载完。
项目地址:http://code.google.com/p/springside2vik/
视频演示:http://vik.haoluobo.com/static/springside2vik/springside2vik.htm

完成对老照片的调整,Django版本升级到1.0

今天完成了对老照片的调整,将Django的版本升级到了1.0。1.0版本的Django相比以前版本相比最大的变化就是那个newforms了。不过好在我在newforms出来不久就直接切换过去了,这次升级只需要在import的时候将newforms改成forms就可以。
admin也是0.96到1.0变化比较大的。不过老照片本来就不太依赖admin,所以我只修改了admin的url映射部分,保证admin后台可以正常打开。以后如果需要用到admin,再对admin部分进行调整。
由于我需要对用户上传的图片进行编辑,因此没有使用Django默认的上传处理。文件上传的变动给我带来了不少麻烦。以前从request.files里取出的文件是个map,但在新版本中变成了一个对象。这个对象虽然提供了files的相关接口,但却又不全,导致PIL无法正常处理。为此我增加了一个临时文件。先将用户上传的文件保存到临时文件再进行处理。在网上看到有用户遇到了和我同样的问题,不知Django在日后的版本中是否会修正。
至于目录的调整,我将那个碍眼的apps给去掉,把所有的文件放到oldphoto这个包下。
此外对项目的配置文件做了一些调整,将默认的数据库改为sqlite,保证程序可以在不做任何设置的情况下直接用manage.py runserver跑起来。
最后再将项目地址贴一下:
http://code.google.com/p/oldphoto/
将项目从SVN中取下后,依次运行scripts目录里的syncdb.bat、runserver.bat就可以跑起来了。当然,那些有些必备的环境还是需要的,python(>=2.4)+django(>=1.0)+PIL。

后记

本来休整工作还包括部分重构以及i18n等,不过在完成Django的升级后就开始没多少兴趣了。由于代码比较老,里面不少东西在现在看来都有更好的处理方式,如果全部都改工作量有点大,只是改部分打打补丁又没多少意思。或许那天重新写个自己看得顺眼点的新项目。

对自己开源的项目进行休整

和大多不负责任的开源作者一样,我都是将代码发布后就不怎么打理了。不过想来既然博客和wiki重新开张,就顺道将以前开源的项目给打理打理吧。
目前的计划主要将老照片SpringSide2–++调整下。

老照片

老照片是我刚开始使用django时做的一个项目。由于刚开始学习django,里面有不少在现在看来非常糟糕的处理。打算将那些非常糟糕的处理给改掉,其他一些一般糟糕的就算了。目前想到要做的主要有:

  • 重新调整目录结构。
  • 实现Django 0.96迁移到 1.0,修正迁移中产生的问题。
  • 把那些糟糕处理改优雅点。

SpringSide2–++

SpringSide2–++是我在SpringSide2基础上重新定制过的一个项目。在我看来定制过后易用性增加了不少,而且提供了一个还成的代码生成器,对于简单对象只需要将该对象的Model写完就可以自动生成完整的CRUD。目前计划的调整有。

  • 这个项目以前是以zip包的形式发布的,打算调整后放到googlecode上。
  • SpringSide–++这个名字现在看来似乎有些怪异,这次修正的时候顺便想个好听点的名字。
  • 写一些IDE环境初始化的脚本呢,帮助用户用IDE打开后不需做任何配置就可以直接跑起来。
  • 界面美化(我觉得现在的界面有点丑)。
  • 录制个简单的视频教程帮助推广:-)。

Google App Engine学习日志(三)不写了-_-,最后写点感受

    又整了几天的GAE,感觉也没什么好写的了。除了API部分和Django有些不同,其他的开发基本和Django差不多,边查手册变写也没啥问题(感觉Google的手册写的不是太好)。数据库部分感觉一些不是太习惯,自的管理后台比Django差太多,想手动编辑数据非常麻烦。数据库的变更也是一个麻烦事。新加属性后必须将数据库里的数据全部取出来重新put(保存)一次,不然所有用到该字段的地方都会查不出任何的东西。

Google App Engine学习日志(二)选个葫芦,开始自己的新工程

    GAE的API手册厚厚的一叠,如果要全部看完再动手,那估计还不得看完热情就已经跑光了。将GAE的入门手册看完后,我决定先找个范例工程,然后开始照葫芦画瓢。
    最终锁定了两个工程OnlyPy和Rietveld。
OnlyPy
    OnlyPy是国人用GAE写的一个Blog系统。我简单的看了下它的代码,还比较简单,挺具有参考价值的。
项目地址:http://code.google.com/p/onlypy/
演示站点(作者的Blog):http://onlypython.appspot.com/
Rietveld
    从Google内部开源出来的代码审核工具,据说是蟒爹的作品(Guido)。有了Google和蟒爹做招牌,这东西自然要多看两眼了。只是这东西的代码量并不太少,而且将非常多的代码都写在同一个文件里,阅读起来挺不爽的。
项目地址:http://code.google.com/p/rietveld/
演示站点:http://codereview.appspot.com/

选择好葫芦后就要开始画了。我根据以往的习惯,将项目的目录结构整理好,然后今天的工作先到此结束,改天继续。
整理好的项目结构如下。
/myProject/google apps/haoluobo/
|~haoluobo/将站点的主要文件都丢到haoluobo这个包下
| |~portal/我习惯将首页信息放到portal目录,然后将顶层的所有url转发给portal.urls
| | |+templatetags/
| | |-__init__.py
| | |-urls.py
| | `-views.py
| `-__init__.py
|~script/将些常用的命令写成bat,这样直接双击就可以执行了(可以偷懒一点点)。
| |-clear_tmp.bat*
| |-runserver.bat*
| |-runserver_with_clear.bat*
| `-update.bat*
|+static/程序用到的静态文件
|+templates/模板文件
|~vik/放自己通用工具的目录,目前还没啥内容
| |~utils/
| | |~gae/
| | | |-__init__.py
| | | `-webutils.py
| | `-__init__.py
| `-__init__.py
|-app.yaml
|-django.zip
|-haoluobo_bootstrap.py
|-index.yaml
|-settings.py
|-tags
`-urls.py

2008关键词

2008有着太多的喧嚣,或许是这个世界沉寂了太久有着太多的诉求需要发泄。
雪灾
首先见面的是雪灾。南方的漫天飞雪,2008以这样近乎华丽的方式开场。当然对大多沉迷于股市淘金梦的人们来说,他们是断不会想到,今年的股市会比这个冬天还冷。
艳照门
接着见面的是艳照门,一场全面偷窥的大狂欢。有时候真不知道是该说这是民主的进步,还是世风日下。
ZD
虽然XZ的问题一直存在,但基本上都成了不是问题的问题。取不想借着奥运的东风再次冒头。就像一个不甘寂寞的小丑,乘着人多主动蹦出来搞个无聊的表演。或许,它只是怕人将它遗忘。
地震
其实自然灾害每年都有,只是今年比较惨烈些。
奥运
奥运盼了这么多年,终于开完了,一场华丽的中国show。中国想借着奥运会作为一个展示中国的平台,只是还来不及品味就遇上了经济危机。不知道在以后来看奥运会是一个优秀的策划还是一个失败的投资。
经济危机
冰冻三尺非一日之寒,但真正关键的只是结果而已。美国的次贷危机迅速的席卷全球,变成全球性的经济危机。中国的股市更是从6000点的珠穆朗玛一直掉落到1800点的马里亚纳海沟。在股市疯涨的时候,股民们大叫政府的干预。我们在股市赚点钱容易吗,你还不让涨。但股市大跌后却开始大骂政府的不作为。股市都跌成这样了,还不托一托。政府容易吗。
爱国/WT
话说我以前一直感觉网上大多是所谓的愤青,总是有东西看得不爽,要大骂。缺不想在地震ZD等问题面前一下子出现了这么多爱国人士。更有甚者,在天涯上出现了专门HC国家两位领导人的“涛宝后援会”。不过或许大多网民只是因为无聊,所以善变。前两天还在为地震痛心疾首的网民们忽然间集体做起了俯卧撑。于是我开始相信或许所谓的WT在这世界上真的存在,或许WT和五毛党都存在。
虽然互联网早已过了“在互联网上没人知道你是一条狗”的原始时代,却也远谈不上真实。这还是一个马甲的时代。
Facebook/51
互联网的变化总是快的惊人。Facebook的迅速崛起,让去年还风头正盛的myspace仿佛在一夜之间迅速过气。与此同时,Yahoo由一个互联网的霸主迅速沦落为一个没人要的烫手山芋。也许还谈不上一个新时代的开始,但也算是一个时代的终结。
51,Facebook的中文Clone。有人说51开启了互联网无底裤抄袭(连css都抄)的历史。但至少51是成功的。尽管Facebook和51是如此的成功,但我却用的不多。特别是51,我始终没有去注册过。或许我已是上一代的互联网人,用着那些过时的产品。
山寨
山寨,始于山寨机却不限于山寨机。在2008,山寨终于发扬光大,走上主流,开启了所谓的山寨文化。毛泽东曾提出了“农村包围城市”的革命性理论,又如“人民只有人们才是创造历史的真正动力”。如今的山寨将毛泽东的理论精髓发扬光大,以草根的力量撬动世界。
iphone/GPhone
摩托罗拉败走麦城,iphone成功的沦为街机,Google的GPhone在千呼万唤后也终于露面。或许新一轮的手机大战才刚刚开始。
FP
虽说我是计算机专业毕业,但却也是在近年来才听过Function Program(FP)。似乎从去年开始国内就有一部分人在炒Erlang。也曾想去学两招好冒充大牛。不过了解后我认为这东西可能不太适合我,或许也并不适合大多人。 FP在更多的时候只是做学术用途。可能是神坛待久了也会寂寞,需要到草根世界寻找一些信徒。神之所以为神,是有人瞻仰。
既然我不是那少数的几只smart guy,就不去趟这趟浑水了。
FP虽然优秀,但不适合我,也并不适合大多人。

Google App Engine学习日志(一)使用Django 1.0 部署django_example

开篇的废话

    虽然GAE(http://appengine.google.com/)已经发布挺久了,而且我也在第一时间去抢了个测试名额,只是一直都没再去关注。说来我并不是太喜欢GAE这东西。GAE就是一个平台,要使用还得先学习一遍。而且由于限制很多,导致程序的移植性不怎么样。差不多用了GAE以后,就很难将应用再部署到自己的服务器上了。不过我想找个地方放东西,做一些自己的小应用玩,除了GAE外还真找不到啥其他比较好的免费资源。
    废话基本上说完了,下面开始正式进入主题。

准备工作(申请开通GAE)

    GAE在刚发布的时候需要先提交申请,再等待开通,现在似乎已经放宽限制可以随便申请了。但开通项目的时候会提示要用手机接收验证码。有人说移动的手机无法接收验证码,不过我的移动号码没遇到问题。这里需要注意的是,google是面对全球服务的,手机号码前需要添加国家标识,中国大陆的是86。
    使用GAE需要下载Google提供的GAE SDK。GAE SDK就是一个普通的安装包,直接安装就可以使用的。GAE计划支持多种开发语言,不过就目前而言还只支持python,因此在安装GAE前确保Python已经安装也是必须的。

安装范例程序django_example

    GAE本身就是一个WEB开发框架,即使不使用任何其他的WEB开发框架也可以直接使用。不过选用一个自己熟悉的,或者是自己认为方便的第三方开发框架也是一个不错的选择。目前GAE官方支持的WEB开发框架有Django0.96/pylons/web.py等。不过即使是GAE没有官方提供的,你也可以选择自己安装。
    由于对Django比较熟悉,而且万一日后真的需要迁移到自己的服务器上,使用Django开发日后的迁移工作也可以相对轻松点。选定Django做GAE的web开发框架。
    为了尽快的了解GAE的特性,我直接去GAE的sample项目(http://code.google.com/p/google-app-engine-samples/)上将Django的sample(django_example_20080409.tar.gz)给down了回来。
    解压后,运行命令dev_appserver.py django_example/,sample就跑起来了。可以使用http://localhost:8080/进行访问。这个Demo提供了简单的登陆/添加/修改功能。
    简单的看了下目录结构,其中下面几个文件比较重要。
|-app.yaml
|-django_bootstrap.py
|-index.yaml
app.yaml
    应用程序的基本配置信息,主要就是程序名,以及url映射。这里所有的url都交给django_bootstrap.py处理。
index.yaml
    这个文件是建索引用的。
django_bootstrap.py
    这其实就是一个wsgi的处理程序,将请求以wsgi的形式交给django进行处理。

更新Django到1.0

    如果使用GAE自带的Django,不需要做任何配置,不过现在Django1.0已经发布,似乎没有必要再使用0.96。于是动手将Django升级到1.0。
    察看官方的相关教程使用zipimport引入Django1.0(使用zipimport主要是GAE有文件数限制,而django的文件数本来就不少)。
    具体做法文章里已经说得比较清楚,我就不再啰嗦。不过有个问题需要注意的,在windows下会出现问题’module’ object has no attribute ‘unlink’,在网上看了下GAE将os的unlinlk给禁用了,需要做点修改。
在django_bootstrap.py里加上
if os.name == ‘nt’:
  os.unlink = lambda: None
更新后sample终于再次跑起来了,不过不幸的是点击添加gift的时候再次出错。这次是Django的错误。可能是Django在1.0里对url tag有做改动,在参数不存在的时候会出错。修改gift.html,将表单的提交地址修改为action=""。
    所有问题修正,使用命令appcfg.py update haoluobo/(haoluobo?:),我换了个自己喜欢的名字)上传到服务器。访问服务器http://haoluobo.appspot.com/,应用已经跑在Google的服务器上了。

后记

    没想到写个简单的学习日志这么费事,不知道还会不会有后继的日志。

推荐一个vim插件eclim(将eclipse集成到vim)

非常棒的一个vim插件,可以将eclipse的功能集成到vim。
eclim的具体功能可以参考官方的命令说明http://eclim.sourceforge.net/translations/zh_TW/vim/cheatsheet.html
(繁体中文翻译)
虽然eclim主要目标是要将eclipse的功能集成到vim,不过eclim本身的vim脚本也是非常实用的(我就没去集成eclipse)。
对我而言,我主要使用了它的自动python语法检查,以及对html标签的</自动完成。
官方的安装版本没有eclipse会无法安装,可以直接到http://eclim.svn.sourceforge.net/viewvc/eclim/trunk/src/vim/,点击页面上的Download
GNU tarball,将eclim的vim脚本down回来,并复制到Vim\vimfiles目录。
如果没有和eclipse集成,有部分功能无法使用并会弹出不少讨厌的提示,可以修改文件Vim\vimfiles\eclim\autoload\eclim\project\util.vim。
找到函数function! eclim#project#util#IsCurrentFileInProject (…)
在函数的最开头增加 return 0
表示文件不在eclipse工程里。
这样eclim就不会再做和eclipse相关的操作。

备注:

今天在使用的时候发现在打开Django的模板文件的时候还是会有些错误提示,不知道是否是他的脚本写的有问题(我看过代码似乎没有问题)。我修改了一点屏蔽了问题。具体修改方法为在\Vim\vimfiles\eclim\ftplugin\htmldjango\eclim.vim中增加以下脚本

if !exists(‘g:HtmlDjangoUserBodyElements)
  let g:HtmlDjangoUserBodyElements = []
endif