我对Java的偏爱 :)

1

有人听了我的电台之后,会有个错觉,觉得可以问我一些问题,比如,最常见的就是我如果要学习的话,应该学习哪种编程语言,“性价比”比较高呢?

这个问题么,我一般的回答是从C,Python和Java中选一个就好。因为我录了一个收费的视频,用的是Ruby语言,一般都会问一下,选Ruby可以么?当然也是可以,因为谈到了“性价比”,这就牵扯到了找工作赚钱的机会,所以,Java可能算是最好的之一了。

继续阅读“我对Java的偏爱 :)”

UNIX历史(3): 1969—1974,UNIX成长的前5年

本文是我在知识星球写的《我所知道的UNIX的历史》系列文章,本文是收费的,在这里只能看一部分。因为UNIX的故事是故纸堆里的事情,有同样癖好的人极其稀少,我做电台深有感触。因为没有阅读量就没有广告收入,幸好有几十个人肯付钱,我才得以考古。

这篇文章有2775字,主要考古了UNIX出生后的前5年,也就是那篇对外宣告UNIX出世的论文——《UNIX Time-Sharing System》——发表之前的故事。

主要讲了如何立项,开发的过程,UNIX名字的来源,如何使用的B语言,里奇又是如何魔改B语言从而形成了C语言,里奇的建议如何为日后Plan 9埋下了浮笔,为了避免官司缠身成立的USG又是如何成了日后旷日持久的版权官司的主角。都在本文中有所涉及。

其中还讲了man这个命令的由来,与UNIX的立项有莫大的关系。

书接上文

当贝尔实验室决定退出Multics项目的时候,汤姆森和里奇的内心是痛苦的。从Multics项目组回来以后,这两个哥们决定上书领导,开发一个类似于Multics的项目,贝尔实验室刚刚从一个失败的操作系统泥潭里出来,常言道,刚出虎穴,又入龙潭,这也太执迷不悟了!理所当然的,他们的领导没有批准这个项目。

汤姆森在Multics项目组的时候,负责的项目是是用Fortran开发的一个游戏,这个游戏叫《太空旅行》,这个游戏最初是汤姆森在Multics上开发的,后来才为了运行这个游戏,首先他将游戏移植到GE的系统上。其实还有不少软件都是从Multics上移植过来的,比如启发vi这个编辑器的ed编辑器,就是汤姆森在Multics上实现的,还有一个版本是在上一次讲的CTSS上实现的。如果真的追下去,ed是山寨的一个叫qed(quick editor)的软件,ed,qed都是行编辑器,只能每次操作一行,那是因为当时的计算机没有屏幕,只能通过类似电传打字机的方式和计算机交互,每次只能输入一行,所以,编辑文件也是一行一行的处理,理解了这个,就知道为什么vi是一个巨大的进步了。

话题再回到汤姆森移植《太空旅行》上,一种说法是当时的GE运行时间太贵了,玩不起,一种说法是GE的可操作性太差了,不好玩。不管怎么说,汤姆森还是要另辟蹊径。于是,他看上了一台老旧的没人用的机器,DEC的PDP-7小型机。这个机器主要的作用是用来连接大型主机使用的,但是这个主机有一个比较快的硬盘,还有两个图形终端,也许可以玩双打了 

于是汤姆森和里奇就决定自己开发一个系统,当时只有PDP-7这么一台机器,要在这台机器上开发的工作难度并不小。这两个哥们就参考Multics,设计了包含文件系统,进程还有一组文本编辑器,《太空旅行》小游戏的操作系统。万事开头难,这和今天不同,他们什么都没有,没有合适的编程语言,没有编译器,于是工作的第一步是要给PDP-7写一个编译器。

这个工作是在GE的机器上做的,要经过给纸带打孔等一系列工作才终于完成,编译器工作的不错,可以支持两个用户,一个是汤姆森,一个是里奇。

