msgbartop
woshimaijia project tech blog by xinqiyang
msgbarbottom

05 Dec 11 [智能架构系列]Buddy框架图片文件云存储模块实现

[智能架构系列]Buddy框架图片文件云存储模块实现
引子
最近很久没有写文章了,主要是忙于公司的项目,也给自己一个深度挖掘的方向,另外生活也出现了很大的变动,现在终于憋不住了。订阅技术博文是技术者必须做的一件事情,每天打开google reader总是会有所发现有所惊喜继而是感慨。本次主要来介绍下图片的云存储方面的技术实现,不管是对于云技术实践,还是降低相关的运维成本,都是很有效果的,不信就往下看吧!

关键字:图片云存储 又拍云存储 PHP图片存储 廉价高速图片存储

正文
上周看了磊哥的文章 又拍云实战 http://www.blogkid.net/archives/2782.html 后很有收获就觉得去试试又拍云存储的服务http://www.upyun.com/,就去注册然后申请试用了。
本次upyun.com的认证方式很让我意外,竟然是客服打电话过来确认,这点服务感觉还是挺好的,从这里感觉还是蛮重视用户的。特别要说的是,今天是星期天我又在这里宣传upyun.com的服务,就和同事说了下,结果他去注册了,竟然在半小时后就接到了客服人员的电话了,感觉这个确认还是很及时的,体验很好,这点感觉还是很不错的。
试用就开始吧,为什么要试用又拍云存储服务呢?这点磊哥的文章中就已经说的很清楚了,这里我做归纳补充下:
1,图片服务器的托管及运维费用挺高的,而且峰值带宽觉得了大部分成本,且运维的软硬成本增大
2,单机达不到CDN功效,需要CDN支持的话,花费就更大了
3,图片的处理及图片的缓存,需要配置nginx的静态缓存图片,需要做系统设计扩展图片类的保存图片及缩略图功能
4,图片的备份,对于图片的备份是个问题需要用rsync同步到备份机器,添加了运维成本和开发成本

基于以上原因,自己开发及部署图片服务的代价还是很大的,所以这个也是极力推荐使用又拍云存储www.upyun.com的原因了,至于大家说的upyun.com是否稳定,磊哥提到的猛买网用了2个月还是没问题的,我也相信@gofeeling和又拍的技术实力的。
如何申请及开通就请详细参看磊哥的博文吧,本篇主要更细致化的讲解技术实现。
首先,设计表结构
id,filename,desc,createtime,status,remoteurl,url,model,user_id
本次主要用到的字段有 filename 及 model
构造图片的访问地址 $staticUrl / $model / $filename
例如: http://img001.img.woshimaijia.com/user/testuser.jpg
考虑到图片表可能进行分表,这里的id使用了 17位的bigint 时间递增

其次,完善图片类
首先图片的处理流程分为如下
1.用户从表单中上传的图片
2.已经上传的图片
现在这2部分的图片都需要迁移到又拍云存储中,而且都需要做本地进行备份。
所以处理的逻辑如下
用户上传 –> 图片保存到WebServer –> 调用ImageUpload类将图片上传到upyun.com –> 更新数据库表
图片读取 –> 获取图片id集合 –> 调用getImage方法拼接URL –> 返回图片URL

下午调试了下实现了一些HTTP REST的图片使用类,主要包含了
上传,下载,删除,查看使用空间
具体代码如下

 

<?php
// +----------------------------------------------------------------------
// | Buddy Framework
// +----------------------------------------------------------------------
// | Copyright (c) 2011 http://buddy.woshimaijia.com All rights reserved.
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Author: xinqiyang <xinqiyang@gmail.com>
// +----------------------------------------------------------------------
/**
 * Image Upload service
 * use upaiyun.com image service
 * 使用了又拍云存储的图片服务
 * @author xinqiyang
 *
 */
