第20期 - 英硕学习
伯明翰大学转码项目第一学期总结学习篇
我的背景
本科商科自学转码前端开发,已经有6年的前端开发经验。但是由于不喜欢国内的职场环境和不想自己限制于前端方向,选择了 再花一年时间读个硕士再系统的学习一下计算机,后续打算转到软件开发。
学期课程
这学期总共有三门课:1、python 2、计算机系统 3、AI and ML
-
python 对于我来说比较简单,除了语法的熟悉,也帮助了我学习如何用英文来描述一些编程术语,也感受到了python 这门语言的魅力,它的灵活性、简洁性,特别是在集合和列表上的操作,这也是python大量运用于AI和ML的原因。因为它能够快速的进行大数据量的矩阵操作,比如相关库numpy。
-
计算机系统:这门课实际上是由计算机组成、计算机结构、计算机网络三门课组合。对于非科班出生的我能够系统性的学习计算机基础相关的知识还是很有必要的,深刻的感受到从二进制到操作系统到网络,其实每个小的知识点后面都很许多值得去深入挖掘和思考有趣的地方。 比如二进制相关文本、颜色、图片实际上都是由二进制表示的,那么是怎么一个规则去表示如此庞大数据量的文字,颜色在计算机内部是怎么存储的为什么用可以用RGB来表示。
在操作系统中是计算是如何去理解高级语言的,如何去识别和存储操作符顺序的,比如一个简单的数学表达式(A + B) * 3, 这里就用到了我印象超级深刻的一个标记法Reverse Polish Notation(RPN),将这个标记法和栈结构相结合存储就能够巧妙 的将数学计算方法中的顺序表达出来。
再比如计算机网络中的TCP协议和UDP协议各自的特点和协议的执行过程,这个问题在以前面试的时候经常会问到,我当时 对这种问题很排斥,因为我觉得这是一道死记硬背的文本问题,感受不到它在实际开发中的意义。但是这次学习让我对它改观了 在学习这种设计规则的看起来是概念性的问题的时候,首先可以先问一个问题为什么有这个协议?这些协议的出现一定是为了 解决某类或者某个问题才出现的。就像这里的TCP和UDP传输层协议一样,他们是为了解决在传输过程中一定可能会发生的传输 错误比如丢包或者包混乱的问题出现的。那么为了解决这个这个问题,人们就思考一个叫RDT(Reliable Data Transfer) 也就是在不可靠的信道上如何实现可靠传输的原则。而TCP协议只是这个原则的实现,那么这个RDT原则其实是一个可适用所有在不可靠信道传输的解决方案。
按照这样的思考方式来学习你会觉得这个问题会变得有趣,当你看到前人们精妙的解决方案的时候就会被他们的智慧所感染。这也是学习能够给你带来快乐的原因。
- AI & ML 这门课是难度最大的,AI主要的是学习优化算法比如SDP下的贪婪和动态规划,还提到了一部分逻辑。ML介绍了分别介绍非监督学习和监督学习下的特征算法,比如最基础的线性回归(理解梯度下降找最优解)、分类算法K-means,感知器、以及涉及了一点深度学习 相关的内容CNN(卷积神经网络),还有和概率论相关的贝叶斯模型和隐式马尔科夫链。在学习这门课的时候需要同时补一些数学知识。比如线性规划中的矩阵向量,还有微积分中的导数和偏导数,以及概率论,我的经验是这些知识可以边学边补,不用系统学习。学完这门课程之后我对AI和ML有一个整体的认知,感觉是一个刚刚入门阶段:明白了AI和ML的是解决了什么问题,AI其实是更多的是一个用算法来找最优解的问题,而ML是通过已有数据发现模式然后根据模式预测未知问题。
课外学习
公开课
除了学校的课程,还课余看了两个课程 一个是吴恩达的机器学习, 这门课我当做和学校的课程互补,有时候学校老师没懂的,我看吴恩达的再巩固一下就明白了。 一个是哈佛大学的CS50s,我实在是太喜欢这个老师了,讲课激情洋溢,slides的例子都是动画形式,非常精美有趣,目前 只是过了一遍lectures,课程的作业还没来得及时间做,因为现在我的优先级最高的是先把leetcode刷一下,巩固一下基础 的数据结构与算法能力。因为我知道这门课的作业难度实在是不小。
leetcode
最近又开始把leetcode捡起来,开始发现刷题也变得有趣了,而且一些之前难以理解的知识点现在我有耐心和信心来解决了。 总结一下之前刷leetcode的方法非常错误:
- 心态问题: 之前是觉得我已经有了几年的工作经验了,有时候连简单题都不会写挺挫败的。然后其实就开始去逃避去做这件事情,因为你不去做就不会有问题,但是我知道我内心深处还是有这个砍,其实这是我害怕的一部分,如果不解决这个我害怕的部分,我会一直有一个结,这个会潜移默化的影响你对这个职业方向上的自信心。
现在心态调整为leetcode和工作上所需的知识其实交集不大,leetcode更多的是数据结构和算法的应用,而工作中是应用上的工程知识,。也就是说如果对于一个非科班生,即使是你工作了,你也很少有机会得到这方面知识的学习和锻炼,首先调整好心态是很重要的,把leetcode学习当做一个全新的学科和学习数学一样来看待。
- 算法学习方法问题:
-
不要一上来就刷题,首先理解数据结构的特点,解决了什么问题,该数据结构的基础操作后再刷题。比如链表,先把链表的操作删除节点、添加、反转,双向链表这些基础知识掌握了再去刷题,题目都是建立在这些基础操作之上的,这样能减少你刷题的挫败感。
-
每次都去思考一下这个结构的实际应用场景 这样可以加深理解和让你觉得学有可用。还是拿链表举例,刷完链表题目之后你知道链表的可以用在哪些场景吗? 如果最近访问列表,比如操作系统的内存分布等,小型的编辑器的撤销操作,知道了这些应用点之后还可以写一个小demo,把这个数据结构实际的应用起来加深理解。
不好的地方
- 经常犯懒,逃掉早九。冬令时后实在是太好睡了。
- 没有很主动的去找老师交流,office hours没有去过,没有和教授邮件沟通过,有问题但是有时候犯懒,感觉用英文来描述就很累了,下学期一定要珍惜这些机会。
- 没有利用好学校的职业指导资源和外国人交流还不够主动。