zoukankan      html  css  js  c++  java
  • 我的编程语言经历

    Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。”,尽管写了这么多年程序,用了这么多的语言,但我自认还没悟道编程语言怎样改变我的思维方式。

    几天前。我须要用python来为ledisdb写一个client,我突然发现,对于c++,go这样的语言,我假设须要实现一个功能。首先想到的是问题是代码应该怎么写。可是当我使用python的时候,我首先考虑的问题是在哪里去找一个库用来解决我的问题。可能这就是使用不同语言带给我的不同思考方式吧。

    我的编程语言经历没有那么复杂。没用过非常多,可是事实上也够我受的了。尤其是在不同语言语法糖之间切换的时候。有种让人崩溃的感觉。

    没准我应该升级一下我的大脑cpu,使其能够更高速的进行中断处理。

    c

    我是从大学才開始学习编程的,相比方今的小朋友来说,能够叫做输在了起跑线上面。

    谁叫曾经生活在山区。没机会接触电脑这玩意。

    我的第一门编程语言是c,不同于非常多童鞋使用的谭浩强神书,我用的是周纯杰的<<c语言程序设计>>。不知道每年有多少同学受到过它的摧残,当然还有那哥们蹩脚的普通话。

    在大学里面。非常多同学的c的毕业设计都是我帮其完毕,但我始终认为自己仍然是个半吊子,除了c的基础略微强一点之外。非常多方面譬如操作系统,算法等全然不会。

    (如今随着工作年限的添加让我越发懊悔,当初怎么就不略微学点这些知识,尤其是编译原理。)

    我差点儿没怎么用c开发过项目,仅仅在tencent可怜的维护过别人的c项目。但至少能看懂c代码,这就够了。

    由于大多数时候,我用的是c++,而不是c来解决我的问题。

    c++

    c++是我工作使用的第一门语言,也是我使用时间最长的一门语言,都七年之痒了。只是还是有点不离不弃的。

    曾经上学的时候有一句口头禅,叫学好c++,走遍天下都不怕。可是有几个人能把它学好的?所以千万别说自己精通c++,那会被人歧视的。

    我使用c++能够分为三个阶段:

    类c阶段

    这个阶段主要是我第一份工作的时候。那时候才毕业,c的烙印非常深,面向对象除了有个概念,真正是啥全然不知道。

    所以最喜欢的方式还是写着一堆函数来解决这个问题,当初VIA身边那帮c++的牛人居然能忍受我这样的代码,真佩服他们。

    面向对象阶段

    后来去了第二家公司linekong,開始做游戏。才開始真正意义上的用c++写代码了。

    记得最開始去第一家公司面试的时候。被问了啥是面向对象,当时不假思索的答了继承,多态和封装。

    啥叫封装?整一个class,把该包的都包了。一个同事曾告诉我。他见过有几万行代码的class,看来我这个几千行的太小儿科了。

    啥叫继承?先来一个父类,干脆叫bird,有一个fly方法,再来一个子类,叫duck吧,继承了bird,只是duck会fly吗?一个父类不够,再来一个。搞个多重继承。什么?出现了菱形继承,那干脆在来一个virtual继承得了。

    啥叫多态?不就是virtual function,然后父类指针能在执行时依据实际情况调用对应的子类实现。那c++的多态是怎么实现的?看看<<深度探索c++对象模型>>不即可了。

    这段时间,能够算是我写c++代码最多的时候。都快写到吐了。尤其还要忍受那龟速的编译。

    我们居然都实现了直接通过汇编改c++的虚表,使其调用自己的函数这样的变态的东西。在那时候我就得出结论,假设不想早死,尽量别用这个东西写代码。可是到如今我都在不停的慢性自杀。

    现代C++阶段

    不知道从什么时候開始,我突然认为我应该来点modern c++的编写方式了,c++0x都出了,还不玩一下就晚了。当然新特性那么多,不可能所有都拿来用的,Bjarne Stroustrup貌似都说过,c++0x应该算是还有一门语言了。

    于是哥就走上了伪modern c++之路,class还是须要的,不然数据怎么封装。继承吗,比重减轻吧。最好採用面向接口的编程方式。而多态,能不用就不用吧,反而认为bing + function的方式实现的delegate模型反而更方便,没准也更酷哟。

    shared_ptr,weak_ptr是须要用的了,c++没有gc,所以一套好的内存管理方式是不可缺少的,每次new之后还要记得delete也比較烦,最严重的是可能忘记那就内存泄露了。

    于是,我就自认为我进化了,最典型的样例就是我写的高性能网络库libtnet,感觉非常modern了。

    lua

    最開始知道lua。是云风那本编程感悟的书,当时可是菊花一紧。认为这东西是啥。为什么能跟c结合到一起使用?

    后来自己开发游戏了。才发现lua真的是一门非常强大的语言,短小精悍。嵌入简单,性能超强。全然是作为游戏脚本语言开发的不二人选。

    只是我最開始使用lua的经历不怎么happy。最開始就是接手了一个c++与lua的粘合层库,关于这个库的传说,见这里Lua 不是 C++。后来,在踩了无数个坑,填了无数个坑之后,我最终弄得相对稳定了。

    貌似如今我曾经的同事还在使用,只是正如我在lua c函数注冊器中说明的那样。对于语言的交互,简单一点才好。如今曾经做的游戏已经开源,见这里。那个传说中的蛋疼粘合层也见了世面。当然,我可不会告诉你们好多搓代码是我写的。

    后来,在如今的公司。由于项目的须要,我们急需解决python的非常多性能大坑问题,于是我開始推广使用openresty,一个用lua包裹的nginx,用了之后。腰不痛了,腿不痛了。性能妥妥的。

    由于lua,我第一次尝到了在代码里面直接写配置的便捷,用一个table搞定,相比起来,c++处理ini。json这些的弱爆了。另外,动态语言的热更新机制使其代码升级异常方便,只是你得非常小心lua的闭包,没准你又一次载入了代码执行还是老样子。

    lua是一个动态语言,所以不用我们管内存释放问题。可是仍然可能会有引用泄露。在开发游戏的时候,为了解决我们程序lua内存泄露的问题。我曾经干过直接从_G递归遍历,扫描整个lua数据的事情。相比在c++使用valgrind这些程序的工具。lua配套的东西还是太小儿科了。

    lua的调试也是一个大头问题,我曾今写过几个lua的调试器,比如这个,甚至都支持了相似gdb那样ctrl+c之后动态的设置断点。可是仍然没认为比gdb方便。所以多数时候。我都是写log为主。

    python

    尽管小时候吃过非常多蛇,可是蟒蛇可是从来没吃过的,如今看来python味道还不错。

    我是来了kingsoft之后才開始正式使用python的。

    对于为啥使用python。我曾跟拉我进来的技术老大讨论过,他直接就说,开发高速,上手easy。

    python开发的高速非常大程度是建立在丰富的第三方库上面的,我们也使用了非常多库,譬如tornado,gevent,django等,可是正如我最開始说的,由于我们有太多的选择。面对一个问题的时候。往往考虑的是怎样选择一个库,而不是自己怎样实现,这事实上在某种程度上面使得非常多童鞋知其然而不知其所以然。这点,lua可能是还有一个极端,lua的定位在于嵌入式和高性能,所以自然地,你得自己动手造轮子(当然,如今也有非常多好的第三方库了),尽管有时候写起来非常不方便,可是至少自己非常清楚程序怎么跑的。

    当然。我绝对没有贬低python的意思。我非常喜欢这门语言,用它来开发了非常多东西。同一时候也知道非常多公司使用python构建了非常多大型稳定的系统(我们的产品应该也算吧)。

    仅仅是如今我越发认为,看起来简单的语言,假设没有扎实的基本功底,写出来的东西也非常烂。而python,恰恰给人放了一个非常大的烟雾弹,你以为它有多easy,事实上它是在玩你。

    go

    好了,最终開始说go了,let's go!

    。!

    我使用go的历史不长,可能也就一年多,可是它如今全然成了我最爱的语言。go具有了python开发的迅速。同一时候也有着c执行的性能。

    (当然。还是有差距的!)

    网上有太多的语言之争。包含go,有人恨,有人爱。

    但萝卜白菜,各有所爱,对于我来说,能帮我解决这个问题。让我用着舒服的语言就是好语言。

    go非常适用于服务端程序开发。比起用c++开发,我陡然认为有一种非常幸福的感觉,譬如对于网络编程,在c++里面,我须要自己写epoll的事件处理,并且这样的异步的机制全然切分了整个逻辑。使得代码不怎么好写。我在开发libtnet的时候感触尤其深刻。可是在go里面。由于天生coroutine的支持,使得异步代码同步化了,非常利于代码的编写。

    如今我的主要在项目中推动go的使用,我们已经用go搭建了一个高性能的推送server,兴许还有几个系统会上线,并且开发的进度并不比使用python差,另外也非常稳定,这让我对go的未来充满了期待。

    我也用go写了非常多的开源程序,也算是拿的出手了。譬如:

    • ledisdb:一个基于leveldb的提供相似redis高级数据结果的高性能NoSQL。真挺绕口的。简单点就是一个高性能NoSQL。
    • Mixer:一个mysql-proxy,如今支持通用的mysql命令代理,读写分离。以及自己主动主备切换。兴许将要參考vitess支持分区,为此一直在恶补编译原理的知识。

    • go-log:一个相似python log模块的东西,支持多种handler,以及不同的log级别。

    还有一些,能够參考我的github,譬如moonmq(一个高性能push模型的消息server),polaris(一个相似tornado的restful web框架)。由于go,我開始热衷于开源了,并且认识了非常多的好基友。这算得上一个非常大的收获吧。

    其他

    好了,说完了上面我的长时间使用语言(至少一年以上),我也用了非常多其他的语言。如今尽管使用时间比較短,但不排除兴许会长久使用。

    Objective-C

    由于我家最终有了苹果三件套。所以决定开发app了,首要的任务就是得学会使用Objective-C。我承认这真是一门奇葩的语言,假设没有xcode的自己主动补齐,我真不知道写起来是神马样的感觉。

    并且第一次见到了一门推荐写函数名,变量名就像写文章的语言。至少我写c++,go这些的一个函数名字不会写成一个句子。

    我如今在自学iOS的开发。慢慢在整出点东西,毕竟答应给老婆的iphone做点啥的。兴许干脆就写一个《小白学iOS》系列blog吧(假设我有精力!),反正对于iOS,我真是一个小白。

    java

    好吧。我也在android上面写过程序。build到我的S3上面去过,对于java,我的兴趣真不大,貌似自己还买过两本《java编程思想》,那时候脑袋铁定秀逗了。

    可是不得不承认。java在server领域具有非常强的优势,非常多非常多的大企业採用java作为其server的编程语言。典型的就是淘宝,据传杭州的非常多软件公司都不用java的。你用java就等于给淘宝培养人才了。(只是我发现他们非常多基础组件譬如TFS这些的可是c++的哟!

    java是门好语言,仅仅是我个人不怎么喜欢,可能我就是太小众了。仅仅对c语言体系的感兴趣。所以非常多公司我去不了,哈哈。

    erlang

    受《计算机程序的构造与解释》影像,我一直想学一门函数式编程语言。最開始玩的是elisp。谁叫曾经我是个深度的emacser(后来居然变成了一个vimer,再后来就是sublimer,这世界真奇妙)。

    后来还是决定好好学习一下erlang,也第一次领略到了函数式编程的魅力。自己唯一用erlang开发过的东西就是bt下载的client,只是后来发现用处不大就没继续进行下去了。

    (好吧,我承认当时想下岛国的东西)

    学习erlang之后最大的优势在于如今能看懂非常多优秀的erlang项目。譬如我在做moonmq以及公司的推送服务的时候。研究了rabbitmq,这玩意可是用erlang写的,而我居然还能看懂,太佩服我了。

    还有么?

    想想自己还学了哪些语言?貌似没了。不知道awk算不算一门。

    看来我会得语言真不多。

    兴许可能会学的

    逆水行舟。不进则退。计算机发展这么迅速,我也须要不断提升自己,当中学习一门新的语言可能是一个非常好的提升途径。至少能为我打开一扇门。譬如,假设掌握了日文。就能更好的理解岛国片的精髓。

    我不会日文,所以还是个门外汉。

    ruby

    ruby是一门非常优雅的语言,非常多大神级别的人物推荐,github貌似也是ruby的幕后推手。

    由于ROR的兴起,使得ruby更加流行。看来。一个好的框架库对于语言的推广帮助真挺大的。

    相比而言。python有django,tornado等,光选择适合自己的就得费点时间。

    ruby能够算是一门全然面向对象的语言,连number这样的的都是对象,并且看了几本Matz的书。认为这哥们挺不错的。对技术的感悟非常深。所以更让我有兴趣去了解ruby了。

    javascript

    作为一个技术人员。没一个自己的个人网站怎么行。我的阿里云都是包年买的(明年还是买国外的vps吧),自己的个人网站还无影无踪。

    好吧。我全然不会javscript,看着css就头疼,没准我从一開始想自己写代码搭建个人网站这个步子就迈的太大。扯着蛋了。假设先用一个开源的框架搭建起来,再自己调整完好,可能会更好。

    但不管怎样,javascript这门语言还是要学习了解的,尤其是以后随着html5的流行。加之node.js疯狂流行,这门语言也会愈发的发光发热。

    C#

    事实上本来不准备跟ms的东西扯上关系的,尽管vs是一个非常强大的开发工具,可是我自从换成mac之后就不准备再迁回windows。

    仅仅是c#我可能是必须要学会的,由于那个坑爹的unity3d,尽管unity3d也提供了其他语言的支持(譬如伪javascript),可是大量的开发人员还是选用了c#,至少在中国我问过非常多朋友,都妥妥的用c#,既然这样。我也仅仅能考虑学习使用了。

    至于我为啥蛋疼的想玩unity3d,毕竟干了非常多年游戏开发,一直有自己弄一个简单小游戏的梦想,还是妥妥的unity3d吧。

    自己造一个?

    语言千千万,我不可能所有学会的,并且以后没准由于业务的须要,没准都会自己造一门语言,也就是DSL。

    只是这个貌似还离我比較遥远。编译原理的东西太差了(说多了都是泪呀)。自己写词法分析还成,后面就菜了。这也是Mixer一直没啥进展的原因。只是已经买了龙书,在学习屠龙秘籍,希望成为顶尖高手吧。

    后记

    写了这么多,看来随着年岁的添加。越来越啰嗦了。

    不是有一句古话:吾生也有涯,而知也无涯 。以有涯随无涯,殆已。只是不停地追逐不也是乐趣一件?

    仅仅是,如今我首先要做的就是向我老婆申请资金升级电脑了吧!

  • 相关阅读:
    namespaces in C++
    cout如何刷新缓冲区
    Journey CodeForces 1336F[data structures divide and conquer graphs trees]
    using ll=long long;
    Kaavi and Magic Spell CodeForces 1337E【dp strings】
    摸个🐟
    gcc的几个有用的处理二进制位的内置函数
    Yui and Mahjong Set CodeForces 1337F 【interactive】交互式题
    C++ auto 的使用
    2005年微软十大安全漏洞 java程序员
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5422446.html
Copyright © 2011-2022 走看看