class ImageUpload
{
    protected $_config = array();
    public function __construct()
    {
        $this->_config = C('imageservice');
    }
    /**
     * update file to upaiyun.com
     * 上传图片保存到又拍云存储网
     * @param unknown_type $object
     * @param unknown_type $filename
     * @param unknown_type $path
     */
    public function put($object,$filename,$path)
    {
        $postField = file_get_contents((realpath($path)));
        $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'/'.$object.'/'.$filename);
        curl_setopt($process, CURLOPT_POST, 1);
        curl_setopt($process, CURLOPT_POSTFIELDS, $postField);
        curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
        curl_setopt($process, CURLOPT_HTTPHEADER, array('Expect:', "Mkdir:true"));
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
    public  function get($object,$filename)
    {
        $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'/'.$object.'/'.$filename);
        curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
    public  function delete($object,$filename)
    {
        $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'/'.$object.'/'.$filename);
        curl_setopt($process, CURLOPT_CUSTOMREQUEST, 'DELETE');
        curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
    public  function usage()
    {
         $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'?usage');
         curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
         curl_setopt($process, CURLOPT_HEADER, 0);
         curl_setopt($process, CURLOPT_TIMEOUT, 30);
         curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
         $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
    
    /**
     * save file or image to upaiyun.com then update db
     * 先保存数据到又拍云存储,然后在更新数据库
     * @param string $model
     * @param string $filename   保存文件名
     * @param mixed $streamFile  流文件或者是图片路径
     * @param bigint $id ID
     * @param bigint $user_id userid
     */
    public  function save($model,$filename='',$streamFile='',$id='',$user_id)
    {
        $result = $this->put($model, $filename,$streamFile);
        $id = empty($id) ? objid() : $id;
        $filename = empty($filename) ? $id : $filename;
        if($result['code'] == 200)
        {
            $array = array(
                'id'=>$id,
                'filename'=>$filename,
                'model'=>$model,
                'status'=> 0,
                'user_id'=>$user_id,
            );
            return ImageService::add($array);
        }
        return $result;
    }
    
    //从缓存获取image表中的 model filename 然后拼接成url 返回
    public  function  display($id)
    {
        $url = $this->_config['url'];
        return $this->_config['url'].ImageService::getImage($id);
    }
}

结语
其实使用API的方式操作其实会比现在的繁琐一些,保存做WebServer上的文件只是作为一个备份文件的形式存在,等同步到备份地址后删除即可,对于同步到备份服务器后即可进行缩略图的操作,或者是通过upyun的url将用到的图片做download一份到备份服务器即可,另外又拍的存储的价格现在看来还是挺实惠的,感觉非常的不错,推荐大家试用。其他国内更多的靠谱的云产品的出现!

16 Oct 11 发布buddy框架1.0版本-智能的最具商业价值的PHP框架

buddy框架,秉承国内优秀框架THINKPHP的优点并增加了很多的商业特性和集成了全版本的商业项目模块,提供给创业者一个最好的选择

 

组建图:

 

16 Oct 11 发布buddy框架beta版本

发布buddy框架beta版本

 

buddy经过近2年的开发,终于发布了

29 Jul 11 互联网产品的本质思考及架构实现探讨

作者:杨鑫奇        公司:百度

 

互联网产品的本质是什么?

作为系统的设计者,什么样的产品什么样的产品线才能够给使用者带来真正的价值呢?

最近两年来一直在思考这个问题,现在终于有一些沉淀,写下来,和大家一起探讨!

当某个时候通过一个方式页面被我们打开了,当然这里指的页面是广义上的页面,就是说我们所看到的,看到的最多的莫过于电脑上的页面,手机上的页面的页面还有其他的比如ipad等的页面,当我们看到这些的时候会想到什么我们会怎么做?我们来分析下这个过程!

 

首先提取出这个过程中的元素

页面的载体(电脑/手机/ipad….)

页面,屏幕上展现出来的页面

 

其次提取页面的关联关系

页面 包含了以下图示中的内容  主要有:

载体(站点、产品、品牌、话题、群组等等)

页面中主要表现的元素,比如导航站主要是站点, 电子商务网站是商品,微博站点的话题等等

