不把C作为第一门语言是个好主意么

----------------------------------------------------------------------------------
 
不把C作为第一门语言是个好主意么?
 
 
摘要:不少人认为,第一门语言最好不要学C,而V众投发起人李智勇却不这么看。他认为如果真想做好开发,想更好地实现人生价值(包括现金价值),那么打基础很必要,而从C语言,这种厚积薄发的语言开始学习学起,则很必要。
 
 
近来连续看到这样两个信息,一个是知乎上有个问题叫:“如何学习C语言?”,这个问题的答案中得票数第二高的是不要最先学习C语言;一个是看到了2012年金旭亮老师写的第一门编程语言选谁?这文章,金老师也是支持不用C做第一门语言的,从投票来看大部分人也比较支持这个观点。
 
这是比较让我意外的事情,因为我正好持相反的观点。
 
语言学习的两种道路
 
我们有两条路来学习编程,一条是厚积薄发,一条则是速成的道路。厚积薄发要一点点打根基,比如学习C语言、学习计算机系统的构造,去看《计算机程序的构造与解释》这类书,去学习算法等,这么走有点吃力不讨好,吭哧半天也还不一定能看到什么结果;速成的就可以先学习IDE,先学习脚本,先学习CSS,JavaScript,这样没多久就可以独立干不少活了,比如创建个漂亮网站什么的。
 
这种不同道路的选择最终决定了C是不是更适合做第一门语言。走前一条路的显然就适合用C做第一门语言,因为不掌握这种系统级的语言就不太好理解什么是指针,什么Stack,什么是Stack Overflow,什么是写超界,对打基础形成不良影响,也理解不了《深入理解计算机系统》这样的书。走后一条道路的就没关系了,哪个实用学哪个。
 
想知道适合走哪条道路,请先拷问自己!
 
初学者到底适合选择哪个方向?首先我们必须承认没有哪种方法是适合所有人的,举个例子来形象地说明这一点:松鼠桂鱼是苏州这边的名菜,但对于不喜欢甜食的人来说,这道菜很糟糕。
 
因此我不想在技术上展开太多,这更主要是个人成长的现实问题,从怎么做更有利于实现自己的价值(包括现金价值)来探讨可能更有现实意义一点。所以要想回答要不要从C开始,最好先回答下面这样的问题:
 
你是不是想专职做程序员,把它作为自己未来的职业?
你是不是想成为比较杰出的程序员获得更好的成长和收入?
上面这类问题的关键在于,如果你一直做程序员而不是做做就干别的去(比如管理、销售等等),那么就要有专业,专业才能更好的创造价值,而专业需要一种高度,高度则需要基础和积累。我们很难讲不学C语言就成不了很专业的高手,但你可以看看身边,很多高手就是打了基础一点点磨练出来。
 
这么说也许有点抽象,我们来看看具体的故事:
 
2012年的时候Facebook花10亿美元买下了照片共享应用公司Instagram。这事在当时引起了非常大的轰动。这事之所以引起极大关注,其关键点在于后者只有十几个员工。十几个员工支撑起10亿美元的价值,这绝对是让人震惊的事情。
做个简单的比较就可以知道这个差距有多大。
 
假设一个公司是做外包的,非常厉害,人月单价有4万RMB。同时这个公司包括支持人员在内有500人,公司里每个人都可以换成收入,那么这个公司一年的收入大概是4000万美元,而Instagram用十几个人达成10亿美元价值只用了差不多2年。两家公司中,单人一年创造价值的比率是差不多500万倍。
这是怎么样的一种杠杆率差异!大家可以想象都是写程序,这两种杠杆率回报上的差异。
 
这种杠杆率背后隐含了这样一种基本现实:基于很多现有的框架,小而精的团队已经可以通过产品撬动极大的生意,这并不仅局限于Instagram。而为了打造这种小而精的团队,大家在听一些分享时就会发现:很多人都有意愿找ACM上成绩比较好的人,他们认为这类人更有以一当十的可能性等。
 
