Fork me on GitHub 打赏

2018年终总结_四年计算机科班学习经验分享+半年工作感悟

一、写作初衷&简单自我介绍

本科专业为计算机科学与技术,今年六月毕业后入职一家上市游戏公司从事游戏服务器端开发,九月中旬离开游戏行业,目前在一家互联网公司从事图形图像音视频算法岗,偶尔兼顾服务器开发。

为什么要写这样一篇文章,主要原因有两点:

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地址
  • 可以通过写一个3D/2D射击小游戏,来熟悉Unity游戏引擎的操作,以及C#脚本代码的编写,如果考虑多人联网,那就去复习服务器端相关技能 Github地址
  • 可以通过写一个3D旋转的时钟,来熟悉图形学中的纹理贴图,搭建三维场景的框架等 博客文章地址
  • 可以通过把一个99码表计时器,来熟悉单片机课程的基础知识,以及Proteus软件的操作,还有C语言的硬件编程,如果还想进一步挑战自己,可以将C语言转成汇编语言来实现它,或者把码表来改进增加其他功能 博客文章地址

 

四、一些吐槽 + 学习经验

1,学编程必须要精通数学吗?

如果你是找计算机相关工作的话,在我看来没有必要。

用到什么学什么。精力有限,你不可能为了搞懂一个空间坐标变换而把一本线性代数,矩阵论看一遍;也不可能为了一个加密而把大学高等数学全部学一遍。

 

2,学编程必须要有电脑吗?

我高中学编程用算术本写程序,在我看来电脑只是为了帮你验证你的程序是否可以跑起来,同时它自带首行缩进,语法高亮,还有在线查问题的功能。

以前看一些人为了学编程在手机上下载编程软件,在我看来没有这个必要。

有些人会把写不了程序怪自己没有电脑,或者键盘敲着没有手感,在我看来完全是为了逃避困难而找的借口。

 

3,算法岗,开发岗、测试岗和技术支持岗的区别是什么?

如果把我们做出来的东西比作一辆车的话

  • 算法岗:根据使用场景造轮子,思考如何让车跑的更快,是造方的好,还是圆的好,还是三角的好;
  • 开发岗:熟练将轮子与发动机衔接好,将轮子与各个模块装好,并使其跑起来;
  • 测试岗:车子在跑的过程总要经过各种场景的测试才可以投入量产,这时候他们会把各种测试数据采集,分析,遇到数据异常的发给开发岗和算法岗来进行优化,改bug;
  • 技术支持岗:车子在投入量产后,总会在用户那使用中碰到一些小问题,这时候先由技术支持岗的负责人前去排查问题,看是操作不当,还是轮子到期该换了,还是轮胎那有个缺口,如果他们解决不了,再找开发。

曾经因分不清技术支持和技术研发而在一场面试中尴尬了,面试详情如下 海康威视2017校园秋季招聘技术支持工程师面试经验

注:以上四个岗位也是根据我的观察和工作来熟悉的,如果有前辈或同行觉得有误导,请及时在下面提出来。

 

4,有没有必要从头到尾把 CSAPP,C++ primer这样的超过七百多页的砖头书从头到尾看一遍?

如果时间充裕,当然最好是认认真真看几遍,但我平时经常把它们当做手册来查阅,带着问题去看。

 

5,学习编程有必要学习英语吗?

有必要,但不是绝对。

我时常看到一些人因为看不懂英文而头疼说是要把考研英语大纲8000个词汇背完,当然这是好事,但或许是拣了芝麻丢了西瓜。

我刚入职算法岗时曾被打击英文阅读能力差,因为老大给的所有参考资料都是英文的,为此我开启了一个英语学习的开源项目VocabularyMap。但是据我了解,我们平时所经常使用的英语词汇最多不超过一千个,加上你所在岗位的特殊专业名词,不超过一千五百个,而且句式较为简单,不像考研英语阅读那么喜欢拐弯抹角的表达意思(这个形容词我想了很久),你只需在阅读英文时,把中文思维调整为英文思维,单词多看几遍记住意思即可。

 