他们两人的反常举动显然瞒不过同事的法眼,他们的同事Brian Kernighan知道了这件事,打趣他们两人,说这个系统应该叫UNiplexed Information and Computing System,来讽刺Multics,起初UNIX的名字叫UNICS,后来因为UNICS和UNIX同音,还少了一个字母,才变成了UNIX。这个叫Brian Kernighan的哥们也不是个普通人,后来,他也加入了UNIX的开发,现在名满天下的C语言入门书《The C Programming Language》和第一作者就是Brian Kernighan,第二作者是汤姆森,第三作者才是里奇。

接下来我再来讲一下UNIX开发的过程。

[passster password=”qnXuE1rRzGNU”]

写第一个版本操作系统的人是汤姆森,里奇并没有实际写代码,所有代码都是汤姆森一个人完成的。当时汤姆森的老婆要带孩子去娘家过一个多月,因为孩子不大,是第一次去见外婆,这一个月里,汤姆森实际上又回到了单身汉的状态,因此有足够的精力完成这个操作系统。系统虽然粗糙,但是考虑是一个月时间完成的,也已经是人中龙凤才可以做到的。

里奇在这个阶段的作用是建议汤姆森把终端,打印机什么的,也当成一个文件来处理,这就是UNIX日后宣传的一切皆文件的来历,虽然实际上,驱动程序什么的,都不是文件,也正是因为UNIX存在缺点,让Plan 9这个伟大的失败项目看到了机会,项目虽然没成功,但是留下的遗产却至今仍在。这个Plan 9的系统留待日后再说。

他们在PDP-7这台机器上工作了两年以后,机器不能使用了,这时候他们想让贝尔实验室再买一台新的机器来用。当然,申请机器要有个名头,说开发操作系统肯定是不行的。汤姆森打听到贝尔实验室当时的专利办公室正在找一个字处理软件,用来处理与专利相关的文件,汤姆森就说别找了,找不到的,我来做一个给大家用吧。大家都说好!于是在1970年5月,这个办公自动化系统被立项,在1971年夏天月,一台新机器PDP-11被运到了实验室。这台机器是个裸机,连硬盘都没有,直到12月,硬盘才来,搞个文本编辑软件就像张飞吃豆芽一样简单,很快就让老板和专利局的同事非常的满意。这个文本编辑软件(名字叫First Edition)就是现在还被一些硬核粉丝用的nroff/troff,代码肯定不再是以前的了,现在开源的版本叫groff。我们普通人,如果不用Linux就不用了,如果用Linux,当我们使用man这个命令的时候,会调用roff格式的文档。

交差以后,汤普森就在这台新的PDP-11上搞UNIX了。

起初在PDP-7上开发的UNIX是用汇编做的,移植到PDP-11上并不容易,这让汤姆森动了不用汇编写代码的心思。移植成功以后,还要移植一个Fortran Compiler,当时这个Fortran的编译器也是用汇编写的,但是在移植的时候,汤姆森决定用一种称之为B语言的编程语言来写,B语言是一种解释语言,执行起来不快。这个时候,他的好朋友里奇来修改B语言,给B语言写了一个解释器,能够生成机器码,并且加了一些数据结构与数据类型,这个被魔改后的语言被改名为C语言。

于是,汤姆森和里奇用这个C语言重新写了UNIX,这个版本的UNIX被他们两个称为UNIX V5版本,他们两人决定让其它人用这个操作系统,最初找了三个种子用户,这三个种子用户都是专利办公室的打字员,打字员很满意,于是专利办公室的人特别支持他们两个。

于是,慢慢的UNIX流行开了,从贝尔实验室的专利办公室开始,被慢慢的传到外面。因为是C语言写的系统,移植起来非常的方便,在1973年的时候,已经在25台机器上装上了UNIX。

