原文出自(已与原作者联系):
https://github.com/OctopusLian/WeeklyARTS/tree/master/Share/2018-12
一、写作初衷&简单自我介绍
本科专业为计算机科学与技术,今年六月毕业后入职一家上市游戏公司从事游戏服务器端开发,九月中旬离开游戏行业,目前在一家互联网公司从事图形图像音视频算法岗,偶尔兼顾服务器开发。
为什么要写这样一篇文章,主要原因有两点:
1,根本原因:大学四年的学习 + 工作半年的实践与领悟,让我刷新了以前对技术的认知,在此记录一下;
2,直接原因:随着博客访问量的提高,总会碰到一些非计算机专业的其他工科生,理科生甚至文科生想要入IT行业,在此想尽我的微薄之力为他们提供一些真实有效的经验和学习方法,而不是被无所事事的人误导刚入门就去看《算法导论》,Linux内核源码。
二、计算机学科基础
计算机学科的专业课主要有这些
高等数学、概率论、线性代数:这些课程以前只是为了应付考试,但当我工作后才逐渐发觉,逻辑写入到底层时,是研究操作系统内部机理以及算法,而算法研究到一定层次其实就是在研究数学。比如音频加密中会用到傅里叶变换,概率论在人口预测和推荐系统中的使用,线性代数在图形渲染,计算三维坐标的应用等;
数据结构与算法:学编程肯定离不开这个。数据结构是定义数据存储的一种格式,而算法是解决某一特定问题所使用的方法,所以数据结构+算法+一门熟练的编程语言=你所要编写的程序;
C语言:大多数学校都会选择以C语言作为入门语言,还有一些学校以Java或Python作为入门语言,在此我不是想争辩C语言有多么好,但就从长远看来,我认为C语言是除了汇编语言之外第二个能将系统底层原理展示出来的语言,所以会有人说学懂了C/C++,看其他语言都不是很难了;
离散数学:和数据结构有着异曲同工之妙,属于计算机专业基础课;
单片机:计算机硬件方向必修课,涉及C语言/汇编语言学习,涉及电路知识,因为这门课,让我深入了解了数据在底层的传输;计算机组成原理:无论是以后做硬件还是软件都应了解的底层技能;
计算机控制原理:和自动化,机械设计专业共有的专业课,主要面对工业制造方面,控制原理中涉及许多积分、傅里叶变换;数据库:一般以SQL语句为主,涉及后端开发必须掌握了一项技能;
操作系统:当年把银行家算法、页面置换算法搞的妥妥的,就为了期末考试那40分大题,除此之外,还有进程、线程,安全的概念,属于底层技能;
计算机网络:凡是涉及网上收发消息,通信,都离不开网络编程,因此这块基础知识也得学习;
Linux操作:有时做开发需要在Linux操作系统环境下进行,所以要掌握Linux基础操作,属于专业基础课;
编译原理:这块涉及不深,不过据说是数据结构、编程语言、操作系统综合起来的一门学科,课程设计是做一个简单的编译器出来;
面向对象:学Java、C++语言进阶需要掌握的一种编程思想,当时我学习这门课时用StartUML画类图,时序图,它就像教你如何设计一个工程,而画的图就是做这个工程的图纸;
图形学:一门将技术和艺术结合起来的学科,非常有趣,兼具美感和深度,美是因为它做出来的东西确实好看,而且应用领域很广,深度在于它的学习有一定的门槛,比如线性代数,算法,还有空间几何和变换等;
信息/网络安全:涉及网络编程,加密的一门专业基础课,在我看来,这门课不是教你如何盗取对方电脑上的资料或者称为一名黑客,而是教你如何更好的保护自己的电脑,以及学习相关的安全法律;
模拟电路:大二的专业基础课,难度较大,当时也没学好,不过这门课对于了解计算机硬件世界很有帮助;
数字电路:大二的专业基础课,将开关状态转为01逻辑数字,进行一系列的操作。
三、计算机学科学习进阶
工作半年,意识到学校所学与企业所用,两者之间造成的断层是多么的深,所以有些公司会在新人入职时进行相应的培养,在此说下我的感受。
如果让我用优先级来判别的话,肯定是以你在公司目前岗位所需的技能进行优先学习,例如:
游戏服务端:掌握C++/Go这些语言的基础,再学习下TCP/IP,线程安全,会写常用的数据库查找语句;
游戏客户端:熟练Unity操作和C#脚本编程,熟悉Shader原理和渲染管线;
图形渲染:熟练使用C++编程,理解操作系统原理,有良好的数学基础,熟悉常用的图形学算法,最好能自己写一个软件渲染器出来。
以上三个岗位是我接触后了解了需求总结得到的,在此掌握的基础上,然后学习你想学习的东西。
进阶阶段可以通过刷编程题,或者做一些小demo来实践你所学的内容,例如:
可以通过写一个包含线程安全的多人在线聊天室,来熟悉Go语言或C++编程,网络基础和数据库操作,锁机制 Github地址;(https://github.com/OctopusLian/Golang-OnlineChatRoom)
可以通过写一个3D/2D射击小游戏,来熟悉Unity游戏引擎的操作,以及C#脚本代码的编写,如果考虑多人联网,那就去复习服务器端相关技能 Github地址;(https://www.cnblogs.com/OctoptusLian/p/7367641.html)
可以通过写一个3D旋转的时钟,来熟悉图形学中的纹理贴图,搭建三维场景的框架等 博客文章地址;(https://www.cnblogs.com/OctoptusLian/p/7367641.html)
可以通过把一个99码表计时器,来熟悉单片机课程的基础知识,以及Proteus软件的操作,还有C语言的硬件编程,如果还想进一步挑战自己,可以将C语言转成汇编语言来实现它,或者把码表来改进增加其他功能 博客文章地址;(https://www.cnblogs.com/OctoptusLian/p/6224065.html)
四、一些吐槽 + 经验
1,学编程必须要精通数学吗?
如果你是找计算机相关工作的话,在我看来没有必要。
用到什么学什么。精力有限,你不可能为了搞懂一个空间坐标变换而把一本线性代数,矩阵论看一遍;也不可能为了一个加密而把大学高等数学全部学一遍。
2,学编程必须要有电脑吗?
我高中学编程用算术本写程序,在我看来电脑只是为了帮你验证你的程序是否可以跑起来,同时它自带首行缩进,语法高亮,还有在线查问题的功能。
以前看一些人为了学编程在手机上下载编程软件,在我看来没有这个必要。
3,算法岗,开发岗、测试岗和技术支持岗的区别是什么?
如果把我们做出来的东西比作一辆车的话
算法岗:根据使用场景造轮子,思考如何让车跑的更快,是造方的好,还是圆的好,还是三角的好;
开发岗:熟练将轮子与发动机衔接好,将轮子与各个模块装好,并使其跑起来;
测试岗:车子在跑的过程总要经过各种场景的测试才可以投入量产,这时候他们会把各种测试数据采集,分析,遇到数据异常的发给开发岗和算法岗来进行优化,改bug;
技术支持岗:车子在投入量产后,总会在用户那使用中碰到一些小问题,这时候先由技术支持岗的负责人前去排查问题,看是操作不当,还是轮子到期该换了,还是轮胎那有个缺口,如果他们解决不了,再找开发。
4,有没有必要从头到尾把 CSAPP,C++ primer这样的超过七百多页的书从头到尾看一遍?
如果时间充裕,当然最好是认认真真看几遍,但我平时经常把它们当做手册来查阅,带着问题去看。
5,学习编程有必要学习英语吗?
有必要,但不是绝对。
我时常看到一些人因为看不懂英文而头疼说是要把考研英语大纲8000个词汇背完,当然这是好事,但或许是拣了芝麻丢了西瓜。
我刚入职算法岗时曾被打击英文阅读能力差,因为老大给的所有参考资料都是英文的,为此我开启了一个英语学习的开源项目VocabularyMap。但是据我了解,我们平时所经常使用的英语词汇最多不超过一千个,加上你所在岗位的特殊专业名词,不超过一千五百个,而且句式较为简单,不像考研英语阅读那么喜欢拐弯抹角的表达意思(这个形容词我想了很久),你只需在阅读英文时,把中文思维调整为英文思维,单词多看几遍记住意思即可。
6,自学还是报培训班学比较好?
如果有半年的充裕时间,建议选择自学,如果自制力差,可以找几位靠谱的朋友一起学习,实在不行再去报培训班。
7,关于刚毕业找工作
慎入培训机构和外包公司。
刚毕业建议去大厂工作一段时间,在这里面会遇到许多有特点的人,同时也会学习到他们思考问题的方式,这对自身长远发展都是非常有利的。
8,公司都在看有没有个人博客和github账号,我需要申请一个吗?
坚持写博客和整理写过的代码是一个好习惯,但既然选择去做就坚持下去,不要为了面试,为了找工作去随意丢几个代码上去,也不要刻意去发一些水文,甚至不要为了github上的Stars和Followers而故意去造假。
面试是看你的专业基础能力是否与所面试的岗位匹配,以及在公司是否可以长期干下去的稳定性,博客和Github只是展示你能力的一部分体现,莫要本末倒置。
9,现在公司不用汇编做开发,是不是就代表它已经不重要?
其实这样的问题还有个变形,例如,C语言岗位招的少了,是不是代表它即将要被淘汰了?
在我看来,编程语言没有高低贵贱之分,只有适用场合的不同。那些所谓的排名也是根据每年的需求量而不断变化。因此,存在即是合理,也许它现在没有什么用途,但在未来某一新发现的领域中会起到不一样的作用。对技术存在包容,那么对自己能力的提升也是有一定好处的。
五、写在最后
2018这一年,我经历了考研失败带给我的痛苦,经历了校园春招带给我的打击和培训机构的骗术,我庆幸有父母对我的宽容与理解,女友的不离不弃带给我的鼓励,还有每一位前辈和好朋友的加油,最后在毕业时经历四轮面试拿到了上市游戏公司研发岗的offer,在这里我收获了宝贵的开发经验,结识了许多能力强又不失低调的伙伴,代表了开发团队去厦门参加48小时游戏开发大赛最后的Pitch Time,最后也因工作原因离开游戏行业,选择进入图形图像和音视频算法领域进行历练。
犹记得进去的第一天,发现部门内基本都是硕士研究生毕业,或者是工作3-5年的老哥,只有我一位稚气未脱的本科毕业生,接着一周五天,连续打击了我的C++编程,VitualStudio软件操作,英文翻译水平和提出的问题(因为太简单)。
但也正是如此,使我跑开了曾经学校戴在我身上的枷锁,使我在不断的遇到问题和解决问题的过程中,逐渐缩小着与周围大佬的差距。
谨以此文,记录我从象牙塔出来后的半年时间完成的蜕变,同时写给那些想跨行转计算机的人,希望这篇文章能帮助你们解决一些学习上的困惑。
距离2019年还有半个月的时间,收拾好心情,一起努力!
这是一条正经的分割线觉得文章不错的的,欢迎点好看转发,长按下图关注程序员乔戈里,收看更多精彩。
作者乔戈里亲历2019秋招,哈工大计算机本硕,百度java工程师,欢迎大家关注我的微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有每天一道leetcode打卡群与技术交流群,欢迎关注。
有疑问加站长微信联系(非本文作者)