这是《开发者说》的第18期,今天我们采访的是在Github上传LeetCode动画题解,获得75.3K标星宝藏项目的程序员吴师兄。
吴师兄从985大学毕业,从通信工程外包零基础转码程序员,逐渐进入一些中厂和大厂,工资也从三四千起步,到现在实现了数倍的跃升。
后来,他通过在github上传的LeetCodeAnimation项目,一周时间就获得了大量关注和粉丝,最终走上了自由职业的道路。如果你也看过他的动画题解,你也一定想了解这位宝藏程序员。
请自我介绍一下,你是怎么开始接触技术的?
这个话题,说来也真是一段故事。我个人的经历也算是起起伏伏,技术之路并不像其他人那么一帆风顺,我还是经历过蛮多曲折的。
我最早接触技术是大学毕业之后,大学期间没有接触技术,一开始的话,我的职业规划并没有考虑进入这个编程行业,因为我大学主修是工程方向,通信领域。我大学是985,有一定的学历优势,但是因为在大学期间经常玩游戏,职业规划没有做好,比较颓废,让我丧失了很多学习机会。毕业之后我也只找到了一份月薪只有三四千的,相当于是外包的工作做的活,也和程序员或者技术无关。
这个时候,因为这种生活落差和对未来的迷茫,就促使我开始反思,做出改变,因为当时是15年,属于互联网的一个风口和红利期,这个时候我才开始真正接触一个技术,决定转行做程序员。
当时的话我用了五个月时间去培训机构进行培训,系统学习一些编程的语言和项目实战。虽然在培训过程中入门的掌握了编程的基本技能,但我自知我的起步技术水平并不高。和在大学里面学了四年的计算机的学生相比,还是有很大差距的。
当时培训住的地方,住过城中村的应该有同感
一开始的话,我的工作就只能做一些比较简单的一些CRUD的一个工作,并不能找到更好的工作岗位。后面我通过持续学习和刷题,通过跳槽等等方式才逐渐从一个普通程序员成长为能够胜任复杂技术工作的技术人员。
我从一开始的迷茫和无知到逐步掌握核心技术,在这个过程中也经历了比较多的挣扎和努力,而且每一次的突破都是通过自身的反思和行动得来的,这种成果让我感觉到编程它不仅仅是一个技术的积累,还是一种思维方式的训练,这就是我一个大概的个人经历!
吴师兄在大学生活中有没有什么比较难忘的经历?
确实有比较多的难忘经历,因为大学期间的话,整体来说我就相当于是一个自我迷失的过程,因为我是从一个18线小城市来到这个大学的,一开始的话,和很多同学一样都带着很多的梦想或者希望。并且由于我比较特殊,我是通过自己的复读才来到我们的学校,哈尔滨工业大学,相当于比较好的一个985学校吧。
我当时也属于意气风发,因为觉得自己通过努力能证明自己能得到不错的成果。但是进入大学之后,我就因为各种原因选择放飞自我,沉迷网络游戏或者看小说,并且非常沉迷游戏,经常逃课,旷课等等,就开始研究怎么玩好这个游戏,基本上就没有好好学习了。
逃课补考是我大学四年的一个常态,那么到毕业的时候,我的毕业成绩就非常不理想了,甚至一度差点不能毕业。这个经历造成的结果就是我毕业那一年,我的舍友或者同学要么是保研成功,要么是考研成功,或者能找到一些比较好的工作,但我自己的话却因为挂科面临着无法毕业的风险,这个落差的话对于我来说还是比较难忘的。
因为别人过得好,自己的话却感觉过得很差劲,就感觉自己很无助,也很有压力,因为没有找到工作。唯一幸运的是,我通过补考也拿到毕业证,也总算给大学收了个尾吧。但我虽然说是毕业了,但没有任何成就感,相当于这四年已经浪费了,因为没有得到任何的东西,也没有学到任何的东西。
这种经历的反差,让我就意识到人生任何阶段的放松和堕落,都会为来自己的道路带来沉重的代价。这个经验也迫使我在后面转码学编程或者学算法或者创业过程中带来了一些经验教训吧,就告诉自己就要存在这种危机感,不能让自己堕落下去,要自我救赎。
科班出身的程序员和培训机构出来的程序员有什么区别?
还蛮多区别的,就我自己的话有比较深的一个感触。因为我自己就是培训机构出来的程序员。我有很多同事,有的是在大学计算机的学生,甚至是已经读研的,我还接触了一些博士,感觉科班出身程序员他们的基础是非常扎实的,因为他们大学四年是系统的学习了数据结构与算法,操作系统,计算机网络这些的一些核心的课程,也就是我们所谓的计算机的基础的课程,这就导致他们在处理一些新的语言学习或者一些复杂系统,或者优化一些代码的过程中,他们的代码逻辑可以占据优势。
像我这种培训机构出来的程序员,因为整个培训过程就只有5、6个月的时间,他们都是赶鸭子上架,更多的目的是让这些学员能够快速上手,每个知识点讲的非常简单快速,只要你能实现这个功能就行了,并不会告诉你说为什么这样实现,是怎么思考的,甚至很多数据结构,算法,操作系统,这些知识都不会涉及,需要后面自己慢慢补。
培训出来后,短期的话有一定的实战经历。但这种程序员一般可以比较快速地适应项目开发,也可以完成一些基础的业务需求,但是遇到比较深层次的技术的话,就显得比较吃力了。
当时培训的教室
当然市面上,培训机构出来的也蛮多的,也有挺多人就走的更远,比如说阿里P8、P9的非科班程序员也有很多。程序员无论是科班还是培训机构出身,两者的区别并不是非常绝对的,并不是说你科班出来就能混得更好。培训出来的就只能干一些底层的工作,关键在于持续的学习和进步。毕竟学校的学习也就四年,而真正决定技术高度和深度的还有后续的四年、十年……
培训班出来的学生,在起点上肯定是落后于科班出身的程序员的,但是我们刚才说的那个计算机的一个技术领域,完全可以通过后天的努力和项目的积累弥补这种差距。事实上,我在进入编程领域后,意识到自己技术底子非常薄弱,也是通过自学,比如说看书看视频,刷题等等,才逐渐补上这个技术短板的。
从另外一个角度来说,培训机构出身的程序员往往也具备更强的项目实战能力和解决问题的灵活性,因为从一开始培训机构就告诉你要面向需求去解决问题,这样导致大家在工作过程中能更好的适合不同的业务需求,而科班出身的程序员虽然理论比较扎实,但真正做实战的时候,有时候可能会显得思考太多了,导致无法快速的上手入门项目。两者来说各有优劣,但最终如果想在程序员这个道路上走得更远,我觉得还是要看个人持续的学习和积累。
科班出身的程序员和培训机构出来的程序员在目前的求职的市场上,其实也会有比较大的区别。因为早些年的话,基本上不要培训机构出来的学生,培训机构出身的程序员如果想找到好的工作,基本上需要伪造简历这种形式,因为培训机构出来的话,基本上要围绕自己有三年的工作经验等等情况,但科班出身的程序员直接上校招就行了。相对来说,科班找工作是远远比培训机构出来找工作简单多的。
可以跟大家分享一下你的工作经历吗?
我大概是15年开始工作,期间在小厂工作,然后开始刷题去大厂工作,在21年的时候我就决定裸辞了,开始全职做自己的算法训练营。到现在的话相当于创业有三年多了,从一个人单打独斗到现在团队有十几个人,虽然说自己的一个工作的定位和形式在不同变化,但自己一直在耕耘于编程这个领域能整个过程虽然说充满了挑战,但个人还比较享受这一点的。
在做1000小时刷LeetCode的过程中,你有没有遇到一些什么困难?
有挺多困难的,因为我本身是一个非科班出身的程序员,没有数据结构和算法的基础,一开始做题的话没有见过这种刷题的形式,就好比是一个外国人突然让他默写个古诗,根本想不到怎么样去写这个东西,猜都不知道从哪猜。
一开始的话,我连最简单的题目都无法解决,比如说一些入门题,比如说leetcode里面的两数之和这类入门级简单题,对于我来说的话,做题仿佛是一座无法跨越的高山,因为当时基本几乎是看不懂题意和解法的,就题目可能都看不懂,类似于外国人看中国的文字的那种感觉一样。
这个时候,我又听说基本每个程序员在跳槽过程中都需要刷很多题目,这个时候我就开始怀疑自己是否真的适合做程序员,那么我又一度陷入了迷茫和沮丧。因为之前在大学的迷茫经历和后面转码成功就让我感觉到,无论做什么事情,最大困难就在于坚持,好比这个刷题,它并不像我们编写业务代码可以马上看到成果,它是需要一种长期积累和深入理解过程的。
在一开始刷题的前几个月,我的进度是非常缓慢的。当时刷过的题目,一段时间后发现完全忘记了当时的想法和思路,这种重复犯错的感觉,就令人感觉非常沮丧,一度开始怀疑自己的智商是否有问题,这种数学题都没法做对,那当时的话,我就做了一个改变。我决定采取当时学的一个叫做费曼学习法,就是以教促学。
我学到题目之后,我就开始把这个题目进行分析,写详细的题解,将每道题目的思路用文字表达出来。同时的话,为了加深我自己的印象,而且能让别人也能看懂,我就开始花费很多时间去做一些动画,这个动画不仅我自己在做的过程中需要思考这个解题思路,同时这个动画也能帮助别人更好的理解。
整个过程就相当于我在教学过程中不断的巩固自己所学的内容,那么虽然一开始我学的非常慢,写的题目也非常慢。非常痛苦,非常耗时间,但是通过这样一个坚持不懈的练习和总结,我也逐渐从一个入门者到能解决中等难度的问题,再到能做很多困难题,甚至教会别人去把这个题目给弄懂。这就是我整个刷题的过程。
你在github上传的LeetCodeAnimation项目获得了很多的关注和star,这个项目给你带来了哪些改变?
当时做LeetCode animation这个项目,我认为是我在整个十年的工作中做得最厉害,最正确的的一个决定了。我当时做这个项目的初衷非常简单,一方面是帮助自己更好的巩固自己的练习,另外一方面还是受当时的风气影响,有种开源的思想,相当于我想把自己的内容分享给其他人,让别人也能从中受益。
在我刷题过程中,我自己也有一些困惑,我看别人题解的过程中,虽然有很多人写的很好,甚至很多大神写的代码非常厉害,但对于一个初学者小白来说,感觉他写的太高深莫测了,要么是解释不够详细,对于我这种初学者来说非常不友好,要么是很多题解写出了代码,但是别人是看不懂的,他没有一个明确解题思路。
对于很多人来说,他看了就看了,根本不知道为什么这样写这个代码,有什么作用,相当于别人看完之后就起不到一个提升的作用。这个时候我就决定,想通过结合动画和详细注释的方式,把刚才提到的问题给解决掉,让刷题变得更简单易懂,接地气。
我希望做到的是,每道题目每个初学者他都能看懂,无论这个题目有多难,我都想把它讲的浅显易懂,基于这个思路,我就把这个题目写了题解结合动画的方式上传到github上去。
没想到的是,LeetCode animation做了一周之后就爆火了,连续大半个月在github排行榜上稳居前十,甚至好几天都是排名第一的位置,我就没想到这个项目会有这么大的一个影响。
基于这个曝光,给我带来了非常多的关注和机会,可以说不仅提升了我的技术影响力,而且很多大厂的一些技术leader或者面试官都通过这个项目关注到我,对我发出邀请去面试,也让我在这个职场生涯过程中得到了更多的机会。同样的话,这个项目也为我开辟了一个新的道路,他不仅能帮助更多想学习算法的人,让我意识到技术内容创作的巨大潜力。
基于这个项目,我开始在公众号写一个付费专栏,通过技术分享和内容创作的方式,我找到了职业生涯过程中除了程序员这个方式还能发挥自己更大价值的道路,在整个过程中也积累了大量的粉丝和行业的资源,这个项目不仅改变了我的职业轨迹,而且让我对这个技术有更深的理解。通过这个项目,我也意识到技术的传播和分享拥有一种强大的力量,它能够影响到更多的人,同时也能反哺自己,为自己创造更多的可能性。
你从企业辞职,决定自行创业的一个契机是什么?
我最后的职场生涯是在一家中厂,决定裸辞也经过了比较长的思考。因为当时做决定的话,最主要的是对自己未来的一些焦虑。我是一个转行程序员,我意识到我想进大厂或者在大厂走得更远的话,我需要不断的去努力和学习,但是随着我自己的年龄的增长,只靠技术而不去扩展更多能力的话,未来资源会受到限制。
另外一方面,我在技术创作上又获得了非常多的一个反馈。这个反馈不仅是金钱收益的,而且还积累了一些流量和粉丝,我就看到了技术知识变现的潜力,那这个时候我就开始去思考我能否分享我的经验和知识,帮助更多像我一样曾经迷茫的程序员,让他们转行成功,然后走的更远,这个时候我就开始萌生了创业的想法。
于是我就裸辞了,开始全职运营,并上线了算法训练营。上线训练营这个过程也充满挑战,因为裸辞的话,所有的收入都来于自己的训练营,生活压力还是比较大的,但我整个过程回忆下来的话都比较值得的,因为就我个人性格和能力而言,我觉得做算法训练营会让我实现我的一个愿望,就是能帮助更多像我一样的程序员,需要算法的系统学习,然后通过算法训练营进入大厂,我觉得还蛮有成就感和挑战的。
我觉得做算法训练营对我来说比较舒服一点,我一直在家办公,虽然说工作上比较忙碌,要录课,要直播答疑,要内容创作,还要去负责很多方面的东西。创业的话相当于所有事情都要自己来做,没有谁给你出任务,整个过程虽然忙碌,但是感觉做的东西都是自己的,还是比较有成就感的。
你目前的工作、生活还有收入状态怎么样?
我整个工作的话,还是在编程领域,就是做训练营,裸辞之后到现在快三年多了,整个训练营也累积了2000多个学员了,整体收入的话,还是比较相对来说比较可观的,就相当于用一年挣以前三四年的一个钱。
当然这样的生活还是充满压力的,因为你不知道明年发展怎么样,后年怎么样,感觉每每个月、每个季度、每年都有一个KPI,没有完成的话,也是比较焦虑的。
至于生活状态的话,因为现在有团队了,我自己的话可以花更多精力去尝试不同的方向,可以让自己团队去做一些答疑录课。至于收入的话,相对来说比上班时是多一些的,差不多每个月有3~4万的收入,虽然说比之前可能稍微高一点,但是也会焦虑明年的KPI。
与此同时,我感觉自己非常有憧憬和目标感的,因为毕竟创业的话,就非常有挑战性,就有可能明年收入更高的期待,也许某一天创业一年抵上了工作十年,整体来说,生活还是比较稳定和充实的。
我也是经历了职场到创业者的身份变化,从一开始我可能是体验做一个企业的螺丝钉,去完成一些比较按部就班的工作,现在其实就是要带团队,这时候要负责的,不仅是你一个人,而且还要包括一起合作的伙伴。很多事情就被迫着要去做一些改变,就以前可能自己不想去出镜头去录视频或者见其他人,但是为了团队一些发展的话,有时候就被迫去出门跟其他人去接触,去探索更多的方向和合作。
你认为你的算法题解和其他人的有什么差异化?
我觉得最主要的有几个差异,最明显就是一个PPT动画的形式。对于当时的我来说,我是一个初学者,所有学习过程的痛点我都经历过,我觉得如果有人在写题解的过程中,他有动画或者一些比较很好的描述方式,对于理解这个抽象过程是非常有帮助的。
基于这个特点的话,无论这个题目多复杂,我都尽可能的用动画来描述每个步骤的一个变化,哪怕这个新手的基础能力非常薄弱,但是他完全可以通过动画形式来了解算法的核心思路,这就是我的题解能够受到这么多人喜欢的一个原因。
再有一个差异点就是深入浅出的一个讲课风格,因为很多大神在做题的过程中,他们非常喜欢炫技,喜欢用一行代码来实现非常多的功能,但对于一个初学者来说的话,他很难一开始就看懂这个代码。就好比就相当于一个来写作文,突然间要让他用七言绝句来描述好一个风景,我觉得很多人是做不到的,但是对于很多高手来说,他无论什么的场景都能写出一个非常好的诗词短句。
虽然说对于他来说的话非常简单,但对于一些初学者说根本看不懂,那么我在写题解的过程中不会追求一个炫技,而是尽量用最简单的方式让读者理解复杂问题,我会为每一行代码都添加非常详细的注释,保证初学者也能看懂每个步骤的逻辑和目的。
这两个特点是有别于其他体系的一个风格,后面很多人写题解也是喜欢用图片或者写非常好的一个注释的,我觉得我对于大家引领大家写题解还是有一定的帮助的,就这两个特点吧!
程序员本身没有做动画的这项基础技能,你是自己去学习制作题解动画的吗?
我刚好看到有人用PPT动画做的非常好,那我想着算法题看无非就是那些数据结构,就比如说链表数组,那完全可以用这种方式来表示,比如说移动数组,那我就把这个图形移动一下,旋转一下等等,通过这种方式就感觉可以实现我想要的功能。
所以说最开始的时候,我是在PPT上去做的这样子的一个动画,然后再去做成GIF,虽然非常耗时,做的慢,但自己也挺有收获的。
互联网行业非常卷,而且这几年的行情不是特别好,你现在还会建议普通人转码当程序员吗?
互联网行情的话,从19年20年就开始逐渐的不太行了,到现在的话,今年可能比去年好一点,如果你是一个普通在校生的话,假设本职行业并不太好,同时学历还可以,比如说211/985那种,我还是建议大家可以去学习编程转码做程序员的。
因为随着未来数字化的一个时代的发展,你无论做什么行业。比如说你可能做会计,做一些销售等等,你可能都要掌握一些编程的技能,掌握一些编程技术都是有帮助的。至于后面的话,要不要当程序员完全可以看自己在整个学习过程中能不能学会这些知识了,因为的话,编程并非是一个轻松的道路,对于任何一个转行者来说,它的挑战还蛮多的,无论是技术的门槛,还是算法学习还是行业竞争。并且整个学习过程中,并不像早期你学会编程语言就能找到工作了,整个过程需要一个长期的积累和持续学习。
举个例子,比如说面对一些算法题的话,很有可能之前只要学一两百道,到现在的话可能要四五百道,六七百道等等。对于一个普通人来说,如果愿意做转行的话,一定要明确自己动机,一定要想清楚自己是否愿意付出足够的时间和努力,如果可以坚持学习的话,热爱面对电脑去编程,同时觉得自己性格不善于人际交往等等,那这个时候我认为转行当程序员是值得一个尝试的选择。
对于普通人来说,哪怕是不想当程序员也可以把编程作为一个工具,不是要转码,而是学习一些就是编程相关的内容。
你在做算法训练营的过程中有没有遇到一些困难或者是一些难忘的经历?
上线算法训练营的时候初衷比较纯粹,是面向跳槽准备的,因为跳槽的话,无论是是校招还是社招,整个流程都有算法笔试环节,然后再去面对面的一个面试。
整个环节的话,第一轮有一个笔试题或者手撕算法的环节,而无论是转码的还是一些科班出身的学生,都是不具备做题的能力的,如果不具备这种能力就影响他们跳槽,影响他们找工作,我做训练营就是为了解决这个痛点的,相当于是一个程序员的刚需。
那么在这个训练营的整个过程中,最初的困难就来源于所有事情都要自己亲力亲为,无论是录课,招生,再到直播,还要答疑和课程迭代设计等,每个环节都要自己独立完成,尤其在初期没有团队支持,就只有自己一个人去干,每天工作量还比较大的,基本上都是饱和运转的,没有太多的个人休息时间。
在整个过程的话,最难忘的话就是一开始前几期训练营,很多学员他们都是零基础的,可能有编程基础,但是算法基础基本上是没有的,那么他们通过这个训练过程中不懂算法,再到把学完之后掌握了算法,同时再去多多练习,最后拿到了一个大厂的offer。
他们在群里报喜的时候,成就感还是比较足的,就让人意识到自己做的事情就比较有价值,不仅能帮助别人找到工作,而且能给他们的人生带来更多的机会和更多的可能性。
随着训练营发展的话,当然挑战越来越多了,比如说如何扩大招生,以及让课程的质量更好一点,以及应对不同学员的不同需求,这就导致我要去不断优化自己课程体系,并且需要结合同学们反馈进行一些改进和提升。
你对今后还会有什么样的计划和打算?
对于未来的话,有几个明确的计划和方向。首先第一点围绕着训练营进行优化和扩展,不仅是基础的算法课程,我还希望后面可以加入更多的高级算法和算法,在实战过程中的一个应用,帮助学员在更高层次也能获得突破,也决定进一步的扩展团队规模,比如说在后期答疑或者跟踪大家学习进度上能起到帮助,就让大家在整体服务上面感觉更好一点。
此外的话,还有可能会探索更多的技术内容比如说自己会开发一些编程项目工作,比如说别人提问过程中提供AI助手来给大家答题,当然这种AI并不是机械化的,就像GPT一样,我觉得可能会结合自己的一些动画的方式来进行答疑,这样的话整个教学过程中会更好,相当于24小时也能答疑。
其他的话,一边前进一边探索,我也没想那么多。一程有一程的风景,一程有一程的收获。
这段话,也送给每一位看到这里的小伙伴。