关联状态

关联状态主要是人和载体感受,比如感受  人喜欢视频,比如人喜欢Iphone4,人购买了iphone4

TAG

载体和载体之间的关联,iphone4 关联关键字iphone,apple,苹果,手机   这样就可以实现载体和载体之间的关联

沟通

人和人之间的沟通,比如人去淘宝里面购物,需要打开旺旺和卖家沟通,或者是有客服页面,人打开客服QQ进行聊天

时间

时间维度是最重要的维度之一,随着时间的流逝,系统中会有很多的动作,需要把这些用户的动作记录下来

区域

地区维度也是最重要的维度之一,根据用户的地域区别来对数据及载体进行分类,针对地域性的规则定制

行动

用户看到载体及介绍的内容之后的行动,鼠标的滚动(拉下来看更多的信息/点击其他的按钮比如顶,赞等),键盘的输入(发布评论),跳转到其他的载体

扩展

扩展,留点扩展,让大家开动脑筋来更好的思考

 

我认为如果系统中能够实现以上说讲到的7个关联中的若干就能够提醒出价值,对于用户的价值。

因为在这个过程中用户能够得到想要获取的信息,能够表达出他/她想表达的思想,能够引导到用户想去的地方。

这个时候站点上也可以让用户提留,当用户在站点停留的时间越长就越体现出站点的价值。

这点是对于用户的价值,但是站在站点设计方的角度,怎么样能够在这个用户的停留的过程中,通过引导用户的行动来带来商业价值。

以上从各个关联及维度来分析,现在就来聊聊如何实现的:

架构设计图,晚上没有带工作PC回家,就用家里的电脑画了个图,大家明白就好别笑话我:

从以上图中可以看出,服务器部署主要有:

WebServer WEB服务器,通过调用API接口来实现数据的访问, 客户端POST/GET服务到WEB服务器,调用Validate::validate() 方法进行验证,验证通过后请求到API的接口返回结果,将结果返回客户端,现实页面调用RES资源服务器和IMG图片服务器 来实现页面

WapServer WAP服务器,通过调用API接口来实现数据的访问, 客户端POST/GET服务到WAP服务器,调用Validate::validate() 方法进行验证,验证通过后请求到API的接口返回结果,将结果返回客户端

MisServer MIS运营/客服管理服务器  通过调用API服务器的接口来实现管理

ApiServer API服务器,站点业务逻辑部署在API服务器上面,其他的服务器调用API服务器的逻辑

WebServer/WapServer/MisServer/手机客户端  通过访问APIServer来获取,手机客户端通过验证数据来传输,WEB/WAP/MIS服务器使用IP白名单来控制访问权限,尽量简化,提高安全性。APIServer对外提供 HTTP GET 方式来传输数据,其他前端服务器通过CURL方法访问API服务器的接口来返回数据,数据是使用json_decode后传输,后将数据返回客户端,直接返回API的直接结果。

API服务器是当前最重要的服务器,绝大部分的逻辑都是存在在API服务器,通过前端Web/Wap服务器的请求API服务器,一个WEB请求,对应N个API请求(N>1),所以这里需要使用CURL的multi_execute方法来执行同一次多个请求,使用CURL来进行GET请求比较稳定高效。

ResServer 资源服务器,存放 css/js/images/logo/ico图片等 2台

ImgServer  存储图片服务器,N台

BackEnd 后端服务,这里主要有PHP的后端服务和C的后端服务,这里也有部分逻辑,如果是PHP实现的主要逻辑就放到API中,如果是C实现的就部署在MIS服务器上,或者使用单独的服务器部署

 

后记:

谈了这么多想法和架构,最重要的就是要去实现,用事实说话,光说不做是没有用的。现在开始逐步的实现以上所说的,具体看woshimaijia 开源项目,地址:https://github.com/xinqiyang/woshimaijia  ,实现了基本的架构基础,开发语言PHP/C 。架构要实现的是快速开发,能够实现商业价值,高性能,能够自动部署,减少运维成本等。在开发的过程中,也能够随着自己的思想不断的深入对业务的认识,从而能够螺旋的迭代,在产品的生命周期里面能够在合适的时间点上线,并开展运营,实现真正的价值。