6,自学还是报培训班学比较好?

如果有半年的充裕时间,建议选择自学,如果自制力差,可以找几位靠谱的朋友一起学习,实在不行再去报培训班。

 

7,关于刚毕业找工作

慎入外包公司。

刚毕业建议去大厂工作一段时间,在这里面会遇到许多有特点的人,同时也会学习到他们思考问题的方式,这对自身长远发展都是非常有利的。

如果不在大厂,那就静下心来先做好眼前的事,再想办法提升自己。

 

8,公司都在看有没有个人博客和github账号,我需要申请一个吗?

坚持写博客和整理写过的代码是一个好习惯,但既然选择去做就坚持下去,不要为了面试,为了找工作去随意丢几个代码上去,要是那样我一天可以写出几十篇,甚至不要为了github上的Stars和Followers而故意去造假。

面试是看你的专业基础能力和在这个公司继续干下去的稳定性,博客和Github只是展示你能力的一部分体现,莫要本末倒置。

 

9,现在公司不用汇编做开发,是不是就代表它已经不重要?

其实这样的问题还有个变形,例如,C语言岗位招的少了,是不是代表它即将要被淘汰了?
在我看来,编程语言没有高低贵贱之分,只有适用场合的不同。那些所谓的排名也是根据每年的需求量而不断变化。
因此,存在即是合理,也许它现在没有什么用途,但在未来某一新发现的领域中会起到不一样的作用。对技术存在包容,那么对自己能力的提升也是有一定好处的。
具体感受可以参考这篇文章浅谈单片机中C语言与汇编语言的转换

 

五、写在最后

2018这一年,我经历了考研失败带给我的痛苦,经历了校园春招带给我的打击和培训机构的骗术,我庆幸有父母对我的宽容与理解,女友的不离不弃带给我的鼓励,还有每一位前辈和好朋友的加油,最后在毕业时经历四轮面试拿到了上市游戏公司研发岗的offer,在这里我收获了宝贵的开发经验,结识了许多能力强又不失低调的伙伴,代表了开发团队去厦门参加48小时游戏开发大赛最后的Pitch Time,最后也因工作原因离开游戏行业,选择进入图形图像和音视频算法领域进行历练。

犹记得进去的第一天,发现部门内基本都是硕士研究生毕业,或者是工作3-5年的老哥,只有我一位稚气未脱的本科毕业生,接着一周五天,连续打击了我的C++编程,VitualStudio软件操作,英文翻译水平和提出的问题(因为太简单)。

但也正是如此,使我跑开了曾经学校戴在我身上的枷锁,使我在不断的遇到问题和解决问题的过程中,逐渐缩小着与周围人的差距。

谨以此文,记录我从象牙塔出来后的半年时间完成的蜕变,同时写给那些想跨行转计算机的人,希望这篇文章能帮助你们解决一些学习上的困惑。

最后安利我开启的两个开源项目

 距离2019年还有半个月的时间,收拾好心情,一起努力!

(本文内容已同步至Github-WeeklyARTS计划)

 

posted @ 2018-12-11 17:16 Zoctopus_Zhang 阅读(...) 评论(...) 编辑 收藏
// function btn_donateClick() { var DivPopup = document.getElementById('Div_popup'); var DivMasklayer = document.getElementById('div_masklayer'); DivMasklayer.style.display = 'block'; DivPopup.style.display = 'block'; var h = Div_popup.clientHeight; with (Div_popup.style) { marginTop = -h / 2 + 'px'; } } function MasklayerClick() { var masklayer = document.getElementById('div_masklayer'); var divImg = document.getElementById("Div_popup"); masklayer.style.display = "none"; divImg.style.display = "none"; } setTimeout( function () { document.getElementById('div_masklayer').onclick = MasklayerClick; document.getElementById('btn_donate').onclick = btn_donateClick; var a_gzw = document.getElementById("guanzhuwo"); a_gzw.href = "javascript:void(0);"; $("#guanzhuwo").attr("onclick","follow('33513f9f-ba13-e011-ac81-842b2b196315');"); }, 900);