精益产品开发
最近一段时间在断断续续看老板推荐的一本书《精益产品开发》
背景
最近一段时间在断断续续看老板推荐的一本书《精益产品开发》。
我这人不太爱看书,是因为看书要犯困,我也不知道为啥,我内心是想看书的,但是一看上就打瞌睡,太难受了,所以导致我看书的节奏是只能概看,偶尔能专注(比如遇到难理解的、有兴趣的)。
在这儿记个流水账啦。纯属个人观点,不喜就算了。
开始
XP方法
即极限编程,一开始以为XP是啥没听过的新东西,一查原来就是早有耳闻的极限编程。
这里想说一说,XP里有个点,正是我目前比较推崇且是这么做的-简单设计
极限编程鼓励从最简单的解决方式入手再通过不断重构达到更好的结果。也就是不过度设计不追求完美不刻意追求可扩展(需要申明一下当你个人都不清楚或者不确定未来的场景的情况下),以最短的时间和最简单的方式实现。
这儿我不跟任何人抬杠,我目前就是认为“简单设计”是让我体验最好的编程方式。
我从中能获益两点,这两点带给我的正反馈是可以让我放弃追求完美和一定要可扩展的目标的。
时间,通常会加快我对产出的交付,特别是当我扮演的是生产者或者叫被依赖方时,会让使用方的用户体验比较好,比如写后端的时候前端开发者会少一些抱怨和矛盾,比如写前端的时候,产品、UE会比较满意。总体来说,不仅仅只是少花了一些时间,在各方的满意度方面都会有所提升,从而最终个人幸福感得到提升。多说一句,团队为啥搞敏捷,说的直白点,很大的一个因素不就是各位消费方都想尽快看到产出吗?而不是多方动不动就墨迹工期的问题。
可靠性,因为是简单设计,所以满足当前场景的出错概念低,且易于维护。
聚焦价值流动效率,而不是资源利用效率。
这一点是我一直比较坚持的观点(虽然没啥人听我的),只是不知道有这么个专业的词语“价值流动效率”,现在公司几乎我接触过的team,不管是办啥事一上来都是先聊资源问题,往往就把事情聊死了或者需要老大出面了。
其实我觉得,不管啥事先要搞清楚,这个事的背景,是为了解决什么问题,最终对于产品的价值的是什么。这就是我认为的价值流动效率,就是咱们得聚焦于交付的价值,而不是资源问题。
控制在制品的数量
其中有一节讲看板方法的实践,里面说到一个实践:控制在制品的数量。
个人认为,首先产品端要克制,每个迭代不要以故事数来定,而是基于故事闭环以及研发工作量,聚焦最终交付的价值
看板

可视化价值流动
看板系统设计的原则
体现价值
反映协作
暴露问题
- 分析价值流动过程
- 识别团队交付的价值类型(业务需求、技术改进等)
- 确定看板系统的基本流动单元(通常选取工作比重较大的价值类型,比如:业务需求。)
- 分析流动单元的流动步骤(分析、开发、测试等)
- 识别流动过程中的价值分解和合并(分解为多人完成再合并)
- 选取可视化设计元素
- 队列。形成的条件:某个状态存在一段时间的停留。比如:开发中、测试中等
- 列的划分可以很细,具体细化到哪个级别,依赖于:
- 工作是否会在该阶段显著停留。比如:待验证
- 使用者是否需要特别关注这些阶段。比如:自测阶段
- 列的划分可以很细,具体细化到哪个级别,依赖于:
- 泳道。表达流动单元的层级关系,起分割作用,常用的划分依据:
- 处理规则的不同,如:业务需求和现场问题。
- 需要给予不同的关注,如需求的受益方不一样。
- 区域。表示特定信息。
- 卡片及标识
- 队列。形成的条件:某个状态存在一段时间的停留。比如:开发中、测试中等
- 用看板墙建模价值流动过程

