Showing posts with label Hacker. Show all posts
Showing posts with label Hacker. Show all posts

Thursday, December 10, 2009

编程学习的本质是什么?

很早之前就想写这样一篇文章, 但因为种种原因而耽搁. 今天在思考怎样学习C++时又想到了这个问题, 把它写下来, 作为我自己的一些感想.

作为一个程序员, 真得好好想想我们在学习编程的时候什么是最重要的, 到底什么才是我们追寻的本质? 是把ASP.NET、PHP、JSP、Ruby、Python、C#、Java、C++都学会? 是可以纯熟地使用VS、GTK+、Qt、wxWidgets、Tk来编写图形界面? 是学会各种框架、各种库? 是可以利用JavaScript编写出各种网页特效? 是对于各种浏览器的插件开发了然于胸? 是可以利用系统API开发出各种应用? 在我看来, 这些都不是. 诚然, 以上这些都很有用, 也很重要, 但绝不是一个优秀程序员应该不停追求的.

为什么会有人认为我掌握了这门语言就成了编程高手? 君不见你学的这门语言10年前可能根本不存在, 并且10年后也极有可能不存在. 老有人说IT界知识更新速度太快, 的确, 如果你5年停止学习, 那你在5年后多半就成了一个"废人". 但有一样东西是不会变的, 那就是大师们常说的"内功". 为什么"内功"如此重要? 看看李开复读大学的例子, 1980年李开复在哥伦比亚大学读本科时, 流行的是Pascal和C语言, 以及Fortran, 再看看今天, 除了C语言依旧傲视群雄外, 其它两个早就划归到历史的长河中去了, 只能作为那个年代的特有记忆而保留着. 而30年前李开复在学算法, 在学操作系统, 在学计算机网络, 在学计算机体系结构, 在学离散数学, 30年后的我们依旧需要学习, 依旧需要掌握. 这才是一个程序员需要以及值得追寻的本质.

刘未鹏在"你应当如何学习C++(以及编程)(rev#1)"中提到"一般性的编码实践准则,以及基本的编程能力和基本功,乃至基本的程序设计理论以及算法设计。才是真正需要花时间掌握的东西。"这些都涉及到两个字: 基本. 计算机的基本功无非是刚才说的那几样, 再加上一点数学知识, 但这在很多人眼里却只是考试的时候 (包括找工作时的笔试和面试) 用用而已. 一个真正伟大的程序员会懂得如何通过加强自己的内功, 从而把编程能力发挥到极致.

刚才的言论难免会引来一些实用主义者的辩驳, 工程上的各种新技术、新框架肯定是需要的, 某种程度上来说是要用来吃饭的, 并且也必须借助那些技术才能应用到实际中来. 但凡事都有主次, 这个领域总会不断地冒出新奇的玩意出来, 吸引着好奇的人们去尝试. 就像这个世界也总是充满了各种诱惑, 每个人都可能像海藻那样飘浮不定, 随波逐流. 不过还是有着需要我们坚持的东西. 也许在10年后, 20年后, 你会发现, 你所坚持的东西是多么得宝贵.

Tuesday, June 23, 2009

隆重推荐VC精华资源: 计算机科学经典著作

今天无意发现的, 这个资源绝对称得上重量级, 不知道发布者收集了好久...

里面包含了几乎所有你知道的和你不知道的经典书籍, 大部分为PDF格式, 少数为CHM. 不多说了, 反正不下会后悔的: 《计算机科学经典著作》

Monday, March 30, 2009

如何利用网络学习

来自Lifehacker的文章: Top 10 Tools for a Free Online Education [Lifehacker Top 10], 文中介绍了Google Code University, 适合CS (Computer Science) 专业学生学习. 通过Personal MBA网站来学习MBA课程. 如果你是一个Linux新手, 那么可以看看Ubuntu Guide, 里面详细介绍了Linux下的各种软件和一些历史故事. Mango Languages的课程可以帮助你学习11门外语 (其实还有一门是汉语...). Lifehacker的另一篇文章还收集了各种乐器的网上教程, 前提是你的听力得很好, XD. 最后是包括MIT (麻省理工学院), Stanford University (斯坦福大学), Carnegie Mellon University (卡耐基梅隆大学), University of California, Berkeley (加州大学伯克利分校), Princeton University (普林斯顿大学), University of Washington (华盛顿大学) 等众多学校的各种网络课程, 顺便抱怨下为何中国的高校如此封闭.

