C 语言底层开发怎么样?
source link: https://www.v2ex.com/t/841252
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
应届生春招拿到了某大厂 offer 。当时选的 Java 语言面试的。
面试通过后,HR 说虽然面的 Java ,也可以考虑别的语言开发。
我了解了一下有 C 、C++、Java 、Python 等,然后对方说我基础不错,推荐去做 C 语言从事偏底层的开发。
现在我比较疑惑的是,大学期间没有接触过这一方面( C 语言教的十分简略,其他知识也都是在 Java 基础上学的),心里很没有把握。不过公司说,没接触过底层没关系,会有导师带。
然后底层开发还要熟悉汇编,现在也几乎是 0 基础(《编译原理》课写的汇编都是伪代码)
认识的同学和毕业生,从事底层的好像也比较少,还没了解到具体是要做些什么工作,前景如何。
HR 说,最终意愿看我,如果坚持 Java 开发也 OK 的。
所以我想问一下,现在 C 语言底层开发如何?
第一份工作选会的,还是选不会的?
liujavamail 3 天前
villivateur 3 天前 via Android
ke1e 3 天前 2
feather12315 3 天前 via Android
freeup 3 天前 2
lakehylia 3 天前
yehoshua 3 天前 via Android
mikewang 2 天前
@freeup 是的,我就是考虑的这个有点心动,现学现用,涨经验。就是想现学会不会压力有点大(没工作过不懂)
@yehoshua 从校招信息看,C 确实没有 Java 热门,而且感觉 C 的下限要求也比 Java 高,得好好学
tool2d 2 天前
而学一年 C ,还要求看汇编,就算有大佬,你会发现一年都是在打基础,陷入到无限造轮子的循环。
C 的回报周期实在是太长了,除非真的热爱编程,否则多留点时间陪伴家人和女朋友吧。
yzbythesea 2 天前
tcdh 2 天前 via Android
zzzkkk 2 天前
libook 2 天前
C 相关的人才相对比较少,但相关人才需求一直都有,后面还可以考虑同时用 Rust 。
Java 相关的人才比较多,竞争比较激烈一些。
stephenyin 2 天前
aerzha 2 天前
Goat121 2 天前 2
关键看你这个偏底层是哪个底层,看具体的应用方向。
比如上面老哥说的云计算组件,哪家大厂不做?
需求市场有了,那他们是招一个写底层组件的容易,还是招一个 java 写业务 crud 的容易?哪个开的工资高呢。
再比如嵌入式,不能说没市场,但都是各自为战。拿到甲方订单的大概率是当地关系户,国企下属,大学教授之类。
开发上也缺乏统一标准,入坑了跳槽也难,大概率会把青春花在调试各种板子上。
直接取决你的收入的是供需,是你的工作可被替代的难易度。
记住这个再去分析,相信会让你更清晰一点
Cloutain 2 天前
ruogu 2 天前
tool2d 2 天前
BrettD 2 天前
Seanfuck 2 天前
mikewang 2 天前
qaweqa 2 天前
sampeng 2 天前
毫无疑问选这个。。。为什么?因为 java 你一辈子可能都用不上高级数据结构。在数据库层面就完全不一样了
ch2 2 天前
说是底层但是翻来覆去都是查 unistd 的 api
其实这个项目不能用 Go 代替的部分已经很少了
开发效率差的非常多
hello2090 2 天前 1
我当然不是语言论者,我自己做了 C++10 多年,现在做 Java ,我也百分百肯定大厂基本不挑语言,我做 C++ 的时候也面试过 FB, Amazon 。 但好歹学门现代化的语言吧。C 可是连类都没有的,所有的变量定义都得放在函数开头的啊,这有啥好学的。。
hello2090 2 天前 1
hello2090 2 天前
janus77 2 天前
什么 C/C++永不失业都是虚的,你前期赚的少,不失业又有啥用
而且选 java 的同时也不是不可以兼修,后期再转也没事
duke807 2 天前
Samuelcc 2 天前 via Android
dcsuibian 2 天前
在我看来 C 语言程序开发者应该是对程序性能、体积、速度有极高要求的人。如果你是这样的话,那选 C 吧。
levelworm 2 天前 via Android
BrettD 2 天前 via iPhone
hallDrawnel 2 天前 10
hello2090 2 天前
duke807 2 天前
隨便據兩個例子,PREEMPT-RT 實時 Linux 系統用戶空間,使用 C 寫出高實時性代碼、不同程序之間如何免 copy 分享數據
更底層,譬如如何在 STM32 MCU 上自己實現一個簡單的調度器
再進一步深入底層就不是 C 了,而是 Verilog
BrettD 2 天前 via iPhone
duke807 2 天前
hello2090 2 天前
hello2090 2 天前
Kasumi20 2 天前
hello2090 2 天前
至于楼主找工作,当然 1 是兴趣,2 当然要看前景,或者说择业范围,我觉得 2 其实更重要。当然是工作机会越多的越好啦。说卷不卷的没啥意义啊,Java 卷不过别人做 C/C++你就能出头了?
yulon 2 天前
BrettD 2 天前
runninghipp 2 天前
tianshilei1992 2 天前
duke807 2 天前
100% 的程序員只要願意,學 java 不會有什麼問題,但是能掌握 c 的程序員估計不到 10%,這跟一個人的智商和悟性有關係。(掌握 c 是指能找到各種莫明其妙的 bug 的根本原因,譬如嵌入式系統加一行 printf 原本問題就消失了。)
大多數行業對智商不敏感,靠努力就行。編程行業對智商有一定要求,其中,越是高階語言,要求越低。
BrettD 2 天前
hello2090 2 天前
duke807 2 天前
op 如果屬於這 10%,那麼他去搞 java 就浪費了
我不會 java ,也懶得學,高階語言我選擇 python ,可以做後端、視覺和學習算法、芯片研發( cocotb 仿真)等
cocong 2 天前
qiufengshe 2 天前
shijingshijing 2 天前 8
有些 C/C++的坑,那真是一入此门深似海,从此高薪是路人。我知道的例子,有老哥深钻基于 MCU 的 RT-Linux ,就是想方设法让那种不带 MMU 的处理器支持类 Linux 的操作系统,各种魔改各种奇技淫巧,片内寄存器+片上内存玩出花来了。结果呢,ARM 普及+半导体工艺进步,让原来节省的那些成本几乎没啥意义了,反而由于软件高度复杂、门槛又高用的人越来越少了。
还有一位同学毕业之后就去了通信领域某头牌外企,起手玩的就是高大上的 VxWorks 系统+PowerPC 组合,这种配置在 10-20 年前绝对是底层里面的高富帅,结果呢,现在通信行业全部改成 x86+Linux 了,以前学得那一套基本上没有人用了,成本太高,客户越来越少,收入也一直原地踏步,最后痛下决心重头再来,拿出考研时候的拼劲,结果也算不错,跑去 HW 做云计算基础设施了。
所以,这种偏底层最大的问题是跟面向的领域捆绑太深了,一定要注意找准一个好点的方向,不然回头太难。
noroot 2 天前
documentzhangx66 2 天前
并不是说 C 一定比 Java 高人一等,而是 C 学习门槛高、需要知道的知识更多、需要踩得坑更多、需要做的实验更多。
Java 写很多东西可以直接无脑 List ,因为 Java 的公认主要目的是实现功能;
而 C 的公认主要目的是追求性能与性价比,需要考虑硬件结构、各设备情况与性能,写的时候还要时刻注意数据结构与算法等等。
换句话来说,当你追求钱的时候,选 C 就没错。但如果你不在乎钱,仅仅只是喜欢轻松编程,那么选 Java ,同时不需要在乎 C 的那些人怎么看待你。
但是,当你不缺钱,对技术又有追求时,我建议,所有主流语言,你都要熟练,然后你就没有到底选哪种语言的问题了。并且,对于高手来说,编程语言、OS 、CPU type 等等,都不是问题。
documentzhangx66 2 天前
但对于就业来说,虽然 C/C++因为门槛高而造成工资高,但岗位却比 Java 少得多,所以不一定比 Java 更好就业。
Suddoo 2 天前
hello2090 2 天前
写 C 也不一定就需要接触到算法,写 Java 也不一定就不用算法。ffmpeg 就是 C 写的,没见过有 Set, Map, 二叉树图的,连链表有没有用上我都不确信。为啥 C 需要的知识更多?做 web 的光数据库的选择就有几十种呢,这也是知识也要踩坑啊。
语言是服务于工作的,C 要考虑硬件结构,Java 也要性能调优啊。C 也有不用考虑硬件结构,数据结构公司早就实现好的,Java 也有只要 CRUD ,能跑就行的。
或者这么说,C 不是门槛高,门槛有啥高的,连个类都没有,几天不就看完了,是 C 要做好的门槛高(这也只是我的假设)。那就像我上面说的,这么高的门槛 10%才能做好,那去做 Java 不是赚的更多?
hello2090 2 天前
feather12315 2 天前 via Android
涉及 arch ,要读 CPU programming guide ,除了汇编外还要懂 CPU 的体系;还有 OS ,看具体的方向,做 BSP 、驱动的要懂 ACPI 、device tree 、PCIe 吧;还要懂编译系统,GCC 之类的几角旮旯里面的编译选项辅助 debug ,还有各类 hack 的 debug 技巧; POSIX 编程更要懂;做文件系统的话要懂 fs ,做 rtos 的话要懂调度之类的吧。这类职位叫 system engineer 。
当然,如果只是做应用层的 c ,确实不多。
matolv 2 天前
国内做了好的项目和公司,基本上只有大疆是新兴 IT 公司需要用到 C 的,海康可能也有部分,他两都是做嵌入式的。大部分互联网公司的业务不需要 C 承载,至于华为肯定也有 C 的岗位,比如自动驾驶之类。
而传统行业用 C 的主要还是工控和嵌入式,不如汽车和飞机的零部件,但工资不比互联网公司,即便大疆这样的用 C 做硬件的开发的还是不如互联网公司的工资
hxndg 2 天前
然后跳槽目前做 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 2 天前
magewu1223ll 2 天前
zomco 2 天前 1
railgun 2 天前
Java 30 多岁的都在领导层了。
mikewang 2 天前
@hallDrawnel 可能招到的人少一点吧。我问了同学,假如校招给 offer 让去写 C 去不去,他说 C 太麻烦了,不如老老实实干 Java...
@Kasumi20 不不,当然不是说“编译”汇编,而是将高级语言翻译为汇编,然后转成机器码。我们写的是“人脑”词法语法语义分析后的汇编伪代码。可能我说的不是很清楚哈哈
@shijingshijing 感谢提醒,感觉现在数据库方向应该还算好,应该不算互联网吧,但是和互联网关系还是很紧密的,应该不会这么快就没落。其他方面大概就要警惕了。
@hxndg 是这样的,听说我那儿还有 C 、Java 都干的小组(混合编程?),我想申请加入试试。
documentzhangx66 2 天前
1.我在前面讲的东西,是一种共识性的、概率性的,你完全可以去看看各厂对这方面的职位要求,也可以和 HR 们聊聊,看看是不是这回事。
如果你只是为了反对我,在这种共识里,找小概率的反例,不用你找,我也能找一堆出来。
2.你的 C 与 Java ,我认为学的并不精通。面向对象,是一种思想,Java 只是对它实现了语法糖。C 语言,甚至汇编,你也可以模拟出一些面向对象的简单特性。当你在吐槽“C 可是连类都没有的,所有的变量定义都得放在函数开头的啊”时,已经暴露了这个问题。
你说你以 C++,面过 FB, Amazon ,这一点都不重要,重要的是,你过了没,以及这两家公司,对你的评价。我觉得前者你不会说,后者你也不知道。
3.也许你想踩 C/C++,来抬 Java ,但我觉得这种操作并不合适。任何语言,都有自己的优缺点,都有自己的适合场景。当你针对工资、层次这些角度,甚至带着玻璃心去看问题时,只会造成偏见。
还是那句话,缺钱,就选工资高的;不缺钱,就选自己喜欢的。拉踩很没意思。
我甚至早期有段时间天天用 PHP ,现在经常写 Python ,这种性能上不入流的语言,你是不是会讥讽我,甚至同情我?
zhgg0 2 天前
rillhu 2 天前
jackmod 2 天前
mikewang 2 天前
感谢观点,Java 卷因为热门需求高,这个是毫无疑问的。选 Java 至少不会差。
不过,说 C 不够现代化可能不敢苟同,大概 C99 的时候变量就能在函数中间部分定义了吧。至少在 GCC 上是没问题的。
C 可能不够 OOP ,不过结构体这种东西就挺有意思的,而且 #define 一些宏确实能做出 OOP 那种味儿。我感觉更像是一种设计思想的问题。
可能我对 C 存在一些特殊的感情吧,因为有时过于 OOP ,在 Java 写了一堆 getters & setters 有点厌倦了,觉得自己就是个垃圾代码生产者(大概是我技术有限,如果伤害到了 Javaer 非常抱歉)
有点歪楼了,其实我不太想搞语言大战,只是想确定下前景,毕竟也不能全靠个人偏好来吃饭..
doug 2 天前 via Android
希望不要有人喷我哈
2NUT 2 天前
hello2090 2 天前
hello2090 2 天前
我说我以 C++面过就是因为我想告诉楼主大厂不挑语言啊,怎么变成我要踩 C++,抬 Java 呢?我做了 10 多年 C++,那我是要踩我自己喽?
看看这楼里谁在踩? C 是底层语言,高级,10%的高智商才会,Java 谁都学得会。合着我做 Java 的就是拉踩,你们 C 的就是理中客?
你用 PHP 有什么稀奇的?我还用 COBOL 呢,对对对,我没遇到一个程序员,都是先问一下是什么编程语言什么框架的,牛逼的我就跪下,挫逼的我就抽一顿满意了吧
hello2090 2 天前
你这个我真的理解不了你想表达什么意思,你用 C 来做面向对象,是因为你学了面向对象语言,了解了面向对象概念,才会去做这件事的啊,难道你是 C 用着用着,自然的想把他用成面向对象的样子吗? C 要模拟才能简单的面向对象,C 开发者学了面向对象语言之后模拟面向对象的用法,不正是说明了 C 不是面向对象吗?
不过我确实没你精通,你能 a++ 都能想着怎么进行性能优化,普通人是达不到这程度的
documentzhangx66 2 天前
既然你说,你不懂我想表达什么,那我掰碎了讲讲:
你对 C 、C++、Java 、就业、岗位与薪资,与其他人的理解有较大差距。
你甚至有点玻璃心,想来抬杠。比如 89 楼 与 93 楼。
这种情况下,楼主可能会被你误导。
Mirage09 2 天前 1
其次是兴趣和项目,做一个自己有兴趣的东西还是挺好的,如果不知道兴趣点在哪的话去做相对热门(比如说,类似岗位多)的组
最后是钱,钱差的不多好说,差太多就不是画饼能覆盖的了
另外非常同意一个观点,HR 推荐的(尤其还是推荐给不懂行的校招生)组往往是个坑组。
@documentzhangx66
我作为一个 ex-amazonian 有评价的权力了吧
C 跟 Java 两个应用场景完全不一致的语言其实根本没什么好比较的,语言只是工具,重要的还是看做什么,一个组不会先选语言再开始做东西,而是先根据 project scope 来确定需要用什么语言 /工具来完成目标。另外就我个人观察,无论是我周围的组还是我面试时经历过的组,没有一个是 C 相关的。
我也不懂你说的“追求钱的时候,选 C 就没错。但如果你不在乎钱,仅仅只是喜欢轻松编程,那么选 Java ”的道理在哪,钱多钱少更取决于供求关系,以及你自己的职级,跟语言有什么关系?
“当你不缺钱,对技术又有追求时,我建议,所有主流语言,你都要熟练,然后你就没有到底选哪种语言的问题了。并且,对于高手来说,编程语言、OS 、CPU type 等等,都不是问题。”
这话说的更离谱,你知道你说的“所有主流语言,你都要熟练”是一个多大的 overhead 么?一个合理的预期是招一个人进来,他能快速的上手组里使用的语言和工具,这种学习能力才重要。除非你需要一个几乎不需要上手时间就能干活的人,问题是“熟练”在这种情况下也远远不够。
Amazon 的大部分服务都是基于 Java (包括 AWS ),这证明了至少 Java 在工程上是一门完全够用(且表现优秀)的语言。
goobai 2 天前 via Android
documentzhangx66 2 天前
1.钱与语言的关系是,做 C 的人能很容易换到 Java 并且达到高级,反之则不能。原因在于两种语言的门槛不一样。所以从供求关系来说,当 C 因为供求关系收入更高时,C 语言程序员会留在 C 岗位,此时 Java 程序员很难进来。反之,C 跳 Java 也容易到 Java 高级。
2.无论“所有主流语言,你都要熟练”,这并不是 overhead ,因为我说了一个前提:不缺钱,又对技术有追求。这种情况是很容易出大佬的。对于大佬而言,语言真不是问题。
3.Java 在大部分业务上,完全够用,注意我说的是业务。但从工程角度来讲,亚马逊的交换机、路由器、防火墙等网络设备,甚至服务器网卡,算不算工程?你和他们说这些设备用 Java 试试?搞软件的千万别忘了这些东西,他们也是计算机系统的一个重要组成部分。
Mirage09 2 天前
1. lol 至少在湾区 /西雅图你想象的 1 完全不成立,钱多钱少只看组的 budget 和你的 level ,写 C 不是劣势更不是优势,而且大厂里需要 C 的组相对来说真的少
2. 语言不是问题不代表需要熟练各种语言...我都说了,需要的是当你有一个新的需求的时候,能快速上手新语言和新工具
3. 鸡同鸭讲...请你仔细阅读我前面说的:“一个组不会先选语言再开始做东西,而是先根据 project scope 来确定需要用什么语言 /工具来完成目标。”——谁跟你说你在嵌入式上用 java 了?或者你来用 C 在 Lambda 上写个 message consumer ?
xsen 2 天前
1. C 是 C ,C++是 C++
只会做 C 的,大概率是做不了 C++,主要是思想、思维的转变。C 底层,面极窄、极专,除非打算一直做这个方向(如数据库引擎),不然哪天想提桶了发现连选择都没几个
现在做 C 底层的不外乎几种,嵌入式(单片机或驱动),维护某些历史遗留产品,某些特定的产品(如数据库引擎——选择 C 是因为要考虑性能、老旧平台支持、Arm/X86/Mips 支持),是没办法的事情
2. C/C++为什么人少
是因为一直以来 C/C++机会少,工资低;原先做 C/C++的大部分都转型了,比如做手机 app 、做后端( java/go/python )诸如此类;而且大部分做 C/C++的都很苦逼(跟行业有关),少部分(如大厂内做基础设施的)好些
3. 方向选择主流的方向肯定是没错
别听某些人忽悠,选择某些细分的、几乎没需求的方向
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK