扯买房实在不擅长,咱门还是来聊程序吧。
A,B,C,D,E,F,G大鹏说,我《都选C》,我是不知道大鹏是不是也写过代码,他居然清楚C的重要性。对我来说,C语言应该可以算得上是世界上最伟大的编程语言。全中国口气最大的程序员,业界称之为“垠神”,曾经发过文章吐槽过业界各种主流的编程语言(对Java,的Python稍微宽容一些),他说Go语言设计有错误,Ruby是垃圾,JavaScript是垃圾中的垃圾。但我看他对C语言却没发表过什么负面言论。
之前参加Go大会,演讲的人许多都在说受不了C语言了,它动不动就爆内存,为了提高系统稳定性与可维护性他们把原有的逻辑用Go语言重写了一遍,这应该是一个正确的策略,并不是C语言不适合大项目,而是要掌控好这门编程语言实在太困难,一个公司很难保证招聘的所有员工都牛逼到考虑到如此之多的内存管理情况,难免引入一些有内存泄露隐患的代码,与其在这里面死磕还不如换一种更好掌控的语言,这或许更符合公司的发展需要。
C语言没有垃圾回收,需要自己去管理内存释放内存,而这点对于现代程序员来说确实有点难以接受。除此之外语法过度严谨,定义方法之前都需要预先声明,指针操作难以理解这种种麻烦事也导致了C语言的市场份额(应该这样说)渐渐被其他语言所占去。不过我觉得以上种种麻烦事也是C语言的魅力之处吧。它能让我们可以更加直观地与计算机系统打交道,让我们可以更加清晰地了解到一个程序运行的时候发生了什么事情,我们哪些方面需要系统的接口支持,我们能够清楚自己需要分配多少内存空间等等等等。
1. 我们往往忽略了它的存在
对于许多计算机系的同学来说C语言可能就是噩梦,以至于他们遇到Java的时候就如同找到一根救命的稻草。经济快速发展的今天C语言似乎渐渐失去了昔日的荣光,在语言排行榜上的第一名的位置已经让给了Java,游戏领域C++已经占有了一席之地,Web领域,Ruby,Go,Python,JavaScript这些语言各自占着不同比例的“市场份额”。那问题来了,C语言是否还有市场?。
让我们透过现象来看看更本质一点的东西,目前承载着我们生活的大部分技术其实都跟C语言脱不了关系。比如,Python,Ruby这些流行编程语言的解析器,目前使用最广泛的服务端操作系统--Linux的内核,以及我们目前用得最多的版本管理系统Git,他们都是大神们用C语言编写而成,只是我们平时看不到C的存在罢了。或许它已经被编译成二进制代码,可以直接在命令行直接运行,或许有些人给你提供了友好的用户界面,让你们看不到在背后默默支撑他们的人。或许有人用它实现了其他更加高级的编程语言(如Ruby,Python,Lua),让你沉迷于这些语言的语法糖的时候忘记了它的解析器是由谁来实现。
如此看来就有点像是前端开发跟后端开发的关系那样,个人觉得后端工程师往往需要承担比前端更加大的工作压力,他们编写的代码支撑着我们系统最关键的部分,但是人们往往只能关注到他们能够直接触碰的东西(可供用户使用的UI界面),却忘记了为了支撑他们所见的这个页面背后默默运行着的服务端代码。C语言实现了许多主流语言的解析器,而我们基于这些编程语言实现了很多了不起的网站,App,而它自己(C语言)却渐渐淡出了人们的视线在背后默默运行着。
2. 你可以学会它
C语言难,是真的难,他是很多大学教计算机课程的“守门”语言,为何说是守门语言?大学老师美其名曰:“用它来吓跑那些对在计算机领域混水摸鱼的人(说得好像他自己不是在摸鱼似的)。”这确实有点用,说实在这也吓走了一些人,我自己也被它吓跑过。
C语言是难,但个人觉得并没有老师说得那么玄乎,如果真如老师所说理解不了指针的人就不适合干这行的话,那我早就该转行了,事实是每个人的智力水平不一样,有些人只是接收得慢而已,凭什么要因为这些老师的几句话就打退堂鼓?
它没有垃圾回收还有异常处理,我们需要自己去分配内存,它甚至连对象都没有。以至于很多人都黑那些学C语言的人找不到对象(好吧,这点我承认,所以我现在更多在写Ruby)。C语言看起来更像是手动挡的汽车,虽然比起自动挡的汽车有点难以把控,但熟练之后的那种操作感还有成就感是无与伦比的。这也导致了我在大三别人都在苦学Java的时候选择了C跟Linux,只是就业机会堪忧只能暂时放下了,最后为了不随Java的大流投入了动态语言的怀抱。如今看来甚好,学习了动态语言之后更加明白了C的重要性,以及Java的非绝对必要性,哪怕现在我用C语言就只能写出"Hello World"也没关系,只要用心,愿意花时间研究,C语言并没有想象中那么难,你一定可以掌控它。
3. 这东西有什么用?
学C语言可以找到什么样的工作?又是一个尴尬的问题,我要是知道答案当初我可能就不会跑去学Python了。我大学时候碰过壁,我以为如果我学会了C语言在外面一定可以找到好工作。后来我发现我错了,好不容易去了一家声称招C语言的公司实习,去了之后他们让我学C#,工作两个星期后跟他们老总接触之后发现,原来他们是分不清C跟C#的区别。
以前据说嵌入式领域会用到C语言,不过好像这个领域也被Python,C++这些语言占领得差不多了。C语言会不会演变成像Lisp那样只适合用来做教学语言了?
之前听过有些大神说过
写Lisp你很难找到相关的工作,但是它能让你成为一个更好的程序员。
现在看来这句话用在C语言上也挺合适的
写C你很难找到相关的工作,但是它能让你成为一个更好的程序员。
据我观察,函数式编程是越来越流行了,如今Java据说都支持一些Lambda相关的东西了,Clojure,Elixir这些编程语言也渐渐火起来了,Ruby,Python,JavaScript这些语言几乎统治了Web开发的半壁江山。后起之秀Go声称要击败C语言,把C语言能做的事情都做一遍。确实如今的C语言已经没有当年的那么无敌了,出现了许许多多的替代品,或者衍生品。但我觉得作为一个存活了几十年的语言,它自有它过人之处,作为一个系统级编程语言,它简单却难以掌控。
当然也可能并没有如上所说的那么玄乎,更多的是觉得学这个东西有什么卵用,只能用来撸撸算法题。哈哈,如果持有这种想法的同学,您还是继续写Java比较好一些。毕竟Java即可以用来撸算法题也可以用来找工作。不过个人更倾向于C语言,或许我自己也是追求“手动挡”操作感的那类人吧,想想你可以在黑窗口上,打开一个轻量级的文本编辑器,编写相关的代码,可以自己精确分配内存空间,直接往某个内存里面塞你想要的东西,当你塞的东西放不下的时候,程序会告诉你内存爆了,这个时候你得去思考自己塞了什么不应该塞的东西进去。个人觉得这或许也是动态语言所不能给予的编程体验吧。
学C语言确实很难找到相关的工作,除非你是资深专家,但它让我们更直接地与操作系统打交道,让我们对内存分配,线程调度这些概念有更清晰的理解。了解这些东西或者说磨练这方面的意识对于日常的工作可能没有什么直接的帮助,但我始终相信掌握C并借此了解更多底层的东西,可以让你在这条路上走得更远,也更开心。
4. 尾声
以上是本人对C语言的一些看法,或许有些片面(还望指正)。越来越多的语言妄想取代它的地位。但个人觉得无论这些语言再先进他们也无法完全取代C语言在许多程序员心目中的地位,特别是优秀的程序员。而C语言最终会走上Cobol那样消亡的道路呢,还是会走上不朽之路呢?我们拭目以待,但我个人觉得会是后者。