C 语言底层开发怎么样?

2022-03-18 13:18:23 +08:00
 mikewang

应届生春招拿到了某大厂 offer 。当时选的 Java 语言面试的。
面试通过后,HR 说虽然面的 Java ,也可以考虑别的语言开发。
我了解了一下有 C 、C++、Java 、Python 等,然后对方说我基础不错,推荐去做 C 语言从事偏底层的开发。

现在我比较疑惑的是,大学期间没有接触过这一方面( C 语言教的十分简略,其他知识也都是在 Java 基础上学的),心里很没有把握。不过公司说,没接触过底层没关系,会有导师带。
然后底层开发还要熟悉汇编,现在也几乎是 0 基础(《编译原理》课写的汇编都是伪代码)

认识的同学和毕业生,从事底层的好像也比较少,还没了解到具体是要做些什么工作,前景如何。

HR 说,最终意愿看我,如果坚持 Java 开发也 OK 的。
所以我想问一下,现在 C 语言底层开发如何?
第一份工作选会的,还是选不会的?

11934 次点击
所在节点    程序员
149 条回复
duke807
2022-03-18 21:24:48 +08:00
@hello2090

op 如果屬於這 10%,那麼他去搞 java 就浪費了

我不會 java ,也懶得學,高階語言我選擇 python ,可以做後端、視覺和學習算法、芯片研發( cocotb 仿真)等
cocong
2022-03-18 21:26:39 +08:00
选什么选,我两个都要。
qiufengshe
2022-03-18 21:28:09 +08:00
学 C/C++是没问题的,能了解系统底层的东西,底层的东西变化慢,JVM/CLR 都是 C/C++写的,还有少部分汇编,不过国内因为互联网的兴起,做基础软件 /基础设施太少了,这也就造成国内 C/C++岗位比 Java 少太多了
shijingshijing
2022-03-18 21:34:26 +08:00
C/C++最大的问题是非常的 Domain Specific ,那个 HR 不是告诉你了么,你面向的是数据库,这个 Domain 其实还好,因为不断的有新类型的数据库涌现,分布式,KV ,基于内存的等等百花齐放,也算是个不错的坑。

有些 C/C++的坑,那真是一入此门深似海,从此高薪是路人。我知道的例子,有老哥深钻基于 MCU 的 RT-Linux ,就是想方设法让那种不带 MMU 的处理器支持类 Linux 的操作系统,各种魔改各种奇技淫巧,片内寄存器+片上内存玩出花来了。结果呢,ARM 普及+半导体工艺进步,让原来节省的那些成本几乎没啥意义了,反而由于软件高度复杂、门槛又高用的人越来越少了。

还有一位同学毕业之后就去了通信领域某头牌外企,起手玩的就是高大上的 VxWorks 系统+PowerPC 组合,这种配置在 10-20 年前绝对是底层里面的高富帅,结果呢,现在通信行业全部改成 x86+Linux 了,以前学得那一套基本上没有人用了,成本太高,客户越来越少,收入也一直原地踏步,最后痛下决心重头再来,拿出考研时候的拼劲,结果也算不错,跑去 HW 做云计算基础设施了。

所以,这种偏底层最大的问题是跟面向的领域捆绑太深了,一定要注意找准一个好点的方向,不然回头太难。
noroot
2022-03-18 21:48:22 +08:00
作为一个嵌入式工程师告诉你,Java 就业面更广,国内做基础设施的公司不多。
documentzhangx66
2022-03-18 21:53:06 +08:00
@hello2090

并不是说 C 一定比 Java 高人一等,而是 C 学习门槛高、需要知道的知识更多、需要踩得坑更多、需要做的实验更多。

Java 写很多东西可以直接无脑 List ,因为 Java 的公认主要目的是实现功能;

而 C 的公认主要目的是追求性能与性价比,需要考虑硬件结构、各设备情况与性能,写的时候还要时刻注意数据结构与算法等等。

