如果有关注我比较长时间的听众可能知道,我录过不少免费的编程视频,其实现在我已经很难解释我当初为什么要录那些Linux,iOS编程的视频,包括这个电台,我也已经很难去解释我最初的动机是什么了。我不喜欢“不忘初心,方得始终”这句话。我觉得我坚持做这件事情,已经混杂了我自己的虚荣,做事的决心还有对现实的不满。说实在的,我分不清楚这其中哪个因素会多一些。
我其实没法做到公开,客观,中立。这一点在电台和公众号的留言里我已经知道了,很多人会来骂我忘记了初心,我一般都会回复一句“我的初心喂了狗”。有一点我得承认,我日子过的不如意,所以,我没法在电台里讲正能量,我知道现在流行的是于丹这种的,不管什么孔子孟子还是庄子,从她那吐莲花的嘴里说出来,的确都是一些真理,比如什么要安贫乐道,要对生活微笑啊,要发现自己的内心什么的,可能有些人觉得这是真理,我觉得这就是一些废话,和过马路左右看,养成高效的学习习惯,高考上北大清华,一样的废话,道理我也懂,就是做不到啊!
我做的视频也是这个样子,比如我做过一个系列叫《iOS从入门到放弃》的视频,这个视频是教大家如何做可以运行在iOS的软件。不管是书也好,还是培训班也好,都有有意无意的用于丹的那一套宣传,比如只要学3个月或者半年就能月薪几万块,或者不少书的名字就叫《iOS实战编程》。这些书或者培训班,最后的成果是做出来了一个计算器,而且还是很丑的那种计算器,只能做加减乘除,界面是用默认的界面,几个按钮摆那里。我觉得这种东西,根本不能上架,要想靠这种东西搞个月薪几万,不是说不行,如果你是男生,那你肯定得长的特别帅,如果你是女生,那你肯定要特别漂亮。因为我也知道,在公开场合说话,并不是说所有的话都是假话,我们在公开场合说的话是场面话,不管是谁,一旦想到自己的话可能会被外人听到,就会换一种说法,开始说场面话。这可能是一种本能。
考虑到这个情况,我也是会说场面话的人,因此我在做编程视频的时候,就不过多的讲情怀,而是直接做一个真正的软件。我的选择是直接对着Google公司出的一个软件,YouTube在iOS上的客户端来做。Google做成什么样子,我就做成什么样子。我觉得这才是实战。这就相当于练书法时候的临摹,啥也别说了,直接对着王羲之的字练就是了。所以,那个视频我就是对着Google公司出的软件来做,它有什么功能,我就做出什么功能,他的状态栏是红色的,我也做红色的,他能左右切换视图,我也用UICollectionVew做一个一模一样的可以左右切换的视图。虽然我不确定Google是用什么技术做出来的那种效果,可能是UITableView或者其它什么自定义的组件,但是,我用UICollectionView能做出可以以假乱真大差不差的效果。大家玩手机软件的时候,会发现一个现象,只要是稍微出点名的软件,一定有自己独特的地方,100%用了自己独特的组件,这些组件可能是状态栏,可能是一个button,肯定不会是一个默认的button,但是那些所谓的实战的书里,还有一些教程里,就喜欢用默认的button。要知道,如果默认的button的难度系数是1的话,自定义的button难度系数最少是5。
我考虑过这个问题,我自己的解释是,程序员和建筑工人,歌手,画家,甚至是炒股的是一个工种,是个手艺活,只有动手去做,才能学到东西。就像一个建筑工人,他在盖楼的时候,如果他懂《建筑材料学》,可能对他盖楼有一定的帮助,如果他不懂,其实问题也不大。类似的,像justin bieber,唱歌非常好,粉丝众多,但是他不见得懂《和声学》。现在程序员这个工种,其实和歌手,画家一样,实践性非常强。大学里的课程,更多的是培养音乐家的,计算机科学家,美术家的,比如美术家可以写出一篇论文来解释为什么梵高的画特别好,但是他就是画不出梵高的画出来。音乐系教授也能解释为什么说唱会流行,但是,这些音乐系的教授唱歌肯定不如痞子阿姆唱歌好听,1000个音乐系教授加起来也不行。以前我特别崇拜这些高学历的教授,现在没以前那么崇拜了,因为我发现包括计算机硬件和软件在内的大部分东西,都是一群冒险者做出来的,大部分和教授关系并不大。
我上大学时候的计算机老师,是个教授,自己写书的那种,可能理论水平很高,写了《软件工程》的书,但是,只会用基本的电脑操作,比如说电脑中了毒,肯定是搞不定的,软件肯定是不会写的。我觉得在学校里,在学校里肯定没什么大的项目给他管理,但是,他就出了书,当了教授,然后教学生《软件工程》。然后大家死记硬背一些知识,什么瀑布开发模型的优点缺点,什么XP开发的优点,最后就是考个试就算了。自从研究生毕业以来,我已经工作了10多年了,现在回想起来,当年我的老师可能没有一个真正写代码的,都是博士。我当年的同学现在已经有一些教授,副教授了,他们并没有实际的软件开发经验,就是去读了个博士,然后找工作,在高校里当老师,然后又再教学生。最后就是没有编程经验的人教没有编程经验的学生学习编程,只能通过书本,这些学生毕业以后,有的去了公司,有了编程经验,但是没机会教别人编程,程序员是不可能当成老师的。当年毕业后没当程序员而是去读博士的人,最后就继续去当没有编程经验的教授,教学生编程。
最后大部分计算机系毕业的会有一个这种情况,学会了C语言,但是读不懂C语言写的代码,学了数据库设计的三大范式,但是不会操作数据库。当然,这并不是只有计算机这个专业才有的问题,我高中时候的同桌,热爱军事,报考的是空气动力学专业,造飞机发动机的,去了才知道,全中国没人会造飞机发动机,但是,大家也得对着书学习,后来他考了公务员,也算是走上了一条光宗耀祖之路。
在做《iOS从入门到放弃》那个视频的时候,我考虑不周全,我在做这个视频的时候,没想到要付出一部分钱。当我们在申请Google的API的时候,会按照申请的数量交一笔钱。这是一笔活雷锋的钱,我又不想当活雷锋,我没申请API,这个API根据读和写的价格是不同的。其实我经常录一些视频,在我做电台之前,那时候Amazon出了云服务,我录视频玩,结果我不小心泄露了自己的key,一两天就让那些所谓的黑客刷了几百美元,所以从那件事情以后,我对网络上的风险有深刻的认识。也正是因为这个原因,我就没再录下去,如果你不小心泄露了key,你根本不知道别人会拿这个key,用你的钱做什么事。因为这个视频是免费的,因此到今天还会有人隔三岔五的来问我为什么不更新了,我就说因为要付钱买API了,大家也就不问了。所以,这次我打算直接收费了,因为我打算布署一个真的项目,目前来看,要付出的钱有域名费和主机费,主机费一年1800来块,域名费每年100来块,我算了一下,一年大概2000多一点就可以了。只要我每份收100块,一年我只要卖出个30份,再扣除平台的分成,这个录视频的游戏应该能玩下去。
我前面讲过,我做电台,很多话是源于我对生活不满。在知乎上,一旦有人不满了,就会有人来引用很可能不是王小波说的,但是被强行安到王小波说的一句话:“人的一切痛苦,本质上都是对自己无能的愤怒。”我认为,这句话更可能是于丹说的,而不是王小波说的。只要你痛苦,就是你无能,比如说你上不起学,你别怨别人,谁让你没能耐?比如说你看不起病,谁让你没能耐,不是退休老干部?比如你高考上不了北大清华,就说你没能耐,谁让你不是外国人,会写名字就能来?我可能是属于一旦碰到问题,就先从别人那里找原因的人。我要做的这个软件的视频,可能也会有我的一些观点,我想在视频里说一下我认为的编程是什么样子的。可能和书上说的,或者培训班里说的不一样,书上经常会说的是编程是世界上最好玩的事情,或者Linux是世界上最伟大的发明之一,再或者学三个月就能赚到月薪1万块,我在视频里可能没这么正能量。
我会把现实中我对软件开发流程不满的地方,都在视频里按照我认为更好的方法去改进。从开发流程上,我想稍微的改变一下,第一步是先定下需求来,然后不是按照常规的流程,就开始编码,而是把写测试提到写代码前面来,因此第二步是写测试,第三步才是写代码,然后第四步是一边上线一边测试。这些流程我有没有在公司实验过呢?当然没有了,要不然我就不抱怨了,实话告诉大家,这个流程是我在书上看到的,并且这几年开发下来,我觉得可能这个流程更好,但是我在公司人微言轻,对开发流程没什么发言权。就好像我觉得美国一人一张选票选个总统出来可能会比较好,但是,我没什么发言权,只能抱怨一下。幸好,这个是软件开发,我自己做一些小项目的时候,我就按照我自己的流程来,觉得真的还不错。下面我就来解释一下为什么这个方法可能有缺点,但是比常规的方法要好。
第一步就不多说了,肯定要先定下需求来。第二步为什么要先写测试呢?我觉得写测试,是程序员搞清楚需求的方法,因为测试相对比较容易写,比如第一步里有用户注册的需求,在写测试的时候,就要考虑到什么情况下能注册成功,什么情况下不能注册成功,比如用户名,电子邮件是不是含有不合法字符的,长度是不是合法的,比如用户名不能是一个字符的,密码是不是包含不同的字符的,最小的长度是多少位的。把这些测试用例先写好,在写的过程中,其实就已经越来越明确要写的代码要完成什么需求,而不是先写代码,然后让别人测试,一下子给出10个改进意见,来来回回的返工。现在有一种技术叫自动化测试,自动化测试比人工测试好多了。写好了自动化测试,以后每次改进,就让它们跑一遍,心里还有底。然后才进入写代码的状态。
写完成了代码,就跑一遍测试,我觉得就可以上线了。在公司里,有一种bug叫“在我的电脑上能跑,为什么到你那里就不行了呢?”比这种bug好一点的情况是,公司做一个假的环境,一般叫什么stage,这个假的环境,是一个迷你版的真实应用场景,大量的测试是在这个环境下测试的,我个人认为没什么用处。我来讲一下为什么用处不大。
第一点,这个假环境的规模非常小,类似于一个沙盘吧。一般情况下,数据是假的,但是这个数据是真的假的,问题倒是不大,我们公司在做测试的时候,会从生产环境里拿一些数据来,然后有的字段就乱改一下用,这不是重点。重点在于负载,你写这个代码,可能在单机上,在假环境上是没问题的,但是,一上线就挂了。当时我提出这个方案的时候,大家都会说,这个太危险了,其实并不是,如果代码里真的隐藏了这种bug,在假环境上又测不出来,只能上线才能测出来,这种bug没办法,不如直接上线,反正都得来这么一刀,早死早超升。
第二点,有些网络延迟根本就没法重现,比如国内的南北互联问题,这种东西不如直接先上线再说。
如果使用生产环境来测试的话,当然也有一些缺点,但是我觉得这些缺点比起优点来,可以仔细考虑一下。反正我能想到的缺点,我觉得都可以用一些方法避免,比如最容易出问题的部分,在写代码的时候,因为先写的测试,已经都测过了。
还有一点就是,我鼓吹的在线上测试,并不是说和最终用户一起用相同的系统。而是在发布之前,就直接上线测试,这个过程叫deploy,只有测试用户才能使用,但是,使用的数据是真实的线上数据。如果有人说,要是把数据库删了怎么办,其实要担心这个的话,在任何阶段都会有这种情况,做好备份就是了,就算是真正的到了生产阶段,有人想删数据库也是有办法的,这种担心我觉得是杞人忧天。就算是程序的功能上出了大问题,也没什么,这个基本上不会影响最终用户,因为最终用户又不用这个系统。再就是做好系统的回滚,能快速的回退到前一个状态,随时变卦。
这就是我做这个视频的流程,先写文档,再写测试,然后写代码,然后直接用真实环境测试,最后再发布。
我曾经在电台里多次说过,如果一个人特别历害的话,基本上是只做不说,比如朱元璋,比如Linus这些人,有什么不满的话直接做,我是最佩服这种人的。我做不了这种人,比如如果我有能力,直接就把软件开发流程给改了,而不是做个视频,做个音频出来抱怨一番。这个也确实如此,是一个鸡生蛋蛋生鸡的问题,没有实力的话,说再多也没什么用处。就像是历史上流传的杯酒释兵权一样,表面上看是赵匡胤举了举酒杯,大家就把兵权给他了,其实,这100%不可能的。连在公司里改个软件开发流程,都是靠实力的,你这一个国家谁当老大,当然也是靠实力说话。
如果大家看历史的话,要知道赵匡胤举起那杯酒来之前,已经搞定了符彦卿,石守信,他们肯放下兵权,只有一个原因,肯定不是因为赵匡胤长的帅,而是因为如果不放下兵权,脑袋就要掉了。当然,长的帅肯定也有好处,我上学的时候,米饭可以免费加,打饭的小姑娘就会看你长的帅不帅决定给你加多少,我们班有个大帅哥,是真的帅,他每次去加饭,人家都会问他要不要加点菜,然后给他加一大勺肉菜,没办法,脸长的帅就是可以为所欲为。我觉得在任何行业长的帅长的漂亮都是优势,但是更重要的还是实力,看起来朱元璋和Linus长的就特别一样,不太帅。
现在我的视频已经录了6期了,可惜现在还没有看到哪家平台肯收留我。就算做一点收费视频这种小事,也有无数让人感觉到麻烦的事情。首先,你要买主机,这个倒是不难,然后,要域名备案,备案有要求,各地都不同,比如我的手机号码是A地的,就只能在A地备案,但是还要有居住地址,如果你有A地的手机,但是在B地住着,这就是死循环了。这还不是最差的,比如我是个人备案,就只能写感想,不能留言,不能做这个,不能评论,只能写生活感想,比如你看到了一朵花,只能写今天生活真美好什么的。网站的名字也有严格的限制,我备案的网站名字叫:春风又绿江南岸。
因为我没法收钱,很多平台不喜欢上线我这种没名气的人,所以昨天我发了一个文章问大家推荐一个平台。有人建议我自己做一平台收钱,除了技术上,说实在的,在技术上,这可能是最简单的,最难的是资质,资质这个东西,就是你没赚到一分钱的时候,看到申请的条件,就觉得要去坐监狱了,而且还是无期的。现在我还没找到合适和平台,我上传到网易上了,但是已经审批了好久了,幸亏是能看的视频,如果是能吃的食品,早就长毛了。如果上线了以后,我会在公众号里告诉大家。
另外,我放了两期免费的视频在B站,网址在这里。
https://www.bilibili.com/video/av27078030/万事开头难,其实不止开头难。