请教 V 友们,一或两年经验的 C/C++程序员,应该具有什么样的能力才算是合格或者优秀的

2018-05-29 16:36:55 +08:00
 Applenice

想请教 V 友们一下,一或两年经验的 C/C++程序员,应该具有什么样的能力才算是合格或者优秀的,看招聘信息的要求总感觉有些乱,如果你们去面试这样的同学都会考察哪些方面呢?先谢谢大家

11470 次点击
所在节点    程序员
120 条回复
c3824363
2018-05-30 10:53:57 +08:00
@wekw 协程的本质不就是用户态程序自己切换"栈"么, 目的不是为了简化同时处理多连接的编程么,弄的异常复杂了还有什么意思呢。
coderluan
2018-05-30 11:04:14 +08:00
干了两年 C/C++,还管自己叫 C/C++程序员,这个基本就是怎么都不合格的。

C/C++本身基本什么都做不了,但是配合别的知识能做的又太多,所以有两年工作经验,还管自己叫 C/C++工程师,就是没有自身定位和方向的表现。

你看招聘乱也是这个原因,因为他们招也不是 C/C++工程师,而是 XX 工程师( C++方向),只会 C/C++肯定是不行的。所以楼主想问这个问题,先明确自己想做什么方向。
current
2018-05-30 11:07:59 +08:00
@wekw 协程调度不做 M:N 的也不算太难写吧,事实上中间插入了“调度”这个概念我觉得就已经偏离协程的初衷了。。

楼下 @3824363 的说法,除了“用起来不像阻塞编程那么直观”这个点可能是笔误以外,大方向我觉得也没有问题,只是说协程这件事,谈调度和运行时环境的切换,是面向下层的视角,谈改变了代码编写方式,自动维护了应用上下文,降低异步代码的编写难度,是面向上层的视角
macha
2018-05-30 11:26:38 +08:00
客户端程序员路过,虽然也是 C++但是基本都拿来当 JAVA 写。
pere
2018-05-30 11:26:39 +08:00
@pkookp8 半年经验不会链表的乐色路过,话说你们找人工资有多低
c3824363
2018-05-30 11:39:01 +08:00
@current 我的意思是说如果不用协程,直接根据类似 epoll 的事件驱动, 然后写对应的事件处理函数,那么这样写起来就必然要用一个结构体来包含一个或多个 socket 和相关的上下文数据,这样就不是很直观了。为了简化和抽象出一个框架,还会用回调的方式,这就让初学者看起来就更不直观了。

但是如果用阻塞的简单方式编程呢, 那么这些结构体里面的上下文数据就可以展开成一些普通的变量了,然后配合阻塞的方式,能一眼从头看到尾,初学者也能一眼看明白了。 但这样只能用多进程多线程处理多连接,用于切换的损失比较大。

协程就是用用户态自己切换上下数据的栈,来同时实现高性能和编程的简单直观。

正常情况下我不用协程,直接用前面说到的第一种方式,例外是用 lua 的场景。 没有笔误,就是没有表达清楚。
c3824363
2018-05-30 11:41:09 +08:00
@c3824363 本身 epoll IOCP kqueue 也提供了携带一个指针的方式来让你关联一个结构体来实现我说的第一种方式。
current
2018-05-30 12:11:25 +08:00
@c3824363 我觉得你这个说法是没问题的,协程的存在提供了使用类似与你描述的( 2 )的形式的代码提供( 1 )的功能的能力,上下文需要分成两个方面来理解,一方面是应用层的上下文,也就是进程 /线程 /协程栈上的数据,一方面是运行时环境,也就是寄存器,TLB,Cache 等