换句话来说,当你追求钱的时候,选 C 就没错。但如果你不在乎钱,仅仅只是喜欢轻松编程,那么选 Java ,同时不需要在乎 C 的那些人怎么看待你。

但是,当你不缺钱,对技术又有追求时,我建议,所有主流语言,你都要熟练,然后你就没有到底选哪种语言的问题了。并且,对于高手来说,编程语言、OS 、CPU type 等等,都不是问题。
documentzhangx66
2022-03-18 21:54:15 +08:00
选 C ,更能让你成长。

但对于就业来说,虽然 C/C++因为门槛高而造成工资高,但岗位却比 Java 少得多,所以不一定比 Java 更好就业。
Suddoo
2022-03-18 22:02:59 +08:00
工资其实主要是由市场供需决定的,技术什么的,另一种形式的 crud 而已,市场上,Java 的需求量明显比 C 大多了
hello2090
2022-03-18 22:09:21 +08:00
@documentzhangx66 C 的目的当然不是追求性能,C 最开始的目的当然是用来编程解决现实的问题啊,而不仅仅是需要高性能的问题,C 现在只能在追求高性能的领域存活是因为别的领域有更有效更高效更划算的编程语言比如 Java 啊

写 C 也不一定就需要接触到算法,写 Java 也不一定就不用算法。ffmpeg 就是 C 写的,没见过有 Set, Map, 二叉树图的,连链表有没有用上我都不确信。为啥 C 需要的知识更多?做 web 的光数据库的选择就有几十种呢,这也是知识也要踩坑啊。

语言是服务于工作的,C 要考虑硬件结构,Java 也要性能调优啊。C 也有不用考虑硬件结构,数据结构公司早就实现好的,Java 也有只要 CRUD ,能跑就行的。

或者这么说,C 不是门槛高,门槛有啥高的,连个类都没有,几天不就看完了,是 C 要做好的门槛高(这也只是我的假设)。那就像我上面说的,这么高的门槛 10%才能做好,那去做 Java 不是赚的更多?
hello2090
2022-03-18 22:10:47 +08:00
@Suddoo 是的,我一点不觉得工资由技术难度决定,我觉得由供需决定。
hello2090
2022-03-18 22:14:39 +08:00
@documentzhangx66 而且也不能把 C C++放在一起吧,我认识做了 10 多年 C 的,一点也不会 C++。做 C 的工资很高吗?上限比 Java 高?还是高薪比例比 Java 高?
feather12315
2022-03-18 22:20:10 +08:00
@hello2090 #35
涉及 arch ,要读 CPU programming guide ,除了汇编外还要懂 CPU 的体系;还有 OS ,看具体的方向,做 BSP 、驱动的要懂 ACPI 、device tree 、PCIe 吧;还要懂编译系统,GCC 之类的几角旮旯里面的编译选项辅助 debug ,还有各类 hack 的 debug 技巧; POSIX 编程更要懂;做文件系统的话要懂 fs ,做 rtos 的话要懂调度之类的吧。这类职位叫 system engineer 。

当然,如果只是做应用层的 c ,确实不多。
matolv
2022-03-18 22:25:16 +08:00
@hello2090 你的理解正确,工资由供需决定,现在 C 的需求侧很少了,除了驱动,操作系统,嵌入式,很少用到 C 了,自然工资也不会太高。另一方面,由于 c 在实际开发中需要长时间的经验累积,就业面又狭窄,导致选择 C 的从业人员减少,所以楼主面试公司的实际情况就是 C 岗位招不到人。即便你 C 学有所成,想跳个槽都很困难。

国内做了好的项目和公司,基本上只有大疆是新兴 IT 公司需要用到 C 的,海康可能也有部分,他两都是做嵌入式的。大部分互联网公司的业务不需要 C 承载,至于华为肯定也有 C 的岗位,比如自动驾驶之类。

