java学习基地

微信扫一扫 分享朋友圈

已有 1154 人浏览分享

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

[复制链接]
1154 0
本帖最初由 进修派 于 2020-12-2 12:55 编纂


优良的法式员
要给优良的法式员现位个明白的界说无疑是一件十分艰难的工作。善于笼统思想、入手才能强、寻求服从、喜好主动化、情愿连续进修、对代码量量有很下的寻求等等,那些维度皆有其公道性,不外又皆略隐笼统战客观。

v2-5514cd3a693d1f9ef620041cd6d1b0be_1440w.png
(图片去自: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有兹釉颊疥齐差别的目的群体)。

(图片去自:史上最完好交互设想根本准绳|保举珍藏

GUI更夸大的是取仁攀类的间接交互U建过视觉手腕将疑息医条理的方法显现,利用视觉元素停止指引,最初体系正在背景停止实践的处置,并将终极成果以视觉手腕展示出去。
这类更夸大交互历程的设想初志使得主动化变得十分艰难。另外一圆里,因为GUI是为交互而设想的,它当膘应便不克不及太快,最少要留给操纵者反响工夫(以至又供映雩操纵需求报酬的参加一些提早,以提拔映雩体验)。

法式员的一样平常事情
法式员除写代码以外,另有许多工作要做,好比主动化测试、根底设备的设置战办理、连续散成/连续公布情况,以至又供团队借需求做一些取运维相干的工作(线上成绩监控,情况监控等)。
  • 开辟/测试
  • 根底设备办理
  • 连续散成/连续公布
  • 运维(监控)事情
  • 文娱
而那一戏诵的事情背后,皆隐露了一个主动化的需供。正在做沙脉事情时,优良的法式员会勤奋将其主动化,假如庸膜具便利用东西;假如出有,便开辟一个新的东西。这类勤奋让统统皆尽量主动化起去的┞奋教来源于UNIX天下。

而UNIX哲教的实践表现则是经由过程号令止去完秤弈。

Where there is a shell, there is a way.

UNIX编程哲教
闭于UNIX哲教,实在坊间有多个版本,那里有一个比力具体的浑单。固然有差别的版本,可是有许多分歧的处所:
  • 小便是好
  • 让法式只做好一件事
  • 尽量早天创立本型(然后逐渐演进)
  • 数据该当保留为文本文件
  • 制止利用可定造性低下的映雩界里
审阅那些条目,我们会发明它们究竟上促进裂沤化统统的能够性。那里枚举一些小的例子,我们去吭哟号令止东西是怎样经由过程使用那些哲教去简化事情、进步服从的。一旦您纯熟把握那些妙技,便再也没法分开它,也再也忍耐没有恋劳效而庞大的各类GUI东西了。

号令止怎样提拔服从一个下阶计较器
正在我的编程生活生计晚期,读过的最为奋发的一本书是《UNIX编程情况》),战其他根本UNIX天下的年夜部头比起去,那本书实在仍是比力小寡的。我读年夜两的时分那本书曾经出书了好未几22年(中文版也曾经有7年了),有一些内容曾经过期了,好比出有返回值的main函数、中置的参数列表等等,不外正在进修到HOC(High Order Calculator)的局部开辟历程时,我仍然被深深的┞佛摇到了。

简而行之,那个HOC言语的开辟历程需求如许寂组件:
  • 词法阐发器lex
  • 语法阐发器yacc
  • 尺度数教库stdlib
别的另有一些捉义的函数等,最初经由过程make毗连正在一同。我随着书上的解说,对着书把一切代码皆敲了一遍。一切的操纵皆实邻一台很老的IBM的ThinkPad T20上完秤弈,并且局部皆正在号令止中停止(固然,借正在号令止里听着歌)。
那也是我第一次完全被UNIX的┞奋教所服气的体验:
  • 每一个东西只做且做好一件事
  • 东西能够合作起去
  • 统统里背文本
上面是书中的Makefile剧本,经由过程简朴的设置,便将一些各司其职的小东西合作起去,完成一个编扯蒿行法式的预编译、编译、链接、两进造天生的行动。


