用来转化html

一、加分逻辑


之前我跟大家说过,无论你的项目是啥项目,在面试官看来,都是小儿科,并且面试官作为过来人,也大概率知道你的项目可能是跟着视频做的。

但是,这并没有关系,因为哪怕是跟着视频做的,在不同的人手里,也是不一样的,这就如同,我们都知道像三次握手四次挥手;进程通信这些问题天天被问,但面试官还是会问你问题,并且不同的人,回答出来的效果完全不一样。

并且我也跟大家强调过,烂大街并不那么重要,重要的是你的思考,因为市面上的项目就哪些,无论是什么项目,都会成为烂大街项目,比如秒杀,商城,论坛,RPC,等等。

但是无数人也用这些烂大街的拿到了中大厂 Offer。

帅地作为一个过来人,并且也接触过很多面试官,在我看来,一个项目最重要的就是,能够让面试官觉得你是用心+真实做过这些项目的,毕竟大部分人都是跟着视频刷完之后就没有然后了。

所以为了让自己的项目更加真实,并且看起来和其他人不同,我们可以做三件事:

1、部署上线:让项目真实部署到服务器,甚至给出一个域名,让别人去访问,哪怕你的项目是跟着视频做的也是没有关系的,因为能够上线+弄上域名,已经超过了很多人了。

2、给项目添加新功能:新功能不需要高大上,只需要实用+有意义,我说实话,平时虽然我们的项目用到了redis,mq之类的,其实也用的很简单,比如缓存啊,就get,set一下,很简单。

3、给项目加上数据:最能引起面试官提问的,就是给项目加上具体的数据,比如通过加上缓存,提高了 xx 的QPS 等。但是呢,我相信很多人,其实是不知道为啥要加上这些缓存的,只知道理论,不懂实践,难道加了缓存就一定会提高效率吗?你测试过吗?时间复杂度O(n^2) 就一定比 O(n) 快吗?答案是不一定的,还和数据有关。所以呢,我觉得如果你要真正让面试官信服你,你最好就是,测试一下没有优化之前是什么情况,然后加上优化,测试下优化后的又是什么情况。毕竟在项目中,事实才是最重要的,理论终究是理论,项目最重要的就是,用实践去验证理论。

加上绝大部分的统一项目的简历写法是差不多的,如果面试官看到你的简历,看到你自己加了东西,那肯定就是比别人加分了,哪怕这个东西很一般,也都行,而且通过加东西,你可以更加熟悉项目。

并且这篇文章的重点,也是给大家添加新功能的思路,我以前也写过一个课程:从0设计一个简易web项目,接下来,我将重新梳理一下,给大家一个添加新功能的思路,但是具体如何做,需要你自己去研究,注意,自己去研究,这非常重要,只有这样,你才能和面试官聊。

接下来,我们将从上面说到的三件事,去不停优化我们的项目,我保证,你完成了之后,不仅更加熟悉项目了,而且也更加自信了,面试官也能相信你是真正做过,而不是 copy 源码,只看视频不搞实践。

二、项目部署上线


你可以用一个服务器,把你的项目部署上线,然后把 URL 在简历上贴出来,然后自己随便构造一些数据,你的项目可能带有诸如牛客网之类的字样,不过你修改一下就好了。

而且,哪怕你真的被面试知道了,你的项目是跟着某个视频做的,那也没有关系,面试官也理解,因为他见过太多这种的了,但是你部署上线了,那就是比别优秀。

如果你想要做的更好,那你可以弄上域名,能够搞定域名,那你对 HTTPS 证书,域名解析这些,也懂了,那么也是加分的,这些都是实打实的。

三、给项目加上数据


很多人写项目的时候,都是说用 xxx 解决了 xxx,提高了效率,减少了内存,等等。

但是,你真的提高了效率了吗?你怎么知道就提高了呢?还是说,你只是觉得理论上提高呢?

