zoukankan      html  css  js  c++  java
  • 技术杂谈

    好久没写博客了,最近事情也比较多,感慨颇深,于是打算写一篇博客来记录这一个月来的成长,也算一个总结提升的过程吧。

    一 背景

      这个月发生的事情挺多的,最主要的是从老东家YY语音离职了,来到了目前的新东家 一个专注于区块链供应链的公司。说实话在这之前并不知道区块链是啥技术,甚至连最近大火的比特币是啥都不知道,了解听说比特币最早的也就是今年大规模爆发的勒索病毒,该病毒会将感染者的文件全部锁住,然后威胁宣称不支付一定数量的比特币作为赎金就会删除所有文件。说实话当时也不是很在意这些东西,感觉这种事只要自己绿色上网就不会感染病毒,自然而然也就没去深入了解比特币的原理。作为IT从业者这是不好的习惯,在这技术革新频繁的互联网时代每个从事IT行业的都应该保持一颗积极求知的心,时刻留意行业动态,学习新技术、摈弃旧技术,这样才能在这技术浪潮中维持一份地位、不为社会所淘汰。废话不多说下面就从比特币说起,然后再到自己从C++转GO的一些心得,最后为一些个人杂谈来阐述本文。

    二 比特币

      什么是比特币

      比特币源自中本聪2009年发布的一本白皮书:一种点对点的电子现金系统,随后中本聪根据白皮书的设计发布第一版比特币系统源码,最终开源成为目前最火热的区块链开源项目。比特币是   一种电子货币,不同于Q币这类电子货币,Q币是由腾讯公司发行的,具体价值只能在腾讯公司体系下才能发挥作用。比特币是具有实际价值的电子货币,并不依赖于任何机构发行,这就说明比特币的价值不受任何机构或者储备控制(比如黄金)它的价值是由市场规律决定。比特币总量为2100万,这代表比特币是一种通缩的货币,随着越来越多的人接受比特币,那么比特币的价值就会一直增长,通过历史数据可以证明这一点:2010年单个比特币的价值不足一分钱,截止到目前单个比特币的价值已经达到了22000人民币,其价值已经翻了两百万倍,并且随着人们对比特币的认识增多,其价值还会一直升高。

      中心化电子货币VS去中心化电子货币

          电子货币诞生的时间很早但是由于各种各样的原因导致其未能流通起来。对于中心化的电子货币其最主要的问题就是依赖于授信的第三方,即授信第三方决定了该体系是否能够成功,这就会导致该体系过度依赖于授信第三方,任何一个环节出问题都会造成巨大的损失 如:电子货币价值、发行数量、授信第三方本身信用与及中心化系统易遭受攻击等问题,这些问题是目前中心化电子货币无法很好解决的问题。然而去中心化电子货币则不存在上述问题,一个去中心化的电子货币不依赖任何机构来进行发币,每个参与的节点通过一定的算法来竞争发币的权利,这就能够保证电子货币定时定量投放市场并且不需要黄金等储备来保证货币的价值。去中心化电子货币不存在授信第三方,而是每个参与节点相互监督只要诚实的节点达到51%就能够达到可信,并且也不存在中心系统被攻击的问题,然而去中心化电子货币也存在长期困扰分布式系统的一致性问题,那就是双重支付问题。

      比特币实现-区块链

         比特币的底层是基于区块链技术的,区块链技术是被誉为继互联网之后又一个能够使人类发生变革的技术,区块链也经常被用来和网络底层技术tcpip来对比,认为其影响跟发明tcpip一样深渊,可见区块链的研究价值是非常大的(还没上车的小伙伴赶紧上车了)。简单来说区块链是一种去中心化的分布式账本(相当于链表,每个链代表一页账本),每个节点都维护着同样的一份账本(类似于分布式里的冗余存储,每个节点存储一模一样的数据),并且通过一定的共识机制(分布式一致性算法)来将数据追加到账本末尾。区块链具有不可复制、防篡改与及匿名等特性,为了实现这些特性,区块链用到许多目前已经成熟的技术:分布式存储、P2P通讯技术、密码学加密技术、工作量证明(pow)、默克尔树等,总体来说区块链是许多技术的集合体,并不是什么新兴的技术。比特币基于区块链很好的实现了一套分布式的电子货币,其使用工作量证明共识机制能够使分布式系统达到最终一致的状态,从而避免了双重支付的风险。

         比特币介绍就告一段落,希望具体深入的推荐一本书 <区块链技术驱动金融> 讲得十分全面是本非常棒的书。

    三 go语言学习

         从零学Go,用了七天的基本就上手了,总体而言Go是一款非常棒的语言,语言风格偏向C语言,学习门槛非常低,非常适合用来写大型后端进程。用了一个月的Go,感觉已经脱不了坑,再也不想用C++了,下面从几个方面来对Go说明。

        1.执行效率    

          Go给我的印象就是,动态语言的使用风格和便捷、静态语言的执行效率。实际上Go语言是一门静态语言,这就决定其效率要远大于动态语言,实际上其效率跟c/c++是同一级别的

        2.编译/跨平台

        Go语言编译不需要像C++那样需要经过繁琐的预处理->编译->汇编->字节码,而是直接生成字节码这就使其跨平台性优于C++,只需要在编译时指定相应的平台即可。相应的Go的编译效        率远远高于C++,原因C++支持模板与及头文件包含,会生成大量的代码并且经过复杂编译流程,最终Go编译几十秒的程序C++可能会编译达数小时。

        3.低耦合

           Go不支持目前C++的多态和泛型,因此也无法实现类似STL那样优雅的模板库,同样也无法实现像虚函数那样的运行时动态联编,但继承泛型这种特性会引入耦合,导致系统规模庞大了不易     于维护等问题。而Go使用接口技术来实现类似C++的多态和泛型,Go使用一种像什么就是什么的方式来实现多态,如定义一个狗的接口如下:

     

    type dog interface{
      bark()
    
       eat()
    
       run()
    
    }
    

     只要某个结构体实现了这三种方法,那么我们就认为该结构体就是狗。如:

    type something struct {
        name  string
    }
    
    func ( something *obj) bark() {
        fmt.Printf("i am %s",obj.name)
    }
    
    func ( something *obj) eat() {
        fmt.Printf("i am %s , eating something",obj.name)
    }
    
    func ( something *obj) run() {
        fmt.Printf("i am %s ,runing",obj.name)
    }
    

     那么我们就可以通过类似多态的方式来调用狗的方法:

    func main(){
         var d dog = new(something)
         d.bark()
         d.run()
         d.eat()    
    }
    

      Go通过接口的方式实现多态的方式不仅降低了类之间的耦合,而且以一种更直白的方式展现类的从属关系。

       4.语言层面支持高并发

           这也许是Go相对其他语言优点最明显的地方了,相对C++来说要实现一个高并发的服务器工作量巨大,一般来说C++实现高并发通常的做法无外乎以下几点:

           1.选用一个异步事件驱动库,libevent、libuv、Asio 或者干脆直接使用linux底层提供的epoll

           2.实现线程池、任务队列、调度器

           3. 实现序列化、反序列化

           4.各种socket的封装、handler的实现

           ...

           等实现完了黄花菜都凉了。然而对于Go而言,上面的绝大部分工作都在语言层面支持了,是的你没听错,就相当于声明一个对象然后调用方法就可以了。

        而Go要做到高并发只需要几样东西:runtime、goroutin、select、channel ,下面分别介绍

           1.runtime 

           即Go的运行时库,Go支持运行时机制,操作系统上相当于在用户态和内核态之间加入一个中间层,用于调度用户态的任务。运行时机制是处于用户态的,而非内核态的,即通过runtime来进     行系统调用,而非直接由程序员进行系统调用。runtime在Go中主要用于协程的调度,使得原本同步执行的协程能够像多线程那样同时执行。

           2.goruntin

           Go高并发的核心,即协程。协程是轻量级的线程,也称用户态线程,一般而言线程是运行在内核态的并且由操作系统来控制,在多线程调度的时候需要操作系统从用户态切换至内核态,当      线程达到一定数目的时候如果频繁的线程切换回导致大量的时间耗费在系统调用上,导致系统的性能急剧下降,所以在高并发网络编程时并不是线程越多越好。再回来说协程,协程是用户态线    程,即协程是运行在用户态的,在进行协程调度的时候不需要切换至内核态,并且创建一个协程的开销十分小,通常而言一个进程开一千个线程基本就over了,然而一个线程开数十万个协程基    本毫无压力。由于协程是用户态线程,不受操作系统控制,这就需要我们手动调度协程,不必惊慌,不是还有runtime吗。

           3.select 

           Go中封装好的异步事件驱动库,是不是很惊奇?只需要一个关键字就能搞定。

           4.channel

           Go中用于协程间通讯的关键字,相当于一个生产者消费者模型的队列。

        

       5.强大的标准库/社区

            Go将许多工程上常用的工具都封装成标准库, 如http、json、加解密、日期、日志等,使得我们不必自己开发开发,大大增强了开发效率,此外社区资源也十分丰富。

       6.其他的特性/缺点

            1.支持GC,跟内存泄漏说拜拜

            2.不支持构造、析构,无法实现RAII

            3.支持defer,即derfer将会在函数退出前执行

            4.支持函数返回多个返回值,运行使用  _ 来忽略某个返回值

            5.不允许光声明不使用、不允许光导入不调用、不允许左括号另起行

    四 个人杂谈

        入行差不多一个月,学习新技术的感觉非常不错,从大方向来说,从一个传统互联网行业转来一个新兴的互联网行业使自己的思维开阔了许多。有机会跟上了一波技术浪潮,说实话个人对这一行的前景十分看好,服务器系统逐渐从中心化、大型化向小型化、去中心化发展,这是目前技术的大方向。虽然在分布式系统这一块目前也有许多,但是没有哪个系统能像比特币一样,真正做到完全去中心化。这也是让我激动不已的地方,目前区块链作为一种底层的技术正在被广泛的研究和使用,大有之前互联网刚刚兴起时候的气势,仿佛人们找到一个切入口,迅速地向其涌入都提出各自的“区块链+”。除了区块链目前在电子货币领域的成功运用造就了许多电子货币,比如比特币、莱特币、以太币,另外人们还积极探索试图在区块链之上来搭建一套图灵完备的体系比如以太坊,使得人们可以基于此创建自己的去中心化应用,更有甚要搭建一个区块链操作系统(eos)、区块链文件系统(ipfs)。也许真正的技术革命正在来临,而我需要在这革命中跟紧步伐,努力为革命大厦舔砖加瓦。

  • 相关阅读:
    异或运算的运用
    HDU1251(统计难题)
    待解决题目
    tarjan算法模板
    FZU1465
    边双联通分量(构造边双联通图)
    UVa 12558
    codeforce Error Correct System
    codeforce The Art of Dealing with ATM
    ~0u >> 1
  • 原文地址:https://www.cnblogs.com/wzsblogs/p/7300681.html
Copyright © 2011-2022 走看看