大家好,我是程序员小孟。
高考填报志愿的时候,我一心要学计算机,因为那时候我的偶像是乔布斯,当年想像他一样改变世界,后来本科毕业一心考研,硕士毕业后,一心想去大公司,再后来职场被pua、考核,一直为五斗米折腰!
生活就这样,兜兜转转,不断体验!
最接有个小伙伴私聊我:从稳定的国企,跳到了心心向往的大厂,虽然薪资很高,但是很痛苦,怎么办。图片
小镇做题家出身,还不容易考上了一本,大学还算努力,后来保研了,硕士毕业后进入了国企,工作没有很大的难度,工资也算稳定,然后业余时间接了不少私活,没有买房,三年攒了100w左右。
后来想挑战自己,业余时间开始刷题、刷项目,然后上岸到了杭州的一家大厂,我和女朋友也开始了异地之恋,薪资翻了一倍,但是从去年开始我特别特别的难受。
一方面,女友有点接受不了,出现了问题我也不能像以前一样立马到她身边,她给我说的最多一句话是:没有安全感了。另一方面,工作压力很大,工作时间很长。
我性格比较内向,这边没有什么朋友,我不喜欢社交,每个月只有冰冷的工资数字能让我开心3秒钟,生活一点趣味没有。
后来一直这个状态,导致了工作上的开发任务一直完不成,有一次项目就因为我没有按时上线,我和领导都背了考核,精神和身心都累,感觉活的好没意思……
我真的不想在这边呆了。
期待小孟的回复……
其实给过很多人建议,但是还是要经过自己的思考,自己想要什么样的生活才是最重要的。真的不能给你很多的建议,我说下我自己吧。
我呆过很多的公司,也有一些公司给到过七位数的薪资,我没被诱惑到,我太清楚高薪资的背后是什么!
那就是付出,资本家不会给你一份不辛苦的工资的,什么样的工资对应什么什么样的价值,5k的工资,一个月开发几个增删改查的模块即可,15k的薪资,一个月要开发高并发的薪资,50k的薪资,要管理20人的团队,出了问题想找你,100k的薪资,对接甲方、对接运营、不要断开会,屁事一大堆。但凡薪资高的,忙的不可开交。
后来我辗转国企,每天9点上班6点下班,很少加班,周末双休,再搞些外快,赚的也还可以。
没有最好的,只有最适合自己的,鞋适不适合只有自己知道!
我找到适合自己的鞋用了8年!
我上次写拼夕夕996、加班严重,一个周后给了我律师函,说要起诉我,不得不说大厂的公关是真的猛。
现在我写文章、写代码、给VIP群小伙伴更新项目,VIP的各种优质项目,我会不断更新,照顾更多小伙伴学习。至少是幸福的,不羡慕别人,做自己,爱生活,我成为不了别人,别人也为不了我。
所以如果我是那位小伙伴的话,会回到对象身边,或者让对象过来一起工作。
国企+业余私活其实比大厂更爽!
程序员这行还算赚钱,实在没钱了,我就接几个商业单或者小单子,再拍拍视频,或者发个广告恰个饭。
如今小孟也去了国企,标准的9点上班6点下班,周末不加班,端午节三天海边游玩,想起当年在大厂假期除了加班就是项目上线。
其实在海边也可以写代码!!!
不管怎么样,不管在哪,技术还是要搞的。
一个小伙伴去米哈游了,看一下他当时面试题,我整理了几个比较经典的问题,附带答案,感兴趣的小伙伴可以挑战下。
有哪些SQL优化策略?
1.1 优化 COUNT 查询
COUNT 的另⼀个作⽤是统计结果集的⾏数,当使⽤ COUNT() 时, 不会扩展成所有列,它会忽略所有的列⽽直接统计所有的⾏数。
但是某些业务不需要count值,用这个太浪费了,可以用explain替换,执行EXPLAIN 并不需要真正地执⾏查询。
1.2 优化关联查询
确保 ON 或 USING ⼦句中的列上有索引,在创建索引时就要考虑到关联的顺序。
如果在 MySQL 5.5 及以下版本尽量避免⼦查询,可以⽤关联查询代替。
1.3 优化limit分页
可以要么在页面中限制页的数量,要么是优化大偏移量的性能。最好的方法是尽可能地使用覆盖索引扫描,而不是查询所有的列,然后根据需要做⼀次关联操作再返回所需的列。
1.4 优化 UNION 查询
尽量使用UNION ALL,如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,这会导致对整个临时表的数据做唯⼀性检查,这样做的代价非常高,得不偿失。
其他还有非常多的优化技巧,可以再多说几条。
进程和线程的区别是什么
线程是进程中执行运算的最小单位,是进程中的一个实体。
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器。
进程是程序的一次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行提高资源利用率和吞吐率。
由于进程是资源分配和调度的基本单位,因为进程的创建、销毁、切换产生大量的时间和空间的开销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时的时间和空间开销。
线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程则占有堆、栈。
主线程的重要性体现在两个方面:
它是产生其他子线程的线程。
通常它必须最后完成执行,因为它执行各种关闭动作。
如何合并两个有序链表?
思路:首先,我们设定一个哨兵节点 dum,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 cur 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 cur 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 cur 向后移一位。
在循环终止的时候,l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。**注意最后返回的是 dum.next **
代码实现:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null) {
return l2;
}else if(l2==null) {
return l1;
}
ListNode dum = new ListNode();
ListNode cur = dum;
while(l1!=null&&l2!=null) {
if(l1.val>l2.val) {
cur.next=l2;
cur=cur.next;
l2=l2.next;
}else {
cur.next=l1;
cur=cur.next;
l1=l1.next;
}
}
if(l1==null) {
cur.next=l2;
}else {
cur.next=l1;
}
return dum.next;
}
}
直接选择排序的原理是什么?
每次在未排序序列中找到最小元素,和未排序序列的第⼀个元素交换位置,再在剩余未排序序列中重复 该操作直到所有元素排序完毕。
public void selectSort(int[] nums)
{
int minIndex;
for (int index = 0; index < nums.le ngth - 1;index++)
{
minIndex = index;
for (int i = index + 1;i < nums.length; i++)
{
if(nums[i] < nums[minIndex])
minIndex = i;
}
if (index != minIndex){
swap(nums, index, minIndex);
}
}
}
说下Hash实现的原理?
1)HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。
2)当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。
3)当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
介绍下你的项目,通过什么技术解决了什么问题?
使用分布式Seesion,可以实现让多台服务器同时可以响应。
使用redis做缓存提高访问速度和并发量,减少数据库压力,利用内存标记减少redis的访问。
使用页面静态化,加快用户访问速度,提高QPS,缓存页面至浏览器,前后端分离降低服务器压力。
使用消息队列完成异步下单,提升用户体验,削峰和降流。
安全性优化:双重md5密码校验,秒杀接口地址的隐藏,接口限流防刷,数学公式验证码。
Spring中用到了哪些设计模式?
工厂模式:Spring通过BeanFactory和ApplicationContext实现对象的创建。BeanFactory是Spring中最基础的容器,提供了最基本的依赖注入支持;而ApplicationContext是基于BeanFactory之上构建的,提供了更多企业级功能。
单例模式:在Spring中,默认bean的作用域是singleton,这意味着每个bean在Spring IoC容器中只有一个共享实例。这是通过使用ConcurrentHashMap维护单例注册表来实现的。
原型模式:与单例模式相对应,原型(prototype)作用域的bean每次请求都会创建一个新的实例,确保每个请求获得的是全新的对象副本。
代理模式:Spring广泛使用Java动态代理和CGLib来创建对象的代理,以实现诸如事务管理、权限检查等功能。
观察者模式:在Spring中,观察者模式可用于实现事件发布和监听机制,例如ApplicationListener用于监听应用程序上下文的事件。
适配器模式:Spring MVC中的Controller接口可以看作是适配器模式的一个应用,它允许将不同类型的请求处理逻辑适配到统一的接口下。
Spring框架通过运用多种设计模式,实现了代码的低耦合、高扩展性,并简化了开发过程。
设计模式,我们已经开源过完美的教程:
https://www.bilibili.com/video/BV1o441157xk/?spm_id_from=333.999.0.0
说说TCP3次握手的过程?为啥不4次呢?
第一次握手:客户端发送一个带有SYN标志的TCP段给服务器,询问它是否愿意建立连接。此段包含一个随机的序列号seq,这是TCP报文的初始序列号。
第二次握手:服务器以一个既确认客户端的SYN(ACK标志位为1),又对客户端发起自己的SYN进行响应的TCP段回复。这个段中的确认序号ack设置为客户端初始序列号加1(即seq+1),同时服务器也会设置自己的初始序列号在TCP段中。
第三次握手:客户端收到服务器的SYN-ACK报文后,会发送一个ACK报文回复服务器,确认号码ack设置为服务器的初始序列号加1(即服务器的seq+1)。
如果只有两次,无法做到双向连接的建立,从建立连接server回复的SYN和ACK合并成一次可以看出来,他也不需要4次。
三次握手确保了双方都有能力进行数据的发送和接收,这是通过第二次和第三次握手中双方分别确认对方的SYN和ACK消息来实现的。
TCP的三次握手过程是经过精心设计的,旨在确保连接的可靠性和安全性。
mysql主从同步的步骤是什么?
安装与配置
安装数据库
主数据库配置:在主库的配置文件my.cnf中设置server_id,开启并配置binlog相关参数,如log_bin, binlog_format, max_binlog_size等。
从数据库配置:在从库的配置文件中也需要设置server_id,并配置相关的复制参数,如relay_log_recovery, log_slave_updates等。
创建同步用户
锁定主库表:为了确保数据的一致性,需要先锁定主库的表,防止在备份过程中数据被修改。
备份数据:使用mysqldump工具备份需要同步的数据库。
导入到从库:在从库创建相应的数据库并导入备份数据。
设置同步信息
获取主库状态:通过show master status命令获取主库的二进制日志文件名和位置。
配置从库:在从库上设置主库的信息,包括master_host, master_user, master_password, master_log_file, master_log_pos等,然后启动从服务。
检查同步状态
查看同步状态:通过show slave status\G;命令检查从库的同步状态,确认Slave_IO_Running和Slave_SQL_Running状态均为Yes。
解锁主库表
解锁主库表:确认从库已经开始同步后,可以解锁主库的表,允许数据写入。
解决不同步问题
处理错误:如果发现主从数据不同步,可以通过设置sql_slave_skip_counter来跳过错误,或者重新进行数据同步。
我是程序员小孟,欢迎点赞关注。有问题可以评论区交流!
文章评论