11 Jun 11 架构分享–微博架构的回顾

最近这段时间工作上的变动有点大,五月份也闲了下来一直在思考自己接下来的方向,并对这一年来的学习进行总结.

对于架构上的深入是这一年多来最主要的沉淀,从小公司到大公司,从小流量的站点的架构设计到大流量乃至超大流量的架构设计,记录下来,分享出来。

在分享自己的那点料之前,先来分享下大神Tim Yang的关于微博的架构设计:

这里主要从 存储和接口角度来讲

对于大流量系统的架构设计,对于写入方面是特别需要注意的,基本上现在遇到的系统都是对于主数据库的写入,然后对于从数据库实现流量的分发。

对于存储,记得公司老大说过,对于BD的项目的架构如果从设计上可以达到20PB的存储规模不出什么大的问题,就说明这个架构设计是合格的。

对于存储,新浪微博使用了redis的部分功能,主要用在用户信息方面的使用,现在只有单机设计,但是对于现在的单机完全可以提供大量的内存比如32G以上,完全可以达到存储数据的要求。

对于MYSQL这里所涉及到的就是设计规范和分库分表,最大的感触是大家为了便利就直接用自增的ID来进行,对于唯一ID的设计也是我一直注意的,因为唯一的设计是涉及到全局的。

将将自己最近总结的PHP和微博架构方面:

1.进行快速开发的过程中,订好规范,按照规范执行是非常的重要的,涉及到的沟通会比较少,其实和其他人联调是很费时间的。

2.对于性能跟踪方面使用使用xhprof来跟踪PHP的执行过程及性能问题,可以初略的估计出来。

3.对于核心代码的复用程度及核心的代码量的把握,核心要灵活可扩展而且保持小

4.技术选型比如对于使用memcache扩展和memcached的扩展还是很重要的

5.对于代码的目录结构和命名还是挺重要的,php的autoload不要搜索太多的目录会比较好

6.考虑下工具类的复用,一直在造轮子每次都重写一遍,这个不是很郁闷的事情,怎么样让这些类不要耦合的太紧?设计很重要

7.对于有些服务是PHP做起来不合适的,比如spam模块的高危词过滤还是用C/C++模块来处理比较好。

8.微博技术的应用Inbox/Outbox/Timeline/Following/Follows/Feed/MQS

9.推荐算法和消息推送的处理,各种高并发的处理

 

13 May 11 结网读书笔记-从产品经理的角度看产品

一直从事技术开发的工作,在工作中,经常的和产品经理接触,在这半年里面,经历了一个产品从出生到发展到最后终结的全过程.

体会甚多,从这次暂时的修整中,利用闲余时间好好的看了下产品经理方面的书《结网》,这本出自腾讯的人的书写的还是很全面,写了很多产品经理方面的感触及工作中遇到的问题及处理方法是一本入门笔记好的书,遂做下读书笔记,结合这半年来的产品来谈产品的概念到设计到开发到运营的过程。

对于一个技术人员,如果可以站在产品的角度来做产品,也是件很欢快的事情,最起码不会感觉到是为了任务而任务,而是可以真正的投入其中。

以下从几个方面来看到这个问题

从团队角度来看

团队是一个产品的引擎,没有它产品就没法跑起来,团队需要有自己的目标,而这半年来,我们的团队一直没有目标,探索性的尝试是不可能有什么好结果的,探索是肯定正确的但是不能冒进,冒着很大的风险,总有一天会迷失的。

当一个团队没有共识,这里是产品和开发人员和运营人员直接,如果没有共识的话,那么就会各自为政了,为了达到自己的目的,有小组织化的操作,直接导致产品的失败,举例,运营人员直接对开发人员而忽略了产品人员,直接对产品进行修改,导致了职责不明,而很多运营新增的功能只是为了短期的利益考虑而没有考虑到长期的结果及对产品带来的影响。

