关于极简编程的思考

Java基础

浏览数:139

2020-5-30

  我是闲大赋,这个昵称用了很长时间,俗话说的好,缺啥炫啥,我本意就是希望又有空闲时间,又不缺钱花,然后现实不是这样。我的Beetl和BeetlSQL开源,并没有给自己带来多少金钱,开放捐助4年以来,总共得到捐助大约是3000块钱(在此感谢那些未曾谋面的捐助者),仅够租用空间和购买域名的钱而已和为数不多的SPA,而投进去的时间确实不计其数,一直都感觉对所在公司有所愧疚。

  闲话少说,我想谈一谈对目前经常出现的字眼极简编程的思考,我认为所谓的“极简”,并不能带来真正的简单。不但要求开发简单,还有阅读简单,维护简单等。

  

>>11:10:12:表达式类型不一致,无法运算(EXPRESSION_NOT_COMPATIBLE):user.price-a 位于1行 资源:/hello.txt
class java.lang.String-class java.lang.Integer
1|${user.price-a}

先看看这个beetl模板错误提示,很清楚,指的是表达式类型不一致,无法用减法运算,且提示了:

class java.lang.String-class java.lang.Integer

即user.price 是字符串类型,a是整形

Beetl对于错误提示还是做得很完善的,但我想说的是,这个错误提示的改进,却是来自JFinal+Beetl一次又一次的使用者反馈,他们自己写的程序,因为这种类型不清楚,在写模板的时候,常常犯下这个错误,我只是在多次帮助JFinal使用者搞清楚问题所在后,才特意加了如上类型的说明,我在技术支持别的MVC框架的时候,从来没有遇到有人范过这样的错误

除了不清楚类型外,JFinal开发者也经常不清楚模型到底有什么属性,Beetl曾经多次背锅,以至于我碰到别人问这种类型或者属性问题的时候,我都会调侃,你是在用JFinal吧,90%的答复都说是。

   在完成项目过程中,会有多个重要产出物,如果你只能选一个去了解,那你会选择谁,我想,毫无疑问,就是系统模型,他是系统概念,系统一切其他产出物的基础,模型包含的属性,他的类型,他的关联关系,成为简单系统乃至复杂系统构成的基础。然而JFinal框架去长期忽视这个前提,早期1.x版本根本就没有真正的模型概念,2.x版本才勉强提供了描述模型的对象,至今JFinal都以无模型作为宣传点。

  那极简编程存在吗,什么是真正的极简编程?

  真正的极简编程就像是一本好的小说,你从任何章节看过去,都会被吸引住。而不是只有第一章才引人入胜。我的意思是指极简编程应该有如下特点

  • 首先应该是开发效率高,比如系统能快速开发项目,在开发环境调试方便。
  • 其次,应该经得住各种折腾,比如系统频繁重构,从单一系统能平滑过渡到分布式系统,从几张表过渡到数百张表。
  • 最后,项目长期维护过程中不给后来人人挖坑,让后来人也能领略到极简编程。极简编程从开始到项目成功,以及最后更迭,都是极简,那才是真正的极简。

   这样的极简编程,很多框架都追求过,比如基于spring的SpringBoot,还有最新崛起的ACT框架,也有很多特定的技术也在追求极简编程,我没有声称自己的Beetl和&&BeetlSql是极简,但很多使用者都给我反馈了这俩项技术的简单易用。

 以Beetl为例,作为一个后端模板引擎,语法基于JS,相当简单了,还有谁不懂JS呢,那些号称极简的模板,总是违背常识的语法和使用习俗。另外Beetl的错误提示在模板里也堪称非常完善。哪怕你的语句里用全角符号,也能在错误提示里指出可能使用了全角。 这样完善的提示才可能使得开发真正正的飞速开发,遇到错误就能很快解决。这才是极其简单!相比某些体积很小,只有几个指令的模板引擎,报错了,都不知道是哪儿错的,这能叫简单吗?

 BeetlSql的简单则来自于尊重以SQL为中心的事实,且以简单明了的Markdown格式管理,辅助内置的CRUD操作和ORM查询支持。因为我做的项目向来都有不少几十行SQL的查询更新逻辑。把SQL放到java代码里,可能写得一时酸爽,但改起来痛苦不堪。我有时候在想,为什么Hibernate和MyBiatis当初差别那么大了,也许就是跟各自作者经历了项目类型有关。如果Hibernate曾经在我这种行业待过,他绝不会写出来Hiberante来的。

   我并非也不需要推销我的开源。我列举我的开源只是想避免被人说“只空谈理论而缺少实践”。作为纯个人开源而非公司性质的开源,没有太多的压力。我一直保持不吹牛,秉承客观的来推广自己的开源,我不想用华丽的字眼来误导人—— 一个功能点介绍就伴随好几个浮夸的形容词。我写这个决心正是来自某位JFinal的使用者对我的诉苦,他曾是java新手,在项目里选择了JFinal,也选择了Beetl作为模板技术。当他把项目做完的时候,他曾经抱怨了很多对极简认识不足的。极简绝不是“开发简单”。

   我也追求极简,曾经认为很多重量级技术不够简单,比如WSDL难以学习,但WSDL确实系统之间最好的交流方式,现在流行的REST比WS更简单,但REST却缺少WSDL,以至于有Swagger搞出来类似的接口规范。

  我也曾认为JSP Tag 比起Beetl的HTML Tag来说复杂的多,特别还有TDL来描述JSP Tag,当时感觉多此一举。但当大家都在使用类似HTML 标签封装渲染逻辑的时候,我也觉得,要是能描述HTML Tag,那Beetl就更加完善了,特别是JSP Tag支持可视化,让我羡慕不已。

    我很长时间都认为那种无类型语言,或者带类型推导的语言,写起来非常酸爽。但每次我看到我写的这些程序,我都感觉看起来非常费劲。我不知道这个变量是做什么的,从哪儿来,什么类型,谁会调用他。我在看一本苦涩难懂的小说? 我认为极简编程,还需要让你阅读程序的时候也很简单。毕竟写一次,会读多次

    当我们编写java代码,享受着一键重构,通过”.” 就能知道所有属性的,通过查看调用栈能知道谁有可能调动你正在查看的方法。我们是多么幸福。其他所谓的极简语言都在像Java靠拢,这也说明,极简并不是写的简单就行了。

  记得JFinal的官方DEMO里,Controller层有类似这种代码(具体细节记得不太清楚)

