精益的本质——Fail cheap fail fast 低成本快速试错(转)

May 29th, 2022 by JasonLe's Tech 190 views

什么叫做不精益?

1. 问题找错,痛点不痛、刚需不刚。刚需:极大提升效率,极大降低成品,极大提升用户体验
2. 闭门造车
3. 解决方案选择错误
4. 过早优化:核心需求没有验证,就开始补充周边功能
5. 过早扩张:核心需求还没验证,就考虑规模化

为什么要进行精益创业?

创业者往往重视显性成本、不重视隐形成本——最大的隐形成本是时间成本
精益创业能帮助企业低成本快速试错,节约时间

正确的步骤:需求探索-用户验证-推广

1. 需求探索-找到痛点-常识判断-找到核心用户-用户访谈-总结
– 做强感知产品,让产品的特性让用户很明确的感知到(eg. 360杀毒软件)
– 为什么用户访谈不能代替MVP?观察真实的客户行为、
2. 用户验证-推行MVP
– 选出最先需要验证的假设?-需要评估哪些数据?-只找一个功能
– 数据收集:漏斗分析(转化);留存分析(版本迭代效果);A/Btest(产品用的少广告用的多);灰度测试
– 验证假设—数据:避免KPI导向,KPI是手段而不是目的(数据造假的方法太多了)
– 验证假设—亲自体验:创业公司CEO就是首席产品经理
– 验证假设—用户访谈:产品是否解决了你的问题?是否愿意付费?对价格是否满意?
3. 推广-加速获得用户
– 黏着式-获得新用户的速度超过老用户的损耗
– 付费式-不同渠道投放广告,投放时衡量成本
– 病毒式-工具型产品病毒式推广相较社交型产品比较困难,但也有如微信支付的成功案例(eg. 微信红包的成功推广)

精益创业的误区与局限性

1. 精益是“术”,大势为“道”——红利与大势
2. MVP不是万能钥匙—最有风险的去做MVP,其他用常识判断,但常识未来会发生改变
3. 在激烈竞争时,有可能错过一些机会
4. 实体性越强,开发中的精益性就越小
5. 有时候向用户寻求建议的价值不大
6. 容易让创业者只专注产品,而忽视营销
7. 容易让创业者做出放弃决定

企业内部如何管理创新-把企业做小是保证创新的核心

1. 团队组成 敢死队,只要精英、不要菜鸟,保持小规模:1个产品两个研发
2. 去KPI,内部市场化,鼓励内部竞争
3. 团队激励
4. 容忍失败

课后讨论

(1)对创业公司来说,时间是最大的成本。需要快速验证产品的路径是否成功。
(2)对已经上线产品模块的功能验证:快速和用户沟通,包括面对面沟通和后续的会议纪要,都可以形成公开参与的机制,感兴趣的成员都可以参与进来。

参考:

https://zhuanlan.zhihu.com/p/26700079

ToB产品本质

April 14th, 2022 by JasonLe's Tech 61 views
第一部分 功能任务
当用户提出需求的时候,并不意味着他有真正的需求。
需要从传统的产品定义中放开,回到原点,我们的目标用户究竟是谁、他在什么场景下能够爽到。有明确的场景、明确的用户群体时才能更加聚焦问题的源头,才能解决真正的问题。离用户最终的目的越近,产品的价值越大。
第二部分 情感任务
情感任务的关键点在于,了解用户是什么样的人,让用户成为自己想成为的那种人。
第三部分 任务场景
  • 我们要看到用户在雇佣产品完成任务的场景中有哪些需求,如何移除障碍、利用资源。
  • 用户需求和用户任务不是同一回事,用户任务是一套话术、技巧,进而帮助我们更好的发现用户需求是什么,是一种刻意练习。
  • 产品不是最终目的,解决问题满足需求是最终目的
  • 提供的不一定是软件、可能是服务,可能是一个精神上的表达。像小助手在服务中可以抽象出一些模式化的东西,进而变成产品的一部分。

资产定价模型 CAPM

January 6th, 2022 by JasonLe's Tech 350 views

资本资产定价模型(英语:Capital Asset Pricing Model,缩写:CAPM),为现代金融市场价格理论的支柱,广泛应用于投资决策和公司理财领域。

1、年化收益率(Annualized Returns):表示投资期限为一年的预期收益率

Pend=策略最终总资产,Pstart=策略初始总资产,n=回测交易日数量

2、基准年化收益率(Benchmark Returns):表示参考标准年化收益率。

3、贝塔(Beta):表示投资的系统性风险,反映了策略对大盘变化的敏感性。

例如,一个策略的Beta为1.3,则大盘涨1%的时候,策略可能涨1.3%,反之亦然;

如果一个策略的Beta为-1.3,说明大盘涨1%的时候,策略可能跌1.3%,反之亦然。

4、阿尔法(Alpha):非系统性风险,Alpha是投资者获得与市场波动无关的回报,一般用来度量投资者的投资技艺。例如,投资者获得了12%的回报,其基准获得了10%的回报,那么Alpha或者价值增值的部分就是2%。

5、收益波动率(Volatility):用来测量资产的风险性,波动越大代表策略风险越高。

 

5、夏普比率(Sharpe Ratio):表示每承受一单位总风险,会产生多少的超额报酬,可以同时对策略的收益与风险进行综合考虑。

6、信息比率(Information Ratio):衡量单位超额风险带来的超额收益。

信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,因此,信息比率较大的策略的表现要优于信息比率较小的策略。合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率。

7、最大回撤(Max Drawdown):描述策略可能出现的最糟糕的情况。

