总结现状
如今
今天是周五,等会就周六了。虽然平时经常忙活在电脑前,但好像没在做什么特别有意义的事情,看到github一个好项目就想着去看它的源码,然后呢,迫于水平不够,一堆工具也掌握的不利索,怎么也没法开始学。其实大概是自己内心不知道以后到底想去做什么吧。其实2,3w行的代码如果搞懂它的流程,而且又熟悉相关语言并懂得一些相关方向的知识,应该是可以开始看了,起码不应该想到看就害怕而退缩,这连第一步都没有走呢。
想法
比较坚定的想法呢是以后做编译相关工作,这个工作岗位很少,要求也很高,许多大神高中就开始接触了。我呢,现在还半吊子,最近才开始理解了最基本的知识,将来如果要考研,这应该是计算机体系结构这个方向的研究生吧。而这2个月一直在学机器学习,但我只是对它的原理好奇,又想着机器学习方向能跟数学打交道,又能锻炼算法能力,便很欣然地参加了这次暑假集训。最近这个月有些忙坏了,但又觉得自己学到知识很少,可能是太贪心了吧,自己对计算机许多方向都感兴趣,但未曾深入其中一个。我还经常跟同学说那句话:不要总想着以后要干嘛,你现在在干嘛,以后很可能就在干嘛,所以要干嘛就赶紧现在就开始干。其实我自己也没有做到我所说,虽然我非常希望自己能做到。
兴趣
最近查阅了一些资料,其实都是自己以前都看过,只是很多不少都忘记了或者没有重视起来。记得大一时候对C++兴趣特别浓厚,买了C++primer和STL源码剖析,还很认真看过(但没怎么敲代码),后来接触了的其他编程语言,C++也基本没有使用过了。现在要是还记得大一C++要求的内容就不错咯。
但我知识,我想以后从事的方向很可能离不开C++(至少10年是这样)。不论是机器学习或者是编译原理,还是网络编程,在高性能的场合,永远需要它。
目前我比较感兴趣的是编译原理,机器学习,网络编程吧。 这三个都可以学很深,无底洞。编译原理简单的话,写个编译器前端,嗯,可能还不如自动化工具强,学的深入了,就得学后端了,代码优化,无底洞,国内好像没几家公司需要这种人才(大概更不需要应届生吧)。不过作为“永不失业的职业”,我对编译原理里面的设计成分更感兴趣,即自制语言。而如果作为一个应用开发者的话,约束应该大很多了,很多时候公式让你做的跟你的兴趣点完全无关,再考虑国内公司的尿性,不让你干缺德的就不错了。
扯远了,关于“设计”这种概念,对于机器学习跟网络编程,也同样适用吧。机器学习重在解决问题,而设计算法是重要环节,这里设计部分可能要发挥脑力,而不是跟风地调用算法,我觉得这里也是很有意思的部分,但如果是解决商业问题,或者做项目的话,自由度感觉不大,倒是留在实验室研究什么的更有意思(虽然最近就是留实验室学习,有点小枯燥)。而网络编程,重点是在网络层以上的开发,打交道是传输层跟应用层,设计协议是很有意思的一环。怎么样的协议更有语义,更高效,更安全,扩展性强,我觉得这部分自制性很强,也是很有研究的感觉。
隐隐约约觉得以上三个方向深入研究最后都要跟并发或性能打交道。毫无疑问,编译原理,优化部分,可能需要把代码隐式转换为并发代码,或者编译成适合并发的机器代码。机器学习虽然是高阶算法,但依托于大数据平台,而底层需要高并发,分布式的架构。有时候算法策略本身可能需要考虑容易并发,而如果设计一个机器学习平台或者系统,底层模型肯定到处是并发,也明显需要分布式。网络编程呢,则是为了更好的进行数据交换,也是并发的策略之一,更是分布式计算的基石。
以上三个方向,在底层方面最需要的便是C++了。众所周知C++是比较难掌握的,虽然现在情况在变好,但我其实还蛮担心自己毕业前连基本的STL都用不好。
基本规划
好像写了这么多,还是不清楚接下来应该如何去学习知识,在这最后的2年时间。其实下个学期课挺多的,而且都是比较难的课,虽然大部分我都挺感兴趣的,但精力一旦不足,我容易对计算机感到一种疲惫,然后几天不碰。而下个学期如此多的课的情况,在学好课内之余如何把课外感兴趣的知识补上呢(C++,机器学习,网络编程深入学习)。可能就只能在周末多抽出时间学习了吧。 算上准备考研,也该多用用C++了,这样数据结构也算复习了。而下学期部分课需要一些数学知识,正好稍微注重一下复习数学,也算事半功倍了。网络编程这部分,即使只是简单地学习,对计算机网络这门课帮助也不少啊,感觉咬咬牙,下学期真的能学到很多知识吧,只希望自己不要自暴自弃,要善于总结学到的知识。
如此一想,感觉也想通了一些,毕竟学习编译原理,计算机网络,操作系统的时候是完全可以用C++来实现相应的功能的,这也锻炼了我C++的水平,但可能目前完全达不到吧,所以打算暑假稍微学习一下C++。
嗯,决定了,暑假还剩一个月,我打算学习以下内容:
- 机器学习跟深度学习,这部分跟实验室进度来,尽量不落下吧
- C++,看些简单的源码,学习一下STL,把忘记的捡起来
- 简单的编译原理学习,实现几个简单的玩具编译器(已经跟着博客抄了一个,感觉还需要再写一个),如果可能的话,用C++来实现
- 网络编程,这一块,估计很麻烦,我基本没有实战过,倒是有基本的理论知识,理想情况下应该是golang或者nodejs来写(它们封装的很好,写起来难度容易接受),C++写的话,估计写一个月也写不出什么。所以尽量暑假尝试写个简单协议(突然想起来之前写redgo,有机会完善下)
其实对C++一向是又爱又恨,爱是觉得这门语言太重要了,感觉如果掌握,用其他语言也就游刃有余了,而且有些语法感觉真的很厉害。恨是觉得这门语言太复杂了,我掌握很吃力,而且有些语法根本就是坑,基础设施STL也是非常复杂。写项目的话,我连相应的流程,工具,环境都不了解。
现在已经周六了,大概就写到这里了,其实我也是编写边梳理自己的思路。 写出来呢,可以经常看,这样自己就不会忘记对自己的严格要求了。每次面对电脑,2小时也不做点有意义的事情的时候,你就会觉得自己真是非常没用,那句话怎么说来着:回首过去,尽是些可耻往事。
大概不论爱好什么,最简单证明自己的热情,是不留余力地享受自己的爱好吧