計(jì)算機(jī)科學(xué),不是計(jì)算機(jī)也不是科學(xué)。這篇文章,建議大一新生好好讀一讀。 你不需要會(huì)以下的任意一種:
但是,你需要會(huì)很多其他的東西。別忘了,你是計(jì)算機(jī)科學(xué)的學(xué)生。 計(jì)算機(jī)系不應(yīng)該是培養(yǎng)程序員的。程序員是青春飯,35 歲還在繼續(xù)當(dāng)程序員很可能會(huì)被 layoff,而且程序員本身也是沒啥職業(yè)發(fā)展空間的,要不然變成架構(gòu)師,要不然變成管理層,要不然,另尋高就吧。如果只是 follow 學(xué)校的教育,很不幸,35 歲可能會(huì)成為你的一個(gè) gap。 算法和數(shù)據(jù)結(jié)構(gòu) 沒錯(cuò),作為計(jì)算機(jī)系的學(xué)生,這兩門課必須得學(xué)好,否則,不能做一個(gè)合格的程序員,架構(gòu)師雖然不見得非得寫算法,但是總是要可以看懂的吧。 主頁(yè)君的算法學(xué)的很差,而且因?yàn)椴皇菍懗绦虻?,所以沒法說碼農(nóng)需要知道什么算法,但是非碼農(nóng)寫程序的話,基本上在紙上寫一寫畫一畫,分析清楚邏輯,簡(jiǎn)單的算法自己設(shè)計(jì)應(yīng)該沒啥問題。除非你不在紙上分析。 操作系統(tǒng)原理 不是 Windows NT 的操作系統(tǒng)原理。這是個(gè)黑盒子,而且經(jīng)常變,而且設(shè)計(jì)足夠復(fù)雜。這里說的,是 UNIX 的操作系統(tǒng)原理。 需要清楚的是,從計(jì)算機(jī)加電開始,如何進(jìn)行引導(dǎo)操作系統(tǒng),如何加載系統(tǒng)內(nèi)核(提問:A20 line gate 是干什么的),init 如何 bring 各個(gè)服務(wù)啟動(dòng),又是如何初始化虛終端的。 一個(gè)二進(jìn)制文件,如何加載(fork exec, ELF/COFF/a.out 文件如何執(zhí)行)。程序是如何編譯和鏈接的,ld 是咋回事兒,so/dll 是干啥的,和 elf/a.out/exe 有什么區(qū)別。ABI 是什么,如何保持庫(kù)的兼容性,name mangling 是咋整的,為啥 C++ 的兼容性差(或者說,為啥 Windows 里 VC11 編譯的 EXE 調(diào)用 gcc 寫的 C++ DLL 可能會(huì)非法操作,或者說 SunCC 的 C++ 動(dòng)態(tài)庫(kù)和 gcc 里的 C++ 程序不兼容)。最好能夠用手編譯一個(gè)程序(沒說讓你 gcc -o hello hello.c,是讓你用 gcc, as, collect2 之類的自己編譯)。dlopen 之類的咋玩(會(huì)這個(gè)就有可能能繞過 Apple 的審查,用 iOS 的私有函數(shù)哦,記得加密函數(shù)名以及 dlopen 函數(shù)…)。 內(nèi)存是如何管理的,函數(shù)是如何調(diào)用的,參數(shù)如何入棧(一定是右到左么?),內(nèi)核和用戶程序是如何通信的,浮點(diǎn)運(yùn)算是咋回事兒,怎么 cast 浮點(diǎn)到 int …… 恐怕這些不知道,操作系統(tǒng)和計(jì)算機(jī)原理白學(xué)了吧。 說到內(nèi)存管理, malloc() 不是很好,而且有時(shí)候內(nèi)存碎片多了,malloc() 不見得能立即返回,有可能要等很久才返回?;蛘吒纱嗑蛼焖馈?/p> 鎖也是不得不提的。多線程應(yīng)用如何設(shè)計(jì),什么是線程安全,什么樣的函數(shù)不是線程安全的,critical section 是咋回事。 文件系統(tǒng)是怎么設(shè)計(jì)的,inode table 里有什么,最好看看 Linux 的 VFS,最好能自己設(shè)計(jì)個(gè)文件系統(tǒng)。以及為啥要有日志,以及為啥 Windows 98 不正常關(guān)機(jī)需要跑 scandisk。(雖然主頁(yè)君認(rèn)為微軟只是為了惡心一下你而已…)當(dāng)然還有為啥某些文件系統(tǒng)可以恢復(fù)數(shù)據(jù)。 說到恢復(fù)數(shù)據(jù),主頁(yè)君需要提醒一下,XFS 和 HFS+ (Mac OS X)是幾乎沒法恢復(fù)的,要備份! 網(wǎng)絡(luò) 所有機(jī)器現(xiàn)在都聯(lián)網(wǎng)了,以下幾個(gè)協(xié)議說不清楚就不像話了:
至少得知道這是干啥的吧。至于 TCP,里面的東西挺多的。還有 IP,會(huì)算網(wǎng)絡(luò)是必須的。 如果打算干網(wǎng)絡(luò)工程師,上面的要爛熟于心,以下的東西也得非常清楚:
順便還得捎帶著搞清楚 IOS 咋玩??紤]到國(guó)內(nèi),也得會(huì)個(gè)華三的配置(神馬 display this 之類的惡心命令)。當(dāng)然設(shè)計(jì)網(wǎng)絡(luò)也是非常非常需要的了。對(duì)了還有 troubleshooting。 至于網(wǎng)絡(luò)開發(fā)——大家都是不少用 C 開發(fā)的吧,那么什么 connect, accept, bind, listen, read, write 之類的當(dāng)然常用了。還有就是 multiplexing 方法,以及 poll() select() 以及 epoll, kqueue 咋玩,否則效率高不了。當(dāng)然也可以用 Python 的 Twisted 寫,也挺方便的。不過也有不少人用 Python 的 socket 直接寫攻擊程序。 數(shù)據(jù)庫(kù) 說實(shí)話,大部分人到最后用數(shù)據(jù)庫(kù)的時(shí)候,只是用個(gè) SQL 而已,而且都不見得寫 SQL 了,流行用 ORM 嘛。至于調(diào)優(yōu),君不見有類人叫做 DBA。CRUD 會(huì)寫了,問題就不大。 當(dāng)然,有興趣做 DBA 的,上面的操作系統(tǒng)原理自然是要非常清楚了。主頁(yè)君并不是非常了解數(shù)據(jù)庫(kù),不敢多說,不過 High Performance MySQL 是個(gè)好書。 Troubleshooting 這活一般是系統(tǒng)管理員干的。主頁(yè)君也是系統(tǒng)管理員。一般來說,以這個(gè)順序?yàn)橹鳎?/p>
如果是 Windows Server...
寫程序 總是要會(huì)寫程序的吧。C 應(yīng)該所有計(jì)算機(jī)系的都學(xué)過。如果沒學(xué) C 直接學(xué)的 C++,只能說學(xué)校傻逼,自己學(xué) C 去,別以為學(xué)會(huì) C++ 了就會(huì) C 了。C 是一定要學(xué)好的,學(xué)好 C (我沒說 MSVC),計(jì)算機(jī)原理應(yīng)該也了解個(gè)一半了。用 Windows 的 C,你只是學(xué)會(huì) Windows API 而已,但是用 UNIX 學(xué) C,你會(huì)學(xué)到 UNIX 的設(shè)計(jì)思想。當(dāng)然你需要知道你編譯出來的程序是怎么跑的,至少得知道程序跑的時(shí)候其實(shí)是沒有類型這回事兒的,全都是 16 進(jìn)制的爛泥而已。 Java 值得學(xué)么?主頁(yè)君也不好說,“企業(yè)級(jí)開發(fā)”,說白了就是把程序員當(dāng)工人而已。 想快速開發(fā)的話,主頁(yè)君推薦用 Python,用 C 開發(fā) Python 擴(kuò)展也是相當(dāng)?shù)姆奖悖部梢园阉俣雀愕牟诲e(cuò)。Python 是個(gè)全功能的語言,不像某些腳本語言,例如 PHP 一樣只是做 Web 好用。當(dāng)然有人會(huì)扯,PHP 也可以做本地程序,比如 PHP 都有 Gtk 綁定…… 當(dāng)然大牛都是用什么 Lisp, Scheme, Small Talk, Prolog, Haskell 之類的神級(jí)語言的。 一些別的 別的,自然是 UNIX 了。會(huì)用 UNIX,保證你現(xiàn)在會(huì)的東西,30 年以后還是可以使用。例如 X11 這么爛的協(xié)議都沒有人去改(受虐習(xí)慣了吧), TCP 這么爛的東西也天天在用(30年以后估計(jì)還得用他),ls cd pwd 這些命令大家也都在天天用(廢話)。別的東西難保你 30 年以后還能繼續(xù)用。不過以下的東西,似乎也沒啥大的變化?
不過 UNIX 這玩意兒也是計(jì)算機(jī)這樣這么多變的東西中幾乎沒變的一種奇跡吧。據(jù)說 Plan 9 比 UNIX 還好,可惜沒見幾個(gè)人用。 計(jì)算機(jī)里,有些東西很 fancy,也很經(jīng)常有新東西出現(xiàn),比如這幾年很火的 Ruby on Rails,NodeJS,NoSQL DB ——這些東西,however,是要依賴于對(duì)計(jì)算機(jī)的 solid understanding 才可以開發(fā)出來的。這些東西很好用,但是,如果不了解他的本質(zhì),很快你就會(huì)淪落為這些東西的奴隸,就變成了它耍你而不是你用它。 |
|