《ToB的本质》摘录与感触(2)

“定价是需求和供给的交叉点,决定了产品的价值传递方式。”

“对某一企业软件市场规模进行准确评估几乎是一件不可能的事情。这有两个原因:第一,没有可信数据源。第二,破坏性创新的统计价值低。”

“若定价未在官网上标出,那么厂商很可能不是严格意义上的SaaS厂商。定价不以高低论英雄,而应以是否适合产品自身定位分好坏。”

“总结来看,企业软件定价模式需要在这两个要素之间平衡:与价值传递相吻合的灵活性,与客户预期和采购相吻合的惯性。”

“国内市场中目前没有专为企业软件提供定价支撑的工具,关于定价,优惠券,免费试用,大客户折扣,到期提醒,成本红线,价格调整,新定价灰度发布,反馈收集等一系列价格管理能力,均需要厂商自行摸索,业内不仅缺乏共识的最佳实践,自己摸索的效率和效果也都很一般。” ——- 机会?

“定价是组织对市场把控力的整体体现,定价不能凭空猜测。”


“线索交换是值得一提的特殊渠道。这一手段短期成单的可能性不大,但客户画像的真实性近乎100%,是罕见的能够批量直接触达企业软件决策者的营销方式。”

“渠道的作用是“放大”,既放大了优点,也放大了缺陷。”

“回到创业阶段,很多时候销售人员(无论新手还是老手)卖不出产品,是因为核心团队没有想清楚怎么卖,卖给谁,并且产品定位不清,价值不显,无法为销售人员搭建一套可学习,可复用的支撑接口,销售工作自然难以深入。”

“基本的销售方法应由核心团队自行实践,总结清楚,然后再招一两位销售人员,试探是否可以复制。”

“我们应将知识的互通视为企业经营的头等大事,也应将其看作销售管理的底层核心目标。”

“在知识分享不畅的软件团队中会出现“三不”:销售不知道怎么深入讲解;知道如何讲解的人不分享;组织中缺乏鼓励分享的机制或文化。”

“虽然最终成单原因是复杂的,但专业性这一要素是核心产品价值的对外体现,需用最重视的态度反复雕琢。”

“市场负责触达,销售负责转化,,,如果说销售是在“点”上转化,那么市场无疑是在“面”上制造影响,而后者天然就是模糊的。”


“当达到5000万元年收入规模时,单产品的收入增长可能会大幅放缓。为了持续增长,厂商普遍会选择横向扩充新的产品线作为第二,第三增长曲线,组成产品矩阵,联合售卖。”

“然而,多产品线带来了更为复杂的管理问题。”

“多产品线,是以产品侧体系性对抗需求侧体系性零散多变的思路,是以数量对抗未知的暴力哲学。”

“一次只做一件事,一个团队只有一个目标,这是做好任何事情的基础。”

“每一个功能都有它的价值,但也有它的代价,我们经常重视前者而忽视后者。”

“清晰的产品边界是交付标准化的基础,而交付标准化是规模化发展的前提。”

“技术优势是一项隐性优势。若不经过专门的良好包装,在短期市场竞争中,技术优势难以体现出价值。包装的内容需要与客户的需求相契合,并不能凭空捏造。”


“交付是最繁重,成本最高的软件经营环节,交付的成本是不可被规模化摊平的,是企业软件行业难以规模化发展的“罪魁祸首”。”

“我仍建议交付环节由合伙人专门负责。交付工作是处于一线的,需要想办法让销售人员听到最后排的声音,让管理者听到最下方的声音,让产品人员听到现场的声音,整个团队才能动员起来。”

“交付是体系化的最大困难,指望某一部门超水平发挥去解决无疑是白日幻梦。错综复杂的体系化问题,只能由体系化的应对方式去解决。”


“软件本质上是企业经营最佳实践的标准化输出。”

“软件的价值根植于人力成本。人力成本由产业链,行业经济,发展阶段,社会形态综合叠加,共同决定。”