8、年化换手率(Turnover Rate):描述策略变化的频率以及持有某只股票平均时间的长短。

CAPEX、DCF、NPV、IRR、ROI

December 21st, 2021 by JasonLe's Tech 423 views

CAPEX 是指资本性支出,英文全称为capital expenditure。一般指资金或固定资产、无形资产、递延资产等资产的投入。此类资产在使用过程中会持续多个计费期间,需要在使用过程中将其资本化,并分期将成本转化为费用。如固定资产的折旧,无形资产和递延资产的摊销等。

贴现现金流(Discounted Cash Flow,DCF)贴现现金流是用来评估一个投资机会的吸引力的方法。指将未来某年的现金收支折算为目前的价值。未来现金流的现值必须通过重新计算(折算)来确定。如此,一个公司或计划项目才能够被准确估值。DCF包括NPV和IRR

净现值(NPV)是一项投资所产生的未来现金流的折现值与项目投资成本之间的差值,净现值指标是反映项目投资获利能力的指标

决策标准:

  • 净现值≥0 方案可行;
  • 净现值<0 方案不可行;
  • 净现值均>0 净现值最大的方案为最优方案。

优点:

  • 考虑了资金时间价值,增强了投资经济性的评价;
  • 考虑了全过程的净现金流量,体现了流动性与收益性的统一;
  • 考虑了投资风险大则采用高折现率,风险小则采用低折现率。

缺点:

  • 净现值的计算较麻烦,难掌握;
  • 净现金流量的测量和折现率较难确定;
  • 不能从动态角度直接反映投资项目的实际收益水平;
  • 项目投资额不等时,无法准确判断方案的优劣。

IRR(Internal Rate of Return)是项目NPV为0的折现率,表示考虑资金的时间价值时,未来现金流流入与流出的现值相等时的折现率,这与NPV的计算逻辑相通,只是在NPV计算中,折现率是已知条件,而IRR计算中是计算目标。

投资回报率(ROI,Return On Investment),是指达产期正常年度利润或年均利润占投资总额的百分比。其计算公式为:投资回报率(ROI)=年利润或年均利润/投资总额×100%

投资回报率的优点是计算简单;缺点是没有考虑资金时间价值因素,不能正确反映建设期长短及投资方式不同和回收额的有无等条件对项目的影响,分子、分母计算口径的可比性较差,无法直接利用无风险投资利润率的投资项目才具有财务可行性,ROI往往具有时效性–回报通常是基于某些特定年份。

参考:

http://jinrongbaike.com/doc-view-7554.htm

JDK8版本过高引起MySQL连接失败:javax.net.ssl.SSLHandshakeException: No appropriate protocol

September 28th, 2021 by JasonLe's Tech 2,806 views

最近在做面向k8s的项目镜像,遇到很奇怪的问题,SpringCloud 项目连接mysql 抛 javax.net.ssl.SSLHandshakeException: No appropriate protocol,调查一段时间后,发现是Java security中的配置不对导致连接Mysql异常。

javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
	at sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:171) ~[na:1.8.0_292]
	at sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98) ~[na:1.8.0_292]
	at sun.security.ssl.TransportContext.kickstart(TransportContext.java:220) ~[na:1.8.0_292]
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:428) ~[na:1.8.0_292]
	at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:316) ~[mysql-connector-java-8.0.17.jar:8.0.17]
	at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:188) ~[mysql-connector-java-8.0.17.jar:8.0.17]
	at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:99) ~[mysql-connector-java-8.0.17.jar:8.0.17]
	at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:331) ~[mysql-connector-java-8.0.17.jar:8.0.17]
	... 68 common frames omitted

看到SSLHandshakeException,心里打起了问号?这个错误比较反常,最终网上找了一番,问题定位了:JDK8高版本导致的,因为之前用的是oracle:1.8,然后换成了openjdk:8,然后发现项目无法启动了。

方法一:

此处连接的MySQL,导致的报错,修改jdbcUrl,在其后面加useSSL=false后运行正常

方法二:

删除SSLv3, TLSv1, TLSv1.1并保存java.security文件,重启项目即可解决问题,删除后此处为:

# Example:
#   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

方法三:

降低JDK版本,这个相当也容易操作,比如可以从1.8.0_292降到1.8.0_281,甚至是1.8.0_275版本,但个人不建议,因为Oracle对JDK 8的支持一直会到2030年:即使很长一段时间用JDK 8,但JDK 8本身也是有小版本迭代的,比如你明年换了电脑,安装JDK,基本是1.8.0_292之后的版本,那这个问题会一直存在。

方法四:

方法一 能解决由SSL调用权限导致的所有问题,但破坏了安全性
方法二 针对MySQL的问题,可以快速解决
方法三 不推荐

因此,碰到类似问题,基本的思路是兼容JDK 8高版本甚至JDK高版本,比如代码层面的:

private Socket overrideTlsProtocol(final Socket socket) {
    if (!(socket instanceof SSLSocket)) {
        throw new RuntimeException("Error, an instance of SSLSocket is expected");
    }
    ((SSLSocket) socket).setEnabledProtocols(new String[]{"SSLv3"});
    return socket;
}

修改为:

private Socket overrideTlsProtocol(final Socket socket) {
    if (!(socket instanceof SSLSocket)) {
        throw new RuntimeException("Error, an instance of SSLSocket is expected");
    }
    ((SSLSocket) socket).setEnabledProtocols(new String[]{"SSLv3", "TLSv1","TLSv1.1"});
    return socket;
}