好程序员不用windows作为开发环境,今天我想就这个点吐槽一下。最近因为工作关系,需要在windows机器上工作一段时间,作为一个用了多年windows,然后切换到ubuntu作为工作环境两年时间,然后切换到mac大概3年多时间只到最近被迫用回windows的程序员,我大概有自己的一些感触。当然,如果你碰巧用了微软的技术栈,或者在开发windows平台应用或者是windows phone应用,很遗憾,你没什么太多选择。如今我写的程序主要是web居多,移动的以iOS为主,辅以一些小工具或者库,了解我的这个背景后,大概会觉得我不那么偏激一些。

好程序员首先追求效率,这一点体现在方方面面。他们不会过度依赖于IDE,而会大量使用命令行工具。他们希望一切都尽可能地快,不光程序运行要快,开发过程也要流畅、没有阻碍和干扰,无聊重复的工作希望能够通过工具自动完成。

举个我每天都要用的terminal来说,如果你在mac或者linux上学习掌握了bash以及一些核心的GNU linux工具箱的用法,那么在所有linux平台和mac平台上都可以很高效,并且切换无成本。现在的shell多数都用了readline这个库,也就是说它们支持类似的一套快捷键,例如Ctrl+a回到一行开头,Ctrl+e到一行结尾,Ctrl+r可以匹配查找历史命令,等等。而直到Windows 8,系统自带的terminal工具cmd还和windows 95里的cmd没什么区别,好像微软从来没期望windows上的程序员去使用命令行工具(你们用visual studio就够了)。不要说快捷键,连进行最基本的copy paste都是一个非常痛苦的事情,更不要提在中文windows下你只能选择一种系统默认字体,窗口的大小不能简单拖拽进行调整…… 我确实看到很多windows上开发的程序员都不怎么用命令行工具,他们默认遵循了windows的设计哲学,那就是一切都通过GUI(图形界面)来完成。

前面提到linux下的GNU工具箱,如果你用过grep、find等工具应该不会陌生,现在除了这些传统工具,还有ack、autojump等新的工具,对于程序员来说十分顺手。在mac下,通过brew或者port,也可以很容易通过命令行工具从远程软件库安装这些工具。而在windows下面,准备好这样一套环境必须得费一番功夫。当然你可以选择cygwin,或者一些较小的linux工具移植(例如mingw utils, GnuWin32等),现在也有nuget和chocolatey这样的软件安装和版本管理工具(类似linux下的apt-get或者mac下的brew),但是仍不是非常理想,不同工具的安装体验也非常不同,而它们对linux的模仿也刚好印证了linux类系统的先进。

最近我也发现了好几个windows上cmd工具的替代,例如powershell,有它自己的优势,还有类似powercmd,powertab,console2等工具,也是希望能够给windows带来更多类似linux和mac上terminal类工具的功能。

除了terminal本身,shell script也比win上的batch script强太多了,powershell的出现让windows也具备了较强的脚本能力,然而shell脚本的强大和广泛应用还是powershell不能比的。在linux上,init和系统配置大多是shell脚本,不论是用bash、ruby还是python写出来的脚本,使用起来和用C语言写成的sed、awk等工具没有什么区别,作为用户,这些脚本的使用体验就和原生工具一样,我们熟悉的vagrant、chef、hg等工具都是脚本写的。而windows上,bat脚本的能力有限不说,其执行体验也差了很多。

不仅是工具,在执行效率上linux也比windows强很多。

我们现在开发很多web应用,很少有部署在windows平台上的,如果你是采用pythong、ruby或者java等语言来开发web,多数情况下你会部署到linux平台上。为什么,因为linux平台执行效率高,而且作为老牌服务器平台,有很多免费的优秀开源服务器软件。这样,我们很多程序员往往在windows上写java代码,在linux上部署war包。

可能有人会问,linux作为服务器效率固然不错,作为开发环境也许差点。我目睹过一个团队从windows切换到linux开发环境后,构建脚本的执行时间从十几分钟缩短到了7分钟左右。linux的文件系统比windows要快,很多脚本解析器的实现也更高效,因此解释执行的效率也更高。

除了效率,我也关注体验。

在mac上,所有程序的界面风格都是一样的,任何一个工具和应用,你都可以用同样的快捷键来进行基本操作,而在windows上,大多数的程序交互风格都不一样;linux和mac上所有命令行工具都是差不多的参数语法,而windows上的命令各有各的参数风格;linux和mac上所有命令行工具都有man文档,而windows上大部分工具都没有合适的文档;在大多数linux平台上,ruby、python、java已经默认安装了,而在windows上,光安装ruby+rails就有一个专门的团队来为其制作安装包了。

在linux和mac上,我在命令行里基本上可以完成所有任务;在windows上,如果我要ssh服务器,我要打开putty,如果我要启动mysql,我得找到mysql工具的快捷方式,启停服务我要到service管理窗口,加个环境变量我得鼠标左右键点击n多次到一个尺寸不能调整的小窗口里手动添加,完了我还得不得不重启cmd窗口。

在linux和mac上,现在很容易可以写一个脚本,把一个开发环境所需要的所有内容都自动化安装执行好,我们不需要一个文档来记载每一个新来的程序员所需要做的安装准备工作。在windows上,我也用powershell写过类似的东西,开发和维护这套脚本的体验都不太好。

