专栏名称: Linux爱好者
伯乐在线旗下账号,「Linux爱好者」专注分享 Linux/Unix 相关内容,包括:工具资源、使用技巧、课程书籍等。
相关文章推荐
Linux就该这么学  ·  手把手教学:Nginx ... ·  10 小时前  
Linux就该这么学  ·  国内网工待遇 VS 国外网工待遇,看完扎心了! ·  10 小时前  
Linux就该这么学  ·  运维工程师必看!Nginx ... ·  昨天  
Linux就该这么学  ·  NASA 滞留太空 9 个月宇航员顺利返回地球 ·  昨天  
Linux就该这么学  ·  成立 57 年第一次!Intel ... ·  2 天前  
51好读  ›  专栏  ›  Linux爱好者

为什么优秀的程序员喜欢命令行?

Linux爱好者  · 公众号  · linux  · 2017-03-29 19:40

正文

(点击 上方蓝字 ,快速关注我们)


源: ThoughtWorks / 邱俊涛

insights.thoughtworkers.org/why-good-programmers-like-the-command-line/

如有好文章投稿,请点击 → 这里了解详情


优秀的程序员


要给优秀的程序员下一个明确的定义无疑是一件非常困难的事情。擅长抽象思维、动手能力强、追求效率、喜欢自动化、愿意持续学习、对代码质量有很高的追求等等,这些维度都有其合理性,不过又都略显抽象和主观。


