Make a Donation
作为6年计算机科班、系统结构方向,我说说我对计算机专业素养的理解吧,希望对大家有所帮助。
知之者不如好之者,好之者不如乐之者,计算机专业也不例外。本科我是被选到计算机专业,大一因为C语言老师的激励而喜欢这个专业,并决定做系统结构研究的。兴趣入门,比如《计算机文化》(第10版?)、《编码的奥秘》(我觉得旧版比新版小开本更好)。传记类的《ACM图灵奖演讲集:前20年 (1966-1985)》《ACM图灵奖 (1966-2006):计算机发展史的缩影》《IEEE计算机先驱奖:1980-2006》。更专业一些,推荐《深入理解计算机系统》(CSAPP),CMU流传着这个段子:15-213,给CMU门牌的课程。这里的15-213,即以csapp为课本的Introduction to Computer System,也是匹村的邮编。Believe it or not,我就是因为这本书,立志研究系统结构的,另一个原因是利用VHDL编写了自定义指令集的cpu和串口,并在带有FPGA的实验台上使两者通信成功!
1)Programming Language
入门当然是C,否则都不好意思说自己是学cs。我当年用的是C Prime Plus,很基础。我就不明白有人居然推荐C之父写的C bible——The C Programming Language,我做编译器从前端做到后端,到现在还不敢说能理解C,居然某人认为这是最快的入门方法?C bible绝对是好书,但是肯定是进阶和reference必备。C进阶还有各种C专家编程,C与指针,C陷阱了,可以提高。之后是C++,java,C#就看科研/项目需要了。我认识的很多msra实习生都从C++转到C#,说什么编码效率高云云。反正我因为做llvm,就是C++一条道到黑。还有个大牛跟我说,按照某语言排名榜的说法 c++快挂了;anyway,大牛没给出出处,在TAMU的C++之父还在弄STAPL,并行版的STL,我觉得C++肯定还不是五丈原的诸葛半仙。C++入门,我用的是C++ Prime,注意,不是C++ Prime Plus。C++之父写的C++程序设计语言,其实比较难懂,入门之后可以翻一翻。C++的进阶书更多,各种Efficient C++,侯捷老师的STL源码剖析啊。(不好意思,我也只是知道,没看。)而Java是不适合作为第一门语言的,几年前已经有美国名校教授写文章批过了。
脚本语言,顾名思义,就是执行冗余繁琐的事情。这些事情交给计算机,定时跑就行,什么python, shell, perl, awk,sed, ruby, ror等等。选一个顺手即可。记得豆瓣还是哪里的程序员自述,计算机科班教育不会开脚本语言课,但谁真正掌握了一门脚本语言,说明他是爱计算机的,所以我们会招聘他。书籍都不一一举例了,似乎是个脚本语言,O'Reilly都有入门到精通的书。That's it. 最后,要精通正则表达式哦。
函数式语言,比如lisp,coq,ML等等,是另一种思维方式。有一个笑话,前苏联克克勃苦心偷到了美国NASA的核心代码,交给上峰后被训了一顿;他很莫名其妙,瞅了一眼代码,全是()的组合,当场疯掉。后面介绍Compiler时也会涉及。事实上,我觉得,这才是计算机学生应该掌握的语言,MIT大二就开了scheme的课。法国“中科院”INRIA设计了Coq,被用于各种形式化证明。首届国家科学进步奖的两位获得者有吴文俊,贡献就是机器证明,另一位是袁隆平,解决咱们的口粮。可见吴有多么重要!
最后,我就很纳闷,有人居然推荐web作为语言的入门?亲,这说的是计算机科学学生的第一门专业课。我讨论的是计算机科学,是科学,不是工程;是本科,不是大专技校。学C,是为了后面的OS——linux。学web,你跟得上市场潮流吗?HTML/CSS/JS,你咋不是HTML5呢。不好意思,我很保守,不懂web编程,但请各位想做web的看看HTML5的发布会视频,演讲者一上来给出各种设计哲学,甚至包括了乔治奥威尔的1984,最后给出了HTML5的。这才是精髓,或是说web设计的精髓。看到自己做的webpage很有成就感,修改linux内核代码的成就感怎样?先抑后扬的感觉不是更爽!本科学习的原则,在我看来,是不要被外界所打动,夯实基础,做自己有兴趣的事情,举个俗透了的例子,如乔布斯学书法,去印度礼佛!
4)Data Structure & Algorithm
很多人推荐《算法导论》,我也不能免俗,但毕竟不是入门级别的。其实,学DS掌握基本概念就行,推荐清华大学严蔚敏老师的《数据结构》,网上也有视频。之后也正如大家所言,ACM吧,不是为了final,只是为了不惧怕编程,体验成就感(再回到PL,web语言可以acm?)一定题量后,需要加强算法,推荐Robert Sedgewick的书和《算法学:设计精髓》。最后,拜一下高德纳的TAOCP,所谓家居编码旅行吹牛必备利器。
2)Operating Systems.
与DS一样,操作系统也是门实践的学科。记得老师在课上说,当年他读书时,觉得银行家算法是这么优雅,为什么没有任何OS使用?原因就在于时间复杂度是O(n^3)。话不多说,直接读开源OS——linux的代码,比如0.11,一万行左右,市面上有0.11代码剖析。我的建议是,先自己理解,再对比学习,这样才能真正懂得。有了0.11的基础,恐怕将来对任何OS部分都不会感到陌生,此时读者可就不只是牛人了,而是大牛了(参考程序员的十层楼)。果然还是有推荐APUE,Unix编程艺术和UNP的。
当然,也可以拿实时操作系统练练手,比如uC/OS,代码短小精悍,和linux一样,pure C。
国内还有本“自己动手写操作系统”?
win方面,好像有window internals?
至此,还是要鄙视一下win——没有好用的终端,以图形界面赢得普通市场,取得商业成功而已,当然win的内核技术事实上是比linux强大。君不见,哪个知名IT公司没有自己的集群?集群需要图形界面吗?在我看来,不用终端,似乎lose my power of control;不爽,计算机是服务于人的,是被CSer控制的。顺便8g一下,盖茨对“计算”的理解,是初中生水平;Google的Page,是本科生。现在,我还不确定Facebook的Zack是什么水平,但至少和Page是平手。再拜一下Amazon,这是因为她的云平台,才有Dropbox等一路风生水起,可叹中国,国家垄断。
3)Database
不好意思,我db没学好。但db其实是很有意思的,可惜mysql已死。入门我就不推荐了,直接进阶吧——《数据库系统实现》
4)Software Engineering
这简直是个人文学科,集计算机科学、管理学、心理学、社会工程学于一身。在此我不展开,经典书籍也有很多分类,比如编码类(Write solid code, refactor, 各类design pattern,代码大全第二版,程序员修炼之道,编程卓越之道,O‘Reilly“xx之美”系列,编程珠玑,各种“UML,XP编程、敏捷、需求,测试”书籍),故事类(dreaming code),管理类(各种Joel on software,“美国”创新工场YC创始人Graham的黑客与画家,peopleware,37single出的都是好书,甚至时间管理GTD的书籍)。其实,我觉得《编程卓越之道》是山寨csapp的;说YC是美国的创新工场,简直跟说巴黎是西方哈尔滨一样猥琐。同时敬礼图灵奖获得者、北卡教堂山的《人月神话》作者Brooks,但我推荐的是他另一本书《设计原本》。
搭车说一下,我不是鄙视web,如果想学web,应该学apache,linux sever管理之类的,再不济也得j2ee。如果真要学web,推荐http://www.pureweber.com/。
5) Compiler及PL设计哲学
出来混,早晚都要还的。我本科学的最差的就是compiler,一个字,混。结果研究生做的都是compiler,即llvm,那些用iDevice的同学为什么觉得系统很流畅,闭源版本的llvm功不可没,当然还有iOS,基于freebsd——另一种linux发行版(b是伯克利的哦,他们有做工具、开源的传统)。有位北京intel研究院的实习师兄跟我说,intel之所以牛,是在于其编译器优化。所以说,学好OS和compiler,走遍天下都不怕。
可惜学到这门课,大家应该大三了。很多人如梦方醒,要面对出国保研考研工作公务员等等了,无心恋战。但从这门课起(包括以前的汇编),才能真正体现CSer与其它非计算机的区别。
《程序设计方法》《计算机程序的构造和解释》《程序设计语言概念》《程序设计语言原理》、甚至《自动机理论、语言和计算导论》《计算理论导引》才应是计算机专业学生应具有的素养。
当然,不能少了龙书虎书和鲸书(http://cse.seu.edu.cn/people/yan ... ID=8&TopicID=26)。很好笑吧,我也是几天前才知道鲸书,而虎书我本科时写编译器前端时参考过,只是不知道她的外号。编译是实践的一门学科,llvm从UIUC发芽,经过10多年的发展,成为apple主力支持的商业编译器,用于iOS,不可谓不是个奇迹。
6) Computer Architecture
海纳百川,系统结构就是这样一门学科,把之前低层的汇编、中间的OS、高层的PL熔于一炉。君不见,因为银河机,国防科大永远是中国计算机系的翘楚,虽然现在也开始浮躁了,清华华科上交(以及南大某并行实验室)还是难以望其项背。
系统结构可大可小。小的指指令集,大的可以包括计算机组成原理、编译(每个指令集都需要自己的编译器)。所以,我把帕特森和轩尼诗的两本扛鼎之作和盘托出——《计算机组成和设计:软硬件接口》和《计算机系统结构:量化的研究方法》。读不懂没关系,书读百遍,其意自现。
但还是那句话,计算机专业是很practical的,Dr. Brooks是因为领导IBM 360而成就的图灵奖,CA是很活跃的——GPGPU,多核众核,可重构计算等等。哈哈,说了这么多,之前所有其实都是为了CA铺路的——希望有志于出国读博的CSer做CA的研究。
Beyond curriculum
在即将飞跃之际,回首这六年,很高兴学计算机,不仅是因为与人相比,计算机其实很“简单”,照着程序执行,出现了意外也是可评估可能恢复并规避的——每个程序员都是折翼的天使,在计算机世界里构建属于自己的理想国,没有尔虞我诈,更是因为通过计算机专业的学习,更懂得如何获得更多的信息,以更开放的心态接受新鲜事物,而不是成为完全执着保守的左派。事实上,很多学计算机的人喜欢科幻,喜欢哲学,什么冯大师的《计算机和人脑》、《万里任禅游》,喜欢讨论技术背后体现的价值观,《我们的防火墙:网络时代的表达与监管》。
计算机的博士学习,需要扎实的数学基础。而博士,更需要人文素养。在介绍SE时,其实更多的书目是偏人文方向的。是的,我认为中国缺少安贫乐道、少欲知足的精神,这与缺乏真正Ph.D.教育——五年时间在一个方向钻研——有关。以计算机专业而言,本科学位是B.E.,工科学士;研究生或是M.S.,科学大拿;博士是Ph.D.,哲学博士。博士毕业后,追求的不应该是过分的物质生活,反而应是研究领域精神上的快乐!
这也与人文素养的缺失有关,包括我在内,没几人读过千字文、三字经、弟子规、四书五经、春秋左传。另外,学计算机技术也是要读历史的,什么《数学之美和浪潮之巅》《激荡三十年》《沸腾十五年》《IT史记》《IT通史》《IT大败局》了,看看什么技术方兴未艾,什么如日中天,什么日薄西山。(同时推荐这个ted视频,http://www.ted.com/talks/simon_s ... inspire_action.html)我最近在读桑德尔的《公正》,讨论的是很贴近生活的道德标准评判。子曰从心所欲而不逾矩,庄子说逍遥游,佛家的观自在(即观音菩萨的别称),让我向往,让我思考,让我自由。
跑远了,期待一下量子计算机吧。那时的计算机基础课,可能完全不是上面这一套了。1)应该是量子力学了吧?
In sum,祝福所有CSer,这是门最好的学科。祝福所有飞友,心安处,即是家。南无阿弥陀佛!
不好意思,知者不言,言者不知。喷了一地口水,与我头像不符,常惭愧。
作为6年计算机科班、系统结构方向,我说说我对计算机专业素养的理解吧,希望对大家有所帮助。
知之者不如好之者,好之者不如乐之者,计算机专业也不例外。本科我是被选到计算机专业,大一因为C语言老师的激励而喜欢这个专业,并决定做系统结构研究的。兴趣入门,比如《计算机文化》(第10版?)、《编码的奥秘》(我觉得旧版比新版小开本更好)。传记类的《ACM图灵奖演讲集:前20年 (1966-1985)》《ACM图灵奖 (1966-2006):计算机发展史的缩影》《IEEE计算机先驱奖:1980-2006》。更专业一些,推荐《深入理解计算机系统》(CSAPP),CMU流传着这个段子:15-213,给CMU门牌的课程。这里的15-213,即以csapp为课本的Introduction to Computer System,也是匹村的邮编。Believe it or not,我就是因为这本书,立志研究系统结构的,另一个原因是利用VHDL编写了自定义指令集的cpu和串口,并在带有FPGA的实验台上使两者通信成功!
1)Programming Language
入门当然是C,否则都不好意思说自己是学cs。我当年用的是C Prime Plus,很基础。我就不明白有人居然推荐C之父写的C bible——The C Programming Language,我做编译器从前端做到后端,到现在还不敢说能理解C,居然某人认为这是最快的入门方法?C bible绝对是好书,但是肯定是进阶和reference必备。C进阶还有各种C专家编程,C与指针,C陷阱了,可以提高。之后是C++,java,C#就看科研/项目需要了。我认识的很多msra实习生都从C++转到C#,说什么编码效率高云云。反正我因为做llvm,就是C++一条道到黑。还有个大牛跟我说,按照某语言排名榜的说法 c++快挂了;anyway,大牛没给出出处,在TAMU的C++之父还在弄STAPL,并行版的STL,我觉得C++肯定还不是五丈原的诸葛半仙。C++入门,我用的是C++ Prime,注意,不是C++ Prime Plus。C++之父写的C++程序设计语言,其实比较难懂,入门之后可以翻一翻。C++的进阶书更多,各种Efficient C++,侯捷老师的STL源码剖析啊。(不好意思,我也只是知道,没看。)而Java是不适合作为第一门语言的,几年前已经有美国名校教授写文章批过了。
脚本语言,顾名思义,就是执行冗余繁琐的事情。这些事情交给计算机,定时跑就行,什么python, shell, perl, awk,sed, ruby, ror等等。选一个顺手即可。记得豆瓣还是哪里的程序员自述,计算机科班教育不会开脚本语言课,但谁真正掌握了一门脚本语言,说明他是爱计算机的,所以我们会招聘他。书籍都不一一举例了,似乎是个脚本语言,O'Reilly都有入门到精通的书。That's it. 最后,要精通正则表达式哦。
函数式语言,比如lisp,coq,ML等等,是另一种思维方式。有一个笑话,前苏联克克勃苦心偷到了美国NASA的核心代码,交给上峰后被训了一顿;他很莫名其妙,瞅了一眼代码,全是()的组合,当场疯掉。后面介绍Compiler时也会涉及。事实上,我觉得,这才是计算机学生应该掌握的语言,MIT大二就开了scheme的课。法国“中科院”INRIA设计了Coq,被用于各种形式化证明。首届国家科学进步奖的两位获得者有吴文俊,贡献就是机器证明,另一位是袁隆平,解决咱们的口粮。可见吴有多么重要!
最后,我就很纳闷,有人居然推荐web作为语言的入门?亲,这说的是计算机科学学生的第一门专业课。我讨论的是计算机科学,是科学,不是工程;是本科,不是大专技校。学C,是为了后面的OS——linux。学web,你跟得上市场潮流吗?HTML/CSS/JS,你咋不是HTML5呢。不好意思,我很保守,不懂web编程,但请各位想做web的看看HTML5的发布会视频,演讲者一上来给出各种设计哲学,甚至包括了乔治奥威尔的1984,最后给出了HTML5的。这才是精髓,或是说web设计的精髓。看到自己做的webpage很有成就感,修改linux内核代码的成就感怎样?先抑后扬的感觉不是更爽!本科学习的原则,在我看来,是不要被外界所打动,夯实基础,做自己有兴趣的事情,举个俗透了的例子,如乔布斯学书法,去印度礼佛!
4)Data Structure & Algorithm
很多人推荐《算法导论》,我也不能免俗,但毕竟不是入门级别的。其实,学DS掌握基本概念就行,推荐清华大学严蔚敏老师的《数据结构》,网上也有视频。之后也正如大家所言,ACM吧,不是为了final,只是为了不惧怕编程,体验成就感(再回到PL,web语言可以acm?)一定题量后,需要加强算法,推荐Robert Sedgewick的书和《算法学:设计精髓》。最后,拜一下高德纳的TAOCP,所谓家居编码旅行吹牛必备利器。
2)Operating Systems.
与DS一样,操作系统也是门实践的学科。记得老师在课上说,当年他读书时,觉得银行家算法是这么优雅,为什么没有任何OS使用?原因就在于时间复杂度是O(n^3)。话不多说,直接读开源OS——linux的代码,比如0.11,一万行左右,市面上有0.11代码剖析。我的建议是,先自己理解,再对比学习,这样才能真正懂得。有了0.11的基础,恐怕将来对任何OS部分都不会感到陌生,此时读者可就不只是牛人了,而是大牛了(参考程序员的十层楼)。果然还是有推荐APUE,Unix编程艺术和UNP的。
当然,也可以拿实时操作系统练练手,比如uC/OS,代码短小精悍,和linux一样,pure C。
国内还有本“自己动手写操作系统”?
win方面,好像有window internals?
至此,还是要鄙视一下win——没有好用的终端,以图形界面赢得普通市场,取得商业成功而已,当然win的内核技术事实上是比linux强大。君不见,哪个知名IT公司没有自己的集群?集群需要图形界面吗?在我看来,不用终端,似乎lose my power of control;不爽,计算机是服务于人的,是被CSer控制的。顺便8g一下,盖茨对“计算”的理解,是初中生水平;Google的Page,是本科生。现在,我还不确定Facebook的Zack是什么水平,但至少和Page是平手。再拜一下Amazon,这是因为她的云平台,才有Dropbox等一路风生水起,可叹中国,国家垄断。
3)Database
不好意思,我db没学好。但db其实是很有意思的,可惜mysql已死。入门我就不推荐了,直接进阶吧——《数据库系统实现》
4)Software Engineering
这简直是个人文学科,集计算机科学、管理学、心理学、社会工程学于一身。在此我不展开,经典书籍也有很多分类,比如编码类(Write solid code, refactor, 各类design pattern,代码大全第二版,程序员修炼之道,编程卓越之道,O‘Reilly“xx之美”系列,编程珠玑,各种“UML,XP编程、敏捷、需求,测试”书籍),故事类(dreaming code),管理类(各种Joel on software,“美国”创新工场YC创始人Graham的黑客与画家,peopleware,37single出的都是好书,甚至时间管理GTD的书籍)。其实,我觉得《编程卓越之道》是山寨csapp的;说YC是美国的创新工场,简直跟说巴黎是西方哈尔滨一样猥琐。同时敬礼图灵奖获得者、北卡教堂山的《人月神话》作者Brooks,但我推荐的是他另一本书《设计原本》。
搭车说一下,我不是鄙视web,如果想学web,应该学apache,linux sever管理之类的,再不济也得j2ee。如果真要学web,推荐http://www.pureweber.com/。
5) Compiler及PL设计哲学
出来混,早晚都要还的。我本科学的最差的就是compiler,一个字,混。结果研究生做的都是compiler,即llvm,那些用iDevice的同学为什么觉得系统很流畅,闭源版本的llvm功不可没,当然还有iOS,基于freebsd——另一种linux发行版(b是伯克利的哦,他们有做工具、开源的传统)。有位北京intel研究院的实习师兄跟我说,intel之所以牛,是在于其编译器优化。所以说,学好OS和compiler,走遍天下都不怕。
可惜学到这门课,大家应该大三了。很多人如梦方醒,要面对出国保研考研工作公务员等等了,无心恋战。但从这门课起(包括以前的汇编),才能真正体现CSer与其它非计算机的区别。
《程序设计方法》《计算机程序的构造和解释》《程序设计语言概念》《程序设计语言原理》、甚至《自动机理论、语言和计算导论》《计算理论导引》才应是计算机专业学生应具有的素养。
当然,不能少了龙书虎书和鲸书(http://cse.seu.edu.cn/people/yan ... ID=8&TopicID=26)。很好笑吧,我也是几天前才知道鲸书,而虎书我本科时写编译器前端时参考过,只是不知道她的外号。编译是实践的一门学科,llvm从UIUC发芽,经过10多年的发展,成为apple主力支持的商业编译器,用于iOS,不可谓不是个奇迹。
6) Computer Architecture
海纳百川,系统结构就是这样一门学科,把之前低层的汇编、中间的OS、高层的PL熔于一炉。君不见,因为银河机,国防科大永远是中国计算机系的翘楚,虽然现在也开始浮躁了,清华华科上交(以及南大某并行实验室)还是难以望其项背。
系统结构可大可小。小的指指令集,大的可以包括计算机组成原理、编译(每个指令集都需要自己的编译器)。所以,我把帕特森和轩尼诗的两本扛鼎之作和盘托出——《计算机组成和设计:软硬件接口》和《计算机系统结构:量化的研究方法》。读不懂没关系,书读百遍,其意自现。
但还是那句话,计算机专业是很practical的,Dr. Brooks是因为领导IBM 360而成就的图灵奖,CA是很活跃的——GPGPU,多核众核,可重构计算等等。哈哈,说了这么多,之前所有其实都是为了CA铺路的——希望有志于出国读博的CSer做CA的研究。
Beyond curriculum
在即将飞跃之际,回首这六年,很高兴学计算机,不仅是因为与人相比,计算机其实很“简单”,照着程序执行,出现了意外也是可评估可能恢复并规避的——每个程序员都是折翼的天使,在计算机世界里构建属于自己的理想国,没有尔虞我诈,更是因为通过计算机专业的学习,更懂得如何获得更多的信息,以更开放的心态接受新鲜事物,而不是成为完全执着保守的左派。事实上,很多学计算机的人喜欢科幻,喜欢哲学,什么冯大师的《计算机和人脑》、《万里任禅游》,喜欢讨论技术背后体现的价值观,《我们的防火墙:网络时代的表达与监管》。
计算机的博士学习,需要扎实的数学基础。而博士,更需要人文素养。在介绍SE时,其实更多的书目是偏人文方向的。是的,我认为中国缺少安贫乐道、少欲知足的精神,这与缺乏真正Ph.D.教育——五年时间在一个方向钻研——有关。以计算机专业而言,本科学位是B.E.,工科学士;研究生或是M.S.,科学大拿;博士是Ph.D.,哲学博士。博士毕业后,追求的不应该是过分的物质生活,反而应是研究领域精神上的快乐!
这也与人文素养的缺失有关,包括我在内,没几人读过千字文、三字经、弟子规、四书五经、春秋左传。另外,学计算机技术也是要读历史的,什么《数学之美和浪潮之巅》《激荡三十年》《沸腾十五年》《IT史记》《IT通史》《IT大败局》了,看看什么技术方兴未艾,什么如日中天,什么日薄西山。(同时推荐这个ted视频,http://www.ted.com/talks/simon_s ... inspire_action.html)我最近在读桑德尔的《公正》,讨论的是很贴近生活的道德标准评判。子曰从心所欲而不逾矩,庄子说逍遥游,佛家的观自在(即观音菩萨的别称),让我向往,让我思考,让我自由。
跑远了,期待一下量子计算机吧。那时的计算机基础课,可能完全不是上面这一套了。1)应该是量子力学了吧?
In sum,祝福所有CSer,这是门最好的学科。祝福所有飞友,心安处,即是家。南无阿弥陀佛!
不好意思,知者不言,言者不知。喷了一地口水,与我头像不符,常惭愧。
Comments
Post a Comment
https://gengwg.blogspot.com/