Skip to main content
Make a Donation
FatWallet Coupons and Deals作为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

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...