(图片来自:http://t.cn/R6I1yhJ)


我对于一个程序员是否优秀,也有自己的标准,那就是TA对命令行的熟悉/喜爱程度。这个特点可以很好的看出TA是否是一个优秀的(或者潜在优秀的)程序员。我周围就有很多非常牛的程序员,无一例外都非常擅长在命令行中工作。那什么叫熟悉命令行呢?简单来说,就是90%的日常工作内容可以在命令行完成。


当然,喜欢/习惯使用命令行可能只是表象,其背后包含的实质才是优秀的程序员之所以优秀的原因。


自动化


Perl语言的发明者Larry Wall有一句名言:


The three chief virtues of a programmer are: Laziness, Impatience and Hubris. – Larry Wall


懒惰(Laziness)这个特点位于程序员的三大美德之首:唯有懒惰才会驱动程序员尽可能的将日常工作自动化起来,解放自己的双手,节省自己的时间。相比较而言,不得不说,GUI应用天然就是为了让自动化变得困难的一种设计(此处并非贬义,GUI有着自己完全不同的目标群体)。


(图片来自:http://t.cn/R6IBgYV)


GUI更强调的是与人类的直接交互:通过视觉手段将信息以多层次的方式呈现,使用视觉元素进行指引,最后系统在后台进行实际的处理,并将最终结果以视觉手段展现出来。


这种更强调交互过程的设计初衷使得自动化变得非常困难。另一方面,由于GUI是为交互而设计的,它的响应就不能太快,至少要留给操作者反应时间(甚至有些用户操作需要人为的加入一些延迟,以提升用户体验)。


程序员的日常工作


程序员除了写代码之外,还有很多事情要做,比如自动化测试、基础设施的配置和管理、持续集成/持续发布环境,甚至有些团队还需要做一些与运维相关的事情(线上问题监控,环境监控等)。


  • 开发/测试

  • 基础设施管理

  • 持续集成/持续发布

  • 运维(监控)工作

  • 娱乐

而这一系列的工作背后,都隐含了一个自动化的需求。在做上述工作时,优秀的程序员会努力将其自动化,如果有工具就使用工具;如果没有,就开发一个新的工具。这种努力让一切都尽可能自动化起来的哲学起源于UNIX世界。


而UNIX哲学的实际体现则是通过命令行来完成的。


Where there is a shell, there is a way.


UNIX编程哲学


关于UNIX哲学,其实坊间有多个版本,这里有一个比较详细的清单。虽然有不同的版本,但是有很多一致的地方:


  1. 小即是美

  2. 让程序只做好一件事

  3. 尽可能早地创建原型(然后逐步演进)

  4. 数据应该保存为文本文件

  5. 避免使用可定制性低下的用户界面

审视这些条目,我们会发现它们事实上促成了自动化一切的可能性。这里列举一些小的例子,我们来看看命令行工具是如何通过应用这些哲学来简化工作、提高效率的。一旦你熟练掌握这些技能,就再也无法离开它,也再也忍受不了低效而复杂的各种GUI工具了。


命令行如何提升效率


一个高阶计算器


在我的编程生涯早期,读过的最为振奋的一本书是《UNIX编程环境》,和其他基本UNIX世界的大部头比起来,这本书其实还是比较小众的。我读大二的时候这本书已经出版了差不多22年(中文版也已经有7年了),有一些内容已经过时了,比如没有返回值的main函数、外置的参数列表等等,不过在学习到HOC(High Order Calculator)的全部开发过程时,我依然被深深的震撼到了。

简而言之,这个HOC语言的开发过程需要这样几个组件:


  • 词法分析器lex

  • 语法分析器yacc

  • 标准数学库stdlib

另外还有一些自定义的函数等,最后通过make连接在一起。我跟着书上的讲解,对着书把所有代码都敲了一遍。所有的操作都是在一台很老的IBM的ThinkPad T20上完成的,而且全部都在命令行中进行(当然,还在命令行里听着歌)。


这也是我第一次彻底被UNIX的哲学所折服的体验:


  • 每个工具只做且做好一件事

  • 工具可以协作起来

  • 一切面向文本

下面是书中的Makefile脚本,通过简单的配置,就将一些各司其职的小工具协作起来,完成一个编程语言程序的预编译、编译、链接、二进制生成的动作。


YFLAGS = - d

OBJS = hoc . o code . o init . o math . o symbol . o

hoc5 : $( OBJS )

cc $( OBJS ) - lm - o hoc5

hoc . o code . o init . o symbol . o : hoc . h

code . o init . o symbol . o : x . tab . h

x . tab . h : y . tab . h

- cmp - s x . tab . h y . tab . h || cp y . tab . h x . tab . h

pr : hoc . y hoc . h code . c init . c math . c symbol . c

@ pr $?

@ touch pr

clean :

rm - f $( OBJS ) [ xy ]. tab .[ ch ]


虽然现在来看,这本书的很多内容已经过期(特别是离它第一次出版已经过去了近30年),有兴趣的朋友可以读一读。这里有一个Lex/Yacc的小例子的小例子,有兴趣的朋友可以看看。


当然,如果你使用现在最先进的IDE(典型的GUI工具),其背后做的事情也是同样的原理:生成一个Makefile,然后在幕后调用它。


基础设施自动化


开发过程中,工程师还需要关注的一个问题是:软件运行的环境。我在学生时代刚开始学习Linux的时候,会在Windows机器上装一个虚拟机软件VMWare,然后在VMWare中安装一个Redhat Linux 9。


(图片来自:http://t.cn/R6IBSAu)


这样当我不小心把Linux玩坏了之后,只需要重装一下就行了,不影响我的其他数据(比如课程作业、文档之类)。不过每次重装也挺麻烦,需要找到iso镜像文件,再挂载到本地的虚拟光驱上,然后再用VMWare来安装。


而且这些动作都是在GUI里完成的,每次都要做很多重复的事情:找镜像文件,使用虚拟光驱软件挂载,启动VMWare,安装Linux,配置个人偏好,配置用户名/密码等等。熟练之后,我可以在30 - 60分钟内安装和配置好一个新的环境。


Vagrant


后来我就发现了Vagrant,它支持开发者通过配置的方式将机器描述出来,然后通过命令行的方式来安装并启动,比如下面这个配置:


VAGRANTFILE_API_VERSION = "2"

Vagrant . configure ( VAGRANTFILE_API_VERSION ) do | config |

config . vm . box = "precise64"

config . vm . network "private_network" , : ip => "192.168.2.100"

end


它定义了一个虚拟机,使用Ubuntu Precise 64的镜像,然后为其配置一个网络地址192.168.2.100,定义好之后,我只需要执行:


$ vagrant up


我的机器就可以在几分钟内装好,因为这个动作是命令行里完成的,我可以在持续集成环境里做同样的事情 – 只需要一条命令。定义好的这个文件可以在团队内共享,可以放入版本管理,团队里的任何一个成员都可以在几分钟内得到一个和我一样的环境。


Ansible


一般,对于一个软件项目而言,一个全新的操作系统基本上没有任何用处。为了让应用跑起来,我们还需要很多东西。比如Web服务器、Java环境、cgi路径等,除了安装一些软件之外,还有大量的配置工作要做,比如apache httpd服务器的文档根路径,JAVA_HOME环境变量等等。


(图片来自:http://t.cn/R6IBZKm)


这些工作做好了,一个环境才算就绪。我记得在上一个项目上,不小心把测试环境的Tomcat目录给删除了,结果害的另外一位同事花了三四个小时才把环境恢复回来(包括重新安装Tomcat,配置一些JAVA_OPTS,应用的部署等)。


不过好在我们有很多工具可以帮助开发者完成环境的自动化准备,比如:Chef、 Puppet、Ansible。只需要一些简单的配置,然后结合一个命令行应用,整个过程就可以自动化起来了:


- name : setup custom repo

apt : pkg = python - pycurl state = present

- name : enable carbon

copy : dest =/ etc / default / graphite - carbon content = 'CARBON_CACHE_ENABLED=true'

- name : install graphite and deps

apt : name = {{ item }} state = present

with_items : packages

- name : install graphite and deps

pip : name = {{ item }} state = present

with_items : python_packages

- name : setup apache

copy : src = apache2 - graphite . conf dest =/ etc / apache2 / sites - available







请到「今天看啥」查看全文