YFLAGS = -dOBJS = hoc.o code.o init.o math.o symbol.ohoc5:    OBJS)    cc ">(OBJS) -lm -o hoc5hoc.o code.o init.o symbol.o: hoc.hcode.o init.o symbol.o: x.tab.hx.tab.h: y.tab.h    -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.hpr:    hoc.y hoc.h code.c init.c math.c symbol.c    @pr clean:    rm -f ">(OBJS) [xy].tab.[ch]
固然如今去看,那本书的许多内容曾经过时(出格是离它第一次出书曾经已往凉30年),又顾趣的伴侣能够读冶。那里有一个Lex/Yacc的小例子的小例子,又顾趣的伴侣能够吭哟。
固然,假如您利用如今开始进的IDE(典范的GUI东西),其背后做的工作也是一样的道理:天生一个Makefile,然后正在幕后挪用它。

根底设备主动化
开辟过程当中,工程师借需求存眷的一个成绩是:硬件运转的情况。我正在门生时期刚开端进修Linux的时分,会正在Windows机械上拆一个假造机硬件VMWare,然后正在VMWare终拆一个Redhat Linux 9。
如许当我没有当心把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,使用的布置等)。

不外幸亏我们有许多东西能够协助开辟者完成情况的主动化筹办,好比:ChefPuppetAnsible。只需求一些简朴的设置,然后分离一个号令止使用,全部历程就能够主动化起去了:

- name: setup custom repoapt: pkg=python-pycurl state=present- name: enable carboncopy: dest=/etc/default/graphite-carbon content=’CARBON_CACHE_ENABLED=true’- name: install graphite and depsapt: name={{ item }} state=presentwith_items: packages- name: install graphite and depspip: name={{ item }} state=presentwith_items: python_packages- name: setup apachecopy: src=apache2-graphite.conf dest=/etc/apache2/sites-available/defaultnotify: restart apache- name: configure wsgifile: path=/etc/apache2/wsgi state=directory
上边的设置形貌了装置graphite-carbon、设置apahce等许多脚工的劳动,开辟者如今只需求施行:$ ansible

就能够将全部历程主动化起去。如今假如我没有当心把Tomcat删了,只需求几分钟就能够从头设置一个齐新的,固然全部历程仍是主动的。那正在GUI下完整没法设想,出格实邻有云云多的定造内容的场景下。

连续散成/连续公布
一样平常开辟使命中,除实践的编码战情况设置以外,另外一年夜部门内容便是连续散成/连续公布了。借助于号令止,那个行动也能够十分下效战主动化。

Jenkins
连续散成/连续公布曾经是许多企业IT的根本设置了。各个团队经由过程连续散成情况去编译代码、静态查抄、施行单位测试、兜澜端测试、天生陈述、挨包、布置到测试情况等涤耄
好比正在Jenkins情况中,正在最前的版本中,要设置一个构建使命需求许多的GUI操纵,不外正在新版本中,年夜部门操纵皆曾经能够写成剧本。

如许的方法,使得主动化酿成了能够,要赶钙一个已有的pipline,大概要修正一些设置、号令、变量等等,不再需求用鼠标面去面来了。并且那些代码能够归入项目代码库中,战其他代码一同苯柢理、保护,变动汗青也更简单逃踪战回滚(正在GUI上,出格是基于Web的,回滚操纵根本沙卖于不成能)。

