Fab移动4g网络不好怎么办端为什么会那么成功

> 移动客户端
导读; 创意产品闪购网站Fab 虽然仅仅上线一年时间,但公司融资已达1.56亿美元,并且在很多国家推出了自己的产品,目前公司正在加速对这些产品的更新。 Fab有550万的注册用户,而且这些用户都不是通过Facebook链接登陆的。而今,Fab终于开通了Facebook登录功能,使用户能够更加方便快捷的注册和购物。与此同时,Fab移动客户端也获得了给力更新,加入了Live Feed(即时动态)功能,能够筛选网站最新的活动和朋友们最新的动态。 目前,通过iPhone和Android登陆Fab人数已占每日访问的40%,而且移动客户端的Fab用户的购买意愿是只使用网页用户意愿的两倍,相应地,购买量也是后者的两倍。此次移动端更新名为Fab 3.0,此次更新添加的Live Feed功能可使用户自由浏览大量其他用户最新购买的产品照片。 Fab CEO Jason Goldberg在之前就曾公开表示Fab是第一家完全基于Facebook的电商网站,有超过20%的流量是从社交服务过来的,50%的会员是通过社交分享加入Fab的。Fab目钱每月投放在Facabook上的广告费用达到了百万美元。 目前...
文章归属: | 关键词:Fab,移动客户端,创意,Facebook
| 感谢提供 | 735次阅读开源中国 - 找到您想要的开源项目,分享和交流
自从上个月进入“减速(ramp-down)”阶段以来,JDK 11 的特性已经处于冻结状态。这些重大的变化已被列为 ...
ReactOS 0.4.9 发布了,ReactOS 是一个基于 Windows NT 架构设计原则的开源操作系统。由于所有的代码...
14回/2173阅
35回/1920阅
3回/1801阅
23回/2189阅
每期高手问答我们都会邀请一位擅长某一领域的开发者,针对近期热门的技术或框架,和各位一起探讨分享,为期一周。
39阅/1评/2赞
30阅/1评/0赞
64阅/0评/1赞
40阅/0评/0赞
98阅/2评/0赞
18阅/0评/0赞
255阅/2评/0赞
2087阅/3评/8赞
2334阅/11评/22赞
434阅/0评/1赞
183阅/0评/0赞
337阅/0评/0赞
969阅/3评/0赞
954阅/0评/2赞
221阅/0评/0赞
38评/3341阅
31评/4061阅
21评/3158阅
12评/531阅
16评/1539阅
9评/1532阅
14评/2214阅
42评/2220阅
37评/3720阅CoordinatorLayout与ListView协同让FAB悬浮按钮从底部消失及出现
CoordinatorLayout协同布局在一般只结合RecyclerView和NestedScrollView使用,如果我使用ListView没有效果的。但是,由于业务原因使用ListView,有需要实现协同的效果怎么办?
其实分析RecyclerView和NestedScrollView的可以知道,他们都实现了一个接口NestedScrollingChild,所以我们可以自定义ListView,实现NestedScrollingChild接口就好。当然除此外,google还提供了一个API
mListView.setNestedScrollingEnabled(true),就可以使用。当然,这2种方法只有在5.0以上才有效果。
下面就滑动ListView,让fab悬浮按钮滑动出现和滑动消失为例:
这里需要自定义一个Behavior类,这个类将作用于fab悬浮按钮,也就是在fab悬浮按钮中使用这个属性,如下:
app:layout_behavior=&www.weshared.listviewandcoor.QuickReturnFooterBehavior&
具体代码如下:
activity_main.xml
&android.support.design.widget.coordinatorlayout xmlns:android=&https://schemas.android.com/apk/res/android& xmlns:app=&https://schemas.android.com/apk/res-auto& xmlns:tools=&https://schemas.android.com/tools& android:layout_width=&match_parent& android:layout_height=&match_parent& android:fitssystemwindows=&true& tools:context=&www.weshared.listviewandcoor.MainActivity&&
&android.support.design.widget.appbarlayout android:layout_width=&match_parent& android:layout_height=&wrap_content& android:theme=&@style/AppTheme.AppBarOverlay&&
&android.support.v7.widget.toolbar android:id=&@+id/toolbar& android:layout_width=&match_parent& android:layout_height=&?attr/actionBarSize& android:background=&?attr/colorPrimary& app:popuptheme=&@style/AppTheme.PopupOverlay&&
&/android.support.v7.widget.toolbar&&/android.support.design.widget.appbarlayout&
&include layout=&@layout/content_main&&
&android.support.design.widget.floatingactionbutton android:id=&@+id/fab& android:layout_width=&wrap_content& android:layout_height=&wrap_content& android:layout_gravity=&bottom|end& app:layout_behavior=&www.weshared.listviewandcoor.QuickReturnFooterBehavior& android:layout_margin=&@dimen/fab_margin& android:src=&@android:drawable/ic_dialog_email&&
&/android.support.design.widget.floatingactionbutton&&/include&&/android.support.design.widget.coordinatorlayout&&/code&
content_main.xml
&relativelayout xmlns:android=&https://schemas.android.com/apk/res/android& xmlns:app=&https://schemas.android.com/apk/res-auto& xmlns:tools=&https://schemas.android.com/tools& android:layout_width=&match_parent& android:layout_height=&match_parent& app:layout_behavior=&@string/appbar_scrolling_view_behavior& tools:context=&www.weshared.listviewandcoor.MainActivity& tools:showin=&@layout/activity_main&&
&listview android:id=&@+id/lv& android:layout_width=&match_parent& android:layout_height=&wrap_content&&
&/listview&&/relativelayout&&/code&
list_item.xml
&relativelayout xmlns:android=&https://schemas.android.com/apk/res/android& android:layout_width=&match_parent& android:layout_height=&60dp&&
&textview xmlns:android=&https://schemas.android.com/apk/res/android& android:id=&@+id/tv_item& android:layout_width=&match_parent& android:layout_height=&60dp& android:gravity=&center& android:text=&ee&&
&/textview&
&/relativelayout&&/code&
MainActivity文件中
public class MainActivity extends AppCompatActivity {
private ArrayList mdatas = new ArrayList();
private ListView mListV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
initView();
private void initView() {
mListView = (ListView) findViewById(R.id.lv);
//API21以上才有效果----第二种方式,比较简便
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.LOLLIPOP) {
mListView.setNestedScrollingEnabled(true);
initData();
mListView.setAdapter(new MyListAdapter(mdatas));
private void initData() {
for(int i=0;i&30;i++){
mdatas.add(&---------&+i+&-----------&);
MyListAdapter文件就省略吧
自定义ListView实现NestedScrollingChild接口,看代码也可以知道,其实发挥作用的就是setNestedScrollingEnabled(true)这个方法
public class NestedScrollingListView extends ListView implements NestedScrollingChild {
private NestedScrollingChildHelper mNestedScrollingChildH
public NestedScrollingListView(final Context context) {
super(context);
initHelper();
public NestedScrollingListView(final Context context, final AttributeSet attrs) {
super(context, attrs);
initHelper();
public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr) {
super(context, attrs, defStyleAttr);
initHelper();
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initHelper();
private void initHelper() {
mNestedScrollingChildHelper = new NestedScrollingChildHelper(this);
setNestedScrollingEnabled(true);
public void setNestedScrollingEnabled(final boolean enabled) {
mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled);
public boolean isNestedScrollingEnabled() {
return mNestedScrollingChildHelper.isNestedScrollingEnabled();
public boolean startNestedScroll(final int axes) {
return mNestedScrollingChildHelper.startNestedScroll(axes);
public void stopNestedScroll() {
mNestedScrollingChildHelper.stopNestedScroll();
public boolean hasNestedScrollingParent() {
return mNestedScrollingChildHelper.hasNestedScrollingParent();
public boolean dispatchNestedScroll(final int dxConsumed, final int dyConsumed, final int dxUnconsumed, final int dyUnconsumed, final int[] offsetInWindow) {
return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);
public boolean dispatchNestedPreScroll(final int dx, final int dy, final int[] consumed, final int[] offsetInWindow) {
return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
public boolean dispatchNestedFling(final float velocityX, final float velocityY, final boolean consumed) {
return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
public boolean dispatchNestedPreFling(final float velocityX, final float velocityY) {
return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
最重要的一个类Behavior的实现类
public class QuickReturnFooterBehavior extends CoordinatorLayout.Behavior {
private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
private int mDySinceDirectionC
private boolean mIsS
private boolean mIsH
public QuickReturnFooterBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
if (dy & 0 && mDySinceDirectionChange & 0
|| dy & 0 && mDySinceDirectionChange & 0) {
// We detected a direction change- cancel existing animations and reset our cumulative delta Y
child.animate().cancel();
mDySinceDirectionChange = 0;
mDySinceDirectionChange +=
if (mDySinceDirectionChange & child.getHeight()
&& child.getVisibility() == View.VISIBLE
&& !mIsHiding) {
hide(child);
} else if (mDySinceDirectionChange & 0
&& child.getVisibility() == View.GONE
&& !mIsShowing) {
show(child);
* Hide the quick return view.
* Animates hiding the view, with the view sliding down and out of the screen.
* After the view has disappeared, its visibility will change to GONE.
* @param view The quick return view
private void hide(final View view) {
mIsHiding =
ViewPropertyAnimator animator = view.animate()
.translationY(view.getHeight())
.setInterpolator(INTERPOLATOR)
.setDuration(200);
animator.setListener(new Animator.AnimatorListener() {
public void onAnimationStart(Animator animator) {}
public void onAnimationEnd(Animator animator) {
// Prevent drawing the View after it is gone
mIsHiding =
view.setVisibility(View.GONE);
public void onAnimationCancel(Animator animator) {
// Canceling a hide should show the view
mIsHiding =
if (!mIsShowing) {
show(view);
public void onAnimationRepeat(Animator animator) {}
animator.start();
* Show the quick return view.
* Animates showing the view, with the view sliding up from the bottom of the screen.
* After the view has reappeared, its visibility will change to VISIBLE.
* @param view The quick return view
private void show(final View view) {
mIsShowing =
ViewPropertyAnimator animator = view.animate()
.translationY(0)
.setInterpolator(INTERPOLATOR)
.setDuration(200);
animator.setListener(new Animator.AnimatorListener() {
public void onAnimationStart(Animator animator) {
view.setVisibility(View.VISIBLE);
public void onAnimationEnd(Animator animator) {
mIsShowing =
public void onAnimationCancel(Animator animator) {
// Canceling a show should hide the view
mIsShowing =
if (!mIsHiding) {
hide(view);
public void onAnimationRepeat(Animator animator) {}
animator.start();实现可拖拽移动的悬浮按钮
  最近想要实现一个可拖拽移动的FAB按钮,这里记录一下个人的思路与经验。
如何监听FAB按钮的移动?
  我们可以实现View.OnTouchListener接口,在onTouch( )方法中获取FAB按钮移动时的位置参数。或者可以选择复写View自身的onTouchEvent( )方法,实现方式大同小异。
移动范围超出屏幕怎么办?
  通过逻辑判断限制FAB移动的范围。
如何区分FAB按钮的”拖拽移动” 和 “点击事件?”
如果同时监听FAB按钮onTouch和onClick事件 , 在onTouch事件中执行拖动操作,在onClick中实现事件逻辑,但是onTouch和OnClick会有冲突。
onTouch事件的返回值是boolean类型的,如果返回true ,那么事件就会被拦截,onclick方法不会被调用;返回false,事件不被消费和拦截,onClick方法会同时被调用。
策略一:要想把OnTouch和onClick事件完全的区分,这里的想法就是在 OnTouch中的MotionEvent.ACTION_DOWN 时,记录下点(X1,Y1),在 MotionEvent.ACTION_UP 时,记录下点(X2,Y2),然后比对 俩点之间的距离,如果小于一个较小数值(比如5),就认为是Click事件,onTouch中返回false,如果距离较大,可以当作onTouch事件去处理,返回true.
 策略二:
如何实现FAB按钮的移动?
  通过监听OnTouch( )方法或者覆写onTouchEvent( )方法,我们已经可以获取到拖拽FAB按钮时的实时位置了,接下来我们如何表现这种位置移动的“变化“? 
通过view.layout()方式。任何布局上的空间都可以支持这种方式移动,上下左右参数值是相对于父viewgroup而言的。
调用MarginLayoutParams.setMargins(),重新设置控件位置参数来实现控件移动效果。这种方式比较适合RelativeLayout、FrameLayout,AbsoluteLayout,对于LinearLayout,因为最后增加的控件总在最下或最右,所以达不到移动效果,TableLayout也不行。 
通过view.setX() 、view.setY()方式。任意布局上的空间都可以支持这种方式移动,参数值是指相对于自身原本位置X坐标轴和Y坐标轴上的偏移量。 
各种实现方式注意事项
 方案1:使用View.layout()方式实现FAB按钮的移动
public class FloatButton extends android.support.design.widget.FloatingActionButton implements View.OnTouchListener{
int lastX, lastY;
int originX, originY;
int screenW
int screenH
public FloatButton(Context context) {
super(context);
getScreenWidthAndHeight(context);
setOnTouchListener(this);
public FloatButton(Context context, AttributeSet attrs) {
super(context, attrs);
getScreenWidthAndHeight(context);
setOnTouchListener(this);
public FloatButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
getScreenWidthAndHeight(context);
setOnTouchListener(this);
public boolean onTouch(View v, MotionEvent event) {
int ea = event.getAction();
switch (ea) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
originX = lastX;
originY = lastY;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
int l = v.getLeft() +
int b = v.getBottom() +
int r = v.getRight() +
int t = v.getTop() +
if (l & 0) {
r = l + v.getWidth();
if (t & 0) {
b = t + v.getHeight();
if (r & screenWidth) {
r = screenW
l = r - v.getWidth();
if (b & screenHeight) {
b = screenH
t = b - v.getHeight();
v.layout(l, t, r, b);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
v.postInvalidate();
case MotionEvent.ACTION_UP:
distance = (int) event.getRawX() - originX + (int)event.getRawY() - originY;
return false;
private void getScreenWidthAndHeight(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthP
screenHeight = dm.heightP
  优劣:这种方式实现是最简单的的,但是当同一个viewgroup中有控件更新(界面刷新)时,移动的控件会复位,即回到一开始的位置.
  仔细观察下图,布局中上方的Banner轮播图和FAB按钮是在同一个viewgroup内的,每当轮播图刷新的时候,FAB按钮就回到了原来的位置,所以在该种情况下,不适合用于view.layout()方式实现位移。解决方法未知……
  缺陷展示效果图:
   方案2:调用MarginLayoutParams.setMargins()设置View的MarginLeft以及MarginTop属性值从而确立View移动的实时位置。
  该方案可参考:
  注意事项:这种方式比较适合RelativeLayout、FrameLayout,AbsoluteLayout,对于LinearLayout,因为最后增加的控件总在最下或最右,所以达不到移动效果,TableLayout也不行。并且你在XML里设置的一些属性值很可能会影响到View的移动。例如:你在XML文件里为FAB按钮的初始位置设置了
android:layout_marginRight=”xxx”
或者landroid:layout_alignParentBottom=”true”属性值。
   方案3:使用view.setX()、view.setY()方式实现FAB按钮的移动
  代码来自:
public class DragFloatActionButton extends FloatingActionButton{
private int parentH     
private int parentW
private int lastX;
private int lastY;
private boolean isD
public DragFloatActionButton(Context context) {
super(context);
public DragFloatActionButton(Context context, AttributeSet attrs) {
super(context, attrs);
public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
setPressed(true);
isDrag = false;
getParent().requestDisallowInterceptTouchEvent(true);
lastX = rawX;
lastY = rawY;
if (getParent() != null) {
parent = (ViewGroup) getParent();
parentHeight = parent.getHeight();
parentWidth = parent.getWidth();
if (parentHeight &= 0 || parentWidth == 0) {
isDrag = false;
isDrag = true;
int dx = rawX - lastX;
int dy = rawY - lastY;
int distance = (int) Math.sqrt(dx * dx + dy * dy);
if (distance == 0) {
isDrag = false;
float x = getX() +
float y = getY() +
x = x & 0 ? 0 : x & parentWidth - getWidth() ? parentWidth - getWidth() :
y = getY() & 0 ? 0 : getY() + getHeight() & parentHeight ? parentHeight - getHeight() :
lastX = rawX;
lastY = rawY;
case MotionEvent.ACTION_UP:
if (isDrag) {
setPressed(false);
return isDrag || super.onTouchEvent(event);
   优点:这里实现了FAB按钮的拖拽移动功能,并且不会影响为FAB按钮设置onClick事件,并且即使同一个viewgroup中有控件更新(界面刷新)时,移动的控件也不会复位回到一开始的位置。
  没时间写完了。。。明天继续写
  还有很多细节要完善。。。。。。
H5移动web页面触摸按钮效果实现-模拟按钮hover效果实现
手机端网页:可拖拽悬浮按钮
移动端悬浮球
在屏幕上添加一个可移动,可点击的悬浮按钮。
没有更多推荐了,感谢赞赏!给好友秀一下吧
内容棒,扫码分享给好友
Fab CEO:创办四家公司教给我的90件事
Jason Goldberg是设计类闪购网站Fab.com的CEO,本篇文章来自他的个人博客。2011年6月,Fab产品线正式上线。12天内,Fab的销售额达到了60万美元。出众的业绩为其带来了800万美元的A轮融资。11月,Fab用户数突破100万关口。12月,Fab进行了4000万美元的B轮融资,估值达到了2亿美元。比创办Fab这件事更疯狂的事是,他一气写下他连续创业教给他的90件事,与创业者分享。可能是事项太多,以至于原文到最后都丢失了序号。不过,这并不妨碍我们掌握其内容。以下是他博客原文,由虎嗅编译,略有删节:创业90件事日,我写了一篇博客,名为“从创办三家科技公司的经历中,我学到的57件事”。深感荣幸的是,我看到那篇博客像病毒一样被扩散开来,翻译为多种语言,启发了很多创业者。上周,我在东京会见Fab的潜在合作伙伴。我被邀参与了一个论业论坛的讨论。这个讨论很快就提到那57件事。真是令人想不到。两年后、数千公里之外,人们仍然在谈论这57件事!问题就来了。我意识到我2010年列出些事,固然是我两年前所学之大成,但也亟需更新,把我最近学到的也纳入进来。特别是这两年我的变化巨大,我们在2011年把Fabulis转型为Fab(译者注:即从男同性恋社交网站转型为设计类产品闪购网站),随之在15个月内,Fab的注册用户扩展到750万名、拥有7500家供应商伙伴、600名员工,营业规模扩展到1.5个亿美元。所以,以下是我对“57件事”的升级版。&找到你公司的“那件事”。这件事需要满足三个条件:你和你的团队对这件事最有激情;你和你的团队有把握成为全世界最擅长这件事的人;这件事蕴藏着巨大的市场潜力。如果你做的事没有满足上面这三个条件的话,那么你现在做的事情是错的。只做这件事。其他的事情会分散注意力。不要做额外的项目。不要参加不必要的会议。对任何没有帮助你做这件事的一切说不。一切皆关乎产品。从来都是这样,以后也如此。唯一重要的是你的产品有多好。剩下其他的都是噪音。在Fab,我们的视觉产品是我们的网站、App,我们的实体产品是我们卖的东西,我们的体验产品是我们的运营与服务,把这三部分搞定就是全部。判断你的产品优劣的唯一标准是有多少用户在使用它,用户获得了多少价值。在早期,你未来成功的决定因素是吸引力。多花些时间搞清楚怎样可以更有吸引力,围绕这一点做优化,有吸引力的事物会变得更有吸引力。如果你在一年内还无法做出有吸引力的东西,转型。我坚定地认为,在现在这个产品生命周期如此短暂,用户反馈速度如此之快的时代,一年时间内你就知道自己是否正在做一件值得的事情。&当然,你无法一开始就正确,没有人可以。你可以一次一次的进行产品特性迭代,但是无法迭代你的商业模式。我看过太多创业公司失败的例子,就是因为他们永无止境地追求新功能,并寄希望于此。别这么干。还有许多有趣的问题等我们去解决。如果你无法在一年内做出有吸引力的东西,去做下一个产品。如果你一年内都做不出吸引人的东西,我和你打赌,这时如果你和团队去思考之前我提到的三个问题的话(你和你的团队对这件事最有激情吗、你和你的团队有把握成为全世界最擅长这件事的人吗、这件事蕴藏着巨大的市场潜力吗),你会发现自己正在做错误的事。在Fabulis还是一个以男同性恋社区为目标的社交网站时,我们开发了大量酷功能,然后不停地迭代,希望通过不断地做事来让这网站变得有粘性,但是我们没有真正地抓住“那件事”。一年后,我们坐下来,跟自己诚实交谈,然后意识到我们的“那件事”:我们团队最有激情的、我们是这个世界上最擅长做这个的、这件事潜力巨大的事,就是设计。所以我们从Fabulis转向Fab。&一旦转型,集中精力,不要回头。当我和团队在10天内做出转型决定之后,我们完全集中在新产品上,我们约法三章,团队里的人不能继续做老的项目了。我们需要每一个人都投入到新的项目中去。我们即刻关闭了旧的网站和应用程序。用10天时间,全公司把目光投向未来,不再回头。自我认知。知道你自己的那件事是什么,你自己真正擅长的那件事。同样,知道你不擅长的都有哪些。“关键不是你”之一:关键是团队。创建一个成功的公司,你是不那么关键的因素,而你召唤出身边人长处的能力是关键因素。当我们从Fabulis转型为Fab的时候,我们围绕着我们创始人之一Bradford Shellhammer去转型,他是独特品味制造者天才。我们意识到,如将Bradford的色彩感、幽默感,以及他对产品的激情发挥出来,Fab可得以诞生,照亮人们的生活及整个世界。围绕着成员的某种天份去创建某种商业 ,这需要胆识与自觉。“关键不是你”之二:关键是客户。从第一天起我们就致力于让客户满意。一开始我们就决定不单只是根据收入来决定产品功能,而是更看重那些让顾客高兴的事情,只有这样我们的收入才会一天天增加。坚持这个哲学是Fab能成功的因素之一。找到优秀的合伙人,有一些工作你永远也不如他们做得好。我很幸运,在一创建Fab的时候,就跟一些了不起的成员如Nishith Shah和Sunil Khedar一起工作。和你爱的人一起工作。和令你激动的人一起上班。你信任他们。每天你都可以看着他们说:这世界上再没有人比他们更适合这个工作了,除了他们也再没有人是我愿意并肩战斗的伙伴了。我是一个很感性的人。爱对于创业成功来说至关重要。把你的桌子对好角度,可以让你和伙伴们对视。如果你不享受于每天都见到他们,那么你的创业伙伴们就选错了。创始人需要控制一些很重要的事。仅仅是指挥还不够,你需要做一些对公司业务和品牌至关重要的事情。你需要真的、真的掌控它。我个人的想法是,因为一切都要落实到产品上,那么最好的创业者就是产品经理。截至到目前,网站和app上没有一个像素不是经由我的输入或批准而出现的。作为创始人我们必须为最终的产品把好关。作为CEO,你还需要做其他人做不到的事。一般来说是推广和选择投资人,管理董事会,对管理人员做出辅导,帮助你的团队理解大方向并让团队全体为之努力。最重要的是,告诉大家业务重点是什么。这些只有CEO能够做到,你没办法外包出去。和那些与你争吵、对你说不的人一起工作。雇佣管理人员最重要的考虑是在文化上能融入公司。你需要能够像你一样工作的人,能够欣赏你的风格和节奏的人。有多聪明或经历多丰富并不重要,如果他们不能符合你的风格,什么也做不出来。在工作的时候可以吵得很凶,但是下班后依旧爱着彼此。作为CEO,只有你能搞清楚公司前进的方向,怎样达成目标,怎样调动资源。一家公司在战略上最清晰的举动就是如何配置它的资源。为决定深思熟虑。创业公司可没有闲功夫,找准目标就要一路走下去。最好能从失败的经历中汲取教训,千万不要闭门造车拍脑子做决定。激励别人。创业是个苦差事,让人精疲力竭。激励你的团队不断向前,把不可能变成现实,坚持不懈。让周围的人像你一样对这事在意与投入。作为CEO,每一个招人的决定你都要负责。我和合伙人要面试每一个新人。如果用错了——有时候会发生这种情况——我会自己承担责任,不会找其他人背黑锅。雇佣对解决问题有激情的人。只是创建一家公司还不够,需要对你的用户充满热情,对解决用户的问题充满热情。作为CEO,你来定调子,挑选风格,做事情的节奏,对事情的预期。我喜欢信心满满又很谦逊。我喜欢在专注管理和迎接挑战的同时为取得的胜利欢呼。没有人需要琢磨我在想什么。我毫无保留(在我的博客上也是)。我的节奏很快。我不断地追求完美,也明白我们会在这个过程中犯错误。我们会在开会的时候互相辩论,这样能收到意想不到的效果。要强势。有时候你甚至要当一个坏蛋才行。这种情况也不会很频繁,但是有时候是这样。如果每天都快快乐乐的,那就太轻松了。我不是说平白无故要讨人厌。我的意思是,要不断的有压力才能做出伟大的事情。尤其是经理们要懂得这一点。如果创业很简单的话那么随便一个人就去做了。有时难就难在我们是在创造一些特别的东西。有时候你做了98%的工作,我会问你剩下的2%在哪,就是这样。保持真诚,保持透明。对你自己、你的公司高管、你的普通员工、来采访的记者、外部观察人士还有投资人,说一样的话。关于团队与产品如果你对某人失望的话,其他团队成员已经知道了。给坏种子(指不好的员工)一天时间,然后再炒了他们。炒的时候要快。对员工是要培训教导,还是不满意就更换?我在创办第一家公司时,很容易对管理层失去耐心,埋怨他们,自己接下重担。教练或者是导师,会让一个几个月无所作为的好种子有积极的变化。问题可能出在你身上,而不是员工身上。某个员工应付不了他的工作或者无法融入到公司里面,另外一个员工有能力也能融入公司文化但是无法达到你的预期水平,这两者是有区别的。无论你的人是新来的,还是要走的,善待他们。提供反馈。即使是高管也需要重新评估。我评估公司高管的指标是:文化。他是否体现了我们的公司文化,帮助打造我们的公司文化,并且培植我们的公司文化呢?a 激情。这名高管对我们做的事情有激情还是在随便一家公司工作就可以?我们的公司是他的生活全部吗?他们是不是就适合在我们的创业公司工作呢?b 上级。该名高管向我汇报的工作做得如何?是否在恰当的时候来征求我的意见?c 平级。该名高管和其他人相处如何?他们是各自为战还是团队协作?他们是来找我解决问题,让我裁决?还是共同商议对策,为我提供选择?顺便说一句,这是大部分创业公司高管最头疼的问题。d 下级。该名高管是否很好的领导并管理了团队?所有团队成员都分工明晰,清楚职责所在吗?团队在不断提升吗?e 激励。该名高管有没有很好的激励周围的人?是否有榜样在起模范作用,激励员工不断向前。f 主人翁。该名高管是否对结果,无论好坏,公正与否,都能负起责任?他们是否挑起了大梁,完成了重任?g 大局观。该名高管了解公司长期的发展方向并清楚自己应该做些什么吗?h 对细节的注重。该名高管是否很细心地从头至尾跟进项目计划呢?有没有什么细节被忽略了呢?i 随时待命。如果我不在旁边,这位高管是否能够独立运作公司一个月呢?他们能不能被派往另外一个国家或地区并且马上投入工作呢?能够接待投资人和记者吗?你从来不会不像自己认为的那样正确。对你和你的公司来说都是。比别人提前五步。这一点很难做到,但是这就是伟大公司和好公司的区别。在事情进行过程中就要考虑,今天的决策对明天的影响是什么?前因后果的事件会引发什么?这些东西很难,但是非常重要。研发自己的技术。如果你想保持持续的竞争优势,这一点是必须的。如果你认为自己可以用别人的技术去创建一个伟大的公司,你是在骗自己。(我的意思不是说开源或者已有的平台技术不好,我的意思是说不要外包你的编程工作。)从一开始就在公司DNA中植入社会化元素。我们很早就开始思考社会化元素,定义并实现了社会化商务的概念。把社会化元素做正确很难,经常会出各种各样的问题。保持下去。有十亿人在使用Facebook,十亿。你的客户在社会化媒体上。考虑移动优先还是web优先已经是六个月之前的事了。很快移动平台会成为一个很大的流量来源。每周至少去健身房跑步四次。如果你想思路清晰就要保持身体健硕。很多人没有意识到,但是这一点很重要。运动可以让你的身体和意识能够应付各种挑战。经过一整夜飞行在机场降落后,我做的第一件事是去健身房,从不例外。我不管是否会耽误我的会议。飞行后健身能够抵消掉时差带来的身体反应,让我准备好面对挑战。不要在飞机上喝酒,除非你的航程超过8小时。酒伤身体,而且浪费你的时间。相信自己的胆识,但要有数据支撑。我们喜欢说,靠感觉开始,但是要用数据支持这种感觉,再来看一下感觉是否正确。但是,如果感觉来得快,我会很坚定的相信就应该是这样子。用户体验很重要,比大多数人意识到的还重要。最好的用户体验是把用户体验扔到一边,专注于帮助人们解决问题。少即是多。如果你要解释什么,你已经失败了。懂技术,明白技术是怎么创立的。不是每一个创业领袖都要自己写代码,但是你必须要懂得产品是怎么创建的,工程上的流程是怎样的,技术在其中怎样发挥效力。把不喜欢的工作分包出去很容易,但是你不能让它成为一个盲点。对我来说,应该是运营。虽然我选择雇佣比我更聪明的对运营更有热情的人来负责,我还是要让自己保持对细节的关注,让运营成为我们公司的一个竞争优势。把公司业务当中你知道的最少的那部分挑出来,仔细研究它。给自己压力,远离安逸。把产品的功能特性分出轻重缓急。对稀缺资源的调用需要排出优先度,没有任何两个产品功能可以平等对待。你不能同时做所有的事情。有先有后。投放市场。除非真正的用户接触到你的产品并给出反馈,否则你永远不知道自己的产品有多好。如果你连续分站了四个星期,还没有一个用户做过测试,可能你搞的代码有点太多了。把它们分成几个小块,这样方便获得快速的用户反馈。快速投放,频繁投放。不要担心添加额外的功能。把最精简的必备功能做出来,开始收集反馈。重复这个过程,放出下一个版本,再尽快放出下一个版本。如果你用超过三个月时间发布首个产品的话,时间就太长了。如果你用四个星期时间做版本更新,时间就太长了。每周都放出小的更新,或者每周几次更新。每三周进行一次大的版本升级。如果之前计划的50%已经成功实现了,说明你做的很棒。尽可能的多接触你的用户。不要过分依赖目标群体的意见。目标群体会告诉你哪里要修改,帮助你定位产品潜在的吸引人的地方,好让你专注于此。但你还是要搞清楚怎样综合他们的意见,明白要给用户提供什么。大部分人只频繁使用五到七个服务。如果你想要做一个重要的产品,成为一家大公司,你就要想想怎么成为这五到七个服务中的一个,这意味着俘获用户的芳心,赢得他们的信任。你要给用户一个理由投入时间使用你的产品。如果你在做销售的话,你要给顾客一个理由让他们掏钱。这可不容易。关于投资人关系与文化作为CEO,你要平衡业务需要和投资人利益。如果这两点没有理清关系的话,你就有麻烦了。只和拥有同样长期愿景的投资人合作。不断提醒投资人,你的长期目标和计划是什么。如果你的投资人看中的是两年内的投资回报,而你在执行一个10年或20年的战略,问题就来了。而且,只有你自己能救自己。永远只选择愿意与你共事的、愿意与你做朋友的、愿意给你提供意见的投资人。永远,永远不要按估值来选择投资人。这里或那里的几次股权稀释并不碍大事,但是和正确的人共事却很重要。商业目标和私人关系孰轻孰重远比估值重要。刚开始起步的时候,融资越少越好。强迫自己精打细算,这样会让你每次花钱都好像是在花自己最后一笔钱一样。获得一些关注之后,在融资时稍微融多一点,但是不能多到不知道怎么花。这个需要些技巧,不要因为担心稀释股权就对募集资金敷衍了事。每次支出都精打细算。但是,不要害怕花钱。知道你在打造一个什么样的公司。谷歌和Facebook是少数。你能收获的一个不错的结果是变现一千万美元,或者是两千万美元,或者是一个亿,也可能什么都得不到。为你打造的公司未雨绸缪,不要瞄准月球(译注:指好高骛远)——除非你发现自己真的坐在火箭飞船里。从拿钱到手的角度考虑,两年时间内得到两千万美元的20%然后变现走人要远好过五年时间得到一家价值一亿美元公司3%的股份。搞清楚你的创业公司是否是不是VC型商业。VC型商业要给投资十倍的回报。这意味着如果融资后的估值为5百万美元,你至少要创造5千万美元的风投退出机会。1千万的估值就是1亿的退出目标,5亿的估值就是50亿的退出目标。这并不是说你不能以低于这个价格的数字出售公司,但是这绝不是你在这个估值下签字拿钱的原因。要知道拿了风投的钱意味着什么,知道自己肩负着多少期望。确保你的个人目标和投资人的目标一致。只有创始人有动力,公司才会成功。投资人不能强迫生意做成,更不能逼着CEO去关心某件事。如果你在火箭飞船上,系好安全带,瞄准另一个星球。在我的创业项目启动4个月以后,我们有了一百万个用户,50%来自社交媒体分享,我们知道这是一个大机会。于是我们开始以不同的方式思考我们的业务。这个规模能够到多大?2012年1月我们回顾最开始6个月的业绩,发现每天销量的三分之二来自回头客,50%依旧是社交媒体分享,我们意识到有绝佳的机会创建一个品牌。我们开始减少对短期结果的考量,更多放在五年、十年、二十年的长期计划上。当我们开始这么做的时候,我们每天设计工作的重心是如何创建下一个有全球影响力的品牌,再不是完成一些短期的业务数据了。给自己找一个“夏尔巴人”。这种人是之前干过这些事——融资、交易、和创业团队并肩战斗。给他公司股份的1%或2%,甚至5%,换取他投入的时间。他们可以找到未来的投资人。在公司发展规划上听取他们的意见。不要用委员会的形式,顾问委员会从来就没什么份量。找到一个伙伴,让他成为你的夏尔巴人,依靠他们。如果你想有一个长久的生意,不要为短期压力而放弃。一旦你决定踏上火箭飞船,为长远做好打算。大部分创业公司都是玩儿短线。长线钓大鱼。保护、培育你的品牌。太多公司在这一点上出了问题。你的品牌要比你的生意重要。你的品牌就是你的客户、合伙人和员工对你公司在情感上的反映。品牌是很脆弱的,需要反复地建立信任,不断地互动。服务要比销售更重要。销售有好有坏,服务永远如一。伴随公司的成长,最难管理的是文化。文化体现在,你雇佣什么人,谁在管理公司,他们是怎样做的。不要只是把文化挂在嘴边上。雇佣聪明的人,以更聪明的方式管理,通过这种方式来创造公司文化。不要让团队失去战略重心。执行才能赢。在创办第一家公司时,我们不断做各种战略执行的讨论,一起开头脑风暴会商量如何引领公司走向下一步。这让团队分散了注意力,忽略了手上的工作。现在我会收集意见并与合伙人在晚餐时候进行商量。每年召集高管团队两次,一起做战略评估和计划。除了这两次会议,剩下的时间我们都把精力放在执行上。坚持完美。永远,永远不要妥协。如果你在这里妥协,又在那里妥协,很快你会问自己“我们是怎样到现在这个局面的?”但是要犯错误。坚持完美不代表团队成员要活在不能犯错的恐惧中。鼓励他们尝试新的东西,把犯错误作为学习的机会。只是千万别搞砸了。把错误变成一次学习机会,做蠢事把生意搞砸了,这两者是有区别的。尽管差别很微妙。为你的挑战而庆祝。每周我们都有全公司的集体会。30%的会议内容是关于我们做得好的地方,70%的会议内容是关于我们今后的挑战。如果你希望公司成长,做大事,就应该这样。我们的管理层会议更夸张,10%谈成功经验,90%谈改进建议。还是那句话,我认为就应该这样。讨论会基本上是浪费时间。我知道很多人不同意这一点,但是我的感受的确如此。和团队成员会面、解决问题,去倾听客户和合伙人的意见,甚至在交易博览会闲逛,这些都能让我领悟到更多。我的准则是,要避开参加讨论会,除非是纯粹为了公关的目的或者你有销售任务。穿好玩的袜子和彩色的鞋子。我穿那种滑稽有趣的袜子,还有红色的鞋子,为的就是提醒我自己不要平庸要创新。也为了告诉其他人,像我这样无趣的CEO也能很有趣。做任何事,表示你不只是一个机器人。让人们认识了解一个真实的你。有时候周五下午4点我会做办公室的DJ,我会用棉花糖扔别人,无恶意就是逗着玩儿那种。大方展示困扰你的难题。勇于自嘲,也允许别人开自己的玩笑。当我搞砸了什么事的时候,我务必要向团队坦白,让大家开心一番。我们都是人嘛。说一个好的故事。人们从故事中获得灵感与激励,而不是来自计划、战术或结果什么的。把呆板的结论生活化,成为你和周围人的个人体验。但是别撒谎。永远都不。你可以润色,但是不能编造。一就是一,二就是二。从周围人中获得灵感。听取他们的意见,培养感情。向他们学习。帮助别人会让你变得更好。每天都有乐趣。如果没意思,马上停止。没有人在强迫你。对于销售人员来说,你的价值就在于最后一次的销售业绩。回家吧。没错,创办一家成功的快公司是很酷。但更酷的是回家,回到你的伴侣身边。成熟些,但是不要长大。保持谦虚。但是,改变世界。做一些有意义的事。给世界带来不同。微笑,这是你的目的。如果你读到了这里,谢谢你。我写这些是为了帮助到其他创业者,也是为了自我受益。
未来面前,你我还都是孩子,还不去下载 猛嗅创新!
最多15字哦
后参与评论

我要回帖

更多关于 移动4g信号差怎么处理 的文章

 

随机推荐