如何准备项目介绍
常见的问法是,说下你最近的(或最拿得出手的)一个项目。
这时候,你做过什么,描述工作经验和项目,面试官的主要目标是看看是否和简历上一致,他不清楚你做了什么太多的内容,因此这个时候,你甚至可以控制面试官接下来问什么
一般来说,在面试前,大家应当准备项目描述的说辞,自信些,因为这部分你说了算,流利些,因为你经过充分准备后,可以知道你要说些什么。而且这些是你实际的项目经验,那么一旦让面试官感觉你都说不上来,那么可信度就很低了。
一般来说,描述的要素是这样的:
项目基本情况
主动说出你做了哪些事情
这部分的描述一定需要和你的技术背景一致。
一般是解决了什么问题 + 带来了什么价值
描述你在项目里的角色
描述用到的技术细节
在这部分你就可以控制一下面试官问什么
我们可以遵循 STAR 法则来进行回答,整体这样下来,会显得你很有思考力,且具有行动力,可以给企业创造出价值,这也是面试官评定候选人最关键的指标之一。
- S:Storyboard 背景是什么
- T:Target 目标是什么
- A:Answer 面临的问题有哪些,采取了哪些行动
- R:Result 结果如何
例如,我对智研项目就可以这样回答
我最近开发的项目就是智研科研项目管理平台,是我作为项目负责人主导开发的高校科研领域一站式数字化协作中枢,开发周期为历时四个多月,核心解决高校科研团队协作碎片化、知识资产流失、流程效率低下、新人融入成本高四大核心痛点,为科研团队提供科研项目的全生命周期管理、成果沉淀、智能协作、AI赋能的一体化解决方案,技术上了采用单体架构和微服务架构。
作为项目Java 后端开发 + 项目经理,我全程负责和跟进从需求调研、技术选型、架构设计到核心功能的开发,再到之后性能优化、线上部署运营的全流程项目开发工作,核心解决了科研协作中的业务痛点,主要分为四个模块,分别解决了前面提到的一些痛点
用户管理与权限模块
这部分就是整个平台身份认证与权限认证的基础,这里不仅实现了一些基础的用户账户处理,而且针对用户的安全制定了一些方案,例如2FA,平台的安全性也有考虑到,例如CSRF,防XSS,防SQL注入等等
项目与团队管理模块
本模块是平台的项目协作核心平台与执行引擎,它负责将项目,团队,任务有机结合,为科研活动提供一个结构化的在线协作环境,核心目标是明确职责,高校协同的推动科研项目的进度,帮助产出。
数据与模型仓库服务
本服务是平台的知识资产沉淀与智能应用中心,它把科研过程中产出的所有形式的成果进行规范化采集,结构化存储,智能化处理,它的目标和功能是将分散的知识集中化,让知识资产为团队持续创造价值
AI 实验分析助手
AI 实验分析助手是本项目的一大特色,一个AI助理能够帮助你基于RAG来帮助你进行科研产出,而且能够结合科研产出的文件进行分析,生成分析报告,思维导图等,而且还通过Dify的社区节点实现了论文查找等实用功能
我在项目中担任Java 服务端开发 和 项目经理,是整个项目的统筹者,主要开发,技术负责人
整个项目的技术栈围绕 Java 生态展开,核心技术选型和落地细节贴合企业级开发标准,重点用到的技术和我的实践细节如下:
- 项目使用Spring系列框架,Spring Boot构建基于Spring Cloud Alibaba微服务架构和单体服务架构,Spring Data JPA+Hibernate 实现持久层开发
- 数据库主用MySQL和PostgreSQL,注重索引带来的查询效率,针对科研协作wiki等非结构化文档数据使用 MongoDB,针对科研产出的对象数据使用腾讯云COS和MinIO,热点数据用Redis+Spring Cache做缓存,对于Redis还简单的使用了Redisson进行优化,也涉及到了 ES,兼顾数据存储的多样性和查询效率;
- 对于安全与认证使用Spring Security + JWT实现无状态认证,结合 OAuth2 实现三方登录,通过 ThreadLocal 传递用户上下文,实现基于 RBAC 的角色权限控制,同时做了 XSS、SQL 注入、IP 黑名单等安全防护
- 最后使用Dify工作流平台搭建 AI Agent 和 Chatflow,实现了RAG和一些其他的使用功能,其中AI的调用使用了SSE做了HTTP 长连接的流式交互,用 Git+Maven 做代码管理和依赖管理,Arthas 做应用诊断和性能分析,Nginx 做反向代理使得线上访问。
如何回答围绕项目的提问
你觉得你解决的比较有成就感的事情是什么?
面对这种问题,主要是看看你开发的深入情况,照实际情况说就可以了
面对线上实际项目的开发,往往伴随着无数的突发场景
有一天,我们的项目突然在线上面临了比较严重的性能问题,包括登录慢,项目具体内容加载慢,个人空间加载慢等问题,这些问题大家一开始没有查出来具体的问题,单独拉出来测试和debug也都看不出什么异常,只是网络带宽异常的高,大家都一度怀疑服务器被打了
我开始向老师请教,使用了 Arthas 进行性能分析,使用了 Arthas 的 monitor 查看大概的周期性的性能情况,对一些异常慢的方法进行 trace 分析,发现了有很大的资源消耗和时间浪费在了头像字段和一些不需要的字段上,因为为了方便,我一开始没有把头像放到COS中,使用了PostgreSQL的字段存储
这就导致了加载项目信息和登录的时候不免要涉及到对用户信息的查询,然后发现就会带着这个很大的二进制数据进行查询,自然耗时耗资网络资源,而且对头像的大小也没做限制
后来我们把头像放到了 COS,然后我进行了一次全面的代码Review,还发现了代码的很多查询带着了不必要的字段,我们也对此进行了一次全面的持久层和服务层的优化,项目整体响应速度直接快了50%左右
你的项目中涉及到的困难有哪些?你都如何去解决的?
不用担心聊的太细太具体,因为每一个需要解决的技术问题都有非常复杂的实操因素,反而可以通过详尽的沟通体现你确实局别解决问题的能力。
有逻辑地讲你是如何一步步解决问题的,可以用时间、空间等不同的顺序框架来拆解,例如最常用的时间顺序
例如,智研项目管理平台作为一个项目平台,针对多级别权限的设计是不可避免的,平台系统一套权限,不同的项目内部用户的权限也不一样,这在最初遇到这个业务的时候比较头疼
这个问题本质上是多维度的动态权限模型设计,一个用户在平台上是普通用户,但是在A项目中可能是‘负责人’,在B项目中只是‘观察者’。这种全局+局部的权限分离,在业务设计和技术选型上都非常复杂。
然后从数据本身入手,思考如何设计数据模型,让一套账号在不同的上下文都有不同的权限
接着我主导重构了权限模型。我们将权限拆分为两个维度,平台权限基于 Spring Security + JWT 加上单独的权限表角色表,控制全局平台的访问和个人信息的控制,对于项目内部权限,建立
Project_Member中间表,存储User_ID+Project_ID+Project_Role,再通过 Spring Security 的权限控制注解,编写全局可用的项目身份认证和授权工具类之后,我们还进行了优化,开发了一个
@CheckProjectPermission注解,在 Service 层方法上,通过 AOP 拦截请求中的projectId,动态校验当前用户在该项目中的角色,避免了大量调用工具类,然后将全局的信息存入被重写的 SecurityContextHolder 的 ThreadLocal 中,这样,问题迎刃而解,性能也还不错而且项目的开发必然会遇到各种困难,尤其是我们这种学生开发人员,包括uni-app的消息推送,如何做记住我,如何做OAuth2的第三方登录等等
讲讲项目的亮点?
项目的亮点是 AI Agent 驱动的科研知识沉淀与流式交互,或许在现在,AI 助手已经很流行,很广泛,但是也正如此说明这个业务是很有必要的,在传统的管理平台上,只是传文件存文件,只是能够与 AI 进行简要的对话来分析一些问题给出建议
但是我们智研平台的目标是让知识“活”起来,帮助科研人员快速分析大量文献,所以 AI 助手对此添加了对应的处理,就是 RAG,可以快速的帮助用户在很短的时间内来进行大量文件的分析
而且我们的 AI 还对产出有一定的能力,包括通过 AI 来分析任务,结合任务关联的产出文件内容,来生成对应的报表和新的总结,帮助科研人员发现新的创新内容,还支持各种在线的辅助科研小工具,都是提高科研产出能力和科研工作效率的,我们的平台放大了 AI 的在科研方面的能力
而且为了解决 AI 生成长报告时前端等待焦虑的问题,改用 SSE(Server-Sent Events)技术实现了 HTTP 长连接的流式数据传输。
项目遇到事故或者 bug 怎么办?怎么改进?
你的项目在都用到了哪些设计模式啊?挑几个场景出来详细的讲一下吧
设计模式的主要用途是让代码能够更好的实践面向对象的原则,并且可扩展、低耦合、易维护。
我常用的有:单例、工厂、策略、模板方法、建造者、装饰器、观察者等。我挑几个最典型的场景详细说一下
首先是创建型设计模式
单例模式:
单例模式确保一个类在整个程序的生命周期中只有一个实例,并且只提供了一个全局的访问点
全局可访问指的就是提供一个静态方法,然后供外部获取这个实例
比如,Redis 工具类、JWT 工具类、分布式 ID 生成器、线程池等,都设计成单例模式,因为他们一个实例就足够在项目的声明周期在使用,而且他们使用的范围也很广,对他们使用单例模式能够减少项目因为频繁创建销毁对象带来的内存开销,同时保证全局状态统一。
而且我使用的是线程安全的懒汉式单例,懒加载保证性能,而且使用
synchronized和volatile来保证线程安全Spring 容器管理的 Bean 本身也是单例,我在项目中充分利用这一点做全局复用。
工厂模式
定义一个创建多种对象的接口,让其子类继承工厂接口,决定实例化哪个类,将对象的创建延迟到子类中完成
比如,我在项目中使用工厂模式管理多种登录方式与多种 AI 模型调用。
然后这样认证方式就能被封装成不同的处理器,通过工厂创建和返回,这样就实现了扩展不用改原有代码,符合开闭原则
还有 MapStruct 进行各种实体转换,通过定义一个工厂接口,然后在其中编写具体的转换逻辑,然后编译后 MapStruct 自动生成实现类,这是工厂模式和策略模式的体现。
建造者模式
建造者模式使得对象的构建可以通过一部分一部分的拼接而组成,这样当所有必要的部分都设置好后,调用一个
build()方法来生成最终的、完整且一致的对象。最终构建出的对象通常是不变的。Entity 实体都使用 Lombok 注解
@builder,这样在例如发送请求,业务内逻辑处理等内容需要组装对象的时候,就非常的方便且易读。再比如统一返回结果
Result、JWT Token、AI 请求参数、分页查询对象。这些对象字段多、参数复杂,用建造者可以链式调用、可读性强、不易出错。
其次是行为型设计模式
策略模式
一个类的行为或其算法可以在运行时更改,策略模式的意图就是将每个算法封装起来,使它们可以互换使用
我在项目开发中大量使用策略模式,策略模式注重的是处理不同的情况使用不同的策略
比如,我在进行权限控制的时候,对于不同的角色,有不同的控制方法,把每种权限校验封装成独立策略,使用随用随调,动态切换,并且与主业务分离
策略模式让我的代码扩展性极强、结构清晰。
模板方法模式
模板模式方法使得子类可以在不改变算法结构的情况下重新定义该算法的某些特定步骤,来达成某些目的,关键是在父类中定义了算法的骨架
其中,在项目中使用模板方法模式抽取公共业务骨架,比如一类业务流程,在服务层都都遵循,参数校验,权限检查,业务处理,日志记录等步骤,把固定流程放在抽象父类,不同业务只实现自己的步骤。
这样代码复用率极高、减少重复、统一规范,而且易读。
观察者模式
当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新
用观察者模式实现 SSE 站内信、AI 流式输出、项目,任务或审核状态变更的推送,这样当业务信息更新时,主动推送消息给前端,解耦发送方与接收方,非常适合消息通知、实时推送场景。
结构性设计模式也用到过
装饰器模式
装饰器模式 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
我用装饰器模式对核心服务做功能增强,比如给接口加缓存、加日志、加限流。
不修改原有业务代码,只通过装饰增强,符合开闭原则。
你对以后的职业规划有什么想法吗?
一般情况下,就是面试官问你你怎么看待你的职业,对这个职位有什么了解吗?
我目前的职业规划非常清晰,主要分为短期、中期两个阶段:
短期(1~2 年):
我希望先扎实做好Java 后端开发,把 Spring Boot、Spring Cloud、MySQL、Redis、微服务这些技术用得更熟练、更深入,尽快成为团队里能独立负责模块、能解决线上问题的成熟开发工程师。
同时我会继续深耕代码质量、架构思维、性能调优,把学校和项目里积累的经验落地到企业真实业务中。
中期(3~5 年):
我希望往后端架构 / 技术专家方向发展,能够独立负责系统设计、服务拆分、高并发优化、分布式架构落地,成为既能写好业务代码,又能做架构设计、解决复杂问题的骨干工程师。
我非常看重技术成长和稳定发展,希望能在一家平台长期沉淀,和公司一起成长。
面试应该主动说什么
面试结束后必问
公司什么时候会给我反馈面试结果啊
公司主要的业务是什么啊,经营范围是什么啊,会不会经常涉及到新的技术内容
面试结束时应该说些什么
首先,表达感谢是基础且不可或缺的一环,这是一个高素质的体现,就好像总说的“非常感谢您今天给我这次面试的机会”
在表达感谢的同时,你还可以进一步细化,比如提及面试过程中某个具体环节或面试官的某个建议让你受益匪浅
紧接着,可以简要回顾面试中讨论的关键点,表明你对这次机会的认真态度和对岗位职责的深刻理解。例如,“通过这次交流,我对XX岗位有了更加清晰的认识,特别是关于XX项目(或技能、职责)的部分,我非常期待能有机会深入参与并贡献自己的力量。”
在此基础上,不妨适时表达自己的积极态度和对未来的展望。例如“我非常期待能加入贵公司,我相信我的背景和技能能够为团队带来新的视角和价值。同时,我也非常期待在这里学习成长,与公司共同进步。”这种正面表态
此外最后,提出后续步骤或跟进的意愿也是面试结束时的一个重要环节。你可以礼貌地询问:“关于后续的面试流程或结果通知,请问我应该如何跟进?”






