勉励-----计算机科学专业的同学,你应该会什么

来源:互联网 发布:matlab矩阵运算源代码 编辑:程序博客网 时间:2024/04/28 14:27

计算机科学专业的同学,你应该会什么

计算机科学,不是计算机也不是科学。这篇文章,建议大一新生好好读一读。

你不需要会以下的任意一种:

  • 做 Flash (人家还有学艺术的呢,别抢饭碗)
  • 视频剪辑(你确认你是制片?)
  • Photoshop (你确认你会拍照?)
  • 组装机器 (除非你想去电脑城打工)
  • 重装系统 (同上)
  • 修 Windows (同上)
  • 做网页 (请问你会设计么)

但是,你需要会很多其他的东西。别忘了,你是计算机科学的学生。

计算机系不应该是培养程序员的。程序员是青春饭,35 岁还在继续当程序员很可能会被 layoff,而且程序员本身也是没啥职业发展空间的,要不然变成架构师,要不然变成管理层,要不然,另寻高就吧。如果只是 follow 学校的教育,很不幸,35 岁可能会成为你的一个 gap。

算法和数据结构

没错,作为计算机系的学生,这两门课必须得学好,否则,不能做一个合格的程序员,架构师虽然不见得非得写算法,但是总是要可以看懂的吧。

主页君的算法学的很差,而且因为不是写程序的,所以没法说码农需要知道什么算法,但是非码农写程序的话,基本上在纸上写一写画一画,分析清楚逻辑,简单的算法自己设计应该没啥问题。除非你不在纸上分析。

操作系统原理

不是 Windows NT 的操作系统原理。这是个黑盒子,而且经常变,而且设计足够复杂。这里说的,是UNIX 的操作系统原理

需要清楚的是,从计算机加电开始,如何进行引导操作系统,如何加载系统内核(提问:A20 line gate 是干什么的),init 如何 bring 各个服务启动,又是如何初始化虚终端的。

一个二进制文件,如何加载(fork exec, ELF/COFF/a.out 文件如何执行)。程序是如何编译和链接的,ld 是咋回事儿,so/dll 是干啥的,和 elf/a.out/exe 有什么区别。ABI 是什么,如何保持库的兼容性,name mangling 是咋整的,为啥 C++ 的兼容性差(或者说,为啥 Windows 里 VC11 编译的 EXE 调用 gcc 写的 C++ DLL 可能会非法操作,或者说 SunCC 的 C++ 动态库和 gcc 里的 C++ 程序不兼容)。最好能够用手编译一个程序(没说让你 gcc -o hello hello.c,是让你用 gcc, as, collect2 之类的自己编译)。dlopen 之类的咋玩(会这个就有可能能绕过 Apple 的审查,用 iOS 的私有函数哦,记得加密函数名以及 dlopen 函数…)。

内存是如何管理的,函数是如何调用的,参数如何入栈(一定是右到左么?),内核和用户程序是如何通信的,浮点运算是咋回事儿,怎么 cast 浮点到 int …… 恐怕这些不知道,操作系统和计算机原理白学了吧。

说到内存管理, malloc() 不是很好,而且有时候内存碎片多了,malloc() 不见得能立即返回,有可能要等很久才返回。或者干脆就挂死。

锁也是不得不提的。多线程应用如何设计,什么是线程安全,什么样的函数不是线程安全的,critical section 是咋回事。

文件系统是怎么设计的,inode table 里有什么,最好看看 Linux 的 VFS,最好能自己设计个文件系统。以及为啥要有日志,以及为啥 Windows 98 不正常关机需要跑 scandisk。(虽然主页君认为微软只是为了恶心一下你而已…)当然还有为啥某些文件系统可以恢复数据。

说到恢复数据,主页君需要提醒一下,XFS 和 HFS+ (Mac OS X)是几乎没法恢复的,要备份!

网络

所有机器现在都联网了,以下几个协议说不清楚就不像话了:

  • HTTP
  • DNS
  • TCP
  • IP
  • DHCP
  • ARP

至少得知道这是干啥的吧。至于 TCP,里面的东西挺多的。还有 IP,会算网络是必须的。