由于当时AT&T由于和军方合作的关系,并且当时反垄断的原因,AT&T不能人事与计算机相关的销售,这样,UNIX是不能被卖的。但是,贝尔内部越来越多的人喜欢用UNIX,只好成立了一个内部小组,做UNIX的支持工作,这就是后来对UNIX发展有巨大影响力的USG(UNIX System Group),这个小组只做两件事情,一件事情是内部如果有人使用UNIX有麻烦,可以找他。第二件事情是如果有外面的公司想使用UNIX,这个小组负责发放许可证。至于开发,都是一些程序员来做。可能是这个基因,导致UNIX对普通用户的不友好,因为UNIX是程序员开发,程序员使用的一个操作系统。

在1974年,里奇和汤姆森共同发布了一篇论文,这篇论文名字叫《UNIX Time-Sharing System》,也正是这篇论文,让外界开始关注UNIX,由此,UNIX由贝尔实验室内部走到了外部。

下次再写UNIX在外面发展的过程。

[/passster]

171. 理想主义是不是开源成功的关键?

我在电台里讲了不少有关开源的,商业的软件故事,虽然听众不多,公众号大概每期只有1000来次阅读,但是,还是有一些留言,包括加我个人微信的,会和人讨论一下开源的问题,因为源代码开放不管从哪个角度来说,都是比较有理想主义精神的。尤其是说到这些人光干活,不收钱,怎么都觉得像共产主义一样。

继续阅读“171. 理想主义是不是开源成功的关键?”

我打工时候遇到的一些事情

1

我刚毕业的时候,这个世界上还存在一个叫SUN的公司,现在已经没有了,我就是在这个公司开始我的职业生涯的。

主要工作是:打杂。

这是一个对开源过分热心的公司,我在这个公司里曾经做的一个工作是读源代码,当然是读不懂了,主要是读注释和变量名,防止注释和变量名里出现政治性的口号,比如歧视黑人什么的。还要两个人读。

继续阅读“我打工时候遇到的一些事情”

第十二次视频 自动化测试

A. 写测试的重要性

我觉得在写软件的时候,除了极个别的超级牛人,真有不少“牛人”觉得自己的代码不用测,让他写测试就是当面污辱他,都会认同写测试和写文档的重要性,我当然也非常的认同,写测试会让自己心里有底。尤其是在重构软件的时候,不会觉得特别的心虚,不会把以前能用的功能又搞坏了吧?

真事儿

曾经,我老家民风淳朴,勇敢,开车那是绝对不能系安全带的,只有胆小鬼才会系安全带。如果你坐在副驾驶,敢系安全带,那朋友就别做了,当场绝交,这绝对是对司机最大的羞辱!
现在,有些人觉得让他写测试就是最大的羞辱。怎么着,以为我写的代码不够鲁棒么?

 

如果是大公司,有专门的测试员还可以强行甩锅,如果是自己的项目,自己写自己测试,还是花点时间写测试比较好。

B. 测试的粒度

虽然我写测试,但是我并不喜欢写测试,写测试并没有太多乐趣。

测试总有个粒度的问题,100%都测试一遍是不可能的。所以,我自己做的时候基本上按照下面的情况写测试:

  1. 用户界面不写,反正自己眼睛看看就可以了
  2. 重要的功能如安全方面写测试
  3. 觉得以后可能会取消的功能不写,都可能取消了,写个屁啊!
  4. 领导看重的功能不想写也要写(重点!)

C. 如何写测试

我在视频中反复强调,Rails是个功能大而全的框架,无论是我们生成控制器(Controller)的时候还是生成模型(Model)的时候,都会顺便给我们生成test文件,比如上两次课中生成的:

test/controllers/users_controller_test.rb
test/models/user_test.rb

这两个文件都是我们在生成controller和model自动生成的,当然了,现在还没有内容,我们的测试用例是写在这几个文件里,然后运行

