后台C++开发你一定要知道的条件变量

后台C++开发你一定要知道的条件变量 今天因为工作需要,需要帮同事用C语言(不是C++)写一个生产者消费者的任务队列工具库,考虑到不能使用任何第三库和C++的任何特性,所以我将任务队列做成一个链表,生产者在队列尾部加入任务,消费者在队列头部取出任务。很快就写好了,代码如下: /** * 线程池工具, ctrip_thread_pool.h * zhangyl 2018.03.23 */ #ifndef __CTRIP_THREAD_POOL_H__ #define __CTRIP_THREAD_POOL_H__ #include <pthread.h> #ifndef NULL #define NULL 0 #endif #define PUBLIC PUBLIC struct ctrip_task { struct ctrip_task* pNext; int value; }; struct ctrip_thread_info { //线程退出标志 int thread_running; int thread_num; int tasknum; struct ctrip_task* tasks; pthread_t* threadid; pthread_mutex_t mutex; pthread_cond_t cond; }; /* 初始化线程池线程数目 * @param thread_num 线程数目, 默认为8个 */ PUBLIC void ctrip_init_thread_pool(int thread_num); /* 销毁线程池 */ PUBLIC void ctrip_destroy_thread_pool(); /**向任务池中增加一个任务 * @param t 需要增加的任务 */ PUBLIC void ctrip_thread_pool_add_task(struct ctrip_task* t); /**从任务池中取出一个任务 * @return 返回得到的任务 */ struct ctrip_task* ctrip_thread_pool_retrieve_task(); /**执行任务池中的任务 * @param t 需要执行的任务 */ PUBLIC void ctrip_thread_pool_do_task(struct ctrip_task* t); /**线程函数 * @param thread_param 线程参数 */ void* ctrip_thread_routine(void* thread_param); #endif //!...

January 11, 2021

后台开发应该读的书

