如果回到学习计算机的最开始,你会选择如何学习计算机呢?
怎么开始?
做为学习了 4 年计算机专业的学生,从大专到本科的学习,可以明显的感受不同的老师,不同的学校,不同的学习方式对一个人的学习成长尤其是计算机方面,有着非常大的影响。
指出学生时期曾经相信的一段谬论:学校对你没有什么用,只要有能力就可以。 其实大多数时候这句话都是 自我安慰。临近实习工作,才发现如今计算机专业的学生差距如此之大!
有人学了几年计算机,连学习的编程语言所用的编译器是什么也不知道,因为没怎么去上过课,或者说上课也没怎么听。毕业之后很大概率也是做着和专业不相关的事。
而如今国内一流的学校,多少有一些计算机的实验室或是社团,寒暑假都在忙着准备比赛 / 做项目,在毕业的时候就具备了两三年的水准的工作能力,这也是为什么应届毕业生能够拿到几十万高薪的真正原因。企业的本质目的是盈利,所以要想凭借工作获得更多的收入,首先你要给企业带来更多的利润。
如果是在一所不太出众的学校,去找一些培训机构基础班的课学习,豆瓣上搜一下相关的书单或是评分较高的书进行系统性的书籍学习,当然如果你有能力学习国外的一手资源自然是首选。如果能做到这一步,起步阶段你就超越了大多数计算机专业的学生。
当然,如果你已经在一所国内顶尖的学校学习了,那尽早加入相关的 实验室/社团 早点接触实际的项目,培养自己学习计算机的兴趣,找到自己要发展的方向当然是最好的。当然一定不要忘记参加 ACM 竞赛,这是计算机专业最有含金量的比赛了。
ACM国际大学生程序设计竞赛:英文全称:ACM International Collegiate Programming Contest(简称ACM-ICPC或ICPC)
是一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过30多年的发展,国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛
学习什么语言?
对于第一门编程语言,我推荐 python / JavaScript ,这也是皓叔在「左耳听风」专栏所推荐的,入门语言最重要的是培养对于编程的兴趣,同时训练出自己的编程思维,学会如何用编程来解决实际问题。
当然 C 语言是我认为系统性的学习计算机所要了解的,至少要学习完 C 语言的指针到底是什么,当你学习完 C 语言中的指针再回过头看 Java、C# 等高级编程语言中的引用传递、值传递就会更清晰。
Java 是皓叔专栏所推荐的正式入门语言,作为长期占据编程语言使用人数榜首的 Java,你应该仔细感受它的魅力(对于初学者,这可是一门劝退的语言),尤其是国内的就业环境,学习静态的面向对象语言,它是首选。
有什么专业课一定要学?
如果只是做些小项目,做做简单的增删改查,不学习计算机的专业课当然问题不大。但是做一个程序员,谁又甘心只做「脚本小子」呢?
计算机专业有 5 门核心专业课:计算机组成原理、计算机操作系统、数据结构与算法、数据库原理、计算机网络。
到底有什么重要的?
计算机组成原理,告诉你代码中 int、for、break 是怎么在计算机中转换成指令,进行运算的,即一个程序究竟是怎么跑起来的。
计算机操作系统,告诉你,一个 2 G 内存条,怎么运行 4 G 大的游戏或者软件。多个程序运行怎么安排他们的执行顺序,按部就班,谁先来谁先运行(FIFO 先进先出);效率优先,谁先跑完谁先做(JSF 短进程优先);都别吵,露水均沾,一人玩几分钟(时间片轮转)… 小小的 CPU 如何管理整个计算机资源 —— 大型分布式系统中,如何做到负载均衡?
数据库原理,如何把业务转换成具体的数据模型,该如何设计数据表(范式),同样查询一张表,为什么加了索引快了十倍?数据插入了一半,系统重启了,怎么把原有数据恢复?
数据结构与算法,数组为什么可以按下标随机访问数据,链表只能傻傻的从头结点一个个遍历为什么要创造这种数据结构?吃东西,每次都把能吃的全吃了(贪婪算法 —— 最好的,我都要)一定是最好吗?动态规划 告诉你,按照计划来,长远规划才能取得最优解。
计算机网络,微信聊天,一段文字是怎么传到对方手机上的。视频聊天怎么有时候网络不好的时候画面不太连贯(UDP 协议,不提供可靠交付),文字怎么不会少几个字(TCP 协议,尽最大努力交付)。
这 5 门课并没有直接的告诉你,如何设计一个合格的程序,编写出可靠的代码,但是它们本身就是计算机领域的经典或是最佳的实践。
推荐一门课:哈佛大学的 CS50,B 站上有资源,作为计算机的入门了解,这门课超越了国内绝大多数老师所讲述的专业课(既有趣味性又有一定的专业了解)。
英语真的很重要吗?
只有英语不太好,平时不怎么看国外资料的人会觉得英语不重要。
最好的编程问答网站—— StackOverflow 都是英文交流,而 GitHub 上面的优质项目/ 交流 也都是英文。更不用说一手的编程学习资料,都是英文的(例如:Spring 官网只有英文资料),许多优秀的外国书籍都需要经过四五年才会被翻译成中文。
学习英语也不局限于学习国外的一手资源,也是打开新的思路,例如不同的编程语言,动态的和静态的,面向对象和面向过程的不同的类型会加深你对编程的认识也会让你有更广阔的思维去思考问题。
随着高校对计算机专业的重视,学生能力的差异变得更大了。加上近几年互联网红利的褪去,如果说以前可以高中毕业通过培训进入一流公司做程序员,现在来看似乎不太可能了,即使是科班生也可能不太知道该如何学习计算机这个专业,甚至面试也不具备与岗位相匹配的实力,只有真正在大学四年中认真学习计算机专业的知识,并多参与项目的实践,寒暑假参加大厂的实习才有可能获得大厂的 offer。
如果重学计算机,以上我所提到的 4 个方面是我认为至关重要的,如果你还是一个尚在大学的学生,可以借鉴我的看法好好规划自己剩下几年的大学生涯,早日成为一名合格的程序员;若你已经要走向职场,或已经工作,那不妨想想,如果你重新回去学习计算机,你会怎样规划你的学习,又有什么是你认为至关重要的呢?
过去是定数,未来是未知数,要想求解未来,先计算好现在,加油。