所以,如果你可以自己测试一下,自己看看你优化前和优化后的效率差距,然后把这个差距,写上简历,那么,你的简历,一定可以更加吸引面试官注意,比如加上 redis 之后,把接口响应速度从 0.5 秒 优化成了 0.05秒,QPS 从 10/s 提高到 1000/s,等等。

倒也不是说每个都需要测试,而是你可以挑选一些方便测试的,来测试一下,同时也能学会一些测试工具,了解纠结啥的 QPS,很多人其实都不知道什么是 QPS,也不知道怎么测试,这些面试官一问,你就漏泄了,可能面试官就知道你完全是根据视频做的,自己可能都没有去好好做过。

所以呢,大家如果想要自己的项目更加突出,那就给他们加上真实的数据,因为我说了,其实无论什么项目,技术栈都差不多,技术亮点也差不多,不就是加个 redis 缓存,加个 MQ 异步,加个分布式锁啥的,如果你有数据支撑,那你就比他们赢了。

四、加上新功能


至于为啥要加这些功能,我会给出理由,你也完全可以把这些作为亮点写入项目。

下面开始讲解,如何让你的项目更加 加分,哪怕你是烂大街也没有关系的,完全不影响哦,所以大家不需要担心烂大街问题,如果你实在想要让你的项目更加突出,按照下面的来即可。

添加新功能+完善项目,考虑的四个维度

在添加新功能之前,我们先来讲解一些东西,就是我们平时做任何事情,都需要去权衡的几个东西,分别是:

时间复杂度:我们在做算法题的时候,经常会说时间复杂度,其实做项目,也是可以考虑上的,就是为了让某个功能的效率更高,我们可以考虑做什么?比如为了接口响应更快,我们用上了缓存,为了查询更快,我们用上了索引,等等。

所以呢,添加新功能的时候,我们可以往如何让某个接口影响更快的层面去考虑。

空间复杂度:和时间类似,就是我们可以通过架构设计、数据结构的选用以及设计一块数据结构,使得让我们的系统更加节省空间,为相信,这些一定能够让你很好去思考很多东西。

安全性:对于一个项目,安全性的维度有很多,比如可以是防止被别人恶意攻击,比如对接口限频,设置IP黑名单,等等,总之就是减少网站被人恶意消耗资源,这块可以做的小玩意有很多,而且很多都是通用滴。

高并发:就是考虑极端情况,当我们的用户多了,容易出现很多临界 bug,比如线程安全问题啊,缓存一致性问题啊,等等,这些都是极端情况,那我们可以思考,为了减少这种极端情况出现,我们可以怎么做,比如点赞关注功能,一般我们都不考虑原子性问题,比如 A 关注 B,B也会成为 A 的粉丝,这里有两个操作,但是我们并不会去保证原子性,因为不值得,但是你此时就像较劲,那你也可以保证他们的原子性。

总之,高并发问题,就是考虑请求非常多的时候,会出现的一些问题。

以上便是四个维度的考虑,这四个维度一考虑,可以做的事情就很多了。

但是,我们一定要懂的去权衡,就是很多东西,并不是越完美越好,我们在实际的项目中,还需要考虑性价比,比如有时候为了安全,我们加了很多很多东西,浪费了很多时间,这其实是不值得的,所以你一定要懂的权衡。

当然,面试官问起的时候,如果你是校招,那你可以说自己是为了学习,比如你的项目,用户肯定不多,肯定不需要啥分布式锁,但是你加上也没有关系,就说是为了学习吧。

请体现你的严谨性


做算法题的时候,我们会遇到很多bug,特别是临界点多的,我们需要考虑更多,如果没有考虑到,我们通过提交到OJ就可以测试出来的。

但是,项目无法像 OJ 那样,可以测试出 bug,所以一定需要多去思考,究竟有没有 bug,倒不是说,遇到 Bug 就要解决,并且有些 Bug 的解决成本高,并且很少出现,所以我们就不去解决的。

