明年毕业,学的计算机专业,但没有学好,怎么办?

更新,建议大家在看这篇文章之前,看一看自己适不适合做一名程序员:


前面的很多人写的回答都很好,答主本科研究生6年一直学的都是机械,学业中偶尔用到编程,都是非常简单的,写个function,写个loop,仅此而已,对计算机运行原理一窍不通,甚至分不清bit和byte的区别(毫无夸张)。找工作时候误打误撞进了软件行业,开始自学编程,利用每天下班时间看书看open course, 学会了一些计算机的和编程基础知识,现在就职谷歌,坐标美利坚。

之所以想补充,是因为其他回答大多说的如果将编程作为一个兴趣学习,个人觉得,要把编程,或者说软件工程师作为你未来的职业,仅仅pick up一门语言,写简单程序,是不够的。理解计算机程序的运行原理和理解很多相关的知识很重要,否则在学习的路上对很多概念只能是一知半解,走不了太远。以下列一些计算机的基本概念和相关的课程,答主觉得对成为一个优秀的程序员是很有帮助的,也是必须的。

此课程讲述了计算机程序是如何运行的,一些计算机,程序的基本概念,例如计算机汇编指令,内存,寄存器的意义,进程和线程的区别。这些概念的理解对一个程序员是至关重要的。懂了这些,才能在程序设计和编写中考虑到一些基本的问题,例如如何和为什么要防止内存泄漏,如何写程序可以减少cache miss提高performance.

如果不理解基本的数据结构和算法而编程,基本相当于不懂力学就去建造一个大楼,楼可能能建起来,但是你敢住,我可不敢。程序的基本作用是存储数据和处理数据,可以把数据结构和算法理解成完成这两项任务的基本工具和思想。

我就不用说网络在软件中有多重要了,除非你只是想写个计算器,否则这些基本概念肯定要懂。这个课程基本讲解了网络building blocks, 浏览器是如何从你打入一个字母组成的网址,到把一个可以interactive(交互)的页面显示给你,虽然这发生在短短一秒内,但后台发生了很多事情,才能保证这个网页传到你的浏览器上。从dns ,router,到load

先写到这……有人有兴趣我再继续更新,后面还有,大概写了4分之一

睡了一觉起来看到这么多赞同真实受宠若惊,既然大家这么有兴趣,我接着码字。我争取每天抽出一段时间更新,答主有个刚出生3个月的娃,时间比较不稳定。首先要解释几件事情,答主自学Computer Science或者说编程的过程完全在国外完成,所以所有学习资料和视频都是英文的,很多术语我也只知道英文的,对大家理解带来的不便先表示歉意。不过说到这,我认为做到两件事情对高效学习CS有很大帮助. 第一,学好英文,尽量用英文学习关于CS的概念。这么说并不是因为我崇洋媚外,而是客观的说,就算我国科研技术和编程水平已经和美国差距不大,但就教学水平和教材质量来说,还差了很多条街,而且很多CS的概念会直接用英文呈现在编程语言当中(stack, heap, tree, array, list, map, graph),即使你学的时候用的是中文,编程的时候还是要知道英文,写英文,直接学英文省去了二次学习。第二,翻墙。这一点的原因不仅仅是国外的教材和课程视频大多在墙外的网站(几乎所有公开课在youtube上,我会把上面提到课程的link)。还有就是,我去年曾经回国在公司的北京office工作过一段时间,试着用了一下百度,就搜索编程技术相关的问题上,百度的搜索结果质量被google甩了不知道多远。上面写过的课程我会贴YouTube链接,这些课程能写的作业强烈建议大家跟着写,因为编程水平是靠写代码写出来的。

这个topic我没有什么推荐的课程,因为大多数我看到的数据库课程都是在讲如何使用sql数据库。数据库的知识我认为分两部分,作为一个入门的程序员,可能只需要知道写简单的sql语句,如何create databse, create table, insert, update and query. 这是数据库学习的第一部分,我建议利用一些可以边学边写的网站学习这部分,实战才会印象深刻,这里推荐一个网站(不知道需不需要翻墙), 他们家有很多课程,都不错,大家不需要用付费版本,免费版足够。 数据库的第二个层面,我认为才是数据库的精髓,这部分我是靠阅读网上的文章加继续搜索学习的,就是数据库的运行原理,具体说,就是数据库是怎么样实现快速查找的,想象一下,一个表有很多列,例如一个人的资料,姓名,性别,住址,年龄。那么比如我要查找一个年龄区间的人,数据库不可能每次都去根据年龄排序,再输出,排序的复杂度是n*logn, 就算不排序, 每次输出的复杂度也是n, 这对于动辄上百万记录的数据库来说,速度是不能接受的,所以数据库会用到几种特殊结构的tree去存储这些列,保证在输出的时候,复杂度基本在logn。关于这些tree是如何实现的,可以独立写一篇很长的文章,建议大家先学会并理解几个基本的tree structure(数据结构和算法里有讲到),顺便在这里推荐一个微信公众号,事先声明,这个公众号跟我没有任何关系,只是他家文章水平普遍较高,公众号的名字叫"开点工作室“,里面有一片讲数据库实现的文章写的非常好,很深刻。

