求建议:二本计算机专业,考研还是就业做开发?

来自:程序视界(微信号:programmer_sight),作者:《程序员的成长课》作者,安晓辉 


安老师好:


我是一个大连某二本院校的在读生,专业是计算机+日语强化。上大学以来一直关注着您的公众号,读了很多您的文章,学到很多东西,也受到过您的鼓舞,随您一同成长进步。


目前我已是大三下,站在第二个人生岔路口,正为各种浮在空中的想法烦恼不已。身边的同学水平都很一般,我也并没有比他们优秀多少,所以烦恼是相同的;学校的老师各有各的心事,并不真的在乎每个学生的发展,也请教不出个所以然来;您之前的文章,一直给我力量,那时本以为只要沉下心别焦虑,就这样走下去,时间自会给我答案。如今我收获了一些,也有很多遗憾,仍是在徘徊迷茫。所以这次写邮件打扰您,向您请教。


我目前的情况是这样的:

  1. 算法能力:浙大PAT甲级考了两次,第一次81/100,排名231/1041;第二次57/100,排名428/1398。今年三月的蓝桥杯B组C/C++省赛一等奖。PAT刷过100多道真题,过程十分痛苦,但最终有所收获。在二刷的时候仍然吃力,而且让我很郁闷的是,二刷写的代码还没有一刷写的简洁优雅;还有一刷做出来而二刷做不出的题,备受打击,二刷没完成,所以第二次考试准备不充分。个人觉得PAT甲级整体要比蓝桥B组省赛难,考点覆盖本科数据结构的方方面面,多考察字符串/排序/查找/树/图,没有动态规划和大模拟;蓝桥杯研究的不深,赛前也没准备,全凭PAT的底子和同行衬托。

  2. 语言能力:CET4 545/CET6 506。听力口语写作很弱,完全没练过,全靠阅读硬撑,词汇量背了10k,实际水平自我估计在6~7k左右吧。技术文档阅读的话,读的不多,粗看过一点点C、JSP和Python的文档,大概意思能懂,细节吃力,另外专业词汇掌握得不够,所以没做到能无障碍阅读原文文档的程度,某些情况下需要借助在线翻译。日语因为当初想法很坚定地要考研,又觉得日语英语打架,所以没怎么上心,目前水平在N2之下,但对自己的底子还是有信心的,肯努力的话半年拿个N2证书应该不是难事。

  3. 项目能力:无正式项目经验。这点是我个人比较在意的。除了课程要求的大作业之外,自己练习写过JSP+Oracle+Tomcat的登录/注册网页(但HTML+CSS+JavaScript学的很一般,蜻蜓点水,就没写),想尝试MVC模式,却写的不伦不类,以失败告终。Python照着书敲过一遍简单的3*3神经网络,训练识别手写数字,算是增强了感性认知,也懂了一点点基本原理;目前正在写简单的静态网页爬虫。实际上大三上学期初找过老师,想接触机器学习,无奈老师只推荐了一本入门PyTorch的书,就没再理我。硬着头皮看了一点感觉缺乏很多前导知识,所以没继续深入。另外感觉我所看到的所谓“机器学习”,不过是调API自己逗自己玩而已,和想象中的各种高深半毛钱关系没有,所以感觉很幻灭。

  4. 数学能力:几乎为零。这是最让我感到无力的一点。初等数学学的很差,无论是数学思维、学习方法、基础知识和习题量都差的很多,导致现在学习高数寸步难行。

  5. 专业课:数据结构学了3遍,在四大专业课中学得最好最深入。然而即使这样说,也没能深入到红黑树这种高级数据结构,基础内容到现在也忘了大半,归并排序应该是很难写出,更不用提快排。算法分析只能理解到双层循环是O(n^2)的程度。其他三门只跟着学校学过,对比教材目录的话,实际都只学了一半不到。

  6. 专业排名:前5%。

 

综上,我对自己的评价是:二本院校的中上等生,一般努力,不够聪明。算法、英语、代码能力还凑合(6分),数学很差(2分),会一点日语(4分),学习能力尚可但不强(5分),为人处事很一般(4分),自我调整能力差(3分),认知水平差(3分)。目标不清晰,所以没有足够深入的领域,所学所思都很浅。


 现在所烦恼的问题有很多:


