开发环境还是选Linux好

柯里薄雾
• 阅读 3051

因平台建设,笔者最近在调研图数据库Neo4j。在调研过程中,遇到的问题真的是波澜起伏不定,心神疲惫不堪。首先声明,这些问题不是Neo4j的问题,而是跟我们的开发环境有关。

先介绍下我们的开发环境:

  • 操作系统:Windows 7
  • IDE: Visual Studio 2012
  • 平台SDK: 最高支持到vs 2012
  • 开发语言: C++

因为公司创建初,服务平台是以Windows搭建的,所以基本上现在的开发环境是基于Windows的。

一句话:对于C++而言,Windows是一个糟糕的开发平台!下面我将用遇到的现实开发问题证明我的论点。

Neo4j驱动问题

Neo4j驱动支持两种协议,二进制的Bolt协议和REST风格的Http协议,前者比后者性能更高,优先选二进制协议。但发现,官方并没有提供C++的驱动,有一github上的个人项目虽然是C的,但基于Linux的。现在我面临的路有两条:

  1. Fork这个C项目,使之支持Windows平台
  2. 自己实现Bolt协议

好吧,还有第三条路。

Http 库

第三条路就是封装Http REST的API,这需要用到Http的库。

在这一点上,Windows下给C++用的Http库真的不太多:

  • WinINet
    一堆bug,微软已经停止维护了,而且微软声明这个库是面向客户端的,不建议在服务端使用。有多少公司在服务端使用这个库,请举手。
  • Winhttp
    这个可以在服务端使用,但一样:微软停止维护,bug也不少。我遇到的其中一个bug是连接设置超时无效。
  • libcurl
    对于普通的http小白,真的很难用,因为太底层了;可以类比为加解密小白用OpenSSL。
  • Boost Beast
    很新,需要VS 2015支持,当前开发环境不满足。
  • Poco
    看了项目介绍,以及样例,觉得挺好上手。然后就编译。。。因为依赖OpenSSL编译失败,我就编译OpenSSL,不同的OpenSSL版本对编译结果也有影响,有的直接编译失败,有的即使编译成功了,写程序测试也会出现找不到符号的错误。然后,我就从网上下载预编译的OpenSSL库,下载了好几份,最终还是编译失败。这一折腾,好多时间又下去了。。。
  • 其他
    。。。

上面的两个问题只是冰山一角,我相信很多人都遇到过类似的问题,还有更多的问题。相比Linux[没用过苹果操作系统哈],Windows作为开发平台主要有以下不足:

  • C/C++ 开发资源少
    比如刚才提到的一些开发库,有些是不提供Windows版本的。万一依赖它们,只能捉急了。
    还有一些开源软件也没有Windows的版本,如常用的Redis。
  • Windows下软件编译困难重重
    这有几方面的原因:
    (1)很多开源项目对Windows下的编译过程言之寥寥,按照流程一步一步编译,往往会出现很多问题。
    (2)Windows本身就不具备对开发的良好支持,在Linux下一个build-essential就能按照得差不多,Windows下连编译器的下载地址都不容易找。

特别说明一下:

  • 以上主要是针对Windows下的C/C++说的,实际上很多虚拟机语言,比如Java,在两个系统上差别很小,比如我用Java花几分钟就能搭建好开发环境,这类语言,有一些公司在Windows上开发,Linux下部署,看中的是Windows的GUI友好,Linux的优越性能。而我则不以为然,开发测试环境与最终部署环境的尽量一致,能有效避免系统各种稀奇古怪的问题,这都是血的教训。
  • Windows也有很多优点,比如GUI工具丰富,有VS这么强大的开发套件,有先进的完成端口模型,有强大的Powershell[这个已经开源了,各系统都支持]等等,只不过相比Linux而言,单薄不少。

现在互联网公司,大部分都使用Linux作为服务器系统,不谈系统本身的优点,主要还是因为这个平台上的开发者多,久而久之,围绕该系统的生态就有了。而Windows虽然这几年也在大力拥抱开源,但落得太远,也就不容易看到进步。

不管多么浮夸的高谈阔论,最终都要落地实施,而开发者的时间成本尤为可贵,Linux是一个很好的开发平台。

关注公众号哦
开发环境还是选Linux好

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
4年前
JOptionPane修改图标
1.在Linux平台下.JOptionPane会显示Java默认的图标,在window平台不显示图标,如何替换这个图标了?2JOptionPane.setIcon(Icon)修改的是内容区域的icon,而不是左上角的Icon.所以需要通过修改Jdialog/Frame的图标来达到修改默认图标的问题.3.代码:if(JOptio
Wesley13 Wesley13
4年前
NEO从源码分析看网络通信
_0x00前言_NEO被称为中国版的Ethereum,支持C和java开发,并且在社区的努力下已经把SDK拓展到了js,python等编程环境,所以进行NEO开发的话是没有太大语言障碍的。比特币在解决拜占庭错误这个问题时除了引入了区块链这个重要的概念之外,还引入了工作量证明(PoW)这个机智的解决方案,通过数学意义上的难题来保证每个
Stella981 Stella981
4年前
React项目中应对开发、测试、生产环境下使用不同全局常量的问题
在开发过程中,避免不了后端在开发、测试、生产环境不一致的情况,这不最近就遇到这样的问题:在开发和测试环境,后端需要一个参数比如:zonehk1,在生产环境中需要的参数又是zonehka,那么解决这种问题的方法也不是唯一的,这里只介绍一种通过配置文件完成的过程。我们在构建react项目时,会执行npmruneject,导出react脚手架
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这