节奏感,产品及开发及运营都要有各自的节奏感,配合紧密一步一步的向前走,谁的冒进都可能导致严重的后果,本次开发过程中发现,运营人员忽略产品而直接对开发进行功能设计的情况非常的严重。而开发这边也没有把握节奏和QA的关系处的非常的不好,也是目前存在的主要问题。

人才

对于团队而言,这半年来,新进了不少同事,现在处的来的同事还是比较多的,但是真的配合的很好的还是比较少,半年来的磨合可以锻炼一支很有战斗力的团队。

从公司角度

对于在大的盈利公司中做研发,不需要考虑到很多现金流的问题,因为公司的薪资和福利都很规范,不会担心这些问题。但是对产品的总体把握上,公司应该从大的战略层来看,这个产品在公司战略中的位置,并进行有效的资源整合来推进产品,但是这半年来,公司对于产品的关注度很不够,对于产品细节,在VP级别没有很好的重视,连大BOSS都没有认真的看过这款产品,导致了对于团队领导及公司领导中对产品的发展有很多的争议,这个也是主要存在的问题。

从产品经理的角度

产品经理每天的工作,为产品进行管理及营销并负责开发新的功能,这块本次产品的产品经理表现的很不尽人意。

从时间跨度上来看,本次团队的产品经理没有从战略的角度来布局产品,这个主要的原因是由于从公司到总监级别都是认为是个探索性的产品而没有对产品进行长期的战略布局,不清楚产品的发展轨迹,这个是最大的失败的地方。对于阶段性的工作,本次产品团队忽略产品文档而主要以原型为主,这样给开发和测试人员带来了很大的工作量,对逻辑考虑的不到位及对产品的把握不够导致了阶段性的活动没有开展,产品经理没有和运营进行直接的沟通领导运营,而是沦为了运营人员的工具来按照运营人员的思想来进行产品的路线及产品设计,没有自己的主观建议。对于商业计划完全忽视,认为我们的产品根本没有盈利的可能性而完全的靠公司输血进行维持。对于成本及用户教育及竞争对手方面的重视很不够,采取的做法是直接忽视。产品经理都没有对KPI进行有效的理解并有效的执行。

对于下图列到的法则更是没有去很好的运用和执行,对于产品经理而言,本次团队的产品经理收到了来自上层的巨大压力也没有发挥出自己的足够的优势,显得比较可惜,对于最后的失败只能说,失败后还不意识到自己错了的话,是没有可能成功的,失败是注定了的.

上张图书笔记:结网读书笔记

 

22 Mar 11 开发环境推荐:Ubuntu 10.10 64bit 安装完成秀下PP

Ubuntu 10.10 64bit 安装完成秀下PP

这段时间一直在用自己的电脑,发现和公司的本还是差距很大的,硬件性能的差距直接影响到用户体验了,遂就将电脑换过来了!

由于WIN7不给力,就下了一个很艰难的决定把WIN7也毙了,现在就只有一个ubuntu了,还是喜欢唯一….

安装过程比较顺利,下了ISO后使用的ubuntu自带的disk creator刻录到U盘,安装很快就完成了!

接下来就是更新系统了,么317M的大小更新了整整一个上午,家里到网速让人很崩溃,更新OK后又折腾开发环境,终于到今天顺手了!放几张PP出来吧!

表达一下对Ubuntu的爱意!

简洁的桌面…………………………..

安装过程中遇到的编译错误,悲剧的PHP 5.2.17  没办法就升级到5.3.6了

升级成功后的php5.3.6

安装完成后配置了gtalk到sina微薄那唠叨唠叨,可惜发现丢失消息的现象还是比较严重的,发了3条就保存了最后一条

贴出安装的软件列表……………….

1.install system (64bit) set root pass (sudo passwd root)  update vim

2.update system  (choose the theme)

3.install chrome and firefox 4 rc

4.install ubuntu tweak

5.install visualbox 4