如果打算干网络工程师,上面的要烂熟于心,以下的东西也得非常清楚:

  • OSPF
  • BGP
  • SNMP
  • CDP
  • RIP (不过这协议已经 RIP 了。。。)

顺便还得捎带着搞清楚 IOS 咋玩。考虑到国内,也得会个华三的配置(神马 display this 之类的恶心命令)。当然设计网络也是非常非常需要的了。对了还有 troubleshooting。

至于网络开发——大家都是不少用 C 开发的吧,那么什么 connect, accept, bind, listen, read, write 之类的当然常用了。还有就是 multiplexing 方法,以及 poll() select() 以及 epoll, kqueue 咋玩,否则效率高不了。当然也可以用 Python 的 Twisted 写,也挺方便的。不过也有不少人用 Python 的 socket 直接写攻击程序。

数据库

说实话,大部分人到最后用数据库的时候,只是用个 SQL 而已,而且都不见得写 SQL 了,流行用 ORM 嘛。至于调优,君不见有类人叫做 DBA。CRUD 会写了,问题就不大。

当然,有兴趣做 DBA 的,上面的操作系统原理自然是要非常清楚了。主页君并不是非常了解数据库,不敢多说,不过 High Performance MySQL 是个好书。

Troubleshooting

这活一般是系统管理员干的。主页君也是系统管理员。一般来说,以这个顺序为主:

  • w/top/free/iostat 看看系统咋了,是 load 高,还是内存不够,还是 IO 卡死
  • netstat -an 看看是不是连接太多,或者 socket 满了,这个是用 file descriptor 的
  • dmesg|tail 之类的看看系统日志
  • 看看应用日志是不是有报错
  • 看看数据库是不是垮了
  • strace/dtrace/truss 之类的看看应用是不是锁死了,基本上到这里就可以知道是什么问题了
  • 如果 strace 还是看不出来,上 gdb 之类看看
  • 如果还是不行,让它吐个 core dump,接着重启 app 试试
  • 如果还不行,reboot 总是可以了吧
  • 如果还不行…… 谁开发的 app 找谁出来 TJJTDS

如果是 Windows Server...

  • 重启一下
  • 换个机器
  • 重装一下
  • 打微软电话发 ticket

写程序

总是要会写程序的吧。C 应该所有计算机系的都学过。如果没学 C 直接学的 C++,只能说学校傻逼,自己学 C 去,别以为学会 C++ 了就会 C 了。C 是一定要学好的,学好 C (我没说 MSVC),计算机原理应该也了解个一半了。用 Windows 的 C,你只是学会 Windows API 而已,但是用 UNIX 学 C,你会学到 UNIX 的设计思想。当然你需要知道你编译出来的程序是怎么跑的,至少得知道程序跑的时候其实是没有类型这回事儿的,全都是 16 进制的烂泥而已。

Java 值得学么?主页君也不好说,“企业级开发”,说白了就是把程序员当工人而已

想快速开发的话,主页君推荐用 Python,用 C 开发 Python 扩展也是相当的方便,也可以把速度搞的不错。Python 是个全功能的语言,不像某些脚本语言,例如 PHP 一样只是做 Web 好用。当然有人会扯,PHP 也可以做本地程序,比如 PHP 都有 Gtk 绑定……

当然大牛都是用什么 Lisp, Scheme, Small Talk, Prolog, Haskell 之类的神级语言的。

一些别的

别的,自然是 UNIX 了。会用 UNIX,保证你现在会的东西,30 年以后还是可以使用。例如 X11 这么烂的协议都没有人去改(受虐习惯了吧), TCP 这么烂的东西也天天在用(30年以后估计还得用他),ls cd pwd 这些命令大家也都在天天用(废话)。别的东西难保你 30 年以后还能继续用。不过以下的东西,似乎也没啥大的变化?

  • 洗衣机
  • 电冰箱
  • 空调
  • 风扇
  • 信用卡

不过 UNIX 这玩意儿也是计算机这样这么多变的东西中几乎没变的一种奇迹吧。据说 Plan 9 比 UNIX 还好,可惜没见几个人用。