后台开发应该读的书 根据我的经验来谈一谈,先介绍一下我的情况,坐标上海,后台开发(也带团队了),某知名互联网公司。 目前主流的有C++和JAVA,C++我的经验稍微多一点。我就说说我关于C++方面的学习经验。如果您是学生,临近毕业,没有那么多时间读许多书,可以按下面列举的重要程度来参考。 首先,我觉得你应该好好准备算法和数据结构,做到常见的算法和数据结构知识点都能非常熟悉,这样的话你毕业求职的时候可以轻松拿一些大厂(BAT等)的offer。我本人非科班出身,一毕业之后各种摸爬滚打。一毕业去大厂个人觉得有两个好处,第一,你的收入会比一般的的小公司高很多,小公司招人要求相对低一些,薪资给的也少很多,它们是实实在在招能干本职工作活儿的人。第二,你的起点也会比一般进入小厂的同学高。我这里并不是歧视小厂,只是说一种普遍的情况。我本人也是从小厂一路过来的。这里我是强调算法和数据结构的重要性。尤其是应届生求职,更应该去好好准备一下这个,因为这个东西是原理性的基础。企业在面试应届生时不会过分要求项目经验和各种操作系统原理、网络通信原理之类的东西,而唯一能考察一个人的基本功的就是这个了。我是社招进大厂,基本上算法和数据结构这类问题问的比项目经验本身要多许多。但是社招又不太一样,因为除了要准备算法和数据结构以外,还得准备有项目经验、了解操作系统原理、熟悉网络通信、了解数据库、熟悉要求的各种开源框架和技术等等,实在太多了,即使再怎么准备也不一定能一举拿下。相反,应届生基本上只要好好准备算法和数据结构的东西,大学其他专业课学的不是太差,这基本上就是进大厂的捷径。图书方面,你可以使用你们计算机专业的相关教材,也可以使用《数据结构与算法分析:C语言描述》《算法导论》这一类严谨的教材,当然,平心而论我是不敢推荐《算法导论》的,因为这一本书实在是太大部头了,没有好的数学知识,真的很难啃。如果想看一下比较幽默轻松类的书,可以看看程杰的《大话数据结构》。 其次,如果你学有余力,可以看看操作系统原理方面的书籍,当然也可以使用你们的教材,我这里推荐一本我看过的吧,Tanenbaum.A.S《现代操作系统》,Tanenbaum是荷兰人,也是Linux之父Linus Torvalds操作系统方面的启蒙老师。当然,我的建议是这种书毕竟流于理论知识,也不一定要看完,但**一定将一些基础概念,如进程线程内存模式等基础概念看懂理解。**你如果还有时间强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》,这本书同时涉及到了Windows和linux两个操作系统平台,用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节,甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚,同时也分析了C Runtime(CRT)、glibc这样的操作系统接口库的原理和执行逻辑,是一本实实在在难得的帮你实战操作系统原理的一本好书。我特别喜欢这个书中序言的一段话: “CPU体系结构、汇编、C语言(包括C++)和操作系统,永远都是编程大师们的护身法宝,就如同少林寺的《易筋经》,是最为上乘的武功;学会了《易筋经》,你将无所不能,任你创造武功;学会了编程“易筋经”,大师们可以任意开发操作系统、编译器,甚至是开发一种新的程序设计语言!” 再次,你学这些东西是为了将来实践并有产出的,而落实这个产出的东西就是编程语言,如果是入门,我首推C/C++。你只有熟练使用一门编程语言,你才能将你的想法变成现实。注意这里我把C和C++放在一起,但是严格意义上说,C和C++还是有点区别的,但是除了语法上的一些细节差异,基本上可以认为是相通的。个人觉得C语言是所有想成为高手最应该使用的入门语言,不要和我说现在很火的python、go这类语言,“玄都观里桃千树,尽是刘郎去后栽”。我这里也推荐一本C语言方面的图书吧,有兴趣的可以参考一下:《C语言程序设计:现代方法》。至于谭浩强的书就不要提了,还有就是大部头的《C++ Primer》,它虽然是一本好书,但实在是太大部头了。语法层面的东西学会很快,stl库的东西需要实战,也不是翻这类字典一样的书就能很好地掌握的。当然,如果你想掌握好C++,《深度探索C++对象模型》是一定要看的。C++实际编码技巧还有另外一本非常好的书,介绍了常见的C++编码技巧《提高C++性能的编程技术》,建议C++开发的把书中说的技巧全部掌握。 接着说,我们再说说网络方面的,首先网络基础方面的书籍,我就没啥推荐了,现在很多计算机学院也开始使用《计算机网络:自顶向下方法》这本不错的教材,如果没有看过的可以看下。当然还是那句话你一定要看懂而不是看完。比如三次握手和四次挥手的细节,你一定要很清楚。然后你就可以找一本网络编程的实战书来看下,如果你没有使用任何socket api编程的经验,你可以看看韩国人尹圣雨写的这本《TCP/IP网络编程》,这本书从基础的socket api介绍到比较高级的io复用技术,有非常详细和生动的例子。如果你是初级水平,强烈建议看看这本书。网络编程的细节需要注意的地方实在太多了,这本书上都有介绍。很多人尤其是一些学生,写了一些可以相互聊天的小程序就觉得自己熟悉网络通信了,但是这类程序拿到互联网上或者离开局域网,不是连接出错,就是数据总是收发不全。我当年也是这么过来的,看看这本书,你就能明白许多网络故障的原因。等你有了一定的网络编程以后(熟练使用常见socket API),你可以看看游双的《Linux高性能服务器编程》,这本书给没有基础的人或者基础不扎实的人的感觉是,尤其是书的前三章,这书怎么这么垃圾,又把网络理论书上面的东西搬过来凑字数,但是如果你有基础再按照书上的步骤在机器上实践一遍,你会发现,真是一本难得的、良心的书,桃李不言下自成蹊吧。如果你掌握了这本说上说的这些知识,你再看陈硕老师的《Linux多线程服务端编程》或者去看像libevent这样的开源网络库,你会进一步的得到提升。这也是我学习网络编程的一些经验和经历吧。注意这里有必要提一下:像UNP、APUE、还有《TCP/IP详解》这一类书,如果你将来不是专门做网络方面的工作或研究,其实是非常不建议抱着他们看的,因为部头太大,其次太多理论和Unix的东西,花的时间产出投入比很低的。 接着说,以上说的都是一些基础的东西。其实不管是什么开发,后台开发也不例外,你都是需要基于特定的操作系统的,这里不提Windows系统,单单拿linux操作系统来说,既然你选择做这个方面的开发,你需要熟悉这个操作系统平台提供的一些常用的API函数,网络通信方面上文已经说过,除了网络通信还有如操作文件、操作内存、字符串操作、进程线程系列、线程同步系列(如互斥体、条件变量、信号量)、管道等常用的各种API接口函数。这里的意思是,不是要你背诵记忆每一个接口函数的签名,而是你要知道何时该用哪个接口,如何用,有什么注意事项。我入门的时候看的是Robert Love的《Linux系统编程》,熟悉这个人的应该知道,google的工程师,他还有另外一本非常有名的书《Linux内核设计与实现》。 最后,我强调一下,如果你是快毕业的学生,面临着找工作的压力,应该以算法和数据结构为主。如果你是大一大二或研一这个阶段的学生,我上面推荐的书,你还是可以考虑好好咀嚼一下。标准是看懂而不是看完。 再补充一些我觉得要成为高手应该要掌握的东西,先说汇编。虽然第三代第四代语言越来越多,硬件性能越来越好。但是如果你熟练掌握汇编,你就比其他人多很多优势,你会能透彻地知道你写的每一行C/C++代码背后的机器指令的效率。无论是做安全工程还是自己技术提升上都是非常不错的。这里推荐一本王爽老师的《汇编语言(第3版)》,这本书不厚,语言通俗易懂,你也不用刻意去记忆,基本上当小说书看一下就能很快看完了。汇编实战类图书还有另外一本《老"码"识途:从机器码到框架的系统观逆向修炼之路》。我个人是非常喜欢这本书的。当年读这本书的时候,真的有一种“笑看妻子愁何在?漫卷诗书喜欲狂”的感觉。尽管那个时候连女朋友都没有——! 另外补充一些我学生时代看过的书吧,我本人是熟悉Windows和linux两个平台的开发,这也归功于我学生时代看过的一些经典书籍,可能有点跑题了,如果不介意,我可以和你说说: 《Windows程序设计》第五版(第六版以后,这个不再是用Windows Native API写C程序了,而是转到C#平台上了),这本书是中国第一代程序的windows启蒙书籍,你所看到的大多数桌面软件,如QQ,的开发者可能都是通过阅读这本书启蒙起来的。 《Windows核心编程》,这本书搞Windows开发的一定都知道这本书的分量。 《linux内核情景分析》毛德操老师的书,非常的实在,另外他写了一套关于Windows源码分析的书,这本书是基于开源的“Windows”ReactOS,书名叫《Windows内核情景分析》。 《编译系统透视:图解编译原理》,编译原理方面的实践书。 《编程之美》,关于面试的,主要是一些算法和逻辑思维题实战。 《重构:改善既有代码设计》,没有实际写代码经验不推荐看。 《程序员的修炼之道——从小工到专家》这本书特别推荐学生看一下,能大幅度地提高你实际编码的技巧和编码风格。 《代码整洁之道》同上 《大话设计模式》 《Windows PE文件权威指南》 《Java编程思想》 《Effective C++》系列 《80x86汇编语言程序设计教程》 总的来看,我学生时代主要是侧重基础知识来读书的。本科四年、硕士三年,多谢这些书帮助我成长,记得大学毕业的时候,我光读书笔记就有满满十个笔记本。 工作以后,也读了像redis、netty、分布式这一类书。但是那都是工作需要吧。由于我扎实的基础,当然也可能是因为运气成分吧吧,所以得到一些注重扎实的技术基础公司的青睐,给了目前这个阶段看起来还不错的薪资(当然可能还有人比我更厉害,那我这里就贻笑大方了,所以请不喜勿喷)。同时非常感谢我一路上遇到的公司和同事给我的技术上和生活上的帮助。薪资本身不能说明一个人是否成功,我码这么多字,**希望广大的开发者注重基础,勿在浮沙筑高台。尤其是学生,你有大把读书的机会,一定要珍惜大学时光。毕竟工作以后,尤其是毕业后,面临着工作、家庭等各种问题,你可能再也没有心思和完整的时间去学习和提升了。**所以前期的积累很重要,毕竟选择技术这条路,提高技术是升职加薪改善生活水平最直接的方法。最后用我学生时代看到一个技术前辈写的一首诗来结束吧: 仗鼠红尘已是癫, 有网平步上青天。 游星戏斗弄日月, 醉卧云端笑人间。 七载寻梦像扑火, 九州谁共我疯癫? 以上是我的经历,我也曾迷惘和无助过。也有很多朋友找到我,希望我做一些经验分享和职业规划指导,有需要的小伙伴可以加我微信 easy_coder。

January 11, 2021

后端开发相关的书籍

后端开发相关的书籍 后台开发应该读的书

January 11, 2021

多线程

多线程 后台C++开发你一定要知道的条件变量 整型变量赋值是原子操作吗?

January 11, 2021

如何使用 Visual Studio 管理和阅读开源项目代码

如何使用 Visual Studio 管理和阅读开源项目代码 对于 Linux C/C++ 项目,虽然我们在 Linux 系统中使用 gdb 去调试,但是通常情况下对于 C/C++ 项目笔者一般习惯使用 Visual Studio 去做项目管理,Visual Studio 提供了强大的 C/C++ 项目开发和管理能力。这里以 redis 源码为例,介绍一下如何将这种开源项目整体添加到 Visual Studio 的解决方案中去。 启动 Visual Studio 新建一个空的 Win32 控制台程序。(工程建好后,关闭该工程防止接下来的步骤中文件占用导致的无法移动。) \2. 这样会在 redis 源码目录下会根据你设置的名称生成一个文件夹(这里是 redis-4.0.1),将该文件夹中所有文件拷贝到 redis 源码根目录,然后删掉生成的这个文件夹。 \3. 再次用 Visual Studio 打开 redis-4.0.1.sln 文件,然后在解决方案资源管理器视图中点击显示所有文件按钮并保持该按钮选中。(如果找不到解决方案资源管理器视图,可以在【视图】菜单中打开,快捷键 Ctrl + Alt + L。) \4. 然后选中所有需要添加到解决方案中的文件,右键选择菜单【包括在项目中】即可,如果文件比较多,Visual Studio 可能需要一会儿才能完成,为了减少等待时间,读者也可以一批一批的添加。 5.接着选择【文件】菜单【全部保存】菜单项保存即可(快捷键 Ctrl + Shift + S )。 最终效果如下图所示: 这样我们就能利用 Visual Studio 强大的功能管理和阅读我们的源码了。 这里要提醒一下读者:C/C++ 开源项目中一般会使用各种宏去条件编译一些代码,实际生成的二进制文件中不一定包含这些代码,所以在 Visual Studio 中看到某段代码的行号与实际在 gdb 中调试的代码行号不一定相同,在给某一行代码设置断点时请以 gdb 中 list 命令看到的代码行号为准。

January 11, 2021

如何成为一名合格的 C/C++ 开发者?

如何成为一名合格的 C/C++ 开发者? 写在前面的话 在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃。 笔者从学生时代开始接触 C/C++,工作以后先后担任过 C++ 客户端和服务器的开发经理并带队开发,至今已经有十多年了。虽然时至今日哪种编程语言对我来说已经不再重要(我目前主要从事 Java 开发),但 C/C++ 仍然是笔者最喜欢的编程语言。在我看来,C/C++ 一旦学成,其妙无穷,就像武侠小说中的“九阳神功”一样,有了这个基础,您可以快速学习任何语言和编程技术。 C/C++ 的当前应用领域 需要注意的是本文不细分 C与 C++ 的区别,通常情况下,C++ 可以看成是 C 的一个超集,在古典时期,可以认为 C++ 就是 C with classes。虽然如今的 C++ 从功能层面上来看,离 C 越来越远了;但是从语法层面来上来看,大多数 C++ 语法还是与 C 基本一致的——所谓 C++ 的面向对象特性,如果细究 C++ 类方法的具体语法还是 C 的过程式语法。当然,面向对象是一种思想,语言本身对其支持的程度固然重要,能否熟练使用更要看开发者的水平。 C 语言目前主要用于像操作系统一类偏底层的应用开发,包括像 Windows/Linux 这样的大型商业操作系统,以及嵌入式操作系统、嵌入式设备上的应用。还有一些开源的软件,也会选择 C 开发,这些系统主要优先考虑程序执行效率和生成的可执行文件的体积(C 代码生成的可执行文件体积相对更小),当然还有一些是历史技术选型问题,这类软件像 Redis、libevent、Nginx,目前像国内的电信服务商所使用的电话呼叫系统,一般也是基于一款叫 FreeSWITCH 的开源 C 程序做的二次开发(项目地址:https://freeswitch.com/ )。 C++ 面向对象的语法与 C 相比较起来,在将高级语言翻译成机器二进制码的时候,C++ 编译器在背后偷偷地做了大量工作,生成了大量的额外机器码,而这种机器码相对于 C 来说不是必须的。例如,对于一个 C++ 类的实例方法,编译器在生成这个方法的机器码时,会将函数的第一个参数设置成对象的 this 指针地址,以此来实现对象与函数的绑定。正因为如此,许多开发者会优化和调整编译器生成的汇编代码。 我们再来说说 C++。C++ 的应用领域目前有三大类,第一类就是我们目前见到的各种桌面应用软件,尤其 Windows 桌面软件,如 QQ、安全类杀毒类软件(如金山的安全卫士,已开源,其代码地址:http://code.ijinshan.com/source/source.html )、各种浏览器等;另外就是一些基础软件和高级语言的运行时环境,如大型数据库软件、Java 虚拟机、C# 的 CLR、Python 编译器和运行时环境等;第三类就是一些业务型应用软件的后台,像游戏的服务器后台,如魔兽世界的服务器(代码地址:https://github.com/azerothcore/azerothcore-wotlk )和一些企业内部的应用系统。笔者曾在某交易所从事后台开发,其交易系统和行情系统就是基于 C++ 开发的。 C++ 与操作系统平台 从上面的介绍可以看出,与 Java、Python 等语言相比,C/C++ 语言是离操作系统最近的一种高级语言,因此其执行效率也比较高。但是有得必有失,因为如此,C/C++ 这门语言存在如下特点。 **C/C++ 整套的语法不具备“功能完备性”,单纯地使用这门语言本身提供的功能无法创建任何有意义的程序,必须借助操作系统的 API 接口函数来达到相应的功能。**当然,随着 C++ 语言标准和版本的不断更新升级,这种现状正在改变;而像 Java、Python 这类语言,其自带的 SDK 提供了各种操作系统的功能。 举个例子,C/C++ 语言本身不具备网络通信功能,必须使用操作系统提供的网络通信函数(如 Socket 系列函数);而对于 Java 来说,其 JDK 自带的 java....

January 11, 2021

我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?

我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应? 以下内容来自于一名群友的求助,经当事人同意首发于『高性能服务器开发』公众号,文字略有改动,未经许可,不得转载。 (以下文中的“我”乃当事人本人,非文章作者。) 群主,您好。我是一名上海一名 C++ 客户端开发,最近遇到了点私人问题,请群主帮我参考一下。以下是我的问题: 我是一名程序员,很爱我的女友,谈婚论嫁时,女友要求我用两年的工资作为彩礼,我该不该答应? (一) 我老家是湖北黄石的,大学就读于武汉某学校,2018 年 7 月毕业,辗转来到上海。由于学历不太好,加上大学荒废了四年,在上海找了近一个月工作之后,终于 2018 年 7 月底上海找了一份 做 PC 客户端开发的工作,使用 C++ 语言。公司是做金融系统平台定制的,主要业务是股票交易系统,为此招了很多数据分析师,女孩子比较多。我就在这家公司认识了我现在的女朋友,她也是一名数据分析师,她是江苏人,也是在武汉上的学,大学毕业时在券商实习做过柜台,所以业务比较熟悉。平常她需要和我们这些开发进行对接,一来二去我们就熟悉了。有一次无意中一起下班,发现我们顺路,后来我们就经常一起加班下班,我向她请教业务问题,她和我了解系统实现逻辑。 后来一段时间,我发现她每天早上来的很晚,而且总是眼睛红红的或者像是没休息好的样子。于是,我趁着下班的机会,问她怎么了,可是她总是说没事。终于有一天晚上我们一起下班回家的日子,她告诉我原因了:她前男友那段时间总是打电话找她,请求复合,她已经和前男友分手快一年了,她前男友回了老家,她来到了上海。现在她男朋友生了病,据她描述应该病的不轻,她拒绝了他的复合要求,但是她心里觉得很过意不去,对于一个病人这样做是不是太残忍了。但是,她又不想复合,虽然她的前男友平常对她很好,但前男友是个喜怒无常且无任何人生规划的人,还有一点点家庭暴力倾向。(画外音:小方群主看到这里惊呆了,好狗血的剧情。。。) 后来,某天晚上在公司附近的公园的草坪上我不断的安慰她,让她想开一点,既然分手了,又有顾忌,就不要再想前一段感情了,建议她向前看。 又过了几天,她说她想通了,这次决定放下。那天晚上,我去了她租的房子。之前,她每次只允许我走到她小区门口,从不允许我进去,调侃我说我“图谋不轨”。那天晚上,我真是感到受宠若惊,聊的比较晚。后来不知道因为什么事情,她又说起了她的前男友如何可怜,我当时很生气,抓起我的书包就准备走。她突然一把抱住我,并且强吻了我。我当时就木头了,单身二十三年,女孩子手都没摸过,更不用说和女孩子接吻了。那感觉,当时脑子就不清醒了。然后,她反问我:XXX,你是不是想追我?我当时小心翼翼地回答是。她说让她考虑一下,然后就让我先回去了。 我一宿未眠,不知道她如何想的。第二天一大早就去了公司,可是一上午都没看到她来公司,我给她发微信打电话也没人回。终于,下午她终于来公司了,而且看起来精神状态不错。她神秘兮兮的和我说晚上一起吃饭。 晚上我们一起在公司的楼下食堂吃饭,她说她和她前男友好好的聊了一下,把事情说清楚了。她不会再想她的前男友,并且接受我的追求。那天,当她告诉我她愿意接受我的时候,我非常的开心。 (二) 接下来的日子,应该是我人生中最开心的一段日子了。我发现,我们对文学都很感兴趣,我们一起聊《红楼梦》《雷雨》《巴黎圣母院》《飘》《百年孤独》《海上钢琴师》等一些国内外的经典著作和电影,她和我聊她之前在深圳和小伙伴们的趣事,还有一些我从未听过的文学作品,她的学识令我佩服。 那段时候,下班以后,我俩骑着共享单车在华师和同济大学的校园里漫游,有时候手拉手在河边散步,无话不谈,真的佩服她的文学素养和对世界的认识。而且让我惊喜的是,她有一手好厨艺,我琢磨着和她自小的家庭环境有关系吧。周末她烧饭时,从来不让我洗碗,而且一个人全包了从买菜到炒菜煮饭、饭后洗碗、打扫的全过程。我们一起玩王者荣耀和英雄联盟,她对这两个游戏也很感兴趣。 周末有的时候我们会一起去南京路步行街逛街、看看电影,我觉得她是个非常独立的人,她每次买东西都不会让我付钱,而且我之前断断续续借给她五六千块钱,在一次闹矛盾后也一分不少的还给我了。当然后来,我们又和好了。 在交往中,我知道了她的家庭状况。家在苏北农村,父母务农。家里有一个哥哥,高中没读完就辍学了。父母比较对哥哥比较宠爱,从小对她管不多,她经常和家里吵架。她从小的愿望就是将来离开家。所以她一个人去武汉上学,毕业后一个人去深圳,干了一年来到上海。但是,她的哥哥从小对他很好,她很感激。唉,这个"好"字,埋下了我后来的悲剧。 在一个周五的晚上,我们去了一家很有特色的古风饭店吃了顿饭,我们一起喝了点店里的招牌酒水——女儿红。她貌似喝醉了,脸红扑扑的,回来的路上,她一边挽着我的手一边给我唱王菲的情歌。那天星光下,她穿着一套白色的裙子,像个仙子一样美丽。那天,我也很开心,心里想:她的独立自强以及读了那么多书,具有一种一般女孩不具有的知性美,还有她的勤劳质朴,在现在的女大学生中实在太少了,这应该是我理想中的对象吧。 顺理成章,那天晚上,我们在她的租的房子里面发生了关系,我很意外的是,她竟然还是个chu。我问她后不后悔,她意味深长的问我,你知道女儿红这酒名的来历吗?我说不知道。她说,古时候,穷人家的父亲会在女儿出生的那一天,把一坛白酒用红色的布包好藏在地窖里,等女儿长大出嫁那一天会拿出来,送给出嫁的女儿和女婿。所以,她不后悔,并安慰我她爱我,这是迟早的事情。那天我暗暗下定决心,一定一辈子对她好。 (三) 后来,有了第一次以后,我就经常在她那里过夜了,只不过我们隐藏的很好,公司没人知道我们的关系,我因为工作表现好,工资从六千涨到一万。后来,闲聊时,她和我说她哥哥对她的好,她虽然恨她的父母,但是她觉得她的哥哥挺可怜的,她想嫁给我,但希望我给她家 20 万的彩礼,她哥哥也可以拿着这笔钱娶老婆,她哥哥比她大五岁,她父母很着急,由于她哥哥学历不高没什么文化,又没啥手艺,生活过的很一般,年纪比较大了,家庭状况也不好,所以还没找到老婆,所以她父母压着她希望她在她哥哥的经济上照顾,她想着从小哥哥就照顾她,所以希望能帮哥哥一把。我当时听了这个话,不知道如何回答。20 万的彩礼对我来说,有点多,差不多相当于我现在快两年多的工资收入。我也是农村家庭,父母辛辛苦苦供我上大学。现在毕业了,父母年纪也大了,还有三万多的助学贷款没还完。 我带她回了趟老家,父母很满意,非常开心。在家里催婚的状况下,我尝试着和她沟通过很多次,能不能彩礼钱少一点,结婚本身也要花钱的,她似乎并不想让步。我不敢告诉我的父母,不想让他们本来很开心的心情泼一盆冷水。我很爱她,但是她的这个条件我确实有点为难。甚至有时候,我在想,本来好好的一场可以开花结果的恋爱,怎么感觉有种卖女儿的感觉? 另外还有件事,让我一直耿耿于怀,群主你不要笑(画外音:群主尽量忍住)。有次和她 XXOO 的时候,正在做的时候,她说她哥真的需要一个老婆,我有这方面的生理需求,她哥哥也有的。所以,她希望我能答应她的请求,她想和我过一辈子,但是希望我能理解下她,同意她的要求。我当时听了这话,像吃了苍蝇,立马没兴趣 XO 了。 这个月,她提出来双方父母见个面,希望我们可以定下来,可是我现在很纠结:我不想和她分手,我爱她,而且她的第一次给了我,但是我又不能满足她的彩礼要求。我不敢想这些事,现在上班也没心思。群主作为过来人和各位读者,能给我点建议吗?

January 11, 2021

我是如何年薪五十万的

我是如何年薪五十万的 以下经历希望对广大程序员同行有点启发。 1 我姓方,码农一枚,14 年硕士毕业于某 211 学校,哎,这里就不提母校了。人到中年,还没混出什么名堂,就不给学校丢脸了。经常很多人问我现在的收入多少,这个嘛,男人的收入就和女人的身高一样是个秘密。不过,今天姑且聊一聊这个话题。 2 我的第一家公司做 Windows C/C++ 开发,第二家公司做 Linux C++ 开发,第三家公司是某大型互联网公司,以 C++ 技术专家的加入,同时从事 C++ 和 Java 开发。我大学学的非计算机专业,非科班出身的劣势就是参加大厂的校招时,筛选简历那一关直接给你 pass 掉了,这也是我毕业时未通过校招去大厂的原因之一。之所以走到今天靠的是自己的兴趣加上一些运气,当然也离不开很多人的帮助。大学时早年自学 Web ,熟悉 html 5 标准前的各类前端开发技术和 PS 等软件,后痴迷 Flash 编程,做过很多 Flash 动画自娱自乐,2011 年大学毕业时先后在上海一家开发 Flash 整站和一家做网页游戏公司任 Flash 程序员,第一家公司实习工资 1500,第二家公司正式员工月薪 3000。许多年后,我和第二家公司的 Flash 主程再聚首时,他告诉我其实我当时作为一名应届生 3000 的工资并不低,当时他作为项目负责人工资也才 8000。当然,据他说,经过这么多年后,在经历了几次创业失败后他也回归于平淡,在张江一家做游戏的公司安安心心地上班。 3 我的大学后半段时间,真的非常痴迷于 Flash,那个时候觉得 Flash 就是整个人生的意义,并为此写过很多轻狂的话,像什么“你 flash一下子,我爱你一辈子,真像个傻子”、“让我们高举 Flash 伟大旗帜,紧密地团结在以 Adobe 为核心的富媒体公司周围,紧随乔纳森.盖伊的脚步,不舍昼夜的编程,把我国的 RIA 事业全面推向现代化!” 那个时候,坐五个小时的火车来上海,就为去上海书城买一本全英文版的《Flash 编程精髓》,甚至为了一份 flash 开发的工作差点儿放弃读研究生。时过境迁,八年后的今天,浏览器原生支持很多以前仅能通过 flash 实现的技术和效果,Adobe 公司宣布不再更新 flash,各个浏览器逐步禁用乃至不再支持 flash。真是让人唏嘘不已啊。 大四正式离校的前一天晚上在逛蓝色理想站点时,发现有人在一篇帖子上推荐《Windows 程序设计》(第五版)这本书,看了下目录,果断购买,听说过这本书的读者应该知道,这本书一百多块钱,老厚了。这本书可谓是改变我整个人生轨迹的一本书吧,这本书介绍了 Windows 操作系统上程序运行的原理,直接利用操作系统提供的 API 进行编程。愈看这本书,我愈喜欢,它介绍了很多操作系统层面的原理,从前很多在 flash 平台不明白的东西一下子变得清晰起来,从前很多 flash 平台提供的类库不知道该如何使用一下子明白了为什么要那么设计了,后面又陆陆续续地看了《Windows 核心编程》等书。整个人更意识到对底层原理和计算机基础科学的掌握的重要性。于是等到硕士毕业时,我可以去一些公家单位从事地质相关的工作,去互联网业务做前端开发(也包括 flash 开发),但是我还是很倔强啊,薪资高低和工作地点并不是我考虑的因为,我就要做 Windows C++ 开发。当年非 flash 不嫁,如今却非要嫁给另外一个人。哎,人这辈子啊,真的可能会爱上很多人,工作、兴趣亦如是。 4 让我们来复盘一下这段经历,整个学生生涯,大学期间学的是 web 开发和 flash 编程,硕士期间学的是 Windows C++,并针对性地补充很多计算机科学的基础知识,也看了不少“闲杂知识”,如汇编、逆向、安全工程等等,当然都是自学。人的经历是有限的,自学的太多其他东西,很可能让你的专业课就变得一塌糊涂。我也是这样,所以,我特别理解 CSDN 上那位叫 moreWindows 的前辈在读研期间的痛苦,好几次想辍学去做开发。但是,作为过来人,我也想劝来者:如果你有机会读研一定去读个研究生,哪怕是自费或者非全日制的,你现在不明白,会有明白的一天,我们大多数人都不是命运的幸运儿,所以有时候学历还是有点用的。 前期学习 Web 开发技术,让我对 html、javascript、CSS 等非常熟悉,而且我读了非常多的 web 方面的经典书籍,也熟悉 web 标准,那个时候讲究的是三层分离(即表现层、样式层和行为层要分离),加上后来又学习了 web 后端开发技术(主要是 php),我的水平具备开发一个商业的 web 整站的水平。这段经历,让我熟悉了很多计算机和软件开发的一些基础理论和设计原则,如 URL、相对路径等概念。...

January 11, 2021

我的 2019

我的 2019 2019 年就这么悄无声息的过去了,我并不是一个喜欢缅怀过去的人,很多人喜欢回忆过去经历的困难,但就我倒是认为如果过去的苦难不能对将来生活质量或者人生经验有帮助,那这些苦难其实相当于白挨了。 从学生时代开始,每年在年末时都会总结一下过去的一年,给自己复盘,总结一下过去一年的得失。成年人的生活没有谁是容易的,而成年人的工作和交往大多数都是逐利的,只是有些是直接的,有些是间接的。当然,这也无可厚非,大家的目的虽然功利却也高尚,都希望给自己和家人或者爱的人提供更好的生活质量。 工作 先来说说我的工作吧。我是一名地地道道的程序员。我于 2018 年 12 月底从携程旅行网离职,应朋友邀请一起合伙创业,投资人是一知名大佬,创业的项目是基于区块链的期货交易系统,项目从 2018 年年底开始启动,从零开始开发,于 2019 年 8 月份正式全球上线,8 月后开始优化和重构部分框架。 整个交易系统分为场上系统和场下系统,场上系统是交易系统的核心系统,一共有多个服务,从功能上有下单服务、清算服务、撮合服务、条件单服务、K 线服务和行情推送服务,场下系统为交易非核心系统,包括指数服务、管理系统等。使用的开发语言是 Java 和 C++,行情服务使用的是 C++,其他所有服务使用的是 Java,另外我们的客户端有 Web 端和手机端(安卓和 ios)。服务与服务之间使用 Kafka 作为消息中间件,数据存储和查询使用 mysql 和 ElasticSearch。交易核心系统开发要求比较高,无论是对性能还是代码的质量的要求比较高,交易系统非核心部分,例如管理系统,由于只是给内部运营团队使用,要求不高做的相对来说粗糙一些,其技术原理也比较简单(各种对数据库进行增删改查的 RESTFUL 接口),但由于功能比较多,工作量也比较大。除了这些技术栈外,还用到了 zookeeper、consul、Prometheus 等。 互联网时代市场动态和风口转瞬即逝,因此我们需要尽快把产品做出来。从立项之初,我们自己公司技术人员加上我一共有 3 位,另外一位是邀请我的朋友,还有一位是我从携程"忽悠”过来的一位玩的比较好的同事。为了加快开发进度,加上起初我们对部分业务不是很熟悉或者经验不足,我们花了大约四百万在上海找了一个专门做交易系统的外包团队,外包团队负责主要开发,我们负责 review 代码和把控整体开发进度。原来外包团队承诺我们的是,项目可以在五月份完成,但是由于外包团队本身的质量问题导致后来我们不得不强力干预,甚至完全自己接手。由于外包团队中开发人员的素养问题以及外包团队的 leader 的管理和待遇问题,导致我们直到五月初还看不到一个可以走通基本流程的产品。于是后来我们的策略做了调整,与外包团队所在的公司进行了沟通,吸纳了外包团队中部分还不错的开发人员,对于无法达到我们要求的开发人员停止合作,最终我接手了条件单、撮合服务、K 线服务、行情推送服务等 4 个核心服务的开发,其中行情推送服务使用的是 C++,目前的人员配置中了,只有我同时拥有 C++ 和 Java 技术栈,因此只能我来接手行情推送服务。 其实从我们与外包团队的合作的刚开始的两个月后,我们就觉得行情服务外包团队在预定的工期内无法完成,因此在那个时候我就被安排开始接手这个服务的开发,起初他们给我的一套程序是他们根据之前做过的一个股票服务的行情代码精简来的一个空架子,加上他们的代码有大量我们不需要的无用功能,加上其通信协议与我们的业务并不完全契合,在我花了一周时间熟悉后,我一边在原来的老的上面开发,另外有自己重新设计了一套,经过大家的试用后完全采用了我新的设计。由于 C++ 是我的技术专长,在行情服务基本开发完毕后,八月份上线后到目前没有出现任何问题,所以基本未做过任何的修改。这样为我腾出大量的时间去集中精力去开发和优化条件单、撮合和 K 线服务。 先来说撮合服务吧。在大多数交易系统中,撮合服务是非常核心的一轮。所谓撮合,即根据一定的交易规则(常见的规则是时间优先、价格优先),将用户的报单进行成交,产生成交等相关信息,如果不能成交,则成为市场上的挂单。最初负责这个服务的外包同事,哎,但是由于其工作态度和代码素养问题,写出来的代码真的是"惨不忍睹"。我们与外包团队约定的要求是,撮合服务必须至少达到每秒可以处理 3000 ~ 5000 笔报单的性能。但是其交付后我们测试发现,每秒三百到五百的速度都达不到。但是这个事情的结果在我们整个公司,包括 CEO 都引起来非常大的恐慌。项目上线在即,如果按这个速度,我们的系统注定是个失败的产品。于是后来,CEO 给外包团队的领导施压,强行把这么同事给"撵走"了,并由我来接手,当然压力也落在我的身上,我记得我最初接手的那几周内,CEO 每天跑我工位上来问我撮合现在最新的进展怎样,有时候一天可能会跑两次。我在阅读其撮合代码的过程中,发现这个代码的质量非常差。当然造成撮合效率如此之低有两个主要原因:一是他使用的一个链表去存储所有用户的报单,这样的话,改单或者撤单,寻找某个订单时需要遍历这个链表,当订单数量多的时候,这个过程会很慢。哎,数据结构和算法不用心学的开发人员,真是贻害无穷啊。二是他往 Kafka 中写数据时使用了 Future 接口的 get 方法,熟悉 Java 的同学可能知道,这个是需要等待的,也就是说每往 Kafka 发一次数据都要等待结果返回。这种同步的做法,让整个撮合系统对报单的吞吐量变得很低。于是,在全公司上下尤其是 CEO 的"密切"注视下,我花了大概三个月时间基本重写了撮合服务的所有业务逻辑,而这个外包同事已经做这个做了半年了。 剩下的是条件单服务,所谓条件单就是用户发起的、根据一定规则(例如某个价格指数达到一定值时)才会产生的报单。这个服务也是上文中开发撮合服务的外包同事做的,条件单和撮合服务存在同样的问题,我也重写了全部的业务逻辑,但是由于时间来不及,18 年 8 月份我们上线时由于还没重构完成,我们第一次没有上线这个功能,第一次上线后的一周后我们上线了这个功能。 剩下的就是不太重要的 K 线服务了,K 线服务本身业务并不复杂,但是数据量非常大,原来是外包团队的另外一位同事开发的。原来我们的注意力并没有在这个上面有特别多的关注,主要是其比较简单。但是某天公司的产品同事,在群里发了几张关于我们生产环境的 K 线服务的图,结果某些大周期的 K 线数据竟然和小周期的 K 线数据竟然对不上,我当时真的是无语了。于是我又被安排维护 K 线服务,K 线服务的代码质量其实还是不错的,只不过一些核心的算法竟然不对,例如计算从某天到某天之间有多少小时,这都能算错,而且如果自己稍微验证一下就很容易发现问题。 上面说的四个服务,除了行情推送服务由于早期就使用我开发的版本因此对我来说,很轻松,大家也很放心,但是撮合、条件单和 K 线这三个服务让我承受了很大的压力。我没预料到的是,一个外包团队的某些开发人员开发水平能不靠谱到如此程度,而且还是工作多年的程序员。好在一切都过来了,项目也成功上线了。后来,我们陆续招聘了前端开发人员、测试团队、补齐了自己的产品团队和运营团队,后来我们又招了客服团队。 由于项目任务比较多,我们采用的是 996 模式,但是在 2018 年上半年,我基本上在晚上 12 点之前是没回去过的。当然,我并不认为工作时间与实际的产出会成正比,在团队扩大的过程中也暴露了很多的问题,有我自己的,也有 CEO 和团队其他一些负责人的。有的时候,我其实挺想和 CEO 说让大家每周多休息一天,但是看到当前的现状,我最终还是没开口。...

January 11, 2021

我面试后端开发经理的经历

我面试后端开发经理的经历 我去年12月份从上一家公司离职,一直到今年3月份,基本上都在面试中度过来的。 先交代下背景:坐标上海,做技术开发,我本人面试的职位是linux服务器开发,最倾向的职位是服务器开发主程或技术经理。我本人也是上几家公司的面试官,因为接下来几年面临着成家,技术上也到了瓶颈期,虽然拿了不少offer,但是想综合比对一下,于是就参加了很多的面试。我先后去了如下一些公司:腾讯、百度、饿了么、爱奇艺、360、携程网、京东、华为、bilibili、上海黄金交易所、东方财富网、zilliz、掌门集团(做无线万能钥匙的那一家)、喜马拉雅听书、峰果网络、华尔街新闻、万得财经、汇正财经、逗屋网络、朝阳永续,还有数家小规模的公司或创业公司吧。 为了避免引起不必要的纠纷,下面我就不说具体的公司名称了。技术面试的细节我尽量写的详细一点,希望对大家有参考价值,技术面试大致有三种情形: 经验分享 一、以百度、爱奇艺等为代表的,以数据结构和算法为主。 首先是简单地了解下你之前的工作经历和项目经验,然后就是算法和数据结构题目,具体涉及到以下内容: 01 快速排序 快速排序(包括算法步骤、平均算法复杂度、最好和最坏的情形),有人说校招要把算法写出来,我是社招,所以描述一下算法步骤即可。 02 二分查找算法 写二分查找算法,这个尽管是社招,但是一般也不难,所以要求面试者写出来。但是很多公司,比如不会直接让你写算法,而是结合一个具体场景来提问,然后让你自己联想到二分查找,比如求一个数的平方根。 03 链表 链表,常见的面试题有写一个链表中删除一个节点的算法、单链表倒转、两个链表找相交的部分,这个一般必须得完全无误的情况下写出来。 04 自己实现一些基础的函数 自己实现一些基础的函数,例如strcpy / memcpy / memmov / atoi,同样的道理,这些必须完全无误且高效地写出来,比如你的实现中会动态分配堆内存,那么这道题目就算答错。 第3点和第4点的门道一般在于考察你的代码风格、对边界条件的处理,比如判断指针是否为空,千万不要故意不考虑这种情形,即使你知道也不行,只要你不写,一般面试官就认为你的思路不周详,容错率低;再比如,单链表的倒转,最后的返回值肯定是倒转后的链表头结点,这样才能引用一个链表,这些都是面试官想考虑的重点。 05 哈希表 哈希表,对哈希表的细节要求很高,比如哈希表的冲突检测、哈希函数常用实现、算法复杂度;比如百度二面就让我写一个哈希表插入元素算法,元素类型是任意类型。 06 AVL树和B树的概念、细节 AVL树和B树的概念、细节,比如会问mysql数据库的索引的实现原理,基本上就等于问你B树了。 07 红黑树 红黑树,这个基本上必问的一个数据结构,包括红黑树的概念、平均算法复杂度、最好最坏情况下的算法复杂度、、左右旋转、颜色变换。面试官常见的算法套路有:你熟悉C++的stl吗?你说熟悉,ok,stl的map用过吧?用过,ok,那map是如何实现的?红黑树,ok,那什么是红黑树?这样提问红黑树就开始了。Java的也类似。 二、以饿了么、bilibli、喜马拉雅、360、携程等为代表的,兼顾算法数据结构和其他开发技术。 算法和数据结构部分上文提过了,下面提一下其他技术,大致包括以下东西: 01 基础的C++问题 以C++语言为例(不是C++开发的朋友可以跳过这一点),第一类是基础的C++问题,常见的有C++的继承体系中virtual关键字的作用(如继承关系中析构函数为什么要申明成virtual函数,如果不申明为virtual会有什么影响)、在涉及到父子类时构造与析构函数的执行顺序、多重继承时类的成员列表在地址空间的排列;static关键字的作用,static_cast / reinterpret_cast / dynamic_cast等几个转换符的使用场景;问的最多的就是虚表的布局,尤其是菱形继承(B和C继承A,D继承B和C)时每个对象的空间结构分布,比如问D有几份虚表,D中B和C的成员空间排布。 另外,如果你应聘的职位使用C++开发,很多公司会问你一些C++11的东西(或者问boost库,基本上都一样),这个你用过就用过,没有用过就说没用过不要装X,常见的C++11需要掌握的一些技术库我也列举一下吧(JAVA及其他语言的读者可以忽略): auto关键字、for-each循环、右值及移动构造函数 + std::forward + std::move + stl容器新增的emplace_back()方法、std::thread库、std::chrono库、智能指针系列(std::shared_ptr/std::unique_ptr/std::weak_ptr)(智能指针的实现原理一定要知道,最好是自己实现过)、线程库std::thread+线程同步技术库std::mutex/std::condition_variable/std::lock_guard等、lamda表达式(JAVA中现在也常常考察lamda表达式的作用)、std::bind/std::function库、其他的就是一些关键字的用法(override、final、delete),还有就是一些细节如可以像JAVA一样在类成员变量定义处给出初始化值。 02 网络通信问题 网络通信问题,比如协议栈的层级关系,三次握手和四次挥手的【细节】,注意我说的是细节,比如CLOSE_WAIT和TIME_WAIT状态(bilibili问了这样一个问题,你可以感受一下:A与B建立了正常连接后,从未相互发过数据,这个时候B突然机器重启,问A此时的tcp状态处于什么状态?如何消除服务器程序中的这个状态? 万得问过流量拥塞和控制机制、腾讯问过tcp和ip包头常见有哪些字段),阻塞和非阻塞socket在send、recv函数上的行为表现,异步connect函数的写法,select函数的用法,epoll与select的区别,基本上只要问到epoll,必问epoll的水平模式和边缘模式的区别;一些socket选项的用法,nagle / keepalive / linger等选项的区别;tcp / udp的区别和适用场景;通信协议如何设计避免粘包;http协议的get和post方法的区别(问的比较深的会让你画出http协议的格式,参照这篇文章中关于http协议格式的讲解:http://blog.csdn.net/analogous_love/article/details/72540130);windows用户可能会问到完成端口模型(IOCP),网络通信方面的问题,我专门开了一个知乎live系统地总结了一下,有兴趣的朋友可以看这里:https://www.zhihu.com/lives/922110858308485120 和 这里:https://www.zhihu.com/lives/902113324999778304。 总之,网络通信问题能搞的多清楚就可以搞的多清楚,最起码把tcp应用层的各种socket API的用法细节搞清楚。 03 操作系统原理性的东西 比如linux下elf文件的节结构,映射到进程地址空间后,分别对应哪些段,相关的问题还有,全局变量、静态存储在进程地址空间的哪里;堆和栈的区别,栈的结构,栈的细节一点要搞的特别清楚,因为一些对技术要求比较高的公司会问的比较深入,例如京东的一面是让我先写一个从1加到100的求和函数,然后让我写出这个函数的汇编代码(JAVA开发的同学可能会让你试着去写一点JVM的指令),如果你对栈的结构(如函数参数入栈顺序、函数局部变量在栈中的布局、栈帧指针和栈顶指针的位置)不熟悉的话,这题目就无法答对了;栈的问题,可能会以常见的函数调用方式来提问,常见的函数调用有如下__cdecl/__stdcall/__thiscall/__fastcall的区别,比如像printf这样具有不定参数的函数为什么不能使用__stdcall;还有就是进程和线程的联系与区别,问的最多的就是线程之间的一些同步技术,如互斥体、信号量、条件变量等(Windows上还有事件、临界区等),这些东西你必须熟悉到具体的API函数使用的层面上来,从另外一个角度来说,这是咱们实际工作中编码最常用的东西,如果你连这个都不能熟练使用,那么你肯定不是一个合格的开发者;这类问题还可以引申为什么是死锁、如何避免死锁;进程之间通信的常用技术也需要掌握,常用的通信方式(linux下)有共享内存、匿名和具名管道、socket、消息队列等等,管道和socket是两个必须深入掌握的考察点(与上面网络通信有点重复);linux系统下可能还会问什么是daemon进程,如何产生daemo进程,什么是僵尸进程,僵尸进程如何产生和消除(bilibili问过)。 CAS机制(饿了么二面问过)。 04 使用过的开源技术 第四类就是一个使用过的开源技术,比如代表nosql技术的redis;网络库libevent等等;数据库如mysql的一些东西。这个一般不做硬性要求,但是这里必须强调的就是redis,熟练使用redis甚至研究过redis源码,现在一般是做后台开发的技术标配或者说不可缺少的部分,基于redis的面试题既可以聊算法与数据结构,也可以聊网络框架等等一类东西。我面试的公司中基本上百分之九十以上都问到了redis,只是深浅不一而已,比如喜马拉雅问了redis的数据存储结构、rehash;bilibili问了redis的事务与集群。 三、只问一些做过的业务或者项目经验。 这类公司他们招人其实对技术要求不高(资深及主管级开发除外),只要你过往的项目与当前应聘职位匹配,可以过来直接上手干活就可以了,当然薪资也就不会给很多。比如游戏公司会关心你是否有某某类型的游戏开发经验、股票类公司会关心你是否有过证券或者交易系统的开发经验等。我的经验就是这类公司,能去的话可以去,不能去的话就当积累面试经验。业务开发哪里都能找到,真正的重视技术的公司,应该是广大做技术尤其是初中级开发的朋友应该值得关心的事情。 不靠谱型公司。 我遇到的大致有四类: 01 装X忽悠型 第一类:装X忽悠型 面试过程冗长繁琐,比如号称每一百份简历中才发一个面试邀请,号称每一百个面试者发一个offer,号称硅谷风格,我面试的有一家公司就是这个样子,先是一轮长长的电话面试,然后是五轮技术面试,前三轮是刷leetcode上原题,然后后几轮面试,面试官从基本的操作系统的中断、GDT、LDT、分表分页机制问到上层高并发海量数据的架构,说的不好听,真是从外太空聊到内子宫,最后问具体职位做什么时,要么遮遮掩掩要么原型毕露;或者讨论薪资时,要么面露难色要么各种画饼,但是实际就给不了多少薪水的。 02 佛性公司 第二类:佛性公司 面试下来,全程面试官面带微笑,问你的问题你回答的面试官也很赞同,但最后你就没通过,我猜测要么公司不是很缺人,想观望一下是否有合适的人才;要么招聘信息上开的薪资给不到。 03 老奶奶裹脚布型公司 第三类:老奶奶裹脚布型公司 其特点是面试周期长,往往第一轮面试通知你过了,让你回去等上十天半个月后,给你打电话通知你来第二轮面试,面试要求穿正装,带好各种证件,面试前必须先查验你的身份证、学历证学位证,甚至是四六级考试证等等,麻烦至极,即使你一路过关斩将过了终面,薪资也给不了多少。大家都是要养家糊口的,都是忙着找工作,谁有时间和你耗上十天半个月呢? 04 不尊重人类型公司 第四类:不尊重人类型公司 我这里说的不尊重人,不是指的是面试过程中对你人身攻击,而是不根据你的工作年限和经验随意安排面试官,举个例子,比如你工作十年,你去面试一个技术总监的职位,对方公司安排一个工作不满两年的部门职员作为面试官,这个面试官如果是走过场可以理解,但是非要和你纠结一个如二进制位移、现代编译器要不要在子类析构函数前加virtual关键字这些技术细节就没必要了。还有一类就是故意问一些刁钻的问题,或者全场都心不在焉、玩手机、漫不经心的面试官,比如问你tcp协议头有多少个字段,每个字段是干啥的。遇到这一类面试官我的经验就是要么婉拒,要么直接怼回去。 注意细节 下面再说下面试中需要注意的一些细节: 01 把目光放长远一点 第一,如果你的工作年限不长,尤其是渴望在技术方面有一定的造诣,那么你首先考虑的应该是新的单位是否能有利于你技术上的成长,而不是两份同样的工作,薪资上的上下相差的三五千、五六千。如果想转行的同学(比如从客户端转服务器,从C++转JAVA),不要因为薪资突然变低而拒绝这种阵痛,要把目光放长远一点。 02 可能最终会因为薪资达不到不被录取...

January 11, 2021