6.install xmind

7.install Awn the start setting

8.downloading lnmp0.6-full and install it (nginx + php + mysql + memcached + redis )

9.install flash plugin

10.install netbeans

11.install xchm

12.install git

小建议:

安装完成后配置自己喜欢到快捷键,这样启动程序就很快的了,按着下自己常用的软件,提高开发效率

喜欢自由就彻底丢掉WIN7吧!投入UBUNTU的怀抱!

强烈推荐开发环境换到Ubuntu,感受不一样的体验!

15 Mar 11 PHP你知道的

病学者厌卑近而务高远,卒无成焉。

最近一直在用这句话来提醒自己,不端正学习态度是很难学好的,不管学习什么语言,没有去认真的付出有效的时间,深入理解吸收,是很难达到可以灵活应用的目的的。

PHP你知道的,其实你真正知道么?用PHP可以说在差的程序员也能把功能做出来,当我们成天的写自定义函数完成一个一个功能的时候,是否有想过,PHP实际是怎么执行的?

你知道的,其实你不知道,我知道的,你说你知道,其实你不知道,也说你知道。

你真的知道?还是来看看图吧,这个图我会一直更新的,当不断的学习和深入的时候,也动动笔,将自己不知道的记录下来,积累起来当遇到不会知道的地方,可以请教或者自己搜索。

切记一点,把知识存储在脑袋里,比存储在其他地方都好,做到能够及时有效的使用。

PHP你知道的 — by yangxinqi

本图内容主要来自于公司某大牛的文章,我只是看了做了笔记,对于分享的精神,在此表示感谢。

学到知识,并能将知识传播给他人,让更多的人受益,这个就是大牛们做的事情,努力提高自我,兴许有一天我也能成为大牛 ^_^!

最后把脑图文件也分享出来,大家也可以自己更新了,其实用脑图软件来管理知识是非常不错的。由于使用Ubuntu选择的是Xmind,不过Xmind也是跨平台的,还是很好用的,推荐XMind

PHP你知道的 脑图下载

最后在分享一张PHP的内核架构图,其实有的时候发现看图,能够更快的吸收内容

06 Mar 11 开源必备之git:开始使用git来管理代码

爱上了github之后就打算使用git来管理代码了

其实用git还是比较简单的

1.实现你要有一台linux,虽然也有WINDOWS的客户端了,但是个人还是推荐使用linux下来操作,本人很喜欢使用Ubuntu来操作

当然在这之前你得先安装git ,安装就不用说了网络上很多的内容

2.开始注册个github的帐号

3.创建个RSAkey 然后在github/account中添加你的key,如果你有多台的电脑可以添加多个key

添加成功后看图

具体添加可以看帮助 http://help.github.com/linux-key-setup/

4.添加完成后在本地建个目录,然后执行

Global setup:

 Download and install Git
  git config --global user.name "xinqiyang"
  git config --global user.email xinqiyang@gmail.com

Next steps:

  mkdir yxqcodes
  cd yxqcodes
  git init
  touch README
  git add README
  git commit -m 'first commit'
  git remote add origin git@github.com:xinqiyang/yxqcodes.git
  git push -u origin master

Existing Git Repo?

  cd existing_git_repo
  git remote add origin git@github.com:xinqiyang/yxqcodes.git
  git push -u origin master

Importing a Subversion Repo?

  Click here

When you’re done:

  Continue

这些做完了之后,就是添加和提交代码了,具体的请看 <看日记学git>  真的是很好的书

下载地址:http://files.cnblogs.com/scotoma/git_tutorial.pdf

最后想说的是git就提高了0.3G的空间来放代码,其实能够把0.3G的空间塞满了代码的时候你肯定已经成功了!

上张开发的时序图

06 Mar 11 懂运营的RD是最好的PM

懂运营的RD是最好的PM

一个TEAM,里面不同的人承担着不同的角色,发挥着他们各自的特长,来促进项目的共同进步。

