原本打算毕业再认真总结一下的,但是最近刚刚弄完毕业论文的初期事宜闲出来一点时间,正好把这个事情做了。这大概也是我这一阶段最后在lc上输出回馈的内容了,之后工作之后估计不太有空闲来lc刷题了,也有可能和近一年一样保持每日一题的养生刷题。
完全跨行,本科材料化学,研究生无机化学(偏结构合成,完全和机器学习/计算化学等交叉方向无关),转码前一天python都不会print("hello world")的水平。基本上依靠纯自学混到了现在。中间走过了非常多的弯路,如果有兴趣可以直接拉到最后,看一下我目前阶段自己排除掉弯路之后的推荐入门路线。
大二阶段接触到本专业的科研时候觉得和自己原先的设想不一样,萌生跑路念头,但是那时候没有明确的跑路方向。大三的时候由于个人太懒且不愿意放弃保研天天玩王者荣耀混日子,大四上学期无聊到爆,学视频剪辑玩,发现各种剪辑软件很有意思。但是后来遇上疫情直接开摆,没跑路的门路,硬着头皮上了个研究生。研究生开始阶段鼓捣了仨月觉得确实不是自己理想中的生活,又开摆了几个月。大概研一下学期接触到CS的高薪就业传说且自己对这玩意似乎略有兴趣于是开始自学。且2020年/2021年行情实在是很好,本穷b实在是很动心。然而2022年秋招大家也知道一言难尽。头部企业大批量缩招(BATTMD+各种独角兽,缩的看不懂了都),外企基本全不招(譬如微软连2022年三月啥大中华区扩招的推送都给删了,虾皮众所周知的xxxx)。总体而言形势是非常严峻的。
现在不推荐任何有本专业毕业压力的人采取“双修”的方式转行,首先是自己不一定能承受得住高强度的“双修”,其次是互联网行业巨变,没有非常能顶的能力/学历几乎不会有机会校招入行。(2022年多少跨行非科班颗粒无收。。。现在chatGPT4出来之后更是开始进一步压榨程序员的拧螺丝空间。)
虽然本科大一学过C++,但是自己直到现在都没想通当初是怎么考过的?学完之后完全没有任何印象,甚至到今年下半年开始学C++的时候才知道include 那些玩意是啥意思。【这里插句题外话:问了一圈同学,几乎没有非(CS以及相关专业)之外的人知道当初学C++的那一串include ... using namespace ... int main() ...是什么意思。国内学校卷gpa是卷的挺厉害,啥也不懂也能硬背下来,老师牛逼学生更牛逼】。导致对C++的零星印象就是难得一笔,全靠背,还有什么*&等等一系列奇奇怪怪的符号。基于以上原因没有从C++入手。然后各种Python培训班的在朋友圈买的通用广告以及互联网新闻吹Python啥啥啥的,半上当受骗的从Python入门。现在后悔的不行。 让我重来一遍我一定老老实实学C++入门。
不会C或者C++的程序员,欠下的债迟早要还。
现在回想起入门的前几个月那是真的艰难,主要的难点在于放羊一样过了大学中后期两三年之后几乎丧失了所有的学习能力,完全不像是一个理工科上了四年学的人。学习没有目标,没有章法,东一榔头西一棒子,学这玩意仿佛在背书一样。那时候其实就发现了自己可能在这方面天赋实在有限。 和学化学的自己作对比可以明显的感受到接受速度慢,在化学上可以一眼解一眼过的知识,在这里会经常体现出过程搞不清,“靠记忆” > “靠操作”的特点。即便是到了现在我自身依旧感受到了这样的特点。
我推测这是来源于生化环材这一类学科养成的不良习惯:由于绝大多数生化环材方向重视结果而忽略过程,在学习/考试中,都是优先掌握结论而几乎忽略理论过程。导致学习其他需要连贯的、严密的逻辑的学科时,不去追求了解完整的本来面貌(为什么),而是只去追求问题和结论(是什么,怎么样)。因为对于很多这方向的同学来说,没有足够的时间等你去了解为什么,论文发表才是最重要的,你不懂没有关系,你拿的出有效的结果就行,很多时候原因写不清楚没那么重要,不是CNS,AM级就没人在乎(这里点名材料行业。)
这样的坏习惯我纠正了一年多感觉还是纠正不回来,它正在显著的影响我的学习效率和能力。我感觉我会为这个坏习惯付出惨痛的代价。
买了一堆7788的书,一直到现在都还没有看完甚至还有几本买了一年了我都没翻开过。这里也要提醒大家,买书一时爽,看书火葬场。对自己的能力一定要有点b数,不是买了==看了。现在感觉还欠了几百块钱的书完全没动过十分愧疚并且可能长期愧疚。之后一定会花费很多时间把这些书全部消化完毕。
以下仅为个人入门步骤,不具有普适性。
抄书。
推荐先找到一个合适自己的码字软件,我这里选择的是typora,并且为了让自己能够积极使用,购买了正版(花了钱不学那实在是太亏了。
我是先从《Python入门到精通》这样名字的书抄起。现在回过头来一看这书可真中二。效果一般,不推荐花钱买,里面介绍的是Python的基本语法。
然后是抄《数据结构和算法Python实现》,抄完课程代码的时候尽量完成每一章的课后习题,大部分题目简单,难一点的去CSDN搜一搜可能有答案,没有就算了。
抄了俩本书之后觉得自己神功大成准备出山了,然后搜到了什么各种方向都需要算法题就开始刷题。【嗯,今年来看这又是一个非常错误的决定,总的来说就是:就是难题完全不会(用lc题来评价难度大概就是>今年周赛平均T4),简单的用🦶也会写(反转链表的各种写法),我个人感觉是秋招找工作的时候,完全没用,没有任何区分度。今年秋招帖子里很多lc高分选手也会是这种感觉,AK了没有p用,挂不挂全看命。技术栈对口你一道笔试也不会也能进面也能拿offer,技术栈不对口AK也是人才库库长】
但是当时是完全不知道这样的结果的,然后每天也不知道该干啥,就无聊的刷题,lc也就这样陪了我七百天(虽然最近三百天我基本上就是每日打卡逛街,有效时间可能约四百天)。
目前的体会是,这种实践性的行业里,新手期:操作>思想,之后是思想>操作。转行入门一定要注重实际操作。
看书。
简单的抄完两本书后对计算机这一行有了最初步的认识,最起码可以发现自己会有哪些不懂的点,知道如何去描述自己不懂的问题了。看书的时间段里我看的主要是《计算机网络》《操作系统》,这俩玩意用Python入门的我是完全走马观花。这也是我十分后悔选择用Python入门的主要理由。不用C++入门这俩课程基本上等于没学。现实的面试结果也告诉我确实等于没学,明年还得补。一直到秋招之前都给自己找借口觉得非科班跨行,面试肯定不会问的很离谱。【嗯,问的和科班没有区别。我最开始面字节的时候我是连问题都听不懂,非常感谢面试官没有看到我菜的离谱的份上直接退了而是给我面满了时间,现在回想起来都要被自己菜笑了】
在没有一个完整的知识内容体系概览之前,计算机的知识显得比较破碎。所以我认为,新手期涉猎的广度比深度更加重要。
我个人感觉其实《计算机的组成原理》这个书非常必要,但是这玩意实在是没得办法作为面试题,所以速成的人基本上也不会花很多时间去看,但是上完车后这个课我感觉重要程度和操作系统一个级别。同样的,《汇编语言》这样的书虽然在实际过程中可能基本用不上,但是在我初步接触这本书之后,对总体代码的设计感,和面临问题去搜索并理解答案的方式有了更加清晰的认知。
看网站。
我这一步主要目的就是为了速成知识网络,实在没有充足的时间去完成各种名校课程+课程代码实验。【其实时间也不算完全没有,更大的原因我感觉还是自己太懒了+找个能混过去的借口,最终还是得补票】。网站看的最多的就是小林coding,其他的可能就是知乎上零零散散的文章,搜到哪里看到哪里不成体系。养成一个搜索的习惯对于程序员来说是非常重要的。【顺便diss一下百度真的是知识性搜索领域垃圾中的战斗机,我是被恶心坏了。大家能用google的用google,否则尽量用bing,百度真的是垃圾真的垃圾真的垃圾】
那时候就对“项目”这个名词充满了好奇,现在的浅显理解是“GUI + 逻辑处理”来完成一个可以完成指定功能的工具? 但也不是所有程序员都会接触到具有用户界面的程序呀? 而写用户界面的好多情况下也不需要写奇奇怪怪的逻辑处理。似乎就只有全栈全包才有一种做项目的感觉。并且我这种纯彩笔接触到的项目那基本就是从头到尾都是看着别人现成的代码一行行重新给他原模原样按照它的文件夹的创建顺序+打码顺序给他来了一遍。用过Go、用过Javascript、用过Python。反正只要想着自己二次加工一下基本上都报错索性原模原样抄写算了。 其他没有这种手把手教学方式的项目我是一个都没接触过。
看视频。
走马观花一样看完了王道考研的408视频,然后看了哈工大的《计组》。在完成基础课之后乱七八糟开始学其他知识熏陶熏入味一点零散散的类似于短视频的知识科普,虽然没啥屁用但是能骗自己在学点东西。
然后迎来了对我转码生涯最重要的网站:acvving(怕和谐,)然后去了acvving开始正式接触项目开发:Django那个项目,算是打开了新世界的大门。对绝大多数新手而言,acvving的知识内容足够支撑到你程序员行业的独立探索期(即可以不再需要引导,自己可以开始完成项目,自己设计完成需要的程序)。acvving以几乎最低的价格,最具有普适性的教学方式带领绝大多数新手算法爱好者和编程爱好者入门,口碑有目共睹。如果自己对学习路线比较迷茫,强烈推荐acvving入门基础知识。(新手不要去直接一次性报名很多课程,acvving是竞赛类平台,其算法的教学难度远远大于普通招聘。从低难度的学起,到自己觉得已经足够应付招聘即可。)
上面说了这么点东西,但到我正式开始完成项目实际上已经到2022年五月了。直到五月份我还是属于自认为0经验的代码崽,所以不出意外的秋招十分惨烈。最后校招去了华子,部门和定级不方便透露,总的来说我还是接受这个结果的,虽然不如最开始想象的那么美好,但是对我来说也是属于一个不错的offer。
我个人认为,打算在程序员行业长期发展的话,如果没有自己倾向的明确就业路线,从普适性来说 C++,Python,Javascript是我比较推荐的。如果有明确的就业路线,根据实际情况进行选择。
对于一些比较有讨论度的语言:Java,C,Go,Rust。我自己面试和交流的体会是,Java的方向真切的可以感受到入职面试造火箭,上班开始拧螺丝;而校招几乎没有任何Rust的岗位;Go岗位的面试基本上不看你会不会Go,不会Go并不对你的择业造成任何影响,面Go的时候语言八股文可以用C++/Java代替;校招C语言和就业行业高度相关,互联网行业的纯C较少,其他实体类行业反而有更多的C岗位。
语言学习的时候,在掌握第一门语言当作“母语”的时候,尽量详细的去了解组成编程语言和功能的每一点,了解的越多越透彻就越容易去学习其他的新语言,之后的所有新学的语言语法几乎都会找到相应的概念,然后再掌握这门新语言的特色用法,就可以开始拧螺丝了。
语言是解决问题的工具,在合适的场景下去选择合适的工具。不要试图成为“语言律师”,除非你做的就是编译器这类工作。
互联网的寒冬让很多人都陷入低谷,大环境比自身努力更为重要。不要抱怨自己,早些认识到努力不一定会有结果,不努力也不一定不会成功;风雨过后大概率不会有彩虹,有的人的起点比很多人的终点都远。在这个世上,无缘无故的事情太多了,我们都无法掌控,过好一天是一天,与自己和解,与平凡和解。我们无数人都只是非常普通平凡的一粒沙,有很多人倾尽一生的努力可能只会帮未来某个天才节约几分钟,而绝大多数人的努力甚至没有资格帮天才们节约这几分钟。
希望大家意识到,过好自己比创造价值可能更重要。我们可能无法提升实力,但是我们可以降低预期。能“摆”就“摆”吧。