但是呢,不解决归不解决,我们得懂。总之,要多测试,测自己的 bug,就比如简单的登录注册,如果我自己在浏览器里把 cookie 手动删除了,有时候都会引发 bug。

所以在下面的功能实现中,细节非常重要。

五、新功能

PS:后面简历上怎么写啊,大概需要注意的点啊,我后面慢慢补充上去吧,大家可以先做。

1、多端互踢


(1)功能说明:有一些安全度比较高的网站或者app,是不支持多个人同时登录一个账户的,比如微信(当然,他支持手机+电脑同时在线),不过呢,大部分的网站还是支持多个设备登录的,这样的体验会好一些。

还有一些网站,为了防止多人享用一个账户的权益,比如你开了VIP,然后借其他人用,那么这种也会限制只允许一个人在线。

所以呢,我们本次的任务就是,后面登录的人,会把前面已经登录的人击退,仅允许一个人在线

(2)亮点:这是一个非常实用的功能,而且一看就知道你是自己做的,不是跟着网上做的,所以大家可以考虑去研究。

(3)难点:这个功能可简单可难,大家做完一定要多测试,否则很容易出现bug,比如可能导致登录成功之后,其他人就登录不上之类的,总之,一定要测试各种各样的 Bug。

还有就是,你能否支持手机+电脑同时登录?A登录把B击退了之后,你要不要通知B?你能不能通过分析IP地址来识别B究竟是把账号借给了别人还是说自己在多个浏览器登录了?

等等,想要做成什么样,自己去研究吧。

(4)案例参考:这个是以前别人做的,可以参考【任务10】注册与登录:不允许多个设备同时在线

2、接口限频


现在我们需要处理的是,要禁止一些用户疯狂访问我们的网站,比如在实际的应用中,有一些接口的响应是比较耗时的,比如搜索的接口,比如有一些需要各种权限验证的接口,等等,有一些人可能会恶意访问这些接口,容易导致网站奔溃了,我之前的网站就被搞过好多次。

奔溃的大部分原因都是,mysql 崩溃了,请求太多,导致 mysql 占用内存过多,被服务器自动杀死。

所以呢,为了防止被有心人恶意刷屏访问,我们需要对访问的频率进行限制,比如对于同一个 IP,或者同一个用户,如果一分钟内访问网站次数超过 100 次,那肯定不是人为访问,而是机器在刷,对于这类 IP,我们需要进行限制,比如在网站的请求入口,拦截器那里,就进行拦截(当然,也有通过 nginx 就进行拦截的,不过这里不做要求)。

限流算法有很多,你们可以自己去了解,搜索一下就有了,最简单的就是用 redis 进行限流,我也推荐用redis,可以更加灵活去处理一些逻辑。但是限流在设计的时候,可以多了解一些限流算法。

参考案例数据统计与拦截:拦截恶意刷屏用户

难点提示:多思考下临界点,我打个比方,比如你一分钟限制用户访问 10 次,那用户在第一秒访问 1 次,第 59 秒访问了 8 次,那到了第 61 秒,你是要怎么计算?用户第 61 秒又访问 8 次,你是要封禁,还是说,第 61 秒~120 算一新的区间?

究竟使用固定窗口还是滑动窗口,这些方式的实现,并不是说哪种更好,而是要想好你的设计,

3、把服务打包到 docker 上

你也可以把服务打包到 docker,现在 docker 很火的,如果你能够把服务弄到 docker 上,然后把这个事写到简历上,那么也是一个不错的加分项,至少证明你掌握了 docker 这些玩意。

这里也有 docker 入门:0. Docker快速入门

4、分布式锁的使用


项目用上分布式锁,容易被面试官问,但是说实话,大部分项目还是用不上分布式锁,毕竟没有那么多的流量,所以万一面试官问你为啥用分布式锁的时候,你也可以说为了学习啥的,比如刚刚学过,刚好这个业务可以用一用啥的。

(1)防止注册时出现重姓名