一个项目,一个产品从一个想法到实现的过程中,总会遇到总总问题,随着时间的流逝,项目就离上线时间越来越近了,上线了用户来了,用了,有的人留下了而有的人却走了。

我们是为谁做东西,我们做这些功能是为了什么,作为一个PM,作为一个项目的设计师,为什么要做这些?可以说服我们么?

作为一个RD,拿到一个需求需要开发,是否是只做东西而做东西呢,还是有很大的热情为了项目的更美好而不断的去完善自己的工作呢?

作为一个运营,对于现有的站点(产品或项目)是否能够充分的理解,接下来有那些目标和规划呢,然后把运营做起来,带来更多的用户,留下用户,反馈遇到的问题给产品呢?

一个TEAM需要多大,一个站点需要有多少人来支持,才能够做的让大家感觉更好,不管是团队的成员天天都能够在上面,还是很多的用户来了留下了,还能够为我们进行口碑宣传,这些都是很重要的。

经历这半年多来,其实对于项目的研发进度都是在时刻关注着的,一个项目的成功与否在技术上确实关系不大,但是涉及到的问题是,技术只要产品的稳定有自己的节奏就能够积累一点的用户,而不是在总体方针上在不断的变换和动摇。所以给出的几点如下:

1.作为一个PM,如果没有前期的需要达标的KPI的话,那么你这个产品就是没有最终确定下来。

如果都不知道这个产品的KPI是什么,就是一只无头苍蝇,什么功能都做都上没有很好的规划。有了自己的目标,最起码知道这部怎么走,下一步怎么走,接下来的路是该怎么样的。

2.作为一个PM,关注用户体验是必须的,但是别去深入到细节去,一个像素,二个像素固然是重要的,可是这不是你更新的问题,做好自己的事情。

关注自己的专业,是必须的,作为PM是要想这些功能如何带来用户,如何留住用户,而不是这个页面看上去如何好看,你自己感觉好看,那其他人感觉呢?

3.作为一个PM,不想着这个产品如何带来收益的话,那么产品的命运就会有波折。

收入支出都是必须需要考虑的,对于大公司来说一个产品线的失败关乎不大,但是作为一个创业公司来说,你如果还是没有看到这点,迟早是花完了钱,结果就完蛋了,关门得了。

以上是产品我认为最主要的地方,这点是从大局出发的,活下来才有发展,如果活都有问题了,何来的宏图大志?

现在来讲讲运营,作为一个站点的主要推手,在运营一个站点的过程中,首要目标就是导入多少的新的用户,把握用户流失率。

所以运营方面

1.留住用户是根本,怎么样把握用户流失率是运营的首要任务。只有知道这些用户从何而来,为什么留不住,就可以知道接下来怎么半了,对症下药是必须的,更要知道这个病症的根源在那里,而这个就看是否吃透一个项目的精髓了,项目的方向了。

2.发展新用户,从用户的行为中和现有的资源中,怎么来发展新的用户,可以从地区,从常用的时间段来分析用户的行为从而定向的投放广告,或者做一些活动来吸引新的用户加入。

其实只要做好以上的几点,就没有什么打的问题,可是现在的问题在于很多人都是知道,可是都做不好,这些的原因是为何?

总结下:

其实对于一个站点,由RD主导,比运营和PM主导有更多的优势,所有作为RD更需要学习他们的所长,实现过程中需要自己努力的。

作为技术人员,自己有信心也有决心,做好自己想要做的东西,想好运营好,离成功就不远了!

做技术但不仅仅关注与技术,为人处事,思维灵活,行动上更是需要想到做到!

行动,行动….

想写这篇文章其实主要是看了美团的一周年的广告视频《纵情向前》,美团网一周年了,我自己在美团上也消费过,它真的确实能够带给我们很好的体验,从王兴的经历,我还是非常非常的佩服他的,做人可以做自己喜欢的,更是能够影响到其他人,那样就成功了!

http://v.youku.com/v_show/id_XMjQ4NDE5MjUy.html

有自己的团队,有自己的行动力,有自己的优质服务,那么就容易成功了!