计算机里,有些东西很 fancy,也很经常有新东西出现,比如这几年很火的 Ruby on Rails,NodeJS,NoSQL DB ——这些东西,however,是要依赖于对计算机的 solid understanding 才可以开发出来的。这些东西很好用,但是,如果不了解他的本质,很快你就会沦落为这些东西的奴隶,就变成了它耍你而不是你用它。

原帖地址:http://page.renren.com/600931132/note/859952337

-----------------------------------------------------------------------------------------------------------

【自勉】计算机科学与技术学的是什么?

计算机专业毕业后 
大致的工作方向是软、硬、网、图 四大类 
尤其以软件、网络为现今的首选 

从岗位上分,又可以分为技术道路、营销道路两大方向 

if 你选择作技术,then 从现在开始,牢记: 
天道酬勤!!!


if 你选择软件技术 then 每天都要用大量的时间学习高级语言,绝对不能仅限于学校的安排。优秀的程序员都是大学阶段就已经自学得非常深入了。 
if you选择网络技术,那么你就多多从网上阅读有关资料 

if you 选择营销类,那么,你只要将老师教授的学好就ok


但是,一定要用大量的时一、给计算机专业的同学 
1.首先请你热爱这个专业。只有这样,你才会从抽象的理论中找到实实在在的快乐。如果你不热爱她,或者只因为这是个热门专业,那么极力要求你放弃这个专业,因为计算机是一把双刃剑,学好了你会飞黄腾达,学不好你毕业后会极其痛苦,高不成低不就,没有发展潜力,如同学英语专业的人到了美国一样。


2.不要用功利眼光对待这个学科,这绝对不是点点鼠标就能挣钱的专业。不要去想做网站挣钱,不要想靠点击率增加广告,这个在4年前已经过时,如果你现在仍然这么想,千万别说出来,因为我会觉得你很土。计算级专业的成就感总是伴随着身体上的痛苦而来,肩周炎,颈椎病,眼睛干涩,掉头发,腰椎间盘突出,关节炎,不夸张,这么帅的我工作了两个月以后发现开始掉头发了。


3.搞明白计算机“科学”与“技术”的含义。做网页,做图片,做flash,玩游戏,上网,听歌,录mp3,搞电影字幕,装windows,改注册表,为软件皮肤……这通通不叫计算机科学与技术,如果你是计算机的学生,会做以上事情,那是你应该的,不会做,也没什么丢人的,我们需要的不是让别人称作“高手”。

 
4.明确你最终的专业方向是软件还是硬件。方向是网络?网络不是专业方向。网络是最优秀的软件工程师、最优秀的硬件工程师与最优秀的通信工程师的智慧结晶。

如果你是软件方向,请你在学精一揽子数学、数据结构、算法设计、数值分析、汇编语言、操作系统、编译原理、数据库原理、软件工程之类课程后,仔细的听一听硬件课程,他对你有用。软件工程绝对不是背背就能过的课,计算机理论可能是一个人就能研究出来,软件工程是成千万网软件工程师几十年来失败的教训凝结成的结晶,请认真听课。不要问我应该学什么语言,计算级专业的人必须具备任何语言1小时上手的能力,最起码要在10分钟把"hello world"做出来。如果说有必须学的两种语言,那他们是c++与java,学他们不是在学语言,而是在学thinking in c++,thinging in java,一个是软件的基础理论,一个是面向对象的基础理论,从来没有人听说过“thinking in basic”。如果你说c++过时了,那么千万别告诉别人你的名字,因为很丢人。山科大的老师只会教给你c,不会教给你++,所以不要被他蒙蔽,大胆的问他++,如果他不会,干脆换老师。学硬件的同学在认真听听以上课程后,学精除了政治以外的其他课程。

 
5.即使你学好了以上课程,我们仍然差得很远,我们只弄清学什么了,但是还不知道做什么。我们的课程设计太小儿科了,别对你在国外的同学说,否则会被笑话,所以我们要尽可能的多做设计,别一个人们闷着头做,两三个人合作一个项目,不会交流的计算机人员30岁以后肯定会下岗。题目呢,尽量是一些简单的底层开发,可以去国外大学网站上搜一搜,要自信你一定能做出来,毕竟不是什么难题,而是我们应当具备的素质。

 
6.如果你对网络有意,在具备了一定动手能力后从协议或者底层硬件的角度去学习它。否则你是自甘从一名高贵的计算机专业人员堕落为做着沉重机械体力劳动的民工。对网络安全感兴趣,那么你就在学会使用各种工具的一个月后从编程的角度深入学习网络协议和操作系统吧!只会用工具攻击无知人员的漏洞是一种意淫的行为,如果乐此不疲,并到处叫嚷“黑客”,那么这种行为可以被称作“手淫”。网上呼吁中美、中日黑客战时,希望你安心学习课程,或者睡觉休息,或者去运动娱乐,不要给祖国抹黑。


