专栏名称: java一日一条
主要是讲解编程语言java,并且每天都推送一条关于java编程语言的信息
目录
相关文章推荐
芋道源码  ·  入职第一天,看了公司代码,牛马沉默了 ·  5 小时前  
芋道源码  ·  Spring-Security ... ·  5 小时前  
Java编程精选  ·  Controller层代码这么写,简洁又优雅! ·  昨天  
芋道源码  ·  如何实现一个合格的分布式锁 ·  昨天  
51好读  ›  专栏  ›  java一日一条

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

java一日一条  · 公众号  · Java  · 2017-09-04 11:08

正文

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


  • 让程序只做好一件事

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

  • 数据应该保存为文本文件

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

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

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

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

    Vagra nt

    后来我就发现了 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,定义好之后,我只需要执行:







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


    推荐文章
    Java编程精选  ·  Controller层代码这么写,简洁又优雅!
    昨天
    芋道源码  ·  如何实现一个合格的分布式锁
    昨天