软件的发展速度,超过了任何一个行业。软件的从业人员节节攀升;软件的使用人员,也深入到了乡村(都使用了智能手机来看节目,聊视频)。
1 Linux与Shell
作为软件产品的使用人员,我们逃不开Windows;作为软件产品的工作人员,也躲不过Linux(类Unix系统,Unix、Linux,简称Linux)。
成万上亿的各种Linux系统,及系统的贡献者,隐藏在信息时代的后台,辛苦劳作,默默奉献。不为名利,只为自由而战。真的很棒。
Linux系统,是计算机世界中的宝藏,等待着有心人的挖掘和分享:
1)最神秘是Kernel,她填补了开源世界最核心的部件,之后开源软件才能自己独立玩了;
2)最多彩是DeviceDriver,她满足了创造的欲望,专业、业余的DIYer,都可以为开源软件添砖加瓦了;
3)最亲密是Shell,她提供了一个“虫洞”,我们可以通过她,进入神秘多彩的计算机时空,体验高维度生物的行为思想(现实时空,也许就是高维度生物的游戏场所);
4)最暖心是各种Tools,你找到她们,她们就会给你惊喜或沉溺;你找不到,就自己苦逼或幸运吧。
本次,我们主要聚焦在Shell。Oh, My precious.
2 Shell简介
Shell是一个命令解释器。用户通过Shell,可以使用和控制Kernel、Device、Tools的资源。
(按照《魔戒》的说法,是:“Linux系统太复杂,于是为玩家提供各种游戏攻略,天下戒指一十七,Kernel得其三,神秘、聪慧而长生;Device得其五,多彩状况,也不乏奇淫技巧;Tools得其九,最多也最贪心,生得多死得也快。戒指太多不知道怎么戴,又弄了一个至尊戒Shell。至尊戒、御众戒,这是一个光明的至尊戒,而不是邪恶的;我们不是去抵制她、毁灭她,而是要经常使用她、亲近她;这样能通过至尊戒,发挥其他戒指的更大威力。”)
shell的用武之地,个人总结有三点:
1)快速实现软件原型
2)非交互式的自动化使用
3)集成实现更高级功能
以下逐点展开描述。
2.1 快速实现软件原型
在管理中,我们经常听到类似的化:“方向比速度更重要,选择比努力更重要”。软件工作也一样:先满足正确性,否则性能没有意义(其实快还是有意义的,能很快知道错了)。
我们可以通过一个简单但实际例子来比较一下:把若干文件中固定格式的16进制数,转成10进制数另存,好方便人类查看。
有几种方法可以一试:
1)打印出来,手工转换,用笔标注
2)使用C,写个Command程序
3)使用MFC,写个GUI程序(可以补充其他语言对比)
4)使用shell,写个脚本
第1)种方法,正确性靠转换人保证(我想起一个电视中揭露的游戏“交20押金,从1写到500,全都正确给价值好几百的礼品或现金,错误则没收押金”,有人靠这个能挣钱养家糊口的)。时间基本和字节数成正比(假设转、写1秒1数)
第2)种方法,需要写源码,实现文件读写、内容按规则读取、字符串数字转换、数字进制转换等功能,然后编译、调试,完成程序后,在命令行调用。正确性靠人设计、通过数据来保证。时间包括写程序、调用文件、执行三部分,主要时间在“写程序”,其次在“调用文件”,“执行时间”最少
第3)种方法,和第2)种类似,只是多了GUI的设计、实现,完成程序后,可以用鼠标操作。时间也类似,只是有“命令行”和“GUI鼠标”的操作时间差异
第4)种方法,和第2)种相同,只是用脚本实现,不用编译。时间的差异有两点:“写程序”和“写脚本”,“编译程序的执行”和“脚本程序的执行”
具体选取哪个方法,要看实际场景。
1)如果只有100个数,人工方法最靠谱人工,什么写程序都是浮云。但电子信息的特点之一:信息特别多
2)如果用GUI实现,用得会很爽,鼠标指指点点搞定。开发时间则是最长的,而且一定要有人触发。如果每天都要操作,这个人会觉得枯燥,说不准忘记了。电子信息的特点之二:开发人员的数据处理,比终端用户多得多。这个进制转换的例子,其实就是开发人员的需求(终端用户,也许根本不知道16进制和10进制的区别。“我们连12点和0点都区不了”),他们在程序调用上,并不是电脑白痴,他们不喜欢当“白痴”
3)用command实现,不开发GUI(不用做GUI,开发很开心,因为美工实际是个艺术活,而不是技术活)时间少,主要时间是调试、逻辑差错时间。可以把执行命令复制下来,要处理就执行一下,方便快捷,但还是要操作。电子信息的特点三,信息随时来;软件开发特点一:调试、差错时间,比编码时间多得多
4)用脚本实现,没有GUI,代码比c少,直接运行调试。如果定点到,或数据多,可以定时执行,无人值守。完美。Oh, My precious.
当然如果要实时转换,脚本速度达不到,耗时部分可以调用已写好的Tool,或者自己实现这个Tool。(真正要实时转换,没有Shell,我们还有写一个定时程序来调用。时间又耗费了)
个人用脚本实现,代码行数54,还包括8行注释,8个空行。实现花了45分钟(包括上网查属性,写word使用说明)。Oh, My precious.
其实,我们有很多快速原型或最终产品的例子:
1)matlab快速实现算法效果
2)搭建虚拟机
3)互联网后台应用
2.2 自动化使用
自动化的概念,从软件角度定义是批处理,无人值守,定时执行。从广义角度,不需要人参与,或者不需要我参与的,都可以归属广义的自动化。在现代生活中,自动化在衣食住行用各个方面,已经无孔不入(而且这也是工业社会进步追求的主要目标之一)。随便就能列出一大把:
先从住家水电卫厨开始:自来水,饮用水,电水壶,保温杯;电、电灯、电饭煲、电磁炉、榨汁机、豆浆机、电冰箱、电视机、空调、电风扇、洗衣机;下水道,天然气,罐装煤气,热水器,浴霸,小闹钟,手表,电脑。。。当然,还有最重要的手机,网络(广义上讲,自动化的一切,就是网络的体现)
再看看交通:自行车、电动车、公交车、私家车、高铁、轮船、飞机、火箭。。。
吃穿就不用多说了:快餐(深圳最发达产业之一)、大排档、酒楼、私家菜。。。;对于穿,从出身到现在,我们有自己做过一件衣服吗?
最近几十年的计算机革命,最近十几年的互联网革命,最近几年的物联网革命,则是计算机、软件、网络、智能设备相关的自动化典型应用。客户越来越懒了,工作人员也是如此。
问题来了,作为工作人员,或者细分到软件从业人员,你的工作、或你的产品,多少自动化了?
Shell做自动化的能力、成果、方便性,在所有语言中首屈一指(后续会逐渐整理一些具体应用,这里只概述),是资深软件从业人员的必备工具(犹如木匠的电动锯,医生的病历本,律师的档案袋)。
Linux启动中,各种服务的自动开启
清除过期文件、机器老化、自动化测试等等的无人值守执行
软件开发的持续集成,提交代码后,迅速编译、打包、运行测试,给出反馈
各种服务器、数据库的维护、备份
。。。
绝大多数场合,我们都是终端用户(衣食住行用),按黑盒子方式使用;偶尔一个微小的点(工作行业的产品),我们是研发生产人员。有时候,我们没有切换角色和思维,把盒子生产的要求点和标准,想得过于简单。
相对终端用户(交互式、黑盒子方式使用,主要关注功能点、性能点、界面、操作流等),研发生产人员更要掌握(制造黑盒需要更多工具,盒子包括很多非用户需求:如快速调试、快速验证、快速发布,系统集成,运行资源监控、批量生产、异常现场信息收集、快速升级)。
如果你要加强工作的自动化能力?Shell真的很不错。这是大家对Shell高手,敬仰之情如滔滔江水,连绵不绝的原因。Oh, My precious.
2.3 集成实现更高级功能
当今的人类世界,除了艺术品还是“单兵作战”模式,如哲学思想、绘画、书法、音乐等等(主要工作是单兵,大量的辅助还是被自动化了。像李宗盛这种,唱歌用自己做的吉他,做吉他用自己种的树,少了);其他工艺品都切换到了“团队作战”模式,如出书、画展、演唱会、做手机、做App产品等等(还是需要单兵英雄,但是大量的工作需要支持)。
而且,“团队作战”的模式,已经切换到“特种部队”这种快速响应模式,通过“少部分外部执行者(前台信息收集、决策) + 资源网络支持(后台数据处理、执行)”。
这种模式能粘合、组装,利用已成熟工作的系统资源,集成实现更高级的目标(也可以叫组装、组合能力)。集成能力像胶水、螺丝、铆钉、绳子、包装袋、容器。。。
一个简单比喻(可能不恰当),小时候过节时发糖果,我们的小手都抓满了,结果没有几颗。于是,我们先抓一些放在上衣口袋,再放一些在裤袋,然后再抓满,很满足。如果我们自己背个书包来装,估计爸妈就要发狂了(小时候一直没有想到过)。
软件开发中,相对硬件、其他有形产品,更容易集成(也许是“需求爆炸”的愿意之一)。Booch在《面向对象的分析与设计》中写到,软件开发团队的任务,是设计一种假象,对用户掩盖复杂性(专业术语是封装)。当然开发人员,必须承受其背后的复杂度。
软件集成了硬件、固件、结构;应用程序集成了操作系统、驱动、网络;Shell,则为快速实现更高级的应用程序,提供了“特种部队”的集成能力、运行环境。
Oh, My precious.
3 学习难度
关于学习,有几点说明:
计算机是一门实践学科,光说不练假把式。
学习计算机语言,比人类自然语言容易得多。
学习Shell,比C++容易得多,比C也容易,比Python有难度(学会Shell,再学Python就容易了)。
学习Shell不要纠结于语法,记住她的用武之地。
多在互联网上查,解决问题会更快。
你解决了问题,可以在互联网上风险,让后来人更快。