杂谈💁🏻
今天本来在记录学习数据结构的链表的过程中,有陷入了深度的自我怀疑当中,有时候其实在很大的程度上,始终不能释怀,复习这个数据结构和算法到底可以给我未来的工作和生活中带来多大的提升,可以让我在职业发展的这条道路上走多远?我本科所学的专业是计算机科学与计算,对计算机的所有涉及到的专业课可以所是了然于胸,但是对于后续工作中,如何可以更深一步的发展,和精进,之前所听到的声音就是全栈,前端,后端,运维,小程序,H5,大数据,什么都得会,好像是在传播焦虑,但是对于类似想数据结构这种也在传播焦虑,你听了这个课,刷够300道题,然后就可以进大厂,就可以走向人生的巅峰。之前一直不知道刷够300道题,他的这个编码的素养到底是什么程度,我也鲜有机会能拜读到这样的刷题狂忍。
但受制于工作时间又是加班,又是工作内容有比较的庞杂,好像需要的数据结构和算法的知识,在工作中的应用其实没有多少,并不能有效的为我转化为钱。我有重新审视了我对计算机这个专业的定义。
计算机这个专业是讲什么的,就是讲什么是计算机,从底层硬件、接口技术到用晶体管做一个4位计算机的实现,再到内外存,硬件结束上升到系统软件;操作系统如何管理硬件,内存管理、磁盘管理等东东,编译器,数据库;系统软件结束了就是应用软件。然后计算机和计算机之间有通讯,就是计算机网络。完了,真的完了。
之前对计算机专业的浅显理解就是在表现应用层,计算机专业的数学和其他专业需要计算机处理的数学要分清楚,要清楚的分开。要搞清楚计算机专业的研究对象是什么,狭义的计算机专业压根就不研究算法,研究的是数据结构。但是如何选择数据结构?却要把算法提出来,选择不同的数据结构,算法复杂度是不一样的,也就是说数据结构定了,就会降低算法实现的复杂度。就是为了讲清楚数据结构怎么选择的问题,所以稍带把算法也讲了,就是这样。
我作为一个码农,对计算机其实根本是一点兴趣都没有,编译原理,和微机原理,16进制数,然后操作片内地址,操作Cach,然后求取命中率,然后在计算什么偏移地址,这个确实是计算机专业的知识,也是表述数据在计算机如何流转的,确实是这样的,但是学这个真的很枯燥,很没有意思。
但是相反,对于表现层,应用的,注入搭建一个redis集群,搭建一个mongodb的集群,把这就是做成了就非常有成就感,其实我也越发的发现,我喜欢去动手去捣鼓一些东西,然后把这件事做成比较有感觉,但是你所让我去刷题,重新沉浸在这个算法里面,刷大量的习题,我很难去坚持下去,我甚至都不能从中体会到学习的乐趣到底是什么,搭建一套Redis集群,跟着教程走一遍,搜集一下中间出现的故障和问题,可以专注去排查问题很长时间,但是仔细去思考一道算法题,前因后果,抽象的从哪里开始抽象,我是真的完全是0经验,没有任何头绪。
我也发现也是固有的经验会阻碍从内到外的变化,因为自己喜欢这种用有经验,有迹可循的套路去学一些东西,就特别喜欢研究自己喜欢的东西,然后总想深入进去。这和上学的时候,老喜欢做简单的题型如出一辙,那怕这个题做一遍,下一道题,就是变个数我也乐意去做这种题。但是对于那种难题,需要重新刷大量套路的题型是非常排斥的,没有经验,害怕浪费时间,只喜欢做自己会做的,怕浪费了时间还是求解不出来,换个数可能还是不会,陷入道深深的自我怀疑当中。
我在我的工作中遇到的瓶颈,其实归根接地还是自己喜欢做自己熟悉的事情,对于有挑战的事情,和需要花费大量时间去解决的事情,会非常的不自信,如果不时间不紧张,可以自己慢慢研究,但是如果时间紧张自己研究了一阵子,有没有结果,就是没有产出,轻则被领导批评一下,重则就是要被辞退。我总结了下我这几年的工作的情况,总的来说,工作可以应付。就是熟练的工作完全没问题,但是对于复杂的工作,需要研究的,思维完全跟不上,不是跟不上,完全没有抽象能力。
举个例子,前几天有个场景,有一个lib包的列表里面都包含了200多个jar包,需要根据这200多个jar包的名字,自动生成一份depency,当然包含了version,artifactId,version这三个坐标,这个要是按照我以前的经验为了保证可以顺利的完成任务,看着时间,掐着表,手动复制粘贴,然后截取名字,然后在赋值粘贴,也不会很多应该来回CV100多次就可以了。但是经过我同事点拨了之后,你做为一个开发,这个重复的过程,完全可以用程序来实现的,你只要把你第一次的复制的动作,抽象出来,然后在细分成每一个步骤,你后面在做不就是省时间很多?他没有给我说具体的步骤,因为大致的需求我是知道的。但是做的这个过程,我和他的想法完全不一样,我完全没有作为一个工程师,理所应当的,用编程去解决工作中重复工作的思路,依然停留在去写一些业务代码。脱离了实际的业务场景,并不具备一个合格工程师的该有的素养,编码素养不够,抽象能力不清晰,理解能力也不行。\
基于这些,而我仍然热衷于去背一些没有用的八股文,比如JVM,MQ,Redis,MySQL的优化,学这些会让人很爽,因为他肯定在你日后面试过程中可以用到,肯定可以对你大有开胃的作用,但是就是和前面我说的一样,一直做一样的题,150分的卷走,中等题和基础题加起来可能就100分,你想在突破在拿到120分,那得有处理难题的思路。很明显我不具备这种思路,我现有的工作环境也不具备让我去处理复杂问题的机会。这个在入职初期,和领导对一个人的信任来看,只有你初出茅庐,或者定位就是一个很高的title,会遇到很多棘手的问题,如果定位不是很高的title,那就是一直在处理重复的工作。扯的有点多了,还是行业限制了自己的格局,之前一直被同事说自己格局不够高,因为我一直在做着简单而且有重复的事情,并且还乐此不彼,对于有困难,需要花时间的事情,则一句话,这个我的能力做不了,你让给别人把。
对于算法的态度,我的想法始终是希望可以通过这个提升我的,编码素养,思考能力,和抽象能力,最主要的是理解的能力,可以快速的在抽象的业务场景中,迅速的剥离出来1,2,3,4的步骤,但是我此时此刻,根本不具备复杂业务场景的分析能力。说来也好笑,还是个码农,码农是什么,码农要研究算法的原因是因为有其他行业的问题需要计算机来处理,这个在公司中一般应该专门设置这样的算法岗位,招聘“ 计算数学 “专业的人才。小公司一般没有这个岗位,大多是拿开源的工具包在用,只要能看懂文档,会用就行了。所以我就一直在做增删改查,然后就是提升,买课,然后焦虑,然后在重复下一轮的增删改查,然后裁员,转行,然后背八股文,根本的问题一直在忽略和逃避。今天扯的有点多了。先写下昨天漏的代码。
链表
链表这个实现的过程和之前为什么有链表的思路,在昨天说过了,主要还是解决动态扩容的问题,和对应的基本的节省空间,采用面向对象的思想来进行处理的。
在实现链表的过程中,主要的思想就是内部类Node,有了这个基本上链表就可以存指针和对应的要存储的内容了。简单罗列下对应的node的代码。
private static class Node<E> {
E element;
Node<E> next;
public Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
}
基本上常见的写法,就是这样,这里面说下的思考,主要是对add,remove的思考。
链表的添加元素,这个添加的过程汇总,可以看到第一个函数就是对应的判断index的范围的,这个没啥好说的,在下面这个判断就比较有意思的,因为是动态链表,涉及到在第一个位置插入元素,所有就有了判断当前的索引位置是不是0 的情况,在判断完这个之后,就要修改指针的位置了,这个当前的指针的位置就是先记录下first的位置,然后将first的next的位置指向了新的位置,然后新的节点的位置在指向了原first的next的位置,这样就把新的元素节点的位置插入进去了,整体就是这样。
public void add(int index, E element) {
rangeCheckForAdd(index);
if (index == 0) {
first = new Node<>(element, first);
} else {
Node<E> prev = node(index - 1);
prev.next = new Node<>(element, prev.next);
}
size++;
}
在说下remove,这个方法在执行的时候,和add刚好是相反的,在执行完对应的操作的时候,比如要删除当前位置的元素,那么就要当前要删除位置元素的前一个元素,然后将前一个位置的元素进行保存的操作,在进行操作的时候,将删除位置的前一个位置的元素就是prevent,的next的指针,直接指向删除位置元素的next的位置,这样就完成了删除的操作,想当于就是要定位到prevent然后next直接在当前删除位置元素的next的next的位置就可以完成删除的操作。
public E remove(int index) {
/*
* 最好:O(1)
* 最坏:O(n)
* 平均:O(n)
*/
rangeCheck(index);
Node<E> node = first;
if (index == 0) {
first = first.next;
} else {
Node<E> prev = node(index - 1);
node = prev.next;
prev.next = node.next;
}
size--;
return node.element;
}
总结
关于链表的思考部分还需要进行下去,必须要提升抽象能力和思考分析能力,这个是一个软件工程师所必备的功能,之前在某平台上一直自诩是码农,不是工程师,工程师所具备的严谨的态度,和专业的分析能力和抽象能力,是码农不具备的,码农是什么,除了会写一些业务的增删改查代码,对业务能力的分析和对当前生产环境的出现问题的排查,并不具备任何条件,不是不具备条件,是压根没有解决问题的能了,也没有刻意的去培养这种解决问题的能力,这就是最后被转行的悲哀。
积累,专注,持之以恒
2023.07.04\