上面一方面的上下文解决代码编写的问题,下面一部分的上下文解决切换开销的问题。当然还有一些细节是要分开考虑的。。比如是否要提供私有栈,是否要提供调度的优先级,yield 的语义等等。。
ioth
2018-05-30 12:13:01 +08:00
c++和 c 完全不是一回事。
pkookp8
2018-05-30 12:20:39 +08:00
@pere 实习 3k,应届 7k,试用 80%。
链表很简单,结构体会吧。其中一个用来存储下一个节点的地址。这样知道一个就能找到下一个
进阶一点,实现一个双向的,或循环的
以这个为原型,结构体增加一个成员用来存储数据
于是可以写出增删改查四个功能,基本就初级毕业了。
再进阶,排序链表,就 OK 了,逆转有兴趣也可以了解一下,不了解也没什么大碍
再进阶,哈西表一个简单的模型就是链表里存着链表,或者想象二维数组也行,实现一下也不难
再进阶,那就是树了。平衡树什么的
日常不是算法相关,这些就够用了,而且对指针什么的使用和理解也会有一个深入
然后就是多写,多看。刚学的时候写一两个小时也正常,熟练了之后,了解原理,熟练使用这门语言,十分钟也是可以的。
c 不像一些更高级的语言,这些都是需要自己造轮子的,需要使用者非常关心的
当然 linux 内核也提供了一个 list.h 可以用,非常方便
Applenice
2018-05-30 12:42:34 +08:00
@coderluan 谢谢大佬指点,说的在理,方向这个确实要好好想想的
Applenice
2018-05-30 12:46:09 +08:00
@liuminghao233 感谢~~~
@pkookp8 list.h 这个的确方便
shijingshijing
2018-05-30 12:52:15 +08:00
@pkookp8 难怪你们招不到人的。。。

话说现在公司招 c 和 c++的,都愿意花大价钱招个很厉害的也不愿意花少点钱多招几个菜鸡,因为一般涉及到要用 c 和 c++的场景,都是没有更好的办法而不得不用(连堆硬件都无法解决的那种),这样人多没啥用,还是要找个厉害的给多点钱然后死命的压榨。

只能说你们公司比较清奇。。
shijingshijing
2018-05-30 13:04:15 +08:00
@xiadong1994 对了,你说 x86_64 的这些参数放在寄存器里面,这个我比较好奇,我只做过 32 位的嵌入式,没看过 64 位的 ISA 手册,不管是 intel 的还是 ARM 的,都没看过,想问一下是所有的 64 位都这样处理的还是看具体的 case ?如果跟一长串参数的话比较好奇 register file 足够大么?能详细说说么?
pkookp8
2018-05-30 13:06:10 +08:00
@shijingshijing 小厂只能招我这种菜鸡凑凑人数混混日子堆堆代码了,每天加班,不知未来在哪
xiadong1994
2018-05-30 13:13:36 +08:00
@shijingshijing 我也只知道 x86_64 的,Windows 和 Linux 的 call convention 还不一样。不过都是把前几个参数放到寄存器里( win4 个,Linux 6 个),多出来的放到 stack 上。

https://en.m.wikipedia.org/wiki/X86_calling_conventions
pkookp8
2018-05-30 13:17:30 +08:00
@shijingshijing 64 位以及 intel 我不是很懂,我只了解 32 位 arm:参数寄存器通常是 r1-4,所以函数的入参建议 4 个以内也是这个原因。大于 4 个不是通过寄存器传参,而是压栈,然后用到的时候出栈,因此代码效率降低(非常有限)。现象可以通过分析汇编语言看出,理论解释需要看 arm 手册
一长串参数会一直入栈,直到栈爆了。栈大小有个默认值,ulimit -s
shijingshijing
2018-05-30 13:28:15 +08:00
@xiadong1994
@pkookp8
大致了解了,这种底层细节的一般我们都是丢给供应商去处理的,我们自己了解不多,惭愧啊,一直撸 application 的真不好意思说自己是写 c 的,以后有时间还是要多看看。
c3824363
2018-05-30 13:46:49 +08:00
@Applenice 内核里面还有个好用的 rbtree
Applenice
2018-05-30 13:48:26 +08:00
@c3824363 这个还真没用过,我去看看,谢谢.

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

https://tanronggui.xyz/t/458700

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

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

© 2021 V2EX