7.正确对待认证。绝大部分认证不是高薪的敲门砖,而是你上岗前的智商水平测试。如果你考过了认证,别对别人说这个认证是垃圾,请告诉别人你在学习中懂得了那些知识,如果你没有懂得知识,那么你是个paper,认证不是垃圾,你是垃圾。如果你连认证都没考就到处喊它垃圾,那么你就亲自考考试试,考过了,懂了,那么你随便;如果过了但是不懂,认证不是垃圾你是垃圾,如果没考过,那么看这个贴子的所有人都知道你是什么了。MCSE、CCNA、CIW等等都有它存在的意义,只要你有钱都值得一学,他们是最正规的知识来源,是经过理论、实践、时间与市场考验的产品。 

二.给非计算级专业的同学的一点建议 
1.热爱你的原专业,尤其是自然学课和基础学科,为了计算机放弃他们就如同为了10张一元钱扔掉了一张100元一样。 
2.计算机是具有学术性和工具性的双重属性学课。架设一做计算级专业与你本专业的桥梁,那对两个专业都是做出了贡献,如果你真的很牛,把计算机学的很深很好,那么你真的值得尊敬。 
3.再次记住做网页,做图片,做flash,玩游戏,上网,听歌,录mp3,搞电影字幕,装windows,改注册表,为软件皮肤……这些不是计算机专业,也挣不到钱。不要让浮躁余功利蒙蔽你的双眼,毁掉你光明的前程。 

当然,计算机语言很多种,每种都有他的特点,各种之间的编程思想又是融会贯通的。只要你学精一门就不愁找不到工作的。加油!间到计算机公司去兼职做营销,踏踏实实提高自己与客户接触能力。 
计算机科学与技术是学什么的?


流行的计算机语言如C、JAVA、VB、VF、DELPHI、汇编等等 
微机原理 
计算机基础 
计算机网络基础 
数据结构 
高等数学 
大学英语 
大学物理 
多媒体相关的课程:如网页制作、IT实用技术等 

喜欢计算机、热爱计算机专业是不会觉得计算机专业无聊的,计算机科学与技术专业既学网络又学软件,只不过学的都不深,如果自己喜欢可以自学钻研。 

记住我说的话,根本没有无聊的专业,只有自己热爱的专业,你认为自己的专业无聊,是因为你没有全身心的投入这个专业并不热爱这个专业,真正爱计算机的人,上计算机的专业课是一种享受。 
每个学校计算机科学与技术的课程都有所不同!但大体相同!在大一大二学习一些基础课程!例如高等数学,英语,C语言,计算机导论,英语,离散数学,概率论,数值分析(计算方法),C++和一些人文课程;有些学校不学的有大学物理,电路,数字电路设计,信号与系统等.高等数学要好好学!学起来会很无聊,要有心理准备! 
到大三会分方向:软件,网络,多媒体.可以按照自己的兴趣选择. 
计算机科学与技术专业适合什么样的工作? 
写给计算机专业的大学生! 

