注: 文章是二十多天前写好发布在博客园上, 因机缘巧合看到掘金举办征文活动, 特来凑个热闹.^_^
一, 写作初衷 & 简单自我介绍
本科专业为计算机科学与技术, 今年六月毕业后入职一家上市游戏公司从事游戏服务器端开发, 九月中旬离开游戏行业, 目前在一家互联网公司从事图形图像音视频算法岗, 偶尔兼顾服务器开发.
为什么要写这样一篇文章, 主要原因有两点:
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 语言岗位招的少了, 是不是代表它即将要被淘汰了?
在我看来, 编程语言没有高低贵贱之分, 只有适用场合的不同. 那些所谓的排名也是根据每年的需求量而不断变化.
因此, 存在即是合理, 也许它现在没有什么用途, 但在未来某一新发现的领域中会起到不一样的作用. 对技术存在包容, 那么对自己能力的提升也是有一定好处的.
五, 写在最后
2018 这一年, 我经历了考研失败带给我的痛苦, 经历了校园春招带给我的打击和培训机构的骗术, 我庆幸有父母对我的宽容与理解, 女友的不离不弃带给我的鼓励, 还有每一位前辈和好朋友的加油, 最后在毕业时经历四轮面试拿到了上市游戏公司研发岗的 offer, 在这里我收获了宝贵的开发经验, 结识了许多能力强又不失低调的伙伴, 代表了开发团队去厦门参加 48 小时游戏开发大赛最后的 Pitch Time, 最后也因工作原因离开游戏行业, 选择进入图形图像和音视频算法领域进行历练.
犹记得进去的第一天, 发现部门内基本都是硕士研究生毕业, 或者是工作 3-5 年的老哥, 只有我一位稚气未脱的本科毕业生, 接着一周五天, 连续打击了我的 C++ 编程, VitualStudio 软件操作, 英文翻译水平和提出的问题 (因为太简单).
但也正是如此, 使我抛开了曾经学校戴在我身上的枷锁, 使我在不断的遇到问题和解决问题的过程中, 逐渐缩小着与周围大佬的差距.
谨以此文, 纪念我从象牙塔出来后的半年时间完成的蜕变, 同时写给那些想跨行转计算机的人, 希望这篇文章能帮助你们解决一些学习上的困惑.
最后安利我开启的几个开源项目
英语学习 (一年时间内做完) https://github.com/OctopusLian/VocabularyMap
计算机网上资源分享 https://github.com/OctopusLian/CS-Resources
2019, 一起加油!
掘金年度征文 | 2018 与我的技术之路 征文活动正在进行中......
来源: https://juejin.im/post/5c3707d36fb9a049eb3c224f