我承认习惯是一个很强大的力量,毕竟当初我从win xp切换到ubuntu的时候,也是花了好一阵才能适应。现在之所以我这么抱怨windows,也可能是我在mac下活的久了的缘故。加之现在的IDE例如intellij和Visual Studio已经把java和.Net开发支持的很不错了。但是如果你的工作不只是在开发机上写写代码,你应该能够体会我前面说的那些差异。且不说windows平台作为web应用的部署平台早已没有任何竞争力,在我看来,作为开发环境,也已没有任何吸引力。

程序员开发windows linux,好程序员不用windows作开发环境相关推荐

  1. 使用Go语言交叉编译开发嵌入式Linux应用程序

    文章目录 目的 基础说明 编译生成嵌入式Linux应用程序 二进制文件瘦身 与C语言混合进行开发 总结 目的 Go语言非常适合用来开发存储空间不紧张的嵌入式Linux设备应用程序,可以在性能需求和开发 ...

  2. 使用VisualStudio2017开发嵌入式Linux应用程序

    曾几何时,在开发嵌入式Linux时,先在PC上安装一个Ubuntu虚拟机,然后桥接网络,安装Vmwaretools,设置共享文件夹或者配置ftp服务器来实现PC和Ubuntu的文件交换-,改代码在Wi ...

  3. 4GDTU工业路由器SDK二次开发与linux系统程序的结合应用 华杰智控

    DTU工业路由器SDK二次开发linux系统,是自带编译环境和各种库文件,SSH登录后可以直接编译软件, 编译好了后直接运行.支持C.C++.Python.PHP等语言进行编程,同时支持MySQL,S ...

  4. go 打包到不同平台windows linux运行程序 压缩程序体积

    转自:https://studygolang.com/articles/16579 1.Mac下编译Linux, Windows平台的64位可执行程序: $ CGO_ENABLED=0 GOOS=li ...

  5. linux程序打包安装,制作Linux下程序安裝包——使用腳本打包bin、run等安裝包

    制作簡單的安裝包的時候可以簡單的用cat命令連接兩個文件,然后頭部是腳本文件,執行的時候把下面的文件分解出來就行了.一般這個后部分的文件是個壓縮包,那樣,就能夠打包很多文件了,在腳本中解壓出來即可.這 ...

  6. linux程序内存布局,关于Linux中程序的内存布局

    我有一些关于Linux中的程序的内存布局的问题. 我知道从各种来源(我正在读"从头开始编程"),每个部分都加载到它自己的内存区域. 文本部分首先在虚拟地址0x8048000处加载, ...

  7. windows linux 共享鼠标,在Ubuntu/Windows下配置Synergy-键盘鼠标共享

    Synergy能做什么 Synergy是一款能够让使用者仅用一套键盘鼠标,在包括 Windows . Linux . Mac OS 等不同的系统上安装它,并且在设定好主从关系后,就能够同时操控多个电脑 ...

  8. itop4412开发版linux实验手册,【分享】iTOP-4412开发板使用之初体验[多图]

    入手了4412开发板有段时间了,当时配的7寸屏和WIFI模块,GPS模块,下面晒个照片介绍一下,手机拍摄图片有点模糊,实物很精致,是我所见过最好的板子.b( ̄▽ ̄)d 预装的Android4.0.3系 ...

  9. windows linux 传文件_2种windows到linux上传文件的方法

    lrzsz方式上传文件 首先安装lrzsz包 [root@localhost ~]# yum install -y lrzsz ftp方式上传文件 [root@localhost ~]# yum in ...

最新文章

  1. nmake构建Geos库
  2. php 基础 判断类型
  3. QT简介及QT环境搭建
  4. ffmpeg文档08-表达式计算/求值
  5. 关于html和javascript在浏览器中的加载顺序问题的讨论(zz)
  6. 【牛客 - 551E】CSL 的魔法(贪心,思维,STLmap,分块)
  7. arm linux漏洞,GitHub - armjirawat/linux-kernel-exploits: linux-kernel-exploits Linux平台提权漏洞集合...
  8. 指令重排序所带来的问题及使用volatile关键字解决问题
  9. ios蓝牙开发(三)app作为外设被连接的实现
  10. python怎么读取中文文件-Python3 解决读取中文文件txt编码的问题
  11. [转帖]国产操作系统概念及历史,目前国产操作系统有哪些?
  12. 关于《JavaScript百炼成仙》电子版,在线阅读地址~
  13. 沉睡者 - 怎么样可以在网络上挣钱,告诉你网上挣钱的5种方法!
  14. 可长期免费使用的国产PLC录波软件(数据采集软件)PLC-Recorder V2.0版新功能
  15. CTF show 萌新区解题报告 (一)
  16. python 钉钉发邮件报警设置
  17. 激光雷达相关技术方案介绍
  18. 打开浏览器显示找不到服务器DNS地址,电脑浏览器找不到服务器dns地址
  19. 有没有开源的虚拟路由器?有,VPP了解一下
  20. OO之美:好代码和坏代码

热门文章

  1. linux替换某个文件夹下所有文件,Linux 批量查找并替换文件夹下所有文件的内容...
  2. vb.net 窗体接收键盘事件_(十五)C#WinFrom自定义控件系列-键盘(二)
  3. xcode8 快捷键失效
  4. 剔除服务器返回的NSNull格式的数据
  5. ajax改变json指向,Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)
  6. c语言枚举法礼泡声次数,C语言枚举类型举例
  7. CF1042F Leaf Sets (贪心+树上构造)
  8. 知识点:Mysql 数据库索引优化实战(4)
  9. DetachedCriteria和Criteria的使用方法
  10. 树的存储结构(树的二叉链表(孩子—兄弟))