“由于企业软件的价值是企业本身在社会中价值的映射,所以市场经济发展越充分的地区,软件价值的天花板理应越高。”

“软件的最终目标是帮助企业实现其社会价值,从业者也当以此自勉。”

延展阅读:《ToB的本质》摘录与感触(1)

Java HeartBeat中设置钉钉机器人监控提醒

在HeartBeat v3.0.0版本中增加了对钉钉机器人监控提醒功能,具体使用设置如下。

1.以HeartBeat的管理员登录,进入‘提醒设置-钉钉机器人’配置界面


2. 在钉钉中创建一个消息提醒群(也可使用已有的群),以群管理员点击‘群设置’->‘机器人’进入机器人管理。点击‘添加机器人’选择 自定义机器人。


3. 填写机器人名字,如:HB监控提醒,在安全设置中选择‘自定义关键词,内容填写‘HB提醒’,最后点击‘完成’保存数据。

4. 复制Webhook地址,在HeartBeat中填写该webhook地址,并勾选‘启用钉钉机器人’,若需要发送群监控提醒时@具体的成员可填写手机号,若需要@所有人则勾选上@所有人,最后保存。

5. 当实例状态变成异常或从异常恢复正常时,钉钉机器人会发送相应的信息到群里,如下图:


若未正常提醒请检查自定义关键词是否在设置的提醒内容中,或查看钉钉说明文档 https://open.dingtalk.com/document/app/custom-robot-access/title-jfe-yo9-jl2

Java HeartBeat 3.0.0 发布,心跳检测应用服务器(支持协议HTTP/UDP/TCP)微服务应用程序

Java HeartBeat 3.0.0 版本已经发布,带来Socket监控支持(TCP/UDP)。

3.0.0 版本主要更新如下:

  1. 添加Socket (TCP,UDP)的监控
  2. 升级JDK, SpringBoot等基础版本, log升级使用logback框架, thymeleaf替换jsp
  3. 各实例提供分组与查询
  4. 邮件配置界面化,更灵活(不在配置文件中写固定)
  5. 提醒方式增加钉钉机器人(相比邮件即时性更好)
  6. 优化界面部分UI,更直观简洁

HeartBeat 3.0.0 版本访问地址:https://gitee.com/mkk/HeartBeat/tree/3.0.0/

SpringSecurity中OAuth2.1/OIDC1.0升级变化明细

spring-oauth-server v3.0.0版本中,我们全部升级了OAuth协议(从OAuth2.0升级到OAuth2.1)并同步增加了对OIDC1.0的支持落地。这些实现的底层依赖SpringSecurity框架的变化,此文将这些细节一一通过对比来讲解。

每一项是一个变化点,依次罗列出之前,之后(v3.0.0)以及说明。

  • spring security oauth组件

spring-security-oauth2 v2.3.x

spring-security-oauth2-authorization-server v1.1.x

Spring Security官方对旧的不再维护支持而推荐升级替换用新的实现,详见 https://andaily.com/blog/?p=20077

  • grant_type变化
  • authorization_code (包括PKCE)
  • password
  • client_credentials
  • implicit
  • refresh_token
  • authorization_code (包括PKCE)
  • client_credentials
  • refresh_token
  • device_code (urn:ietf:params:oauth:grant-type:device_code)
  • jwt-bearer (urn:ietf:params:oauth:grant-type:jwt-bearer)

grant_type的变化看到安全在不断升级,同时为更好的支持物联网提供协议上的支撑。具体说明详见 https://andaily.com/blog/?p=103

  • scope变化
  • read
  • write
  • trust
  • openid
  • profile
  • email
  • address
  • phone

scope的变化按照OIDC协议的规范来实现的,代码中详见 OidcScopes.java

  • MySQL表结构
  • oauth_client_details
  • oauth_client_token
  • oauth_access_token
  • oauth_refresh_token
  • oauth_code
  • oauth2_registered_client
  • oauth2_authorization
  • oauth2_authorization_consent

