V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
assad
V2EX  ›  程序员

最近的 Java 项目之感想

  •  
  •   assad · 2017-11-16 09:29:52 +08:00 · 16429 次点击
    这是一个创建于 2325 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近接了两个小活,都是 Web 项目,客户指定 JAVA

    基本采用的 SSM 以及 Srping Boot,总体感觉。

    JAVA 的写法,还是太啰嗦,一堆 set,get,一个类里面,净是 get,set 了

    持久层的 mybatis,感觉基本就是手写 SQL 了,因为项目较小,没有复杂的表连接操作,所以感觉使用 mybatis 是有点用错了。把 sql 写到一个 xml 文件里,项目 SQL 非常多的话,可读性就差的很了。我真想说,挫,挫,挫。不会写 sql 的,就完犊子了。

    部署,因为很不喜欢 Tomcat,但是 Java 的开发人员选用了 Tomcat。客户提供的运行环境是 Windows,部署就花了半天,不是这个问题,就是哪个问题。JDK 版本不一致,JVM 内存不足无法启动,启动时间及其慢。我想,这要是 PHP 或者 Python,那是分分钟的事啊。Java 部署怎么这么难。写项目的这个哥们还是个 5 年经验的。

    然后因为最初写项目的哥们要离职,交接项目,新来的哥们是个 6 年经验的。结果前面那哥们的项目,git 上 down 下来,愣愣是折腾了大半天,才把项目跑起来。我就想,至于么,别人的项目代码,别人想要跑起来,也不至于折腾这么长时间啊。

    最后,项目预上线,客户不停提出修改页面啊什么的

    每次修改完,都要重新部署。我的个哥,痛苦异常。就是改了模板上一个简单的标签,得,重新部署。

    难道不痛苦么?好痛苦啊。我对 JAVA 一直没好感,严谨导致啰嗦。各种规则,各种乱七八糟的玩意。

    哎,人生苦短,我用 Python。还有我的 PHP。

    一家之言,大家轻喷。

    第 1 条附言  ·  2017-11-16 10:09:34 +08:00
    哎,我让我们的 JAVA 技术好好看看你们的回复,好好学习大牛们的经验
    第 2 条附言  ·  2017-11-16 10:22:15 +08:00
    最后把我气得,心想,我要是会 JAVA,哪有这些事。自己就搞去了。但是,Web 开发,还是 PHP 好啊。虽然大家都瞧不上!
    第 3 条附言  ·  2017-11-16 14:36:31 +08:00
    看到大家回复,气氛很好,我也学习了不少,我没黑任何一门语言的意思。小鸡尿尿,各有各的道。且行且学习!
    142 条回复    2018-12-27 12:43:10 +08:00
    1  2  
    rswl
        101
    rswl  
       2017-11-16 14:22:08 +08:00
    getter/setter 挺方便的啊
    wupher
        102
    wupher  
       2017-11-16 14:26:19 +08:00
    Mybatis 写小项目还是挺麻烦的,虽然可以能用插件可工具反向数据库生成设置与模型。但是基础的增删改查都是要手写修改。

    Java 默认的 Getter Setter 前面有说过用 lombok

    我现在一般使用 Groovy 来进行开发,仍使用 SpringBoot 框架,使用 SpringMVC ( API 基本不变,但是 Groovy 的语法糖会使大部分冗余的代码如 Getter Setter 时间转换等变得优雅和精简。

    数据库层使用 GORM,GORM 连接 SpringBoot 可参见 Gorm 的文档。它基本上是在 Hibernate 上模拟 ActiveRecrod。常用的数据库操作会变得非常简单。写一个简单的模型类,数据库表就生成了,模型类上直接可以做增删改查,无需手写任何代码,包况关联查询。

    缺点是生成数据库表字段属性还有进一步优化的余地,在你上生产之前可以把 chema 导出来,手动进行优化。
    assad
        103
    assad  
    OP
       2017-11-16 14:34:30 +08:00
    @zjsxwc Golang 最后还不是需要前面挂个 Nginx 反带,如果你使用的 BIN 方式部署,改个什么,还不得重新生成 BIN 文件
    incompatible
        104
    incompatible  
       2017-11-16 14:37:20 +08:00
    @NeinChn 嗯。等你想给 java bean 加个字段,lombok 用户写好字段就行,你得再用 IDE 自动生成一次,又-了几 s。
    你问我有+1s 啥意义?我觉得我们公司的工程师每年通过 Lombok 省下几十万秒,留出这个时间用来做更有意义的事,导致公司财报好、股价高、老板开心年终发大包,这就是+1s 的意义。

    新人入门更简单这件事完全站不住脚。新人搞不好要问你 为啥不用 Lombok ?

    另外说到 Tomcat/VCS 什么的,你要搞清重点:我在讲的是 IDE 装个插件没什么大不了的,不是在跟你讨论 VCS 怎么用、Tomcat/Jetty 怎么跟 IDE 集成。
    NeinChn
        105
    NeinChn  
       2017-11-16 14:53:58 +08:00
    @incompatible
    1w 个人节省几十万秒,一个人一年节省几十秒,这个时间能做啥?
    当然你就是随便说个数字我也懂,就这能腾出的这么点时间其实改变不了什么
    考虑一下当引入 lombok 遇到 BUG 的时候,几十秒能解决么,为了这么几十秒的收益牺牲更多的时间
    当然如果你说你用的很好一直没有遇到 Bug,其他人呢...

    另外说到 Tomcat/VCS 什么的,你要搞清重点:我在讲的是 IDE 不装任何额外插件也可以方便简单进行开发,不是在跟你讨论 VCS 怎么用、Tomcat/Jetty 怎么用。
    barbery
        106
    barbery  
       2017-11-16 15:23:18 +08:00
    对接过 java 的后台,惨不忍睹,ie6 风格
    incompatible
        107
    incompatible  
       2017-11-16 15:28:50 +08:00
    @NeinChn 不。我就一定要装 vim 插件,不装 vim 插件的 IDE 不能称作可以方便简单进行开发的 IDE。既然要装 vim 插件,我不在意再装个 whatever 别的什么。
    说到底,你要实现的某些功能 /达到的某些效果,就算不在 IDE 装插件,你也免不了用个其它什么东西来实现。SourceTree 你要不要装一下? mvn plugin 你要不要配一下?该做的事是逃不掉的。

    说到 Lombok 会引入 bug,你用的任何一个工具、任何一个 library 都会面临同样的情况,然而你还不是义无反顾地用了?拿这个说事情是没有意义的。

    最后说到话题本身:其实 lombok 或 IDE 自动生成 setter/getter 都弱爆了。使用原生支持 property 的语言才是正解,在 java 生态里我推荐 groovy 或 kotllin。
    skyFuture
        108
    skyFuture  
       2017-11-16 15:38:34 +08:00
    @assad 贵司是哪里的哦?我去面试看看哈哈
    Terry05
        109
    Terry05  
       2017-11-16 15:41:15 +08:00   ❤️ 3
    楼主这样的大菜鸡,来这里如此吐槽,简直就是找骂

    就好像平时都只是拿着手机拍照,突然因为需要被迫要使用单反来拍照,于是到处吐槽单反怎么这么难用,还要什么换镜头,还要设置什么光圈、快门,怎么那么麻烦,弄了半天怎么拍出来照片还不如我的手机拍的照片!!!

    对不起哦,是你自己不会用
    NeinChn
        110
    NeinChn  
       2017-11-16 15:48:57 +08:00
    @incompatible
    我想表达的就是:在 Lombok 和 getter/setter 之间做选择,lombok 可能会引入 bug,但是 getter/setter 不会(当然万一 IDE 有 BUG 这个就特别尴尬了,但是由于应用范围不同,而且更好解决,肉眼可以看出问题,lombok 生成的代码 debug 难度至少高了一个级别)
    基于效率时间考虑,万一引入了 bug,这节省的时间就完全不值
    你要说其他工具其他 library 就扯远了....

    装插件纯属个人喜好问题,如果能提升自己的开发速度,那当然装装装
    但是不能绑架其他人,vim 插件你装就装了,别人不装一样用,但是 lombok 不一样,别人不装就会飘红一片无法使用 IDE 编译
    对,即使不使用 IDE 插件,也总是需要使用其他手段来做的,但是这个是一次性的,配好了就一直可以用
    不需要每个人针对这些东西做调整,例如 mvn plugin,我写好了 POM,其他人不需要做任何操作
    这才是对自己负责对别人负责对团队负责...这就是意义

    回到话题本身,我也觉得 getter/setter 很丑陋,Function 不是 first class 导致 lambda 特别丑陋
    尤其是遇到一些函数式的库
    出现一堆这样的 class
    Tuple1<T1>
    Tuple2<T1, T2>
    Tuple3<T1, T2, T3>
    Tuple4<T1, T2, T3, T4>
    Tuple5<T1, T2, T3, T4, T5>
    但是其实本身并不太影响开发效率,的确是繁琐了一点,但是开发效率并不等价于要敲多几行代码所花费的时间
    又不是写最简单的 CRUD,这一点点时间确实没必要在乎....
    zjsxwc
        111
    zjsxwc  
       2017-11-16 15:50:14 +08:00
    @assad #103

    Golang 最后还不是需要前面挂个 Nginx 反带,如果你使用的 BIN 方式部署,改个什么,还不得重新生成 BIN 文件

    -------

    nginx 部署又不依赖你说 php 还是 golang 写的程序, 就算你单独搞台机器跑做 nginx 也没关系.

    golang 如果不改涉及 go 的代码, 只是改 html 模板文件也不需要编译, 再者 go 的 bin 部署就一个文件, 没有各种部署依赖问题, 比 php 这种要多加个 c 拓展功能就各种鸡飞狗跳, 也比重新 build docker 容器简单很多
    dhssingle
        112
    dhssingle  
       2017-11-16 15:55:35 +08:00 via iPhone
    还是 C#方便,部署 语法都没那么多屁事
    hasbug
        113
    hasbug  
       2017-11-16 16:15:40 +08:00
    同感,尽管我只是一个小前端
    leaves615
        114
    leaves615  
       2017-11-16 16:17:25 +08:00
    那个语言都有它的优势和弱势,应该从使用环境上去发现它的优势,并最大化发掘。 横向单点对比,只能说明还没到达“无招胜有招”的境界。
    现在的热门语言,对多平台支持都是非常不错的。 抱怨平台问题,只能说明 2 点:1.对平台本身不熟悉,2.对语言本身不熟悉。 现有很多的软件都是多平台支持,多平台交叉编译。
    kenshinji
        115
    kenshinji  
       2017-11-16 16:31:52 +08:00 via iPhone
    @assad 要生产力显然还得看 django 或者 rails 啊
    wangxiaodong
        116
    wangxiaodong  
       2017-11-16 17:10:04 +08:00
    @assad
    你对 java 的用法不对啊!

    部署问题已经被 docker 解决了,一个 Dockerfile 部署文件,外加一个 docker run xxx 命令,所有依赖所有部署细节都将自动解决。

    这种方式不但部署简单,而且对宿主机无污染,不需要了解任何细节。

    即使修改了一个标签,也可以通过 ide 的 docker 部署自动重新发布,不需要你任何额外工作。


    另外,MyBatis 有 CDI 版本( https://github.com/mybatis/cdi ),直接注入使用:
    @Inject UserDataRepository mapper;
    UserData user=mapper.getUserDataByUsername("myUserName");

    定义数据访问接口也可以不用 xml 配置文件,直接用 java 注解:
    @Mapper
    public interface UserDataRepository {
    @Select("SELECT * FROM user WHERE username = #{username}")
    UserData getUserDataByUsername(@Param("username") String username);
    }
    Jimrussell
        117
    Jimrussell  
       2017-11-16 18:34:37 +08:00
    看完蛋疼。很多小公司通病,包括 PM/dev lead 也是楼主这样水平不怎么样的。靠谱点的 java 熟练工一般都看不上楼主这家公司吧。
    fanqianger
        118
    fanqianger  
       2017-11-16 18:36:40 +08:00
    你为什么不去做中间件?
    jason19659
        119
    jason19659  
       2017-11-16 18:43:26 +08:00
    嫌 SQL 麻烦用 NOSQL 啊,NOSQL 也嫌麻烦直接用 mapDB 存吧,不会写 SQL 的还能通过面试?你要是觉得没人改你的代码你也可以不写 setter,你全用 static 都没人管你。
    对 PHP 才是最好的语言。以后不要写 JAVA,有点骨气,不用 php 的就不接
    0Kelvin
        120
    0Kelvin  
       2017-11-16 19:10:34 +08:00
    @dhssingle 现在公司用 C#,Java 转过来表示开发起来感觉省了好多事,就是生态还是没 Java 好
    sampeng
        121
    sampeng  
       2017-11-16 19:37:04 +08:00
    原先我也是这么想,后来想去解决这个问题,发现除了 mybatis 和 tomcat。用 kotlin 就能完美解决语法啰嗦问题,java 也有非常成熟的热部署解决方案,自己网上一搜就有,曾经我在用热部署,我旁边 5 年工作经验的哥们吭哧吭哧的修改,重启,修改重启。。我简单算了一下,我一天最少要比他多写 2 个小时代码。。。
    mybatis 也有编辑器插件自动生成,tomcat 就不是很了解了,这个确实得经验,无解。

    如果所谓 down 下来跑不起来的,八成是配了大量本地的各种路径。。。。5 年还是 n 年经验有毛线关系,就是不了解不学习不进步而已。。。吃枣药丸
    incompatible
        122
    incompatible  
       2017-11-16 19:56:18 +08:00
    @NeinChn 说到对自己负责对别人负责对团队负,actually 在一个团队里是否不使用 Lombok 并不是个人的选择,而是整个组织的意志。这就好比团队里到底用 maven 还是 gradle 还是手撸 ant 管理依赖一样,并非我 prefer 某一种就可以强奸其他人,而是在大家达成共识后才会选用其中一种。假设某天我加入了你们团队、大家都不用 Lombok 且我也没有能力通过我的理论说服任何一个人使用 Lombok,那么我自然不会在代码中搞出一片红。

    你个人觉得使用 lombok 无必要,但你要正视许多规模不小的组织中这玩意儿用的非常广泛的事实。“居然有人使用 lombok ?”这种反问实在是有点大惊小怪了。
    print1024
        123
    print1024  
       2017-11-16 20:36:10 +08:00
    试试 SpringBoot+SpringData JPA
    nl101531
        124
    nl101531  
       2017-11-16 20:43:02 +08:00 via Android
    mybatis 的优势就是 sql 分离,很容易做优化,你这个是原型不对,都不需要考虑性能的项目就直接 ORM 就好了
    maomaomao001
        125
    maomaomao001  
       2017-11-16 22:08:51 +08:00 via Android
    用 docker 自动化部署啊
    sagaxu
        126
    sagaxu  
       2017-11-16 22:20:37 +08:00 via Android
    @NeinChn 你太低估工程师的学习能力了,就 Lombook 这个具体例子,用过的自然懂,没用过的不用 10 分钟也懂了。
    @0Kelvin kotlin 就是坐拥 Java 生态的 C#
    tonitech
        127
    tonitech  
       2017-11-16 22:38:12 +08:00
    Mybatis 可以用注解,简化 get set,Lombook 自动生成代码非常方便的,而且 get set 用起来其实很爽,小项目你只要用面向对象的思想去写根本无需自己再写入 sql 的方法。
    本地的开发环境可以用 idea,安装个 jrebel 热部署,不需要重新编译啊,节约很多时间。
    另外前后端如果做分离了,前端采用调用接口的方式,其实改界面根本就不需要改服务端啊。
    NeinChn
        128
    NeinChn  
       2017-11-16 22:42:48 +08:00
    @incompatible
    这正是因为我所处的环境中,没有人使用 lombok.所以我才好奇....
    我呆过的公司也都算规模尚可,TMD 吧...
    举个例子,如果有人在生产环境中还拿 System.out.println 来输出信息,我肯定会觉得很惊讶(当然例子不太恰当,一个是绝对错误的操作,lombok 最多算可有可无的操作)

    嘛,可能阿里用 lombok,至于广不广泛,这个也没具体数据,并不清楚
    不过跟团队保持一致就好了,这个我很认同,反正在这种事情上没必要特立独行
    NeinChn
        129
    NeinChn  
       2017-11-16 22:48:21 +08:00
    @sagaxu 这和低估别人能力没关系
    确实挺烦人的,IDE 装了插件确实就能正常开发了
    然而有些版本如果不加额外处理,mvn compile 会有异常,还要去 Stack Overflow 找为什么
    很有可能你需要在 mvn 的 plugin 里先加上 lombok 的 plugin,IDE 还要加一份
    当然我很久没用了,不知道现在还是不是这样
    还是 @incompatible 说的那样,团队都在用,那就用
    没人用,那就不要麻烦别人,不要引入额外的东西,大家一起别用...
    sagaxu
        130
    sagaxu  
       2017-11-16 23:09:57 +08:00 via Android
    @NeinChn 我觉得团队里需要不断的有人去推一些新东西,学习成本或者额外的配置都不是障碍,惰性和固步自封才是真正的阻力。我尝试推过很多东西,用 vue 代替 jquery 操作 dom,用 java 注解代替 xml 配置,用 coffeescript 代替 js(失败告终),用 lombok 代替 getter/setter,用 spring data jpa 代替简单的手写 crud 等等。大部分推广都被接受,甚至还有人问我为何不早点用,很多我推过的东西成了后续项目的标配。偶尔也有特别顽固的同事,还在坚持手写 servlet,连 spring 都不用,我们不可能因为照顾他而停止更新技术模板。
    mikulch
        131
    mikulch  
       2017-11-16 23:33:09 +08:00
    java 是挺麻烦的。折腾环境搞半天。
    面向环境编程,有个屌意思啊。
    NeinChn
        132
    NeinChn  
       2017-11-16 23:43:09 +08:00
    @sagaxu
    我觉得精力可以放在能够提升自己竞争力的东西上
    例如多试试其他几种中间件,对比中间件有什么优劣,那么多架构上的东西可以探究
    从简单的地方出发,也可以看看这些到底是怎么实现的...
    只是用一下 lombok,spring data 对个人而言,我是觉得不算什么竞争力
    这些都是该自己去了解去看源代码的,如果能了解他们是怎么实现的,那还是有意义的
    而且重点不是用不用,而是知道什么时候应该用什么,前面我们也讨论了那么多为什么要用 lombok 不用 lombok
    核心在于,这个东西是不是真的合适,到底应该用在什么场景,能不能自行判断,而不是老大说啥就是啥,这才是能力的体现
    Lonely
        133
    Lonely  
       2017-11-17 01:12:33 +08:00
    明显就是个无脑黑,还狡辩
    evolify
        134
    evolify  
       2017-11-17 09:28:51 +08:00
    我想知道,楼主是用记事本写代码的么?就算你瞧不起 lombok,不是还有 ide 帮你搞定 get/set 么?至于 mybatis 麻烦,既然你也知道 springboot,没用过 jpa ?部署麻烦?就算你不会 docker,不是可以打包个 jar 就直接跑了么?
    tairan2006
        135
    tairan2006  
       2017-11-17 09:38:45 +08:00
    lombok 确实会引入某些奇怪的 bug,不过大部分时候还是很靠谱的
    swim2sun
        136
    swim2sun  
       2017-11-17 09:45:52 +08:00
    @mikulch Java 的开发环境除了 JDK, maven 还需要什么? java 能有今天的地位,就是因为当年主打跨平台, 实在不明白你的黑点
    Zz0Zz
        137
    Zz0Zz  
       2017-11-17 12:34:07 +08:00 via Android
    @xgfan 对,我们现在的项目基本都不怎么写 sql 了,直接自动生成,复杂的才考虑写
    sutra
        138
    sutra  
       2017-11-17 14:52:47 +08:00
    估计遇到了半吊子程序员。
    Sypher
        139
    Sypher  
       2017-11-17 15:28:45 +08:00
    楼上该说的都说了,部署方面用热部署确实省很多时间。
    dakingHR
        140
    dakingHR  
       2017-11-17 15:46:29 +08:00
    Java
    1、精通 JAVA 语言编程,具有企业级 Web 应用系统的开发经验;
    2、具备良好的面向对象编程能力,熟悉流行的开源技术;
    3、熟练掌握 MySql、Oracle 等数据库,sql 语言;
    4、精通 B/S 架构开发,熟悉并在实际开发项目中使用 SSH 架构;
    5、熟悉 J2EE 规范,熟悉各种常用设计模式;
    6、熟悉主流框架 Spring3,Stuts2/SprigMVC,Hibernate3/Mybatis ;熟悉 Dubbo+zookeeper 框架开发;
    7、具备良好的沟通能力。
    待遇:1700-4500 $,8h/天,月休 4
    有意跳槽请联系 Q:2129461425
    sagaxu
        141
    sagaxu  
       2017-11-17 17:30:13 +08:00 via Android
    @NeinChn 引入新库跟深入分析内部实现冲突吗?跟掌握其它技术冲突吗?跟独立分析思考冲突吗?

    核心竞争力,我觉得是解决问题的能力,不是熟悉某个框架某个库,也不会局限于某个语言,甚至都不是技术本身。

    在该不该用 lombok 这个事上,一定会有分歧,纠结谁是谁非没有意义,想用的人一起组队,不想用的就分道扬镳,谁也不必迁就谁。
    yamasa
        142
    yamasa  
       2018-12-27 12:43:10 +08:00
    sql 本身就是可读性差不好维护,对性能要求高的查询 gen 出来的 sql 也不够好用,而且它还就是刚需,你让 mybatis 背什么锅?给你 hibernate,你这种水平的估计又要大喊加戏多原理复杂不好优化了。java 的热部署发展多少年了自己不去了解学习就瞎比比。很多能遇到的问题都有庞大高效的生态帮你解决。挫?挫的是 java ?还是人?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3547 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 04:54 · PVG 12:54 · LAX 21:54 · JFK 00:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.