而传统行业用 C 的主要还是工控和嵌入式,不如汽车和飞机的零部件,但工资不比互联网公司,即便大疆这样的用 C 做硬件的开发的还是不如互联网公司的工资
hxndg
2022-03-18 22:26:53 +08:00
我就是用 C 的,原先的 tls 安全工程师,写协议 /服务器 /自动机,可以说是安全开发的。在开发的过程当中会接触到很多底层,会学到比方说 abi ,汇编,多线程的基础知识。用 C 的工作平时会接触到很多基础知识,这些知识一般都得自己去翻外国的资料,自己去看学习的过程很费劲,当然也很有趣。这些基础知识实际上正是我跳槽的时候面试官看中的。因为很多东西不管外面包装的多华丽,最后还是落到了基础上。当然如果你对底层没兴趣,那可能要多考虑下。

然后跳槽目前做 CI/CD 发现基础知识很多都不会在日常工作用到,只会在出现问题才接触。换言之,这些基础帮我解决可能只占 5%的工作内容,但是这 5%的工作内容没有这些基础知识对其他人可能就是 20%的时间消耗。你可以看看这些需要基础知识的问题,我都记录了下来 https://hxndg.github.io/2021/01/07/%E8%AE%B0%E5%BD%95%E4%B8%80%E4%BA%9B%E9%81%87%E8%A7%81%E7%9A%84%E6%9C%89%E8%B6%A3BUG/


我支持第一份工作接触 C 而不是 C++有一个好处就是很多 C++的问题最后都是可以用 C 的很多基础知识解决。C++为了提供一个简单的方式,把很多东西包装了。只有懂 C 才能很方便的解决问题。很多多线程的东西最后还是回到了 C 的函数上去
tairan2006
2022-03-18 22:27:48 +08:00
C 是偏硬件的,搞纯软不是很建议,除了内核、流媒体、游戏引擎等几个有限的方向。就算这几个方向,其实也再逐渐过渡到更高级的语言,比如 Rust 和 go 之类的。毕竟 C/C++写起来真的很累(
magewu1223ll
2022-03-18 22:27:53 +08:00
说个楼上都没说过的,音视频开发,这个也是用 c 的,也是非常偏底层的,并且没个大几年功夫根本做不出东西来,就是前期非常熬人,
hxndg
2022-03-18 22:29:36 +08:00
@mikewang

忘了说一点,最好不要只用 C ,最好是 C+CC+GO (如果你喜欢 java 就一块搞呗),只用 C 会导致很多现代化的东西缺失,最好是混合搞。而且
zomco
2022-03-18 22:34:06 +08:00
如果热爱编程,建议选 C/C++,否则选 Java
railgun
2022-03-18 22:59:16 +08:00
C 语言如果是做硬件的话,很容易和平台、行业绑定。导致以后的路比较窄。但是确实比较稳定,做硬件的我见过很多三十多岁的。
Java 30 多岁的都在领导层了。
mikewang
2022-03-18 23:22:21 +08:00
@hello2090 目前看来还行,确实大厂不挑语言,我打算两门语言一起上了。如果收入不行立马跑路哈哈

@hallDrawnel 可能招到的人少一点吧。我问了同学,假如校招给 offer 让去写 C 去不去,他说 C 太麻烦了,不如老老实实干 Java...

@Kasumi20 不不,当然不是说“编译”汇编,而是将高级语言翻译为汇编,然后转成机器码。我们写的是“人脑”词法语法语义分析后的汇编伪代码。可能我说的不是很清楚哈哈

@shijingshijing 感谢提醒,感觉现在数据库方向应该还算好,应该不算互联网吧,但是和互联网关系还是很紧密的,应该不会这么快就没落。其他方面大概就要警惕了。

@hxndg 是这样的,听说我那儿还有 C 、Java 都干的小组(混合编程?),我想申请加入试试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX