半路出家的野生程序员

我是半路出家自学的计算机和编程,一度觉的自己学的还不错。后来看别人写的优秀代码,直呼过瘾,也发现自己的代码并不出色,用某人的话讲就是:too young, too simple,  sometimes naive。一度觉得学得还不错,那是自我安慰,其实只是掌握了一些非常基本的小技巧(little tricks)。

发现自己和专业人士之间存在差距,也意识到这差距是需要付出更多的努力才能追回来的,知耻而后勇。那么究竟又差在了那些方面呢,是数学,是数据结构、算法、计算机体系结构,是这些非常基础的东西。

就自己学习的过程来看,要说操作计算机这事,那是最为简单了,只要不傻,应该不成问题。甚至写代码也是简单的,只要逻辑清楚就好,但是要想认真的了解计算机是如何运行的(How to work?),并且针对计算机来设计程序,那还是有很多东西要学的,要考虑到性能问题、扩展到问题等等。

就在刚才我看ericsk写的新工作的來由,又顺着看了《程式設計師懺情錄》和《不要學電腦、不要學英文》,其中有一个算法有没有用的例子,就是从1加到100,靠逻辑来写呢:

result = 1
for i in range(100):
    result += 1

加算法:

result = (1+100)*100/2

在计算机运行上差距就非常大了,掌握好算法、数据结构这些基础知识是从事软件工作的同学必须要做到的事情。

系统管理员和程序员

Everythings Sysadmin的作者Tom给一个初级系统管理员回了封Learn your operating system’s internals的信,有讲到每次靠重启解决问题和用猜代替知道的时候总是觉得这是对行业和专业的深深打击。然后又讲了系统管理上三个复杂且容易误解的内容:内存子系统,文件子系统和进程。再加一个是安全子系统,然而这三块的内容又是理解安全的必要前提。总之就是一个系统管理员一定要深入操作系统,知道操作系统到底是怎么工作的。Tom还列了几本针对不同操作系统的书出来,

  • Windows:《Windows Internals》,中文版:《深入解析Windows操作系统》,Russinovich, Solomon and Ionescu
  • Linux:《Linux Kernel Internals》,Beck, Bohme, Dziadzka, Kunitz et al
  • FreeBSD:《The Design and Implementation of the FreeBSD Operating System》,中文版:《FreeBSD操作系统设计与实现》,McKusick and Neville-Neil
  • The TCP/IP Protocol: 《TCP/IP Illustrated》, W. Richard Stevens,中文版:《TCP/IP详解》,W. Richard Stevens

无论你是否使用FreeBSD,都应该读一读FreeBSD的那本。TCP/IP那本就不消说了,现在离了网络的计算机啥也不是!

还有一个Hacker News的贴是问How to step up my coding skills?,提问的人想在半年到一年的时间里成为一个Skilled Programmer,回贴的都说程序员这摊子浑水深了,这点时间是不够的。顶的最多的是说要写代码,也有列了代码量的。不过我觉得Ixiaus列出的建议还是很实用的,比如下面几条:

  • 要成为一个程序员,不是码农。/Ctrl+C/V
  • 不要忽视理论、算法、数据结构和数学
  • 学习多个语言,包括面向对象和函数式编程。

系统管理员和程序员虽是两个不同的职位,但是学习的内容应该说是差不多的,系统管理员甚至要比之程序员学得更多,了解的更多,按三金的话就是:我们知道的状态比其他人多,修好只不过是把系统调到已知状态。