一些软件概念上杂乱无章的2 

我们经常会遇到一种情况，好入手，难精进。换句话说在抵达瓶颈后，应该如何突破才是最高效的。

这种情况很大程度在于路子不对，看似咫尺，实则天涯。怎么理解呢，就像是有些岗位注定是空降的。看似风马牛不相及，不过确实是正路。

之前有提到我在了解了基本的C++之后，准备重新看看之前看的不是很明白的Python、go、Lua。

我现在看软件的视角，虽然依旧不成熟，不过相对比与最开始解除的时候，只能写一些Hello world,好了不少，应该会有些新的理解。

-----

Python 的使用难度很低，几行简单的代码，就可以将想法实现，反馈性强，修改几行代码后，就可以看到效果。

Python 的问题在于，自学的引导性太差， 很容易陷在函数式编程中出不来，基本上，作为一个实现想法的工具而言是合格的，但是对于更深层次的挖掘，在完成功能的基础上，很难从自己需求的角度去探寻出项目式的结果。

Python 的底层和上层的过度差异性太高，不去将C++磨练到一定程度,Python永远都是在调用api,根本没有写库的能力。

C# 的感觉呢，初学时的门槛要稍微高一些，工程化在拖拽的阶段过渡到代码的阶段也很顺利，实现项目的完成性，相对于Python 阶段有了一个显著性的提高，代码的分离感，层次的构建，各种设计方法和范式的运行，都要比在Python 中规范一些。

C# 的缺陷在于与C++ 的交互方面，当开始涉及到这里的时候，那种割裂的断层感又出现了，过于底层的东西，基本都在别人封装好的库里，而自己对与如何封装出这种优雅的库函数，单纯依靠自己的摸索，很难很难。

于是这里又涉及到了C++，C#写道一定程度，本能的就会朝向C++这边发展。

C++ 非常的繁琐，在有C# 的基础上，面对C++ ，我依旧显得非常无力，很多时候就是有一个大概的想法，但是如何实现想法，自身对于代码和范式的掌握不足以支撑自己实现出来。

-----

C# 的优势在于对C++ 的兼容性上，极其出色，缺陷同样在此，许多原始库就不提供对于C# 的原始支持。

比如OpenCV , 提供了Python,JAVA,C++ 三种编译版本，但是不提供一个C#的版本。

比如CUDA ,比如OpenGL,当然这些都有其他人提供了一个封装好的C# 版本，但到底是不如C++的可扩展性好，面对高级需求时，很乏力。

如果是C++ 出身，转入C#,很自然的对于里面的细节的部分就可以有着一个实现，但是如果只看C#,就很难理解。

虽然C# 提供了unsafe 的写法，但是显得很鸡肋，小的函数没问题，但是具象到工程层面，学习梯度还不如补一补C++。

为了解决这种，C#这块的学习的进阶就只能朝向C++ 。然后来反过来反哺C# 。

当然python 的无力感来的更早一些。

创造某种语言一定是基于某种理由的，如果不是，其他人也肯定会选择不用，正是因为后来的语言，解决了之前语言的某些痛点，所以才让许多人从原来的语言中转向新语言的开发。

语言只是一个接口，调用硬件的接口。

比如CUDA, 用C++创建连接，C# 创建创建连接，JAVA创建连接，Python，在GPU 内部应该效率是一样的。外部效率略有差异。

还有线程之类的。

至于C++学到什么时候算是头，能用其他语言写出来的，用C++ 能够写出来就算是到头。 

学习C++就像是修炼内力，而C#,python,Lua,Go,QT,OpenCV，Matlab之类的，则更像是武学或者是武器。

单纯学习C++，对于解决实际问题而言，太过于遥远，而只学习工具的话，瓶颈期会来的很快。就像幼童拿上手枪，也要比成年人拿上棍棒要厉害。