表设计变化挺大的,主要由于框架的实现重新设计与实现,新的表结构能更好地满足token全生命周期管控(同时带来一定的性能问题,可通过技术手段解决),有更好的配置项扩展能力(通过将各类配置项通过JSON格式数据存储)

  • token配置项
  • access_token_validity -设置token有效时长(默认12小时)
  • refresh_token_validity -设置refresh_token有效时长(默认30天)
  • authorization_code_time_to_live -设置authorization_code有效时长(默认5分钟)
  • access_token_time_to_live -设置access_token有效时长(默认5分钟)
  • access_token_format -设置access_token的格式,有两选项self-contained(自签即JWT格式,默认) reference(兼容旧的,通过UUID生成随机值)
  • device_code_time_to_live -设置device_code有效时长(默认5分钟)
  • reuse_refresh_token -设置是否复用refresh_token值当刷新token后(默认true复用,设置false时每次刷新后将生成新的refresh_token值)
  • refresh_token_time_to_live -设置refresh_token有效时长(默认60分钟)
  • idtoken_signature_algorithm -设置生成id_token使用的签名算法(默认RS256)

新版本与token配置项相关的请查看 TokenSettings.java 类与数据库表oauth2_registered_client 中的字段 token_settings

  • client配置项
  • trusted -是否授权信任; 适用于grant_type=”authorization_code”的情况,当用户登录成功后,若该值为0,则会跳转到让用户Approve的页面让用户同意授权
  • autoapprove -是否自动跳过用户授权步骤
  • client_secret_expires_at -client_secret过期时间,可设置
  • client_authentication_methods -认证请求时传递client_secret支持的方式(如post, basic)
  • post_logout_redirect_uris -退出时的重定向到client的uri地址
  • require_proof_key -是否强制使用PKCE(默认false)
  • require_authorization_consent -授权时是否要求用户进行确认(默认false)
  • token_endpoint_authentication_signing_algorithm -指定jwt-bearer流程中生成id_token时使用的签名算法(常见如RS256, ES256)
  • client_name -可以给client设置一个有业务意义的名称

新版本与client配置项相关的请查看 ClientSettings.java 类与数据库表 oauth2_registered_client 中的字段 client_settings

  • java版本

java 8

java 17+(openJDK)

从JVM层面做安全升级,同时提升性能与稳定性

  • token全生命周期管控API
  • /oauth/token -通过认证生成token
  • /oauth/check_token -检查token状态
  • /oauth/error -响应HTML异常信息
  • /oauth2/token -通过认证生成token
  • /userinfo -获取用户信息,OIDC协议中定义
  • /oauth2/revoke -吊销已签发的token
  • /oauth2/introspect -审查token状态(包括是否存活等)
  • /connect/logout -退出并销毁token,浏览器上调用

新版本的token全生命周期管控完整性更好,也是协议更新版本的优势所在

通过各明细对比,能更清晰理解与把控各项安全细节。

《ToB的本质》摘录与感触(1)

“而国内的企业软件仍重度依赖于售前,交付,沟通,驻场等服务,对这些与客户同协同律的工作的依赖,意味着地区壁垒可能通过企业客户而对软件厂商的经营模式产生间接影响。”——软件只是实现客户定制的工具罢(还不错的工具)?

“换句话说,企业软件行业可能少有颠覆性的新机会,现有大厂可以相对安稳地经营下去,持续享受整个市场水涨船高带来的福利。”——企业软件解决的痛点不够痛?

“销售扩张时优先设立地区线,而后考虑行业线,理应具备最佳的性价比。”

“近10年以来,有多少旧人折戟沉沙,就有多少新人奋勇争先。诸多我尊敬的团队,景仰的前辈,未坚持到日出之刻;多少优秀的产品,精致的服务,徘徊在黎明之前。”——创业维艰呢


“稳定且仍在发展的广阔土壤,较低的门槛,专业的需求以及纷杂的壁垒,这“大,专,低,杂”的因素综合在一起,互相作用,共同构成了行业珊瑚礁状的形态特点。”