$rails test
......
/Users/dong/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:26:in `rescue in mysql2_connection': Unknown database 'lmzdx2_test' (ActiveRecord::NoDatabaseError)

如果你碰到的错误和我一样,这个错误说明没有建数据库。要再建一个test的数据库。

Rails项目环境

Rails项目默认生成三个环境,一个是测试环境,一个是开发环境,还有一个是生产环境。这对应于每个环境。可以使用下面这条命令检查一下:
首先使用rails console进入console,然后执行Rails.env就知道是在哪个环境下了。
如果想进入test环境,可以执行: rails console test

 

D. Rails的控制台

如果你还没有建立过user的控制器和模型,先要执行下面三条命令。

rails generate controller Users new
rails generate model User name:string email:string
rails db:migrate

如果已经执行过的就不用了。

rails console是一个可以在命令行下与rails交互的程序。因为Rails主要是用来在web软件的,如果web端还没有建立好,那么可以在console下对rails进行操作。这样非常的方便。

oh-my-zsh介绍

我在录视频的时候,有人会问我,你怎么使用的命令我的环境中没有呢,比如z这个命令是什么?

其实这个很简单,我没有使用Linux默认的bash这个shell,而是使用的zsh,这个zsh对我来说其实和bash差不多,因为有一些相对比较方便的插件,我就觉得比较好用了,比如用z这个插件,就可以很快的跳转到某个常用文件夹,而不用打一长串命令了。

我看重的是oh-my-zsh强大的补全命令,其它方面,我用的不多。

继续阅读“oh-my-zsh介绍”

UNIX历史(2): CTSS:UNIX的爷爷;Multics:UNIX的爸爸

本文是我在知识星球写的《我所知道的UNIX的历史》系列文章,为了公平起见,本文是收费的,在这里只能看一部分。

本文主要考查了UNIX之间的两个操作系统,一个是CTSS,一个是Multics。如果想看到更好更精确的内容,还请点击阅读原文去我的网站上。因为这里只能改五个字。

本文涉及的内容主要有:

  1. 最初没有操作系统的时候如何编程
  2. 批处理操作系统
  3. 在高达1800万美元一台的IBM 7094上开启的Project Mac项目
  4. 可以连接30到160台终端的CTSS系统
  5. 开启了现代操作系统众多诸如进程的Multics系统
  6. Multics的机器指令高达2000万条,而同期的IBM OS/360有100万条

本文有2500多字,是我写的《我所知道的UNIX的历史》的一部分

——正文开始——

时光流逝,时间的指针马上就是进入2019年,在50年前,也就是1969年的时候,世界上第一个配置了Multics操作系统的机器在MIT大学开始运行,负责学校的信息处理工作。

50年过去了,这个启发了包括UNIX在内的所有现代操作的前辈已经功成身退,虽然在众多的教课书里,Multics被形容为一个失败的项目,提到Multics只是为了衬托UNIX的伟大,但是不要忘记了正是Multics,将进程的概念引入了操作系统,将分时系统发扬光大。

继续阅读“UNIX历史(2): CTSS:UNIX的爷爷;Multics:UNIX的爸爸”

170. 政商手机的王者:黑莓手机(5):黑莓手机是麦当娜离婚的元凶么?

再接着上期的内容讲黑莓的故事,因为我们已经知道了故事的结局,黑莓公司已经不行了,所以这个故事也就没什么好讲的了,但是在2002年到2008年的时候,当时苹果和安卓手机都没有出来,那个时候,肯定没有人会意识到,手机市场会变成这个样子。

继续阅读“170. 政商手机的王者:黑莓手机(5):黑莓手机是麦当娜离婚的元凶么?”

UNIX历史(1): 我所知道的UNIX历史

这是我在我的知识星球上写的文章,公开大概1/3就算是广告了。

UNIX不是一个操作系统,而是一个家族,在这个家族数十年的繁衍中,已经有了太多的分支,但不可否认,这个家族至今仍然是最有影响力的高门大族,子孙后代繁荣昌盛。

继续阅读“UNIX历史(1): 我所知道的UNIX历史”