编程是什么:
在我的眼里,编程是对生产生活的一种抽象,下一层的语言是对上一层的语言的抽象,直到抽象到10,能让计算机看懂为止。学习编程的过程就是学习抽象的过程,如何将具象、明确的事物,准确高效地抽象总结成计算机能够执行的指令,这是编程的核心问题。而解决这些问题的过程是繁复的,如果没有足够的好奇心、成就感,恐怕确实不适合编程。
开始:
我学习的时候第一门语言是 python, python是很接近自然语言的语言
list = [“wo”,“shi”,“sha”,"bi"]
for word in list:
print(word)
# wo
# shi
# sha
# bi
你看,只要这么几行代码就可以在电脑上显示出我是傻逼字样,有趣。
python学习:
这上面是基础教程,教一些python的基本语法
这个是慕课网,主要是一些网络编程语言和软件教程
注意:一开始就学习python主要是为了感受语言,python隐藏了许多电脑底层的东西,并不适合用来学习电脑知识
python是自学的,学了一点python之后我就开始强行学java,书的还就是core java之类的,我也没很仔细看,就是大概看了一下,然后就凭感觉看起了
Algorithm(4th edition)
这本书,并且配合
priceton super niubi white hire old men course - 1
priceton super niubi white hire old men course - 2
这两门课学完了这本书,你如果可以把所有的作业都写完,那你可以说是很棒棒了,我反正只做了前三个作业。
这个时候你的算法和数据结构的概念应该比较清晰了。
第一学期选的课:
然后我选了cs570,那个时候cs570还是用c++教的,甚至还有期中考这种神奇的东西,现在的话应该是cpe593教这类的东西吧(反正不是c++就是java),其实我后来才理解,java并不适合入门,因为面向对象(object-oriented)这个概念并不好理解,虽说c/c++里面的指针也是比较吊的,但你拼命看个几个小时也知道个大概了,不像oo需要项目才能理解。如果你选了cs570活着cpe593,建议所有的作业不管是不是小组的,都自己一个人写完,SIT的同学们基本不会抢着写作业的,你写了知识就是你的,何乐而不为?何况本来就是基础中的基础。
同时选的课还有cs561,学了点sql和jdbc,后来就再也没有用过了。。。学的时候会涉及一点点数据库原理,认真看书的话还是有点收获的。
还有就是cs550了,这门课的作业其实没什么毛病的,如果你是cs零基础,这门课应该好好把书看一边,这是计算机组成原理,对于以后理解计算机很有帮助(虽然北美cs面试是几乎不会考这些的)。
c++:
c++是很底层的语言,我一开始并没有直接《c++ primer》,而是随便找了一本中文c++书看,其实primer就是挺基础的,直接看就好了,看到template那一章就行(看书的时候记得注重概念,而不是技巧,比如function pointer那里,其实如果你不用的话很容易忘掉它的写法,与其记住它的写法,更应该记住它是个什么东西,以及什么时候需要用到)。
这里有一些适合c++初学者写的project,可以试试,反正我没试。
windows的话,首先你的电脑需要可以编译(运行)c++的平台(软件),下载visual studio community(这是一个IDE,可以自己查查IDE是什么),然后网上找找教程写一个hello world程序感受一下:
mac的话直接用terminal来编译运行吧,学习效果更好。
学c++的时候可以百度(考虑)以下问题:
- 程序编译的过程是什么
- 什么面向对象编程,什么是面向过程编程
- 汇编语言是什么,机器语言是什么
- 为什么c++编写的程序比java更快,为什么java编写的程序比python更快
java:
下面可以学习java,为什么我把java放在c++后面?因为java出现在c++之后,是总结了c++的优缺点而出现的完全面向对象编程(object-oriented)的语言,不过我个人认为c++和java是可以一起学习的,两种语言的对比结合可以让自己对语言的认识更深刻:
http://www.imooc.com/learn/85
http://www.imooc.com/learn/124
http://www.imooc.com/learn/110
全都学一下吧,然后可以学学java的设计模式(design pattern),会让你对object-oriented programming有新的认识
java可以用来开发android的手机app,也有ASP这样的框架(一种别人写好的方便实用的类似平台的东西)可以用来写网页程序,网上有数不尽的项目可以写
学习java的过程中,可以考虑以下问题:
- java与c++有哪些异同?
- 为什么需要面向对象编程?
- 除了面向对象、面向过程编程的语言,还有面向什么编程的语言?
第一学期暑假:
第一学期快结束的时候我找了个 unity 的教程学了下,用的是C#,挺简单的,但是帮我瞬间理解了面向对象编程。
暑假的时候我参加了一个项目,是学校EE学院组织的,具体叫啥忘了,反正是什么summer research,做的很水,学了点 javascript 和前端的东西,写了个小网页,没啥卵用,然后一个暑假两个多月(我回家一个月)时间把leetcode的题目刷完了,当时380多道,你可以估计一下你现在的刷题速度,一开始刷题多少都会遇到点困难,但是多总结多理解的话就还好,除了 dynamic programming(建议看一下 introduction to algorithm) 和一些类似 bit manipulation 的稀奇古怪的题之外,你都应该要能做出来才行(讲道理的话dp的题目大部分也应该能做出来才对)。
第二学期选的课:
cs546,跟风选的,教了些前后端的东西,主要用javascript,没有什么难度,但是可以让你大概了解下网络知识,不至于一头雾水,我开学前十天就做完了一个学期的作业,课程基本看视频就行了,最后写一个网站,我觉得要是比较闲的话就一个人写完得了。。。万一队友坑你呢?
还选了cs600,其实如果你自己上完这个课,并且写掉作业的话,对算法肯定是有巩固作用的,反正我是没认真学。
还有个cs810,这个课每年都会换,是cs的水课,我在这课上学了 swift,写了俩 app,在这里学的ios开发 ,如果你时候题目刷的差不多的话也可以写写项目了,不用担心写什么项目,什么都行,反正写就对了。
第二学期寒假:
这个时候我已经迷茫了,因为简历并没有什么项目,然后计算机底层也不会,感觉面试面不过(其实可以面了,我想多了),本来打算寒假再总结一些刷过的题目,但是实在提不起兴趣,于是就水过去了。。。其实花了十几天时间水了一个 operating system 的网课,大概明白操作系统是个什么东西,作业太难了,一个都没写。
第三学期选的课:
cs615,这课可以的,学点命令行,可以装逼,让你自己感觉仿佛像个黑客一样(屁),作业量也不大,但是还蛮有锻炼效果的,以后找到工作了不至于环境都配不好。其实我有点后悔,应该吧cs631也选了,据说也讲得很好。
然后瞎猫碰上死耗子就进了 Amazon,面试毫无意义,就是划水,之前学的什么都没用上,但是我知道我既然拿到了offer那就肯定没办法好好继续准备面试了,所以怒答应。之后我就比较开心了,看完(差不多完了)了 thinking in java,c++ primer,computer system a programmer perspective,little java,还顺便学了点Lisp。
大概我就是这么学的了,你照这么学我保证你技术方面是没有什么问题的,至少是问题不大的,但是找工作,这是另一个技术,可能看面经,有针对性的准备面试更加靠谱。