1)考研or就业?

  • 我曾经坚信自己一定会考研,所以很认真地学过专业课(虽然现在看来完全不够),但到了现在才发现,这份坚定在考研数学面前不值一提。学了一个月的高数,其难度和自己稀烂的数学底子让我痛苦万分。按照自己的复习速度算了下日子,感觉时间非常紧迫;又了解了一下今年的考研形势,哀鸿遍野;曾经以为拼命考到370,读个985应该很稳,结果今年很多380+的本科985等着调剂双非,也有391分复试被刷的现象,扪心自问自己没有能力考那么高,370也是理想主义的一个梦而已,而这985硕士梦越来越模糊。和我一起备考的同学已经把复习资料转手送人,打算找实习;本来决定专心备考,没怎么听课的我也重新摸了键盘,畅快地敲了几天代码,一个声音在心中越来越强烈:我真的热爱敲代码,真的讨厌学数学。也有人提醒我,现在写的代码太简单了,而高数的难度从一开始就没变过,所以会有这种感受。但回想当时刷算法题,卡得整天冥思苦想却求而不得,仍然坚持,到现在依然对刷题抱有热情,我觉得这份热爱不会有假。我渴望变得更强更专业,代码更高效更优雅。花9个月的时间在备考上,也许最后我得到的仍然是考研失败;但同样的努力付出在程序上,我一定会比现在更好。

  • 也思考过考研的目的。长远来看,是想借此提升自己的实力,站在更高的平台上,让自己见识到这个学科里更新更厉害的东西;现实点来说,也不过是想找一份更让人满意的工作;意气用事一点,我自然不会甘心自己的学生生涯最终仅以二本画上句号;跟风一点,人工智能的热潮下大家都想搭个车,但我同时怀疑动机和可能性,毕竟门外汉对此的了解根本不足以用来判断是否入行,但想想当初填志愿也是瞎蒙加听人说的,所以又会想跟着潮流走应该不会错吧。但现实又如此清晰:计算机的本质是数学,而我的数学又差到无可救药;父母也已经老去,责任就在肩头;凭自己的双手可以养活自己,这意味着真正意义上的独立。然而传统的搞开发、做工程,似乎天花板很低;留给我这种天资不高的人的出路,似乎就那么几条;业内又一直有着35劝退这种让人怎么也放心不下的说法。在我心里,可能读研之后,情况会变得不同,前方的路会更加开阔,选择的权力也更多些。但到底能够改善多少,我并不清楚,如果没有什么实质性的改变,那读研究竟值不值得?这些印象,我深深地怀疑只是自己坐井观天的臆想与道听途说的结果,很可能困扰着我的,不过是自己的胡思乱想而已。而我眼前所能看到的最优秀的人,只有一个哈工大科班毕业的硕士,在我们学校教书10余年,本以为普通院校教书毕竟比在企业当码农轻松,但现在看上去也压力重重。所以事实究竟是什么样的?

  • 写下这些话的时候,也算是在理清思路,很明显我现在的倾向是就业>考研。多半理由是认识到凭自己现在的能力不足以一战上岸,而二战三战即便家里支持,我也过不去自己这关。但如果真的读研比就业更好,我还是想努力争取一下的,但不是现在。一方面,就业的吸引力很大,我打算在实习的时候,一边做项目,一边从零开始学数学和专业课。这样既弥补了没有项目经历的遗憾,也把战线拉得长一些,让我有更充足的时间去把数学补回来。感觉这样做,要比单纯的考研失败再二战要强。脱产复习自然更专注,但其中的苦闷和压力也很大。另一方面,我又忍不住怀疑自己,现在有这种曲线救国的想法,会不会仅仅是在逃避现实的说辞?


