计算机专业?你该干什么

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

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

  • 做 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 才可以开发出来的。这些东西很好用,但是,如果不了解他的本质,很快你就会沦落为这些东西的奴隶,就变成了它耍你而不是你用它。

转自人人网。

 

你可能感兴趣的:(计算机专业?你该干什么)