clojure java architecture devlove complexity antifragile software design cynefin framework data modeling struts1 jvm excel programming sier 銀の弾丸 design patterns flexibility domain model simple made easy tactical periodization lateral thinking review architecture review drift into failure testing test harness maven jjug ccc chaos engineering simplicity oop yagni waterfall methodology agile software