2)国内or日本?

  • 我本人是不太想留在大连的,向往更广阔的天空。不知道现在自己这个水平,能在北上广深这种一线城市找到什么样的工作。大连这边的几个外包公司,我还是有自信以应届生的身份进去的。然而业内都一致鄙视对日外包,说是活多钱少没发展。我也在想,如果真的落到只能在大连干外包的话,同样是给日本人干活,为什么不直接跳到日本去?同时我还有出国的想法,虽然这好像比硕士梦更遥不可及。

  • 会考虑这个,单纯是因为从现状出发:我是计算机加日语专业的学生,然而可笑的是,学校的计算机课程无论从学时上还是教学质量上来看都不如日语。往届毕业生中,也有很多人选择赴日,多半是先留学后工作。学校的老师也经常提醒我们,要认识到自己是“计算机+日语的复合型人才”,要多利用自己这方面的优势,而不是单纯地和计算机科班的人拼短板。虽然这名头在我看来不过是种讽刺而已,也可以解读为“计算机稀烂,日语也不怎么样”,但如果真的打算就业,扬长避短确实是当下需要考虑的,相比同样是二本工科院校计算机专业的学生,我确实多了一种可能性。

  • 面对这种可能性,又有另外两种不同的声音:有人说,日本IT互联网行业整体上并不如国内,在国内的发展要比日本强,日本企业制度森严,层级关系和加班传统逼人发疯;也有人说,日本是资本主义发达国家,同等水平下薪酬待遇要比国内强。自然到哪里做哪行,都有混得风生水起的人,但成长路径却截然不同。之前也看过一篇同样有此困惑的问答,但感觉我的情况可能更好一些,所以想了解得更深入。不知您是否能更详细地回答这个问题,或者有没有非常了解这方面的朋友,能够分享下经验见解呢?我想要的最终结果是,要么彻底击碎我这个幻想,让我能沉下心老老实实在国内找工作;要么给我勇气,从此踏上赴日的征程。


3)Java or Python?

  • 我知道这样问其实并不专业,更好的问题应该是技术方向而不是语言选择。之所以先说它,是因为语言给人的感受是非常直观的。我的感受是,Java谨慎但冗长,Python灵活但难懂,两者写起来更流畅的是Python。之前考虑到跟随潮流,Python大火,又是大数据和人工智能的主流语言,多学点也许会对读研有帮助,所以选择了深入学Python。但现在面向就业来看,似乎Python能做的事情并不多,而且需求也没有Java那样大。有人说Python是胶水语言,脚本语言,成不了大器,最后成就大型系统的,还得是Java;也有人说,根本没有必要把两个语言对立起来,因为它们各有特色,正确的做法是两者都用,干活时哪个顺手用哪个;还有人说,编程语言需要的是专精,精通一门胜过了解很多但都不够深入。众说纷纭,又都有道理,对此我的认识尚浅,所以有了这个困惑。

  • 更本质地说,是技术方向的选择。目前我了解到的方向,就是开发,测试,运维,再高端点的就是算法。开发又分为软件开发和网站开发,软件开发又分为桌面和移动端,网站开发又分为前端和后端。我对算法的兴趣很大,或者说了解得最深入,但也深知这个领域有多深多难,所见只是冰山一角;机器学习这种高大上的领域,自然谁都想蹭下热度,但难度也可想而知;NLP是我们学院未来主推的方向,老师们有能力的也在研究这个,听过领域泰斗的讲座,目前选修了这门课,其程度也不过是科普级别的,一涉及到数学理论就头痛不已,看见公式都不知所措;引库调API分个词倒是很有意思,但也不过是儿戏罢了。不读研的话,我想以后也无缘接触这些东西。开发的话,我最开始的想法是写一个网站,确实也写了一个特简陋的,但所谓的什么前端后端还是不懂;后来看到有很多大牛都会给自己写软件玩,所以对这个也有想法,但不知道该怎样实现,目前也没研究;同时正在学的软件工程太过枯燥,同样是理论,还不如四大专业课有趣。

  • 现在唯一意识到的事实就是,对各个方向的了解太浅,任何一块都没有深入研究过。但究竟应该研究哪个领域,我也摸不清头绪。实际上,我自认为Java学得要比Python好,了解的相对来说也更多一些,但更喜欢写Python;鉴于现在哪个都只停留在浅层,语法和简单应用,还没有深入到底层,去了解功能实现的源码和运行机制,所以选择哪个对我来说都是可行的,足够我研究好一阵子。

 