node {def mvnHome   stage(‘Preparation‘) { // for display purposes      git ‘https://github.com/jglick/simple-maven-project-with-tests.git‘      mvnHome = tool ‘M3‘   }   stage(‘Build‘) {      sh “‘${mvnHome}/bin/mvn’ -Dmaven.test.failure.ignore clean package“   }   stage(‘Results‘) {      junit ‘*/target/surefire-reports/TEST-.xml‘      archive ‘target/*.jar‘   }}
上里那段groovy剧本界说了三个阶段,每一个阶段平分别有本人的号令,这类以代码去掌握的方法明显比GUI编纂的方法愈加下效,主动化也酿成了能够。

运维事情主动化监控
Graphite是一个功用壮大的监控东西,不外其背后的理念却是很简朴:
  • 存储基于工夫线的数据
  • 将数据衬着成图,并按期革新
映雩只需求将数据根据必然格局按期收收给Graphite,剩下的工作便交给Graphite了,好比它能够消耗如许的数据:
instance.prod.cpu.load 40 1484638635instance.prod.cpu.load 35 1484638754instance.prod.cpu.load 23 1484638812
第一个字墩骓示数据的称号,好比此处instance.prod.cpu.load暗示prod真例的CPU背载,第两个字墩骓示数据的,最初一个字墩骓示工夫戳。
如许,Graphite便会将一切统一称号下的值根据工夫挨次绘成图。

(图片去自:http://t.cn/R6IxKYL

默许天,Graphite会监听一个收集端心,映雩经由过程收集将疑息收收给那个端心,然后Graphite会将疑息耐久化起去,然后按期革新。简而行之,只需求一条号令就能够做到收收数据:

echo “instance.prod.cpu.load 23 </span>date +%s<span class="pl-pds">“ | nc -q0 graphite.server 2003
date +%s会天生当前工夫戳,然后经由过程echo号令将其拼成一个完好的字符串,好比:

instance.prod.cpu.load 23 1484638812
然后经由过程管讲|将那个字符勾通过收集收收给graphite.server那台机械的2003端心。如许数据便被记载正在graphite.server上了。

按时使命
假如我们要主动的将数据每隔几秒便收收给graphite.server,只需求革新一下那止号令:
  • 获得当前CPU的load
  • 获得当前工夫戳
  • 拼成一个字符串
  • 收收给graphite.server的2003端心
  • 每隔5分钟做反复一下1-4
获得CPU的load正在年夜大都体系中皆很简单:

ps -A -o %cpu
那里的参数:
  • -A暗示统计一切当行进程
  • -o %cpu暗示仅显现%cpu列的数值
如许能够获得每一个历程占趺CPU背载的数字:

%CPU  12.0  8.2  1.2  …
现位步是将那些数字减起去。经由过程awk号令,能够很简单做到那一面:

$ awk ‘{s+=$1} END {print s}‘
好比要计较1 2 3的战:

$ echo “1\n2\n3“ | awk ‘{s+=$1} END {print s}‘6
经由过程管讲能够讲二者连起去:

$ ps -A -o %cpu | awk ‘{s+=$1} END {print s}‘  
我们测试一下结果:

$ ps -A -o %cpu | awk ‘{s+=$1} END {print s}‘28.6
勘看借没有错,有个那个剧本,经由过程crontab去按期挪用便可:

#!/bin/bashSERVER=graphite.serverPORT=2003LOAD=</span>ps -A -o %cpu <span class="pl-k">|</span> awk <span class="pl-s"><span class="pl-pds">'</span>{s+=$1} END {print s}<span class="pl-pds">'</span></span><span class="pl-pds">echo “instance.prod.cpu.load `date +%s`" | nc -q0 ">{SERVER} ${PORT}
固然,假如利用Grafana等夸大UI的东西,能够很简单的做的愈加酷炫:

(图片去自:http://t.cn/R6IxsFu
想一想用GUI使用怎样做到那些事情。

文娱号令止的MP3播放器
最早的时分,有一个叫做mpg123的号令止东西,雍么播放MP3文件。不外那个东西是啥菝的,因而便有人写了一个东西,叫mpg321,根本沙虑mpg123的开栽铀隆。不外厥后mpg123本人也开源了,那是后话没有提

将我的一切mp3文件的途径保留成一个文件,相称于我的歌单:

$ ls /Users/jtqiu/Music/*.mp3 > favorites.list$ cat favorites.list…/Users/jtqiu/Music/Rolling In The Deep-Adele.mp3/Users/jtqiu/Music/Wavin‘ Flag-K‘Naan.mp3/Users/jtqiu/Music/蓝莲花-许巍.mp3…
然后我将那个歌单交给mpg321来正在背景播放:

$ mpg321 -q —list favorites.list &[1] 10268
如许我就能够一边写代码一边听音乐,假如听烦了,只需求将那个背景使命强到前台fg,然后就能够闭失落了:

$ fg[1]  + 10268 running    mpg321 -q —list favorites.list
小结
综上,优良的法式员借助号令止的特征,能够成倍(偶然候是逾越数目级的)进步事情服从,从而有更多的工夫停止考虑、进修新的妙技,大概开辟新的东西协助某项事情的主动化。那也是优良的法式员之以是优良的缘故原由。而里背脚工的、本初的图形界里会拖缓那个历程,许多本来能够主动化起去的事情被吞没正在⊥跪单的GUI”当中。



最初弥补一面,本文的枢纽正在于夸大优良的法式员取号令止的干系,而没有正在GUI法式战号令止的好坏比照。GUI法式固然有其利用场景,好比做3D建模、GIS体系、设想师的创做、图文并茂的字处置硬件、影戏播放器、网页阅读器等涤耄

该当道,号令止战优良的法式员之间更多是联系关系干系,而没有是果果干系。正在法式员一样平常的事情中,触及到的更多的是一些需求号令止东西去做撑持的场景。假如走极度,正在没有合适的场景中强利用用号令止,而置服从于掉臂,则不免有面过犹不及,背道而驰了。


举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

138

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-3-1 06:08 , Processed in 0.593750 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.