那关于分布式锁的时候,其实有很多方式,比如防止用户重姓名啥的,关于这个,我之前这里有总结:【总结+面试考点1】用户名防重名设计

其他待补充,你们可以结合自己的项目来

5、日志系统


日志系统,应该说是一个重难点,每一个正经的线上项目,理论上都应该提供日志系统,有时候线上项目出问题了,我们基本都是通过日志来排查。

特别是一些服务类的系统,比如你用了腾讯云的某个产品,有时候你操作着操作着,觉得有 bug,那么你就会去找客服,客服就会找开发人员,开发人员会给你一个明确的答复,然而明确的答复,只能通过日志来,日志显示啥那就是啥。

比如说你 点击了某一个按钮,但是你说按钮没反应,这个时候开发人员也不知道你点击了没,只能去看日志,看看打印了日志没,如果打印了日志,但是数据库一些数据却没有变,那就是出问题了。

一般来说,同一个项目内,出问题的概率非常小,不同项目之间的调用,出问题的概率大一些。

反正我在腾讯云工作时,查日志都查到吐了,因为那个项目有点老,bug 多,天天出问题,天天查日志,,,,

所以呢,你可以定义一个日志系统,对某些接口进行日志打印,特别是一些敏感的借口,比如登录日志啥的,这些都是比较重要的,可以帮助用户查看系统是否被人登录过。

参考【任务14】日志系统:设计一个简单的日志系统

6、系统故障监控


上面我跟大家说一下日志的重要性,日志可以很简单,也可以很复杂,上面我让大家设置了两个日志相关的功能,不过不少用户可能觉得有点难度,但其实日志并不怎么难,他的难点在于设计,反正你们用知道,日志是用来辅助自己排查错误的,不过上面两个功能如果你能实现,其实算是挺可以的了,所以我们就先把日志系统相关的放一边吧。

日志主要是用来排查错误的,与之相对应的,就是关于系统错误的一些监控,比如你的 mysql 突然挂了,你刚好又在睡觉,那该怎么办?又比如 redis 也挂了,该怎么办,或者你的网站突然访问不了,等等。你总不能等待用户来给你反馈吧,自己总需要做一些监控点,比如我那个网站,前一阵子遭受攻击,就是不是挂了,挂的原因就是 mysql 的压力太大,占用太多 内存,被系统自动杀死了。

所以呢,你可以用一些脚本来监控你的系统情况,包括redis,mysql的服务是否正常,系统负载啊,项目是否在正常运行啊,等等。

自己百度搜索一下,应该就有很多了,我们不需要多高大上,哪怕用最简单的脚本写都行。

通过这一部分功能,你更能够向面试官展现你确实是做过项目的,因为只有真正经历过,才会去思考这些问题。

参考【任务16】故障监控:1、用脚本监控 mysql + redis

7、短信/邮件与扫码登录


短信,邮箱,扫码登录这些,需要对接第三方的 API,虽然第三方文档都写好的了,但是能够和第三方对接,本身是一个很好的能力,所以如果要让你的项目加分,我觉得可以加上这种和第三方登录的对接。

微信扫码可能不方便,需要服务号,不过短信登录,邮箱登录,还是可以的。

而设计到登录码,登录码的有效期设计等,一定一个可以挖掘的问题,而且可以和上面其他问题链接起来,比如接口防刷等等。

这里也有一篇文章讲解短信设计的,我觉得挺有意思:【阅读】关于短信验证与邮箱验证码的设计

8、设计一些表结构


就是对于数据库表,也是一个经常被问的话题,那你可以想一想,对于 你的项目,你能否别出心裁加上一些字段,或者使用联合索引之类的,来使得你的某些方便效率更高呢?

暂时我也不知道怎么加,只是给你们提供一个这样的思考,结合具体的项目,可能容易加一些,比如通过联合索引,更快查询。但是那种最基本的加索引的,就别写了,比如通过给用户名字加索引,查询更快这种,没啥好写的。

发表回复

后才能评论