从这类现象中我们可以挖掘出来什么东西?
 
第一点,如果把程序员进行分级,一个极端是能做很高端的活,比如以小而精的团队打造很牛的产品;一个极端是只能做CRUD的活,那收入与这种技能等级正相关是无疑问的,杠杆率在那里。
第二,做很高端的工作可以并不只局限于打造产品,也可以去弄系统底层等等,但总的来看,越往高端走对基础要求越高,这里的基础范围可以广点:可以是算法,可以是对体系结构的理解等。没有这类基础工作时,就很容易被卡在一些地方干瞪眼,不知道如何下手解决有点难度的问题,而事实上当你试图创建一个新产品的时候,必然会碰到独属于你自己的问题。
要想成为名好程序员 学习C语言是非常必要的
 
在《程序员生存定律》里,我写过一篇文章叫:程序人生的出口。其中列举了程序员最可能的结局,比如:
 
1 成就超一流高手 
简单来讲就是继续以程序员的身份进行奋斗成为牛人。
2 积累、爆发、开始创业
简单来讲就是自己做产品,努力当CxO去。
3 转向管理之路
大多情形下是抛弃程序,内部转行去喊口号。
4 维持原状的老码农
就是在CRUD这个层面打转那种。
5 提前退场、向代码说再见
眼看前途渺茫,转行了。
这其中1对基础要求很高,2与3对打基础比较无所谓,这时候技术很像一种敲门砖,而4与5很可能正是忽视了基础的结果。
 
这样一来事情就非常清楚,如果你真想长时间做程序员,并且想比较好的实现自己的人生价值(包括现金价值),那么打基础是很必要的,再进一步就是说从C语言开始学习编程其实是很必要的。
 
从C语言开始学习编程对大学生的另外重意义
 
从C语言开始学习编程对大学生而言还有另一重含义:除了大学的时间,你可能再也没有大段的时间打基础。容易的东西是可以用碎片时间学的,比如各种脚本语言,但难的东西是需要大片时间学的,所以一旦大学里不把硬骨头啃掉,未来很可能就没时间啃了,说回来还是要先打基础再谈其它。
 
历史上赵匡胤曾经犹豫过是先搞定比较羸弱的南唐还是先搞定幽云十六州,最终他选择了先易后难去搞南唐,从结果来看这是错了,你不趁自己最巅峰的时刻搞定最难搞的,未来可能就再没机会了,而羸弱其实一直会弱在那里,早搞晚搞差别不大。
 
当然我们也必须承认即使努力的去打基础,也不是每个人向上走,都能成为高手、成为特别牛的程序员,还是有人会卡在某条线下面,要去维护垃圾代码、写垃圾代码,但关键是我们谈的是在学习阶段应该怎么做,不争一争就放弃某种可能性,还是太可惜了。
 
此外,对于大学生或者那些有充足时间学习的人,我不太认可一种方式可以培养兴趣,另一种就不能培养兴趣的说法。这更多的可能是种借口,因为在有如此多好玩开源项目的年代,对于想学的人,C语言一样可以有很多兴趣,对于不想学的人再简单的语言一样也很无聊。
 
有没有趣,是学习或者是教学方法的问题,而不是编程语言的问题。
 
最后我想再补充两点
 
首先,我写上面内容时,没太考虑职业技术学校的情形,一旦考虑速成,考虑大规模生产,结果必然会掉过来,这并不令人意外。
 
其次,并不是只有我有这类观点,大名鼎鼎的Joel在《软件随想录》里专门有一章叫“学校只教Java的危险性”,其中所表达的观点与这里的观点类似。
 
 
同样是3600个汉字,会说话的人和不会说话的人,差别是惊人的!汉字大家都可以学会,但好文章不一定谁人都可以搞定的!编程语言也是这么回事。同样的编程问题,用同一种编程语言,也有很多策略、算法不同,有些计算效率差别太大了,你懂得!
上一篇:每日英语:How to Solve India's Huge Food Wastage


下一篇:web 开发人员必须学习的 3 门语言