----------------------------------------------------------------------------------
不把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个汉字,会说话的人和不会说话的人,差别是惊人的!汉字大家都可以学会,但好文章不一定谁人都可以搞定的!编程语言也是这么回事。同样的编程问题,用同一种编程语言,也有很多策略、算法不同,有些计算效率差别太大了,你懂得!
- 学前端的第一门语言HTML
学前端最终要做的就是制作各种各样的网页,html就相当于网页的骨架,所以我们学习前端的第一步就是先学html,接下来学习什么是html. 什么是HTML? HTML指的是超文本标记语言(Hyper T ...
- 准备踏入IT编程的学子们,你们第一门编程语言选谁? Are You Ready? Go!
Are You Ready? Go! ——第一门编程语言选谁? 金旭亮 说明: 这篇文章是专门针对大学低年级学生(和其他软件开发初学者)写的,如果你己经是研究生或本科高年级学生,请将这篇文章转发给你的 ...
- web 开发人员必须学习的 3 门语言
web 开发人员必须学习的 3 门语言:html css js HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 网页的行为
- python第一周语言基础
控制语句 if语句,当条件成立时运行语句块.经常与else, elif(相当于else if) 配合使用. for语句,遍历列表.字符串.字典.集合等迭代器,依次处理迭代器中的每个元素. while语 ...
- Scala学习系列(一)——Scala为什么是大数据第一高薪语言
为什么是Scala 虽然在大数据领域Java的使用更普及,Python也有后来居上的势头,但Scala一直有着不可动摇的地位.我们熟悉的Spark,Kafka,Flink都是由Scala完成了其核心代 ...
- python这门语言为什么要起这个名字
我只是一只可爱的小虫 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Liz喵 PS:如有需要Python学习资料的小 ...
- 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记
第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...
- 一站式Hadoop&Spark云计算分布式大数据和Android&HTML5移动互联网解决方案课程(Hadoop、Spark、Android、HTML5)V2的第一门课程
Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. 如何从企业级开发实战的角度开始,在实际企业级动手操作中深入浅出并循序渐 ...
- 最近一些朋友问我,临近快毕业了专业不对口,想转行看到IT行业就业前景不错,但是编程语言众多不了解,不知道哪门语言能够快速入门掌握,短期能让我找到工作
我做互联网前端后台开发也有四年多了,一路走过来,累并快乐着.快乐比艰辛更多,源自我的兴趣驱动.初中的一个偶然的机会我接触到了计算机,从那个时候就喜欢上开始经常到网吧上网.那个时候我对计算机领域的认识是 ...
随机推荐
- 每天一个linux命令目录
出处:http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html 开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每 ...
- XCode6 开发本地化应用
使用 XCode 6 开发本地化时,第一步,不能忘记,否则在添加本地化文件时,可能会找不到简体中文. 此外,如果使用 NSLocalizedString(@"xxx", nil) ...
- EF6 如何判断DataContext有修改,以及如何放弃修改
如何判断DataContext有修改: EF6的 using (var db = new Model1()) { if (db.ChangeTracker.HasChanges()) { Cons ...
- 报表开发之批量导入导出excel
在日常使用报表过程中,会有这样一种情况,你将Excel表分发给各个员工,员工填完后,统一整理成多个Excel,你需要将这些数据,用报表的填报功能,提交录入到数据库中,这样一来可避免到服务器机房录数据的 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 事件)
今天第星期天,知识是永远是学习不完的,所以今天这部分算比较轻松,同时也希望大家会有一个好的周末.场景事件即场景的回调,和别的事件一样是在特定的条件下产生的,前面也介绍过场景的各种事件,今天详细的说一说 ...
- Linux 系统中僵尸进程
Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸.配图源 ...
- 第一个JAVA应用
1.1创建源文件 1.1.1Java源文件结构 Java应用由一个或多个扩展名为“.Java”的文件构成,这些文件被成为源文件.从编译角度,则被称为编译单元(Compilation Unit). 如果 ...
- Struts2 OGNL案例
一>>原始类型与包装类型 先定义两个实体类User和Address User package cn.entity; public class User { private String n ...
- Unity 下载存档
各种版本的UNITY下载 https://unity3d.com/cn/get-unity/download/archive
- 初识CDQ分治
[BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 200 ...