啰里啰唆写了这么多,请勿见怪。一方面是想把问题说得详细一些,描述一些我认为的“事实”,表达一些想法,希望尽可能多地暴露出认知上的错误,供您提出改进建议;另一方面,也是一种倾诉。现在的我,急于明确自己的方向,也贪心地想找到这个方向上的局部最优解,然后不后悔不留恋地勇往直前,遇见更厉害的自己。最后,非常感谢您能耐心地看完我这些幼稚的提问,也期待您的建议和见解。


这是有问有答栏目有史以来收到的最长的咨询邮件,这也是我决定回答的一个重要原因——因为你是真的想请人辅助自己分析一下。


这里我只回答考研还是就业这个问题。



首先,我从一个角度对软件开发工程师做个分类,方便我们讨论。


软件开发工程师可以分为应用型研究型胶水型三种。


所谓应用型开发工程师,主要做行业应用开发,比如一个医疗挂号系统、一个OA系统、一个电商网站的商品展示模块、一个流媒体平台的广告管理系统等等。他们的主要工作,是了解业务,使用某种编程语言+某些框架,结合数据库等数据处理手段,实现业务需求。简单讲,是搭积木。其发展方向是:如何更好的搭积木、如何把搭积木搭得更有效率、如何使得搭出的积木建筑更稳定更易于维护和扩展。


应用型开发工程师在软件开发工程师中占比最大,其门槛较低,薪水较低,未来发展空间比较有限,工作5~8年,技能水准和收入基本都会见顶,这也是你看到开发者群体整天讨论35、40这种年龄歧视问题的原因。(参考:你的收入何时见顶?怎么办?


见顶后基本出路如下:

  • 横向复制、螺旋成长,即不断用已有技能做新项目,在最新项目中淬炼已有技能或根据需要学习一些新技能。这些新技能,基本也都是应用型的。大部分开发者在这个道路上挣扎。

  • 转管理。这是很多人选的路,不过从概率上看,15~20%左右的开发者会走上管理路线。

  • 做架构。一个技术方向足够深,然后拓展技术宽度和视野,立足业务,成为T型人。能做到这个程度的,在应用型开发者群体中,也算是出类拔萃的。

  • 转型做其他的工作。


所谓研究型开发工程师,主要做算法和底层构件的开发,比如音频算法、机器学习算法、图像处理算法、网络传输算法等等。他们的工作,更为专精,基于抽象的算法或者底层模块来解决偏技术层面的问题或者已抽象为技术问题的业务问题。


常见的研究型开发工程师,有音视频算法工程师、机器学习算法工程师、深度学习算法工程师、图像处理算法工程师、数据挖掘算法工程师、推荐算法工程师、搜索算法工程师、自然语言处理算法工程师、语音识别算法工程师、数据科学家等等。


这些方向有几个特点:


  1. 学历和专业要求高。很多公司的JD中都标注数学、物理、计算、模式识别等相关专业硕士或博士。这一点去拉勾或猎聘都说我说的职位就可以确认。

  2. 需要持续不断在一个方向积累,既有知识、技能和经验非常重要。

  3. 报酬高。50k、80k一个月的JD,相当不少,做这类工作的,年薪百八十万的大有人在,翻过百万达到百十多万甚至数百万的,也不少见。

  4. 职业寿命长。这是由工作性质导致的——算法本身的更迭没那么快,而且往往是渐进性的。比如神经网络是几十年前的东西,这几年又大放异彩;比如噪声抑制、语音增强,都是发展了多少年的算法和技术。


在研究型开发工程师中,又有两类,一类是只做算法研究和实验,不怎么写代码的;一类是负责用编程语言把第一类研究的算法实现出来的,这类也要求很深的算法功底。


研究型开发工程师的未来方向比较明确:专家。


所谓胶水型开发工程师,是介于研究型和应用型之间,比如做SDK开发和API设计的,这类工程师,一方面衔接底层的算法,一方面对应用层提供接口。


胶水型工程师的要求比应用型要高一些,需要理解算法,需要有更好的程序设计能力。


这类工程师,更多存在于比较大型的公司或者转做技术解决方案的公司,因为只有这两类公司,才会投入资源在技术上做分层架构。



然后我们来分析你的情况。


你的学历为二本,在就业竞争中将处于劣势,很多好机会简历关通不过。


复习考研科目时存在明显的畏难情绪,实际也遇到一些困难。


对应用型开发方面的编程语言、做网站等等的了解,属于大学生中的正常水平:一知半解。这点没什么,多练习,慢慢涨涨经验就好了。


参加过一些算法竞赛,排名中上,有排名,有收获,应算是相当不错了。再深一步,感觉很吃力,实际开发中遇到算法、数学等相对深入的问题,理解不了。


综合这些情况,如果你本科毕业后直接工作,大概率找到的职位是应用型开发工程师


如果你觉得自己就是做做应用开发,干上十年八年再转行,那就现在出来。如果不甘于此,那就看长远一些,选择考研。


但为什么你会在考研和就业之间犹豫呢?


是因为你意识到考研对未来更好,但现在又吃不下学习研究的苦,感受到了很大困难,对考研失去了信心。


所以,你下意识里想回避考研,想去吃社会的苦,拒绝学习的苦,这与你的理性认识不一致,所以就纠结了。


为什么宁愿吃更久更多社会的苦,也不愿现在吃学习研究的苦?


这不仅仅是你的问题,是很多人的问题,有必要再展开来讨论下。



很多人之所以宁愿吃更多更久社会的苦也要逃避眼前学习的苦,第一个原因是:学习的苦就在眼前,压强很大,感受很强烈。社会的苦还没到来,有段距离,感受不是很强,而且在想象中可以分段、拉长周期、多次来吃,压力不大。


第二个原因是:我们脑子里总有一个幻想——说不定社会的苦吃一阵子抓住机会老子就飞起来了,再说,将来需要的话,老子还可以折回头来吃学习的苦。


现实点说,第二个原因,根本就是自我欺骗啊——我们犯了幸存者偏见的错误,把那些没怎么吃学习的苦又从社会的苦海中脱颖而出的个例当成了普遍现象,以为自己也能做到那样。但实际情况并非如此哦——我们往往高估了自己,或者有意高估自己以便合理化自己的选择。


其实第二个原因和第一个原因一样,都是从我们『尽可能推迟痛苦的发生时刻』这个底层习惯衍生出来的。


这个习惯会引导我们选择『关注眼前感受,确保眼下少吃点苦,把大痛苦延后』这种迁就策略,而一旦你这么选择了,就会习惯并用行动拥护自己所处的环境——哪怕这个环境比较糟糕,经常有点小小的不满意和痛苦。但是我们会习惯呀,真的会习惯呀,不但会习惯,还会合理化这个选择,觉得蛮舒适的,认为这是自己的舒适圈,进而害怕变化,因为一旦引入新的变化,可能会有更大的痛苦随之而来。


所以,我们顺着那个小小的幻想所做出的自以为埋藏了『必要时破釜沉舟必能崛起』之后招的选择,往往就没有后招了。我敢打赌:80%以上的人都会吃惯了社会的苦忘掉了自己当时设想的后招。


所以,到底是坚持算法、数学、考研这些将来会更好的选择,还是直接放弃它们,出来做开发,一定要慎重考虑哦。


理性的分析是:面向未来做选择,从长远利益出发,选择考研。


当然每个人都有个人情况,而如果你发现自己真的吃不了学习研究的苦(就是学不进去或者身体状况不允许),那选择直接就业,也是合适的。


如果决定出来,就要利用复合优势:你是懂日语的计算机专业学生。这种组合优势,使得你做对日开发或者到日企工作,成功的概率会比不懂日语的人高很多。


这样选下来,接下来就应该加强日语和计算机编程的能力了。



说了这么多,总结一下要点:


  • 优选考研这条路,它对长远未来更好。因为一方面可以从学历上给你更好起点,另一方面可以为做研究型开发工程师奠定基础。至于学不下去么,是有办法解决的,找人辅导、上考研班等等,都是可以尝试的。

  • 如果身体或心理状况不允许考研,就选择本科毕业直接工作,利用计算机+日语的组合优势去竞争更好的机会。


希望对你有帮助。

来自:程序视界(微信号:programmer_sight)

推荐↓↓↓
IT考研
上一篇:双一流、985、211、C9、34所、小985、小211....你想知道的都在这里 下一篇:我的大学实验室---下(成长)