Sunday, January 11, 2009

经典书收集 (持续更新)

  1. Computer Foundamental

    • The Art of Computer Programming  作者: Donald E. Knuth
      这个不用多说什么了.

    • Introduction to Algorithms  作者: Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein
      传说中的MIT教材. 传说中的CLRS.

    • Computer Systems: A Programmer's Perspective  作者: Randal E. Bryant and David R. O'Hallaron
      想从一个初级程序员晋升为高级程序员吗? 请看这本书.

    • Programming Pearls  作者: Jon Bentley
      编程猪与鸡, :)

    • Hacker's Delight  作者: Henry S. Warren
      我看到的第一本Amazon五星书籍, 涉及很多位运算. Amazon上有人戏称这本书是"The Art of Computer Programming, Volume 0: Bit Manipulation".

    • Introduction to the Theory of Computation  作者: Michael Sipser

  2. Mathematics

    • What Is Mathematics? An Elementary Approach to Ideas and Methods  作者: the late Richard Courant, Herbert Robbins, and Ian Stewart

    • Discrete Mathematics and Its Applications  作者: Kenneth Rosen

    • Probability and Statistics  作者: Morris H. DeGroot and Mark J. Schervish

    • Concrete Mathematics: A Foundation for Computer Science  作者: Ronald L. Graham, Donald E. Knuth, and Oren Patashnik

  3. Operating System
  4. 在操作系统原理领域有两本书被公认为经典, 一本是Tanenbaum的《Modern Operating Systems》, 另一本是Abraham Silberschatz, Peter B. Galvin以及Greg Gagne的《Operating System Concepts》. 这里之所以提出来, 是因为我最初学习操作系统时在选书上走了一点"弯路". 后一本我没看过, 不便评论, 但Tanenbaum的那本我想应该提醒一下各位. 首先, 如果你是一个操作系统的初学者, 那我极不推荐你看第一本. 纵观操作系统的书籍, 那些最典型, 同时也是最基础的知识, 比如process, memory, I/O, file system, 是肯定会包含的. Tanenbaum的那本也不例外, 但在某些概念上的阐述就不是很清晰了, 会让初学者感到没有解释清楚, 也许是大牛觉得那些都是很简单的东西, 不用说的太详细. 此外书中的一些术语也不同于国内以及其它国外教材, 比如process control block, 在这本书中却叫做process table. 恐怕《Modern Operating Systems》书中的最大亮点是占了全书近1/3篇幅的关于Linux, Windows Vista以及Symbian (这里是以第三版为例, 其它版本可能不同) 的分析与介绍, 但在我看来这有点鸡肋, 毕竟关于上述三种操作系统的分析都有很不错的对应的书籍, 区区100来页怎能很好地理解一个完整的操作系统呢? 不过, 最后一章中作者讲述的作为一个操作系统设计者应该注意的地方还是值得一读的. 所以没有必要拘泥于权威, 我推荐初学者看下面这本书, 至少在我看来也是很不错的, Amazon上虽然褒贬不一, 但只有真正看了才能知晓其中的好坏.

    • Operating Systems: Internals and Design Principles  作者: William Stallings

  5. UNIX/Linux

    • Advanced Programming in the UNIX Environment  作者: W. Richard Stevens and Stephen A. Rago
      UNIX的圣经.

    • The Art of Unix Programming  作者: Eric Steven Raymond
      讲述UNIX哲学.

    • UNIX Network Programming, Volume 1: The Sockets Networking API  作者: W. Richard Stevens, Bill Fenner, and Andrew M. Rudoff

    • Understanding the Linux Kernel  作者: Daniel P. Bovet and Marco Cesati Ph.D.

  6. Network

    • 计算机网络  编著者: 谢希仁
      这是我推荐的为数不多的国内出版的书籍, 推荐的理由很简单, 适合初学者, 文字清晰易懂, 能让你在最短的时间内了解计算机网络的全貌, 为以后更深入的学习做好铺垫.

    • Computer Networks  作者: Andrew S. Tanenbaum
      这是一本巨细无遗的书籍, 可以让你从里到外, 非常透彻地了解计算机网络, 很适合于那些已经具有计算机网络基础的人用来深入学习.

    • TCP/IP Illustrated, Volume 1: The Protocols  作者: W. Richard Stevens

    • TCP/IP Illustrated, Volume 2: The Implementation  作者: Gary R. Wright and W. Richard Stevens

  7. Database

    • Fundamentals of Database Systems  作者: Ramez Elmasri and Shamkant B. Navathe

  8. Compiler

    • Compilers: Principles, Techniques, and Tools  作者: Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman
      传说中的龙书.

  9. Software Engineering

    • The Mythical Man-Month: Essays on Software Engineering  作者: Frederick P. Brooks

    • Code Complete: A Practical Handbook of Software Construction  作者: Steve McConnell

    • The Pragmatic Programmer: From Journeyman to Master  作者: Andrew Hunt

    • Design Patterns: Elements of Reusable Object-Oriented Software  作者: Erich Gamma, Richard Helm, Ralph Johnson, and John M. Vlissides

  10. Assembly

    • 80X86 IBM PC and Compatible Computers: Assembly Language, Design, and Interfacing  作者: Muhammad Ali Mazidi and Janice Gillispie-Mazidi

  11. C

    • The C Programming Language  作者: Brian W. Kernighan and Dennis M. Ritchie
      传说中的K&R.

    • C Traps and Pitfalls  作者: Andrew Koenig

  12. C++

    • The C++ Programming Language  作者: Bjarne Stroustrup
      C++之父大作. 这本书不是很适合初学者, 如果你不了解C++, 那么你在看这本书的前几节时会感到异常难懂, 甚至会因为缺乏耐心而放弃. 不过这绝对是C++的圣经.

    • C++ Primer  作者: Stanley B. Lippman, Josée Lajoie, and Barbara E. Moo
      适合初学者, 浅显, 讲解透彻, 入门好教材.

    • C++ Templates: The Complete Guide  作者: David Vandevoorde

    • C++ Coding Standards: 101 Rules, Guidelines, and Best Practices  作者: Herb Sutter

    • Effective C++: 55 Specific Ways to Improve Your Programs and Designs  作者: Scott Meyers

    • Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions  作者: Herb Sutter

    • Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library  作者: Scott Meyers

    • Programming: Principles and Practice Using C++  作者: Bjarne Stroustrup

  13. Java

    • Core Java  作者: Cay S. Horstmann and Gary Cornell

    • Thinking in Java  作者: Bruce Eckel

  14. JavaScript

    • JavaScript: The Definitive Guide  作者: David Flanagan
      一本全面介绍JavaScript的书, 你可以从中学到很多基础, 同时这本书也可以作为一本reference.

  15. Shell Script


  16. Version Control

    • Version Control with Subversion  作者: C Pilato, Ben Collins-Sussman, and Brian Fitzpatrick
      作者在网上放了免费的版本, 参见我的另一篇日志: 学习了SVN

    • Pro Git  作者: Scott Chacon

Monday, September 22, 2008

may the source be with you

节选自《算法的力量》 李开复

给程序员的七个建议

(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。大家不妨试试高德纳所著The Art of Computer Programming里的题目,如果你能够解决其中的大部分题目,就说明你在算法方面有一定的功力了。

(2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言,考试过关就算学会了;课题项目中,只要程序能够编译,运行,并且输入输出满足要求就算了事。这些做法是不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四年中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。

(3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与敬业精神。我发现不少程序员对于知识的掌握很肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中是如何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到,只有通过踏实的实干才能真正掌握。

(4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、集合论和数理逻辑。这些知识并不难,但是对你未来的工作帮助会很大。 尤其当你对一些“数学密集型”的领域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。

(5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。

(6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的能力。想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成钻研,好奇,创新,动手,合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。

(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使用的程序。

Wednesday, April 2, 2008

My Way

Hacker == Code Master

1. Programming Master
2. UNIX/Linux Master
3. Web Master
4. English Master

I did it my way.