/* 这周一直在加班,外加出差,一直没有更新,十分不好意思,周末有点时间我来更新一下*/

操作系统(英文缩写OS)其实即使是经验丰富的软件工程师都很少有非常熟悉的,因为实在难点太多,太难理解,其中有很多鸡生蛋,蛋生鸡的问题,答主自己也并没有理解的非常好,但我认为对于一些基本概念的粗浅理解也是很重要的,例如OS如何schedule process的,如何管理内存的,如何实现各个process切换的,文件系统是怎么实现的,还有最难理解但也一定要有一些理解的一个概念--锁(mutex lock)。我之前在Oracle的工作经历主要负责的提高操作系统的性能,所以理解较一般不在这个领域的程序员的会深刻一些。说一说为什么锁很重要,现在很少有程序是单线程了(javascript除外),在多线程的运行环境下,如果没有锁基本上就会天下大乱了。举个最简单的买牛奶的例子,假如你和别人合租有个室友,你们俩每天都喝牛奶,有一天你回家发现没有牛奶了出去买牛奶,然而在你室友回来后你还没回来之前你室友无法判断你是否已经去买牛奶了,如果他认为你已经去了而自己没去,你们家里会有一瓶牛奶,如果他认为你没去自己也去了,你们家里就会有两瓶牛奶,如果他认为你去了而你没去,你们家就没有牛奶了。这种在多线程程序中会出现不确定结果或错误结果的情况很可怕,需要解决。那么解决方案就是锁,在这个例子里,锁就是一个贴纸,如果你去买牛奶后贴一张纸告诉你室友你去买了,那么对于你室友这个就很容易解决了,如果他看到没有牛奶,没有贴纸,他就去贴一张纸条告诉你他去买了,结果是你们家有一瓶牛奶。如果他看到没有牛奶但你贴了纸条,那他就知道你已经去买了,他就不用去买了,结果还是你们家只会有一瓶牛奶。这样程序执行结果就不会有不确定性。当然,真正的锁实现上比这个复杂而且会有很多种锁,但基本原理就是这样的。关于这方面,和第2点一起,推荐一本书,我写在了开头,这本书开头3章不太好懂,讲的是一些很基础的计算机实现原理,不过要坚持看下去,看不懂就多看几遍,配和网上搜索,也可以给我发信,不过我时间非常有限,尽量回答,没时间回答大家不要怪罪。

system,我不知道如何翻译比较靠谱,意思就是版本控制系统。先说说为什么我们需要它,版本控制系统帮助你更好管理你的程序,更好的帮助一个小组在程序上进行合作。举个例子,比如你用word写文章,想象每次你保存都不会覆盖,而会保存成一个新的文件,并且这个文件名会记录你和上一次保存的变化以及你的保存时间(这个保存叫commit),这样如果你在一次改动的时候如果觉得改动的太差,你不用手动改回到上一次保存,这个系统会帮你一键回到任何一个你之前的保存,这样你在每次保存后就可以放心大胆的改动,不用担心如果程序没改好导致前面的成果全部废掉,因为你随时可以回到任何一个前面的版本。再说说它的第二个作用,就是合作,假设你程序写到一半,发现这个程序需要的工作量远远超过你之前的预期而你需要别人的帮忙,于是你有了一个合作伙伴,这个合作伙伴用这个工具copy(这的copy一般叫clone)了你的文章,这样他瞬间就得到了你之前所有的版本。当你们俩分头编辑了很多之后,这个工具可以实现一键合并你们俩的修改的内容(merge),如果你们修改的内容有冲突(merge conflict),这个工具会告诉你们有冲突的地方并让你们逐一选择选择谁的修改,当合并好之后,这次合并对于你们俩来说又都只是一次commit, 随时可以回到各自合并前的版本。Version Control有很多,比较popular的有git, perforce 和Mercury,个人最喜欢的是git, 大家可以先学学git.