“这像是企业软件行业存在的市场壁垒,让大资本与巨头食之无味的同时 ,给无数创业者和管理者以穿越周期,安稳栖身的机会。”——无序意味着机会。

“在社会中的其他科技领域增长乏力时,企业软件行业可能以其特殊的结构,稳定的土壤,庞大的需求,较低的门槛,纷杂的市场壁垒,吸引大量科技和工程领域人才进入耕耘。”

“当一个具备标准功能,标准流程的企业软件产品交付给客户时,会同时发生3件事情:客户的认知需要与软件价值达成一致;企业的流程需要与软件支持的流程对齐;旧有的系统需要与新软件完成对接。”——软件开发结束只完成了一小步。


“软件厂商和投资者如果抛开对低利润,难扩张的重交付模式的厌恶,只从市场整体的利弊出发,不带感情色彩来看,或许会发现:可以(或愿意)提供重交付模式,反而是厂商具有的,符合市场需要的竞争优势。”——优势由交付决定??

“发展不是规划出来的,而必须是实践出来的。”

“定制多,交付重,离业务近,却解决了企业的核心问题。”——服务模型(管家式服务)。

“对老旧系统的兼容问题,属于非功能性质的需求,对技术水平和投入的隐性要求很高,会给企业带来极高的成本,且没有经验的人员很难预估其难度。”——骨头上的肉。

“老系统带来的交付难度可作为衡量企业的信息化阶段和步幅的指标,交付难度越低,企业的信息化成熟度可能就越高。”


“中国企业软件的云化趋势是由中小企业(特别是科技企业 )和新兴企业的快速发展带动的。”

“需求是发展的驱动力和方向,但又天然具有一定的模糊性,盲目性,甚至欺骗性。”

“SaaS只能解决产品成本问题,无法绕过软件产生价值的必要步骤。国内大部分企业缺的并非单纯的产品,而是顾问式的,能落地的解决方案。”——有多少清晰的认知到?

spring-oauth-client v2.0.0发布,OAuth2.1客户端参考实现

spring-oauth-client 发布了v2.0.0版本,全面支持OAuth2.1协议的各类grant_type(如 device_code),对应不久前发布的 sping-oauth-server v3.0.0版本功能。

此版本升级更新的主要内容如下:

  1. 底层安全架构升级:jdk 升级 17 (相比 jdk8 性能与稳定性有大提升), spring6.x, springboot3.x, thymeleaf 替换 servlet/jsp
  2. 增加支持OAuth2.1协议中的 device_code 与 jwt-bearer 两种实现(同时弃用了旧的grant_type,如password),并提供相应的工具类
  3. 构建产物由war换成jar,更便捷
  4. 界面使用说明按OAuth2.1协议进行更新,更友好理解
  5. 日志框架升级,由logback替换旧的log4j

v2.0.0版本链接:https://gitee.com/mkk/spring-oauth-client/tree/2.0.0/

spring-oauth-server v3.0.0 大版本发布,升级到OAuth2.1 & OIDC1.0

在spring-oauth-serverg开源10周来之际,我们发布了全新的大版本v3.0.0,从底层架构到整体的协议支持都做了大范围的升级与更新,更好的满足业务需要与跟上技术演进。

此版本升级更新的主要内容如下:

  1. 底层安全架构升级:jdk升级17(相比jdk8性能与稳定性有大提升), spring6.x, springboot3.x, thymeleaf替换servlet/jsp
  2. 全面升级支持 OAuth2.1协议与 OIDC1.0协议(同时弃用了旧的grant_type, 如 password模式)
  3. 构建包由war换成jar, SQL相应调整
  4. 用spring-security-oauth2-authorization-server升级替换spring-security-oauth2, 详见背景说明
  5. 界面使用说明按OAuth2.1进行友好设计并更新各提示语句
  6. 增加spring-restdocs文档支持, 自动生成API相关文档

v3.0.0 版本链接:https://gitee.com/shengzhao/spring-oauth-server/tree/3.0.0/