public void showBlog(){

    int id = this.getIntPara("id");
    Blog blog = ....
    this.setAttr("blog",blog)
    render("bogdetail.html");
}

这个方法不长,看着也不累,方法签名非常“极简”,无参数,无返回值,这样写起来看似方便,但每次读到这里,总会不得不读一下方法体才知道这是做什么的,如果对比一下Spring写法,你会发现Spring更容易去读

public ModelAndView showBlog(int id){

}

Spring Controller 的方法签名包含了参数是什么,返回的值是什么,代码阅读者能扫一眼就能立刻知道这代码是干什么的,需要什么参数也一目了然。你会乐意去读一个方法签名什么都没有的系统吗?

另外,这个Spring代码也天然的支持单元测试,如果你有心想让你的代码经得住折腾。那么Spring显然已经做好了这样的准备。

   我祝福JFinal,因为他越来越完善,比如2.0增加了模型的getter和setter方法,3.0 增加了sql管理。相信4.0还会增加IOC功能,JFinal的视野会随着用户越来越多的支持而越来越宽广,而不再是5年前那个宣称“体积小仅198K,且无第三方依赖”的“全能框架”。JFInal正在把开发简单过度到全面简单过程中。

  我自己则非常喜欢SpringBoot,他确实把一个功能齐全而又健壮的Spring框架封装做的非常简单,不要知道太多的概念就几乎能使用SpringBoot的提供的全部技术栈,能快速开发小系统,而又毫不费力的过度到那种大的或者带分布式系统。

  什么是真正的极简编程,打个比方来说,男女相爱,不仅仅要一见钟情,缘定三生。还有更多的柴米油盐酱醋茶,上有老,下有小的事情,都要充分考虑好这样才能生活幸福。我希望真正的极简编程,不单单是程序员的美好愿望而被追随,不单单是因为有这样的口号而哗众取宠。 我希望是切实可行的技术路线,目前看来,SpringBoot,和ACT都做的很好了,我的Beetl和BeetlSQL也一直低调的朝着这个方向前进:)

作者:闲大赋