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

求教 Java 技术栈的进一步学习思路

  •  
  •   acctv2 · 2023-02-21 20:54:27 +08:00 · 1654 次点击
    这是一个创建于 635 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是明年毕业的研究生,准备跨行转码农的。

    之前有在 v2 提问过该选前端还是后端,大多数都推荐我学 Java 后端。现在有一些迷茫的地方。

    当下的目标:尽可能找一份暑期实习,实验室不放人所以只能找暑期了。

    目前的情况:

    有在看 B 站上的 SSM 培训班视频,感觉讲的都很基础,理解也很轻松,但是看完后又总感觉收获有限,似乎就是学了一堆本来可以在文档中就能看到的内容,相当于带我整体性地过了一遍需要用到的文档,似乎自己这样看完后劣势依然很大,基本没有学到啥。然后力扣上的题也有在做,但是感觉时间还是比较有限,所以尽量在挑热门题做,先自己做题然后看看一些解题思路啥的,跟以前做题家时期模式一样。

    迷茫的点:

    1. 培训班教学感觉一直在教工具的使用,并没有教一些抽象程度更高的内容(我想程序员群体应该明白我的意思),细节应该依赖于抽象,很显然我现在对抽象的理解不足。很多培训班的源码解析我也觉得是走过场地带你观光一遍 Spring 的实现细节,但是又不深入讲抽象,感觉意义不大。
    2. 当然我不是说排斥工具的学习,我也希望自己能够熟练运用,但是看完了我自己还是没法熟练应用 Mybatis 和 Spring 框架,很多视频里提到的东西我也想不到应用场景,只是听视频里老师复读一遍文档,我也不想当文档抄录机,笔记都不怎么想做。

    顺带再提一个我在看 Spring 框架时的一些问题:

    Spring AOP 默认使用的是 JDK 的动态代理,而这个是基于接口实现来进行代理的,因此在getBean()的时候只能用接口声明来获取代理后的 bean ,此时就没办法操作代理对象的原对象本身了,而只能调用实现的接口方法。

    那会不会有这样一种场景:我既希望某一个对象中部分方法被代理,又希望直接控制这个对象的字段或者未暴露在接口当中的方法呢?

    我自己想的答案是这样的:

    这种场景不符合开发的基本原则,因为面向接口编程本身不光是依赖倒置的实践,也是开闭原则的实践,相关的操作方法没有暴露在接口中意味着这些方法是闭合的,所以想要直接获取实现对象访问其中未暴露在端口中的方法,是不符合依赖倒置和开闭原则的。


    就是这些问题,主要想问前面的迷茫的地方,后面关于动态代理这个小问题有大佬回答就更好了。

    15 条回复    2024-09-22 10:06:40 +08:00
    utokato
        1
    utokato  
       2023-02-21 22:45:59 +08:00 via iPhone
    感兴趣的话,可以➕Q 聊一聊,或许可以解答一些你的疑问。base64:MzgzNDMwMjY2
    yikuo111
        2
    yikuo111  
       2023-02-21 22:57:04 +08:00 via iPhone
    @utokato 我也想知道,老哥我能加你吗
    karottc
        3
    karottc  
       2023-02-21 23:09:21 +08:00
    愿意付费的话,我可以给你解答。
    utokato
        4
    utokato  
       2023-02-22 07:22:47 +08:00 via iPhone
    @yikuo111 当然可以呀
    byte10
        5
    byte10  
       2023-02-22 09:36:46 +08:00
    打乒乓球,打羽毛球,画画,编程,都是要大量的练习,才能理解熟练 。很多心法,设计模式,没有实战的话,还是很空洞的。
    acctv2
        6
    acctv2  
    OP
       2023-02-22 10:01:02 +08:00
    @byte10 所以关于框架使用这一块就是不知道该如何实战,自己没有接触过任何业务。

    培训班的一些实战视频我也看过,感觉没有讲什么东西,基本就是让你跟着他抄,抄出来一个 XX 商城然后往简历上写,自己完全不知道整个设计思路。
    DIO
        7
    DIO  
       2023-02-22 10:24:18 +08:00
    这就凸现了实习的价值,让你实在地参与到一个项目开发中去,有心留意的话,能把工作流程和内容了解一些。
    其实最好就是观摩历史,从工具的演化中了解它的设计理念,一步步理解他是怎么变成庞然大物的。
    计算机和软件都是人造的,不同于物理和化学有时候不讲道理,他的大部分设计都是有逻辑的。
    过分追逐细枝末节是没有必要的。

    至于这方面比较系统的材料,我也在找。有找到的拍拍我
    sky857412
        8
    sky857412  
       2023-02-22 11:57:53 +08:00
    推荐一本书《 Java 编程艺术》,高永强,看下第二部分模块,我是看这本书学会的
    OldCarMan
        9
    OldCarMan  
       2023-02-22 22:06:28 +08:00
    应届生建议着重编程基础(语言基础,数据库基础,算法基础,编程思想等),基于这些基础的深度,再逐步打开自己的视野(技术广度),比如设计模式,代码设计,框架 /中间件 /组件,工程化,微服务,架构设计等。另外注重学习效率,比如如何具现化问题,如何提高搜索能力,别好高骛远 /急于求成,多动手实操积累经验,有时间多看源码,学习优秀框架 /组件等的编码能力...

    关于学习教程,个人比较推荐极客时间上面那些大佬的视频;

    关于找实习,知识储备和时间的矛盾,个人觉得可以看看招聘网站相关岗位要求,短时间内稍微面向岗位学习,留意同家公司别人流露出的面试内容,一般中大型公司比较注重学历和基础,对于你跨专业的应届生来说机会可能会稍微多点,面试小型公司可能得对岗位要求内容有一定的“经验”和认知,小点的公司一般希望进来就能快速成事,但这些只是短期取巧的方式,长期我觉得还是得看我上面说的。

    关于你说的代理,可以看看这个讲设计模式的网站( https://refactoringguru.cn/design-patterns/proxy ),我觉得都解释的很不错。

    “Spring AOP 默认使用....只能调用实现的接口方法”,对于你这个解释,我觉得有待商榷。接口你可以理解成现实世界中各种对象的行为(比如人,叫外卖),你如果不想太多行为被代理,你可以不把这些行为写到一个接口里面,代理模式里的代理方就类似中间商,其提供帮助你完成这些需求的服务(比如,骑手,帮你拿外卖,这个比喻可能不大恰当,毕竟外卖和骑手中间还有其他中间服务,比如美团 /饿了么这些中间商),“我既希望某...接口当中的方法呢?”,其实代理只是帮助你完成你想要做的事,不是你就不能控制这个对象了,这些事你完全可以自己去做,你也完全可以控制你想控制的对象,至于你既要又要的需求,有点偏离代理模式被设计出来的目的了,代理对象处理的一般是一批对象的公共行为,就像 spring aop 的代理,目的是为了处理很多被代理的对象( bean )需要处理事务 /记录日志等行为的需求,如果你不想接口里的所有属性 /方法都可能被代理处理,要么你自己实现自己的代理,要么选择不处理这些对象里相应的属性 /方法,但更好的方式应该是,在你决定把对象交给代理方处理时,把那些你想被代理的行为写入相应的接口里。
    acctv2
        10
    acctv2  
    OP
       2023-02-24 13:36:08 +08:00
    @OldCarMan 我就是觉得现在买很多视频既没有面向 Offer 也没面向基础所以很困惑。因为暑期实习马上就要找了,所以我还是想先面向 Offer ,所以就从框架上手了。

    感谢您的回答。
    OldCarMan
        11
    OldCarMan  
       2023-02-27 15:38:44 +08:00
    @acctv2 个人觉得大部分技术都是铁柱磨成针的活,网上教你快速就上手的视频,估计绝大部分都含有水分。

    不过你这种渴望快速入门的需求也是正常的,个人建议你在个人目标上要有一个定位,基于你的现实情况,看看你想 /能找什么规模的公司。
    我觉得如果是大公司,面试官应该更注重应届生的基础能力而不是各种框架 /组件,当然少一个知识点不如多一个好,但对知识深度的考核应该才是他们了解你的重点,这点你可以网上搜一下过去一两年大公司招应届生的面试就知道;
    如果你的定位是中小型公司,个人觉得你了解框架知识确实有必要,而且最好是看你面试的公司的岗位需求。

    个人觉得找公司是一个循序渐进的过程,千万别因为急于求成而东凑西凑的拼接相关方面的知识点,专业领域的知识在一个上下文内最好别碎片化,最好自己要有几个知识点,了解的特别深刻,面试时可以试着引导面试官到你精通的领域,给面试官留下好点的印象,因为如果你去面试时,有经验的面试官会在一个上下文知识体系里给你不断的提问,直到你答不出他的问题为止。

    最后建议找公司时,给你面试的公司分类,观察一下什么规模的公司会面试什么样的问题,在面试的过程中积累点经验,以便让自己下一步以更加完整的形态出现在另外一家公司面前,加油!
    acctv2
        12
    acctv2  
    OP
       2023-02-27 19:49:54 +08:00
    @OldCarMan #11 非常感谢您的回答,我也不是不重视基础,而是希望也能学习一些框架掌握一些工程能力。

    您觉得具体什么知识算得上一个应届生应当掌握的核心能力呢?
    Java SE 熟练程度? JVM 的深入?各路设计模式的应用?还是说进一步的深入到操作系和数据库层面的内容?
    OldCarMan
        13
    OldCarMan  
       2023-02-28 00:28:33 +08:00
    @acctv2 "这点你可以网上搜一下过去一两年大公司招应届生的面试就知道",我上面说过,我说的不算,你还是去了解一下现在互联网公司对应届生的主要考核内容吧。

    个人觉得数据结构 /算法是基础,语言基础 /数据库这些是其次,接下来是设计模式 /代码设计...每个方面都有很多横向细分的知识点,最好对每个方向中比较突出的点有一个较为深刻的了解。

    比如考核语言基础这方面的,面试官可能会从一个简单的问题入手,问你 HashMap 的底层实现的问题(先考核你的数据结构的知识点,你的回答可能涉及数组+链表+红黑树),当你答完 HashMap 的底层实现后,面试官可能又会问你,为啥 HashMap 要采取这些数据结构来实现或链表插入为啥要采用尾插法来实现之类的,假如你回答的不错,他还可能会继续升级到考核你 HashMap 线程安全的问题,进而考核你多线程 /锁 /相关的应用和底层实现的问题;如果你回答得一般,那么问题可能会变成考核你数组 /链表 /二叉树相关的类型 /插入 /删除 /更新之类的问题,或者衍生为其他用到这些数据结构来实现的领域,比如当你回答完二叉树问题后,面试官可能会问你 mysql 的底层( B+树)实现的问题...总之他可能会由点到面问完后再开一个由点到面这样循环,一个问题的入口就像你打开一个浏览器窗口,而之后衍生出来的问题就像这个窗口下的标签页,可以有很多,并且当你回答得差不多了,他又可以新开一个新的窗口和相应的标签页继续问你,反正就是全方位的考核你的技术广度 /深度。不过这些一时半会也很难都熟悉掌握,建议结合你自身的需求,还是先去了解市面岗位要求 /周边同学面试情况等再好好完善自己的学习计划吧。

    关于找题的,你可以看看我在另外一个帖子下的回复( https://www.v2ex.com/t/917639#reply4 ),加油!
    acctv2
        14
    acctv2  
    OP
       2023-02-28 20:05:10 +08:00
    @OldCarMan OK ,非常感谢,我去看看
    joijoop16
        15
    joijoop16  
       57 天前
    @OldCarMan 码住,面试题提问思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:45 · PVG 13:45 · LAX 21:45 · JFK 00:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.