
现在虽然每次看到 TIOBE 的排名中 C 的排名都是很靠前的,但事实上现在发现写 C 的工程师不多。
首先,可能是应用场景有限,最多的就是 Linux 底层应用编程,写驱动,嵌入式编程,网络相关的编程;
其次,可能就投入和产出效率来说,Java,Python, C#这类语言的产出效率要比 C 高,而 C 追求的是高性能对商业公司来说有时候可以用堆硬件上集群的方式来解决。
最后,坚持写 C 且能把 C 写好的工程师不多,以前也说过公司如果真的不得不要用 C 和 C++来解决问题,那么一般都是花大价钱请个厉害的然后当几个人用,绝对不会请几个菜鸡 C 码农,效率低容易出错浪费时间浪费钱。
我还有个问题,像 C++和 Java 都有 Think in 系列,有 Effective 系列,更不谈各种设计模式的。但是 C 的书好像就 C Traps and Pit 那本书,Pointers on c 那本书,想问问还有其他进阶的读物么?特别是关于系统设计和编程技巧这方面的,设计模式什么的好像基本没有看到用 C 写的。还有就是想了解一下除了嵌入式这个行业的发展路线以外,其他写 C 的行业发展路线图和技能树都是什么?
长期写 C 的都出来冒个泡。
1 easylee 2018-07-30 15:58:02 +08:00 via Android 这个标题太欠揍了,如果换个标题,可能会有不少人和你认真讨论这个主题内容。 |
2 shijingshijing OP @easylee 嘿嘿,难得当一回标题党啊 |
3 Andiry 2018-07-30 16:01:51 +08:00 via Android C 挺简单的,精通不是什么难事 |
4 leido 2018-07-30 16:01:57 +08:00 不屑于精通. |
5 dtgio 2018-07-30 16:03:00 +08:00 via iPhone 我觉得非要把 C 和 C++区分开来其实没什么必要吧? |
6 ballshapesdsd 2018-07-30 16:03:10 +08:00 精通 c 这个字母的拼写 |
7 Applenice 2018-07-30 16:03:26 +08:00 写 C....但是我写的比较辣鸡...是真的辣鸡那种 |
8 Ediacaran 2018-07-30 16:05:42 +08:00 精通 C 本身不难,用 C 写出来 nginx, redis 这种水平的软件太难了 |
9 enenaaa 2018-07-30 16:06:39 +08:00 写程序不需要先精通一门语言 |
10 kaneyuki 2018-07-30 16:08:49 +08:00 核心的东西还是 c/c++写的多 只是国内一般都是互联网上层业务,所以产生了 c 不怎么用的错觉 |
11 chiu 2018-07-30 16:10:39 +08:00 via iPhone 刚毕业的时候敢,现在不敢了…… |
12 glacer 2018-07-30 16:11:22 +08:00 C 的难点在于各种奇技淫巧黑科技的指针操作,写 C 的过程中脑子里就要映射出一个内存模型。 |
13 wizardoz 2018-07-30 16:12:05 +08:00 “精通”这个词现在基本上等于贬义词。 哪个人的简历出现“精通 XXX ”,基本上被认为不谦虚。 这个可能就是文化吧…… |
14 t6attack 2018-07-30 16:16:26 +08:00 除了你提到底层应用编程、系统编程以外。 Java,Python, C#,PHP,这些编程语言本身,也是 C/C++写的。 解析 Javascript 的浏览器解释引擎。C/C++写的。 apache/nginx 这些服务器,C/C++写的。 常用数据库,C/C++写的。除了 ORACLE。 在互联网领域,C/C++程序员,是你的上游。 |
15 d18 2018-07-30 16:18:00 +08:00 要深入一门语言当然是看经典的源码了,redis 就不错。光看书永远只能是纸上谈兵。 |
16 king7 2018-07-30 16:18:19 +08:00 维护系统这方面的,主要改 android C 部分相关的代码,boot、kernel、工具、以及封装的 jni 接口,像楼上 Ediacaran 说的,C 并不难,用 C 写出来 nginx 相当难。 |
17 waruqi 2018-07-30 16:25:12 +08:00 c 死忠粉飘过,有兴趣的话可以关注下我的 c 项目: https://github.com/tboox/tbox |
18 hmzt 2018-07-30 16:25:30 +08:00 我精通 C..................................的语法 |
19 liuminghao233 2018-07-30 16:28:03 +08:00 via iPhone 什么叫精通 c 写个 os 出来叫精通 c ? 还是 c 语言内容倒背如流叫精通 c ? 但前者跟语言有什么关系吗 |
20 luozic 2018-07-30 16:36:44 +08:00 系统和驱动现在大部分还是 c/C++写的,一个系统都是 2000w+的项目,有不需要驱动的硬件? |
21 xmadi 2018-07-30 16:38:07 +08:00 via iPhone 有没有敢说精通中文的? |
22 xuboying 2018-07-30 16:46:16 +08:00 并非 C 语言用户 感觉精通 C 语言本身并没有什么,C 出现的很早,语法种类也不多.但是要 C 的很多场景都是和硬件打交道,所以说问别人是否精通 C,一般都是暗示问是否精通某种硬件平台.e.g.如何写 C 代码(汇编)从而达到这种平台的能耗比最优. |
23 sammo 2018-07-30 16:47:38 +08:00 用 C 语言的人根本瞧不上 V2EX |
24 zhzer 2018-07-30 16:47:47 +08:00 有没有敢说精通程序员的? |
25 hanxiV2EX 2018-07-30 16:52:53 +08:00 via Android 游戏服务端引擎用 C 写的。逻辑用脚本语言。 |
26 SonicY 2018-07-30 16:53:24 +08:00 via Android 精通这玩意说的太玄了,给我一本世界名著,我能看懂里面的每一个字,但让我写,写不出来。 |
27 abutter 2018-07-30 17:02:57 +08:00 C 本身并不算难,只是很多东西都跟硬件或者编译器多少有些关系。 |
29 xhinliang 2018-07-30 17:05:09 +08:00 我觉得 C/C++ 这个说法就是扯淡。 C 就是 C,C++ 就是 C++。 这是完全不同的两门编程语言。 |
30 tingyunsay 2018-07-30 17:11:48 +08:00 经常在 qq 群看到有人发言:在学校学了几年,除了 c 什么都不会.. |
31 deweixu 2018-07-30 18:28:21 +08:00 买了 《 Linux/UNIX 系统编程手册》《 UNIX 环境高级编程》 《 UNIX 网络编程 卷 1:套接字联网 API 》 《 UNIX 网络编程 卷 2:进程间通信》 |
32 zhtf 2018-07-30 18:37:55 +08:00 敢不敢和能不能友不是一回事儿 |
33 YenvY 2018-07-30 18:56:05 +08:00 via iPad 远不如精通 css 看上去那么不可思议 |
34 tomfs 2018-07-30 18:56:55 +08:00 标题歪了,导致帖内内容不是主要了. |
35 shijingshijing OP @deweixu 都在书架上吃灰,对不对? |
36 shijingshijing OP @t6attack 比较好奇 ORACLE 用什么写的? Java 么?安装时候的那个 UI 确实是用 Java 写的 |
37 xxoxx 2018-07-30 19:06:10 +08:00 via iPhone 我能用 18 种字体写出 c 字,算不算精通? |
38 firebroo 2018-07-30 19:10:42 +08:00 三角猫水平,写点简单的可以。。 |
40 stzz 2018-07-30 19:12:22 +08:00 via Android 当初入门时看过.《 C 专家编程》,当时看得还可以 |
41 zjsxwc 2018-07-30 19:14:02 +08:00 via iPhone 只要心够大有什么不敢的 |
42 Gothack 2018-07-30 19:14:16 +08:00 语言只是个工具,难得是你用这工具能干出什么活 |
43 bfdh 2018-07-30 19:27:29 +08:00 长期 && 只会用 C 的 表示不知道该说点什么 |
44 fuyufjh 2018-07-30 19:51:06 +08:00 C 只比汇编高级那么一点点,精通 C 比精通 Python、Java 容易的多。然而,对于能用得到 C 的地方,编程语言可能是最简单的部分。 |
45 prolic 2018-07-30 19:52:54 +08:00 via Android c 的语法,关键字也不多,不复杂,说精通也没什么问题吧?上面说的东西都不是语言层面的知识点 |
46 crab 2018-07-30 19:54:33 +08:00 丹尼斯里奇:我 肯汤普逊:还有我 |
47 hyyou2010 2018-07-30 20:06:34 +08:00 要说 c 语言的编程技巧,我看得最头晕目眩的是 linux 内核里面各种链表 /结构 /锁 但是,除非工作需要,否则不推荐去钻研,因为高级语言可以轻松搞定 计算机硬件+CPU+汇编+C,这是一坨,关注的是物理硬件是怎样运行的,C 只是汇编的外衣,通过学 C 和汇编我们知道物理硬件是怎样运行起来的,这就够了 C++,Java 或其他任何高级语言,这是一坨,关注的是编程技巧与数据处理,关注业务的完成,这才是普通程序员要多花时间的地方 |
48 NSAtools 2018-07-30 20:12:40 +08:00 刚毕业的时候敢说 |
49 tan90 2018-07-30 20:13:39 +08:00 自学 C 语言,也是编程的入门语言,自娱自乐写点小程序,面向百度编程,简历上应该怎么形容这种状态? |
50 djyde 2018-07-30 20:17:18 +08:00 到底「精通」的标准是什么?我了解这门语言的所有特性、完整阅读过这门语言的 specification, 在实际环境中遇到过很多的坑,而对方恰好问了我一个关于这么语言一个我忘掉了的点,那我算不算「精通」?是否只要人的记忆力有限,就永远也无法「精通」一门语言? |
51 djyde 2018-07-30 20:18:37 +08:00 那么我认为只有机器能「精通」某一门语言了 |
52 sunnogo 2018-07-30 20:19:59 +08:00 via Android 据说代码不能写太牛逼,不然其他人看不懂不好维护。特别是 C 语言。 |
53 GeruzoniAnsasu 2018-07-30 20:46:55 +08:00 我觉得就 C 语言 来说 达到精通不难而且是可量化的 二级指针随便用绕不晕 函数指针类型随手写不用想 嵌套宏伪 meta 想用能用 熟知 duff's device,typedef struct type* type 无类型指针,list_head 嵌入式“泛型”链表 等 C 特有的惯用法和 trick 然后再用过些 c99 c11 标准的特性比如变长数组语法糖,_Generic 就很精通了 |
54 xupefei 2018-07-30 20:50:08 +08:00 @t6attack #14 @shijingshijing #36 Oracle 的引擎是 C++写的,顶层是 Java 写的。 > Java,Python, C#,PHP,这些编程语言本身,也是 C/C++写的。 除开某些性能相关的组件,Java 是 Java 写的,C#是 C#写的。这个叫“自举”。 |
55 GeruzoniAnsasu 2018-07-30 20:50:50 +08:00 另外拿 c++来和 c 对比…… c++实在是复杂到太难以想象了,这个世界上最鬼畜的程序员就是 c++程序员,鬼知道是什么驱动他们去实现一个写错一个逗号报错 1000 个模板嵌套的代码…… 用模板模式匹配去创造一个语法描述?然后把它静态分析编译成一个语法 parser ? 这 tm 是人干的事? 然而这是有些 c++程序员干的事…… |
57 PythonAnswer 2018-07-30 21:20:38 +08:00 精通 html css 很厉害了 |
58 zhchyu999 2018-07-30 21:26:50 +08:00 有人敢说精通某一项技术么 |
59 loading 2018-07-30 21:27:41 +08:00 via iPhone 我,精通,毕竟都 15 天过去了。 |
60 kwest 2018-07-30 21:34:38 +08:00 大学时曾用 VC6 写过贪吃蛇,做过课程设计。毕业后入了嵌入式的坑,用 C 写过 CGI (很多人怕不知道这玩意儿是啥,嗯,反正吧比 PHP 还古老)。写过嵌入式 Web Server,你没看错,由于硬件 Flash 和 RAM 限制,得自己实现基本的 HTTP1.0 协议,为什么不实现 HTTP1.1 协议呢,因为 1.1 太复杂了,那个时候水平不够:( 同样由于硬件限制,为了动态网页交互,还得自己实现一个类似于 PHP 的动态网页解析器。感谢摩尔定律,硬件越来越快,价格也越来越便宜,硬件上可以跑嵌入式 Linux 了,开源软件一抓一大把,应用层相对变得容易,只需要交叉编译,需要改的代码没以前那么多了。用户态解决了,可内核态呢?早期芯片商提供的驱动不完善,得自己修改,甚至有些还得自己写。公司业务又涉及到内核部分的修改,于是改吧改吧从 2.4 改到 2.6,从 2.6 又改到 3.0。Linux 内核变得越来越完善,芯片商的 turnkey 解决方案也考虑得越来越周到,对嵌入式开发人员的要求也没那么高了,行业门槛越来越低,竞争对手越来越多,产品市场逐渐从蓝海变成了一片红海,我知道是时候离开了。几年后,听闻各种智能硬件又火了,开源硬件发展得如火如荼,树莓派,各种派如雨后春笋般纷纷冒了出来,我笑了笑,这不是咱玩过的东西吗,只是换了个“智能”的壳,人生苦短,还是继续码我的 Python 吧! |
61 shijingshijing OP @hyyou2010 @kwest @GeruzoniAnsasu 都去撸高级语言去,这个也是大趋势,花相同时间和精力,肯定是要收益最大化的。 PS:最近跟一个老外交流,他们用 C 单独实现模块,然后用 Lua 当胶水连接起来,Lua 本身够精简加上 C 的性能,是个很不错的选择呢。 |
62 shijingshijing OP @kwest 唉,我当初也是从点亮 LED 跑流水灯什么的开始做起的,各种位操作寄存器操作,各种移位操作,绕死个人。现在一般硬件模块都带 SDK 和 Application Note,把里面代码复制粘贴过来随便改改跑起来没 Bug 就 ok 了。优化?不存在的。 |
64 nikola 2018-07-30 22:27:32 +08:00 如果说每种语言都有自己的特色,不见得。但是,如果说 C 语言比较有特色,区别于其他语言,那我是承认的。C 语言本身没什么难的,但是有扎实的 C 语言功底,对于理解操作系统源码实现,对于理解计算机体系结构是很有帮助的。所以计算机专业第一门编程语言往往是 C 语言。这是程序员学习经历中基础的基础,理解 C 语言和数据结构,往后看其他语言都是万变不离其宗。 |
65 ming2050 2018-07-30 22:50:37 +08:00 via iPhone 语法就那些,用不了三天就能精通。但是,你非得加上算法模型,内存模型,网络模型,,,,,慢慢学去吧。。。。。 |
66 qq258076067 2018-07-30 23:07:42 +08:00 借楼 有精通 C 和 swift 或者 oc 的吗。。。 |
67 luozic 2018-07-30 23:16:04 +08:00 via iPhone 编码,大小端,做标准应用还是专有应用。 |
68 adadada 2018-07-30 23:30:59 +08:00 KVM/Xen/QEMU 开发者路过。基本搞明白了指针的用法和链接器的工作原理,再去把 C standard 里的 undefined behavior 和 implementation-dependent behavior 过一遍,把项目用的编译器的常用扩展搞懂了,剩下的感觉就是多写和多看别人写了。感觉学什么语言都是类似的套路吧,只是 C 比许多语言都要小得多,应该能够更快的精通,吧 |
70 lzhCoooder 2018-07-30 23:49:14 +08:00 via iPhone 我也算 C 爱好者,然而迫于生存压力现在在写 C++(#捂脸) C 语法特性少很容易学,但是真的很难用,没轮子先不说,各种 UB 满天飞,到处是你想不到的坑,不懂汇编寸步难行,和操作系统之间强结合必须懂操作系统吧,没其他高级语言自带的数据结构,经常面临手撸的困境,C 想搞点事情真的很难啊.... 关于未来前景,应该说非常悲观了,我应该说非常喜欢 C 的简单与直接,但是还是只能靠 C++为生,除了嵌入式 C 没什么应用场景,不合格程序员太多,根本写不了 C,让不合格的程序员写 C 真的会是一场灾难吧... |
71 stevenbipt 2018-07-31 00:17:06 +08:00 via Android 当初只有山寨机的年代,联发科处理器不支持 C++,只支持 c 语言,然后大佬们都需要把用 java 写的游戏改写成 c 语言的,OOP 什么的都是小意思,现在支持 C++了估计也没人愿意去这样做了 |
72 frqk 2018-07-31 00:46:59 +08:00 via iPhone |
73 langjiyuan 2018-07-31 01:00:14 +08:00 写 c 的路过,项目上目前还是纯 c 语言,还不到 c99,一直有很大的历史包袱。新的产品线开发时,直接定了换到 java 或 python,争取上 docker,旧平台因为内存和 cpu 限制只能保持纯 c 的维护,恩我就是那个被分配到主业维护的。。。。 产出上 c 与 java 和 python 差的不是一点,相同的业务需求,维护 c 的那套需要花 1 个星期+2 个人力,用 python 写 3 天 1 个人。。。 个人感觉 c 在应用层的使用会越来越少,内核和驱动级别另说,用 c 就是硬件跟不上,现在随便都 64 位 arm,跑个 java 跟玩似的。 其次,可能就投入和产出效率来说,Java,Python, C#这类语言的产出效率要比 C 高,而 C 追求的是高性能对商业公司来说有时候可以用堆硬件上集群的方式来解决。 最后,坚持写 C 且能把 C 写好的工程师不多,以前也说过公司如果真的不得不要用 C 和 C++来解决问题,那么一般都是花大价钱请个厉害的然后当几个人用,绝对不会请几个菜鸡 C 码农,效率低容易出错浪费时间浪费钱。 |
75 esw 2018-07-31 01:07:07 +08:00 via Android 懂得计算机工作原理才能写好 c 把 |
76 ericgui 2018-07-31 01:09:47 +08:00 这也是我学了 C 语言 2 次,然后都放弃了。日常工作用不到。。。。。。。。 刷 LeetCode 也是用 Javascript |
77 langjiyuan 2018-07-31 01:20:17 +08:00 上一条。失误。。没写完。。。继续。。。 c 的开源库和单元测试是真的无解,各种轮子大部分情况下需要自己调很久,或者干脆自己写。。单元测试废了好大劲也没能在组内推广,最后在编码阶段只能停留在用 python 脚本的功能测试上,私以为快速的单元测试是 c 最麻烦的地方。一个指针的移位,最后表达的结果完全不同。 至于 c 语言的进阶,,因为指针疯狂自由的(我用的是疯狂),即使参照同一详设,组内编写的程序,详细到同一函数的实现,中间的逻辑细节完全不同。未排除未知 bug,最后逼的组内 c 语言规范补全各类细节,至今还在补充当中。也是因为指针,各类的设计模式等等,都可以在 c 上实现,不过成本是很高,相对其他语言。 c 的职业发展路径,嵌入式中驱动 /linux 内核至少暂时不会出现很多变得,纯单片机,现在 linux 满天飞,个人了解用的是越来越少了。linux 应用层,目前公司内 c 的使用也在减少。逐步被 java 替换了,测试用 python。目前个人已经在切换到 java 和 python 上来了,因为前(钱)景。 |
78 zaneenaz 2018-07-31 01:23:44 +08:00 via Android 每次写到指针时候都会 segment fault。精通是不存在的。 |
79 coldear 2018-07-31 04:22:15 +08:00 via Android C 语言本身算是简单的语言,但就是因为太简单,用起来不方便,难度来自于你要造的那些轮子 |
80 ihackevin 2018-07-31 08:36:03 +08:00 真看不起你们这些程序员,一个字母讨论 80 楼,我精通 a-z |
82 wkl17 2018-07-31 08:48:42 +08:00 借个楼吧:乃们都用什么工具开发 C、C++? |
83 geying 2018-07-31 08:57:33 +08:00 我精通各种语言和框架... 的 hello world |
84 Clarencep 2018-07-31 09:03:08 +08:00 通 C 语言本身并不困难,困难的是精通你的业务用到的所有的 C 库 |
85 macha 2018-07-31 09:07:54 +08:00 写 C++但不精通的路过。C++好歹还有一个 STL 可以用用,C 语言只能一起从头撸起了。 |
86 harry890829 2018-07-31 09:08:53 +08:00 |
87 ytmsdy 2018-07-31 09:14:33 +08:00 现在越来越觉得,写 C/C++的才是真正的程序员啊。 一般人 C++的指针就能喝一壶的了,但是我见过有人写出指针+指针+指针的程序! C++领域是大牛横行的地方,一般都是三四十岁的大叔,而且都很低调。 |
88 AngryLi 2018-07-31 09:15:49 +08:00 前不久面一个“精通 C++”,问了下平时用的多吼?“没,也就是一部分 SDK 会用到一点”。这就是简历上的精通 |
89 dosmlp 2018-07-31 09:22:55 +08:00 这么简单的语言,我敢说我精通 |
92 karllynn 2018-07-31 09:52:47 +08:00 这个标题看了想 block 楼主… |
93 hikarugo 2018-07-31 09:54:02 +08:00 精通语言真的很无聊。。。精通某个领域知识才算比较有价值吧 |
94 silencefent 2018-07-31 09:56:21 +08:00 你敢说你精通 C ? 是啊(便乘) 那你说说这个技术用 C 解决的思路要点 说不出呀 那你说精通 C ? 你只问我敢不敢嘛 |
95 yingtl 2018-07-31 10:07:25 +08:00 常年用 C 的路过 |
96 Yoock 2018-07-31 10:07:34 +08:00 via iPhone 精通 c,写 c 的时候脑子里就会出现编译后的汇编。 |
97 wuweidong0107 2018-07-31 10:18:51 +08:00 你们对精通某种语言是不是有误解,我理解的精通是你能用这种语言去阅读优秀的代码并且写出优秀的代码,这些不是基于单纯某个语言的,而是基于你对软件的理解。 |
98 Commencal 2018-07-31 10:56:59 +08:00 @silencefent 好臭哦,C 艹我超勇的(一 转 攻 势) |
99 glfpes 2018-07-31 11:05:23 +08:00 上一次真正写 C 还是嵌入式课程的大作业,好像是在一个什么板上调用忘记了什么东西,写 1 个能打电话发短信有电话本能拍照录像有相册还能用 opencv 人脸识别外加 gps 定位和惯性导航,界面还是 QT 写的,这辈子就用过这一次 QT。 我估计为了买那个带超大触摸屏的板子,学校花的钱能买好几个诺基亚 5800 |
100 coderluan 2018-07-31 11:35:21 +08:00 “首先,可能是应用场景有限,最多的就是 Linux 底层应用编程,写驱动,嵌入式编程,网络相关的编程;” 最开始就说错了,凡是性能相关的库,很大部分都是(嵌着 SIMD 和汇编的) C 实现的,计算机视觉,机器学习,异构计算等等,只不过封装完之后你就认不出来而已。 所以说精通 C,其实是精通性能优化,毕竟语言只是工具,这就涉及到各种专业课程了,数据结构,算法,机组,编译原理,操作系统,不同方向还有相应方向的知识,图形学,GPU 编程啥的。 然后 C++(尤其是 11 之后)和 C 是两码事,应用场景也不同,性能优化一般也就用个封装和 STL,别的特性反而会拖慢性能。 最后有兴趣推荐看看 ffmpeg 源码,C 语言实现的非常牛逼。 |