显示化流程规则
核心要求:团队成员对流程规则形成一致的理解和承诺。
six months learn a language
最近看到一个视频:如何在六个月内掌握一门外语挺让我惊喜的,里面的内容跟以往我看到的一些教学习语言的内容有挺大不同,做个记录。
开始
两大误解
- Talent(需要天赋)
- Immersion per se(沉浸式语言环境)
特别是第二点再没看到这个视频之前我一直以为学习一门新语言最好的方式是去到说该语言的环境中,沉浸式体验才能快速学会,看过视频后最起码让我觉得这应该不是最好的方式,因为我回过头来一想,之前在重庆上学的时候因为学校就在重大旁边,所以认识了几个公派留学生,他们在中国留学2年,据我的了解,这些留学生没一人能说超过10句中文,尽管他们天天待在中文的环境。
5个原则
7个动作
hexo 配置
效能提升
思考工具
加入了 池老师的知识星球:让时间为你证明
OOM排查工具
JVM
GC
背景
现场排查OOM,对于GC的一些理解。
杂项记录
https://vladmihalcea.com/improve-statement-caching-efficiency-in-clause-parameter-padding/
http://technodibble.blogspot.com/2015/02/hibernate-in-clause-outofmemory.html
http://xmlandmore.blogspot.com/2014/10/jdk-8-is-tuning-maxnewsize-in-g1-gc.html
heap内存归还给操作系统:G1GC https://openjdk.org/jeps/346
https://www.youtube.com/watch?v=BTIcja5xcK0
https://www.youtube.com/watch?v=IB7oFVYTOJ0
https://gceasy.io/gc-recommendations/important-g1-gc-arguments.jsp
https://github.com/Snailclimb/JavaGuide/blob/83efb36fb56d197f2c4b471084b884c6a4f23e37/docs/books/java.md
https://www.douban.com/doulist/2545443/
https://www.baeldung.com/jvm-parameters
https://blog.csdn.net/myth_g/article/details/119855832
https://docs.oracle.com/en/java/javase/11/gctuning/introduction-garbage-collection-tuning.html#GUID-326EB4CF-8C8C-4267-8355-21AB04F0D304
https://programmer.ink/think/jvm-series-jvm-tuning-jps-jstat-jmap-jhat-jstack-jinfo.html
https://docs.oracle.com/javase/10/jrockit-hotspot/logging.htm#JRHMG121
https://confluence.atlassian.com/confkb/unrecognized-jvm-gc-options-when-using-java-11-1002472841.html
https://dzone.com/articles/understanding-garbage-collection-log
https://sematext.com/blog/java-garbage-collection-tuning/
https://sematext.com/blog/java-garbage-collection-tuning/
https://cloud.tencent.com/developer/article/1811734
https://docs.oracle.com/en/java/javase/11/tools/jstat.html#GUID-5F72A7F9-5D5A-4486-8201-E1D1BA8ACCB5
https://www.javatang.com/archives/2017/10/19/51301886.html
https://morioh.com/p/935f204ccc1a
https://dzone.com/articles/jvm-tuning-using-jcmd
https://sematext.com/blog/java-garbage-collection-logs/
MAT
dump文件分析用的MAT。
线程分析
https://geekflare.com/generate-analyze-thread-dumps/
https://blog.fastthread.io/2016/02/22/thread-dump-analysis-pattern-repetitive-strain-injury-rsi/
当应用程序出现性能瓶颈时,大部分线程将开始在有问题的瓶颈区域累积。这些线程将具有相同的堆栈跟踪。因此,每当大量线程表现出相同/重复的堆栈跟踪时,就应该调查这些堆栈跟踪。这可能表示性能问题。
以下是一些这样的场景:
- 假设您的 SOR 或外部服务正在变慢,那么大量线程将开始等待其响应。在这种情况下,这些线程将显示相同的堆栈跟踪。
- 假设一个线程获得了一个锁并且它从未释放,那么在同一执行路径中的其他几个线程将进入阻塞状态,显示相同的堆栈跟踪。
- 如果循环(for 循环、while 循环、do..while 循环)条件未终止,则执行该循环的多个线程将显示相同的堆栈跟踪。
当出现上述任何一种情况时,应用程序的性能和可用性都会受到质疑。
重点关注:Troubleshooting Tools、Monitoring Tools
https://docs.oracle.com/en/java/javase/11/tools/tools-and-command-reference.html
https://programmer.ink/think/jvm-series-jvm-tuning-jps-jstat-jmap-jhat-jstack-jinfo.html
https://www.hollischuang.com/archives/110
线程状态产生的原因
runnable:状态一般为RUNNABLE。
in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING。
waiting for monitor entry:进入区等待,状态为BLOCKED。
waiting on condition:等待区等待、被park。
sleeping:休眠的线程,调用了Thread.sleep()。
https://jakubstransky.com/2017/12/19/hotspot-jvm-internal-threads/
Tomcat线程模型
NIO: synchronous and non blocking. It can support large concurrency better than traditional bio. This mode is adopted by default after Tomcat 8.0.
NiO
https://developpaper.com/nio-optimization-principle-and-tomcat-thread-model/
Tomcat’s NiO model has more poller rolesAcceptor、PollerandHandler worker thread pool。 Are these three roles very familiar? If poller is replaced by reactor, is it the reactor model. Yes, Tomcat’s NiO model is based onMaster slave reactor modelIt’s just a change of name.
AcceptorThe: accepter thread is specifically responsible for establishing network connections(accept)。 After the new connection is created, instead of directly using the worker thread to process the request, the request is first sent to the poller buffer queue.
Poller: in poller, a selector object is maintained. After poller takes the connection from the buffer queue, it registers in the selector and blocks to wait for read and write ready(Read wait ready, send wait ready)。
Handlers: traverse the selector to find out the ready IO operations in the selector and hand them over to the worker thread for processing(Read memory read, decode, process, encode, send memory write)。
https://www.cnblogs.com/grey-wolf/p/13740845.html
调优
https://tomcat.apache.org/tomcat-9.0-doc/config/http.html
https://www.datadoghq.com/blog/tomcat-architecture-and-performance/