首先说一说进入计算机专业的目的,我个人是因为十分喜欢IT业,很喜欢折腾电脑,所以在填报志愿是毫不犹豫的在报了的所有的学校都填写的计算机专业,梦想着进入计算机专业后能遇见很多高手,能交到几个知己,谁之进来后却大失所望。计算机专业的学生有很多以前对计算机不怎么了解,而且还有部分人进大学前连计算机摸都没摸过,对计算机很熟悉的很少,高手更是凤毛麟角,大多数人是服从了父母之命,显而易见,目前社会最热的行业是IT业,工资最高的也是IT业,抱着这个因素,大多数考生的父母都让自己的孩子进入了计算机专业,而大多数学生也天真的认为从计算机专业毕业后就能够像电视里演的大多数白领一样每天只用坐在办公室里和同事们聊聊天,和老板吃吃饭,每天签几个字然后就有高工资等着你去拿。 

进校后他们发现其实他们在专业课方面什么都听不懂,自己也一点兴趣都没有,没有兴趣那就没有学习的动力,而且这个专业是要靠悟性的,而兴趣是培养悟性的第一步,然后他们会发现越往后学专业课越难,也越听不懂,好一点的就会狠下心来,硬着头皮苦学一通,有可能也就能走出一片路来,而不好的就会就此放弃,只需要混着考试通过,混毕业,找个单位安心上班。有些人上了几年学连自己上哪些课都不知道;拿个程序他分不清是用C语言写的还是用PASCAL写的;不小心进了DOS不知道怎么再回到WINDOWS。但说起游戏来头头是道,好像每个都是职业玩家一样,有的每天只知道泡在网吧。这就是中国计算机人才下一代的悲哀! 


再说现在计算机专业大学生的学习和生活。大多数计算机专业的学生对本专业的发展及前景一无所知,每天都是看小说、玩游戏、看电影、打牌、喝酒、睡觉等等很有"前途"的事情。偶尔看见一两个同学看看与计算机专业有关的书,跑去拿来一看,全是什么"游戏攻略"、"黑客秘技"等此类书籍。还有的人连C语言和C++谁是谁都还没搞清楚,就拿本VC的书"刻苦钻研",真不知他们看懂了没有。好多学生都买了电脑,但用处都是游戏机+碟机+音响,每天都在用电脑玩着各种流行的游戏、看着最新的大片、听着时尚的音乐,就是不用电脑学习。有的学生甚至问我电脑除了玩游戏还能干什么,我问他你为什么这么问,他告诉我他觉得电脑只能用来玩游戏,不知道还能不能干干别的什么。据我了解,近几年在国内好几所高校的计算机专业的毕业生的毕业设计竟然是做网页,在大学了四年,学完了《数据结构》、《软件工程》、《C语言》等专业课后,竟然交了一个没有学过计算机的人自学一两天就能做好的东西! 

这就是大多数计算机专业的学生,在我在大学玩了两年之后,我突然明白该为自己的未来打算打算了,但还有许多人仍然还什么都不明白,所以就有了这篇文章。 


如果你是以上我说的那种受父母之命来学计算机的学生,如果你看了《计算机应用文摘》第15期的《写给想当程序员的朋友》一文后,发现自己没有当程序员的欲望,那么我这里有几条路给你选择: 
1、**页制作,将来去网站工作! 
2、学习3D MAX等软件,去作动画! 
3、学习美术设计! 
4、**络,将来考个CCNA,去专业组网! 
5、在保证能顺利毕业的前提下,去疯狂玩游戏,做个职业玩家或做一个或几个网络游戏的GM。(我身边就有这样的人) 
6、以上五条都与计算机有关,要有一定的专业知识,但比起你的专业课简单多了。如果你看到这里还不觉得有适合你干的,那这条最适合你:在你们学校去修双学位,修一个自己感兴趣的专业,计算机真的不适合你! 
如果以上几条有适合你的,那么你就努力去做适合你的那一片天地,去看杂志的下一篇文章,下面的文字你看了只会浪费你的时间。 