十分抱歉这么长时间没有时间更新了,前一段时间因为刚有了小孩所以十分忙。在这期间接到了很多问题和评论,谢谢大家喜欢这个回答。从大家的问题中我发现还是有很多学工科或者其他学科的人有兴趣学习写代码的,但我发现很多问题不是问不到点子上就是过于general。例如,我学xxx专业的现在想学写代码,应该怎么办,或者说,我决定开始写代码,听说Java不错,能不能说说怎么学Java. 我觉得我在上面的回答想跟大家传递的我的想法是,如果想转做一个水平还不错,有职业发展的码农,写代码这件事要有规划,系统的学。如果你刚开始接触写代码,我就教你怎么写Java, 就好像你想做一个建筑工程师/设计师,我上来就教你怎么用锤子钉钉子,怎么用钜子锯木头,但即时你锤子和木头都用的很熟练了,你还是不做不了建筑师,因为你不知道建一个哪怕是一个小房子,应该需要几块木头,每块木头多长,每块木头应该怎么连接,应该在哪钉钉子,应该用什么样的木头和钉子。所以,学Java并不是最重要的,学之前你应该知道学会了应该怎么用, 不然就是很盲目的。我很希望能帮助到大家,回答一些大家的问题,带大家写写代码,所以我在考虑每周找个时间做个直播,回答大家的问题或者讲点基础的东西。对我来说比较方便的时间是周末的早晨,也就是各位周末的晚上,我想了解一下有多少人有兴趣,希望有兴趣跟我交流的朋友给我留言或者发站内信,如果有兴趣交流的朋友多,我可以利用周末的时间跟大家交流

身为一个计算机专业的准程序员,在接触到专业课的时候,总会学到程序设计这门课程,但学习过程中总会遇到很多问题,学习起来杂乱无章。这时候你要相信,每个初学者都是这么过来的,所以要先把自己的心态摆正。本篇文章给大家介绍了学习程序设计的一些方式方法和一些重点难点,大家可以借鉴!

首先,努力学习好数据结构是学好程序设计的第一步,也是关键的一步。

这一段时间没有什么捷径,只有多看书、多练习,把所有结构和类型的用法都找掌握牢固。不懂就要问,可以去一些技术论坛比如说:度娘、知乎、CSDN技术社区等。有一位老师指引,这样比自己在这条路是摸黑前进强多了,而且往往还事半功倍。切记!只要跨出了第一步,以后就容易多了,万事开头难嘛!一定要坚持,当你过了这段时间以后,你就发现程序设计根本没有你想象的那样难。

当你把这些东西都学会时,程序设计的大门已经向你敞开了一扇,而另一扇就是——算法,这个是程序设计的重点,也是难点。许多菜鸟和老鸟的区别主要在对算法掌握的熟练程度上面。有许多朋友曾这样问我:"我数据结构上面的都学会了,也知道该怎么样用,可是我为什么还是在编程时,不知道该怎样用呢?其实,这就是缺少算法思想的一个具体表现。

并不是学好了数据结构就会编程了。算法是灵活多变的,它不像数据结构那样有固定的形式。算法是不固定性就决定了它的特点,你不可能把所有的算法都学会,因为它是无穷尽的。但是你要是能把自己学的有限的算法融会贯通了,那你就了不起了。就好象你只学会了1、2、3这三个数,但是你可以组成12、23、32、123······。所以算法这条路既长有短,既难又易。

简单介绍一下学习算法的两个好习惯:

1、 求精算法这个最重要的习惯一定要养成;

2、 程序源代码的清晰度与可读性一定要高。

除了上面说的求精算法和数据结构外,数学方法和逻辑思想对你的程序设计也会有一定的影响,所以打好数学基础也是非常有必要的。

写在文末:给大家分享几个可以提高自己编程水平的方法。

1、 多加练习和多多与别人交流心得,研究和欣赏别人优秀的程序代码,去其糟粕,取其精华;

2、 在编译一个程序时,要多想几种不同的算法,反复比较,看看究竟哪个更适合这个程序。这样,不仅有助于提高你程序的运行效率,更重要的是有助于提高你对算法的认识和思维的广度。

鸡汤结尾:总而言之呢,无论是新手还是大虾,要的就是勤学苦练,只有这样,你才能走上通向程序设计金殿的成功之路。

我要回帖

更多关于 计算机专业好学吗学不懂怎么办 的文章

 

随机推荐