如果你是计算机专业的在校大学生,而且想当程序员,那么请往下看: 
1、大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘! 
2、计算机专业是一个很枯燥的专业,但即来之、则安之,只要你努力学,也会发现其中的乐趣的。 
3、记住:万丈高楼平地起!基础很重要,尤其是专业基础课,只有打好基础才能学得更深。 
4、C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好。 
5、C语言与C++语言是两回事。就象大熊猫和小熊猫一样,只是名字很像! 
6、请先学习专业课《数据结构》、《计算机组成原理》,不要刚开始就拿着一本VC在看,你连面向对象都搞不清楚,看VC没有任何用处。 
7、对编程有一定的认识后,就可以学习C++了。(是C++而不是VC,这两个也是两码事!C++是一门语言,而VC教程则是讲解如何使用MFC类库,学习VC应建立在充分了解C++的基础之上。看VC的书,是学不了C++语言的。) 
8、学习编程的秘诀是:编程,编程,再编程; 
9、认真学习每一门专业课,那是你的吃饭碗。 
10、在学校的实验室就算你做错一万次程序都不会有人骂你,如果你在公司你试试看!所以多去实验室上机,现在错的多了,毕业后就错的少了。 
11、从现在开始,在写程序时就要养成良好的习惯。 
12、不要漏掉书中任何一个练习题--请全部做完并记录下解题思路。 
13、你会买好多参考书,那么请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码。 
14、VC、C#、.NET这些东西都会过时,不会过时的是数据结构和优秀的算法! 
15、记住:书到用时方恨少。不要让这种事发生在你身上,在学校你有充足的时间和条件读书,多读书,如果有条件多读原版书,你要知道,当一个翻译者翻译一本书时,他会不知不觉把他的理念写进书中,那本书就会变得像鸡肋! 
16、我还是强调认真听专业课,因为有些课像《数据结构》、《编译原理》、《操作系统》等等,这种课老师讲一分钟能让你明白的内容,你自己看要看好几个月,有的甚至看了好几年都看不明白。 
17、抓住在学校里的各种实践的机会,要为自己积累经验,就业时经验比什么都有用。 
18、多去图书馆,每个学校的图书馆都有很多好书等你去看! 
19、编程不是技术活,而是体力活。 
20、如果你决定了要当一个好的程序员,那么请你放弃游戏,除非你是那种每天只要玩游戏就能写出好程序的天才! 
21、你要有足够的韧性和毅力!有个高手出了一道题测试你的韧性和毅力:找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。 
22、找到只属于你自己的学习方法!不要盲目的追随别人的方法,适合自己的才是最好的! 
23、请热爱程序员这项工作! 
以上的话有些是我的经验,有些是我从高手那里直接COPY来的,但他们都很有用,记住他们,并遵守他们,那你们一定会成功! 

对于大多数初学者来说,好多人有这种问题存在:我到底先学什么?学C/C++?还是学VC?还是学Borland C++ Builder呢?还是Delphi?哪一个更好呢?学习程序设计和学习程序设计语言究竟是怎么一个关系?初学者究竟应该如何取舍呢?就这些问题,我从一个高手那里看了一下的这段话,可以帮助在这方面有问题的人:学习程序设计就好比学习射击,而程序设计语言就对应射击中的气枪、手枪、步枪等各种枪械。学习射击必须要选择一种枪械,不可能没有枪还能学好射击的,也不可能同时学会使用所有的枪械。但是,如果掌握一种枪械的射击,再学别的也就触类旁通了。因为在熟悉一种枪械的同时,也学习了射击技术本身。再学其他的,自然事半功倍。学习程序设计也是一样,必然要从学习一门程序设计语言开始入手。在学会系统的编程理念之后,用什么工具都一样! 

之所以写这篇文章呢是因为自己眼看身边那么多的同学一个个都"不务正业",荒废了学业,心急如焚,自己也荒废了好几年,眼看微软的Windows从3.X到现在的2003 Server,而中国的软件业还是在原地踏步,难道我们真要每年等微软给他的操作系统换一次名字,我们给他交一次钱吗?这么大的利润为什么不留给我们自己,为什么不让别的国家给我们交钱呢?这是广大中国程序员的一个共同的梦,要实现这个梦的人是现在还在大学里的"准程序员"们,他们是中国软件明天的希望!希望广大计算机业的大学生看到这篇文章后,睡觉的能醒来,玩游戏的能停下来,在网吧的能出来,一起拿起课本,坐在电脑前,用程序写出中国软件业明天的辉煌。


参考资料:来自:计算机科学与技术学的是什么?

0 0