MoreRSS

site iconAnZhihe | 安志合修改

国学和传统文化爱好者,IT行业从业者,运维和SRE。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

AnZhihe | 安志合的 RSS 预览

Linux系统下查看硬盘转速

2025-03-06 17:20:48


1740661422600414.png


在Linux系统中,了解硬盘的转速对于评估系统性能和进行硬件优化具有重要意义,硬盘转速通常以每分钟转数(RPM, Revolutions Per Minute)来衡量,是影响数据传输速度的关键因素之一。以下是不同转速硬盘(包括7200rpm、10000rpm和15000rpm)在关键性能指标上的对比表:

硬盘转速 读写速度 平均寻道时间 数据传输率 故障率 适用场景
7200rpm 中等 较长 较低 较高 一般办公、家庭娱乐
10000rpm 较快 较短 较高 中等 企业级应用、轻量级数据库
15000rpm 极快 极短 极高 较低 高性能计算、数据中心、虚拟化环境

使用hdparm命令查看硬盘转速

hdparm是一个常用的硬盘参数设置工具,可以用于显示硬盘的各种信息,包括转速,以下是使用hdparm命令查看硬盘转速的方法:

1、安装hdparm

大多数Linux发行版默认都安装了hdparm,如果没有安装,可以使用以下命令进行安装:

   sudo apt-get install hdparm  # Debian/Ubuntu系统
   sudo yum install hdparm      # CentOS/RHEL系统

2、查看硬盘转速

使用以下命令查看硬盘的转速:

   sudo hdparm -I /dev/sda | grep Rotation

/dev/sda是你要查看的硬盘设备路径,根据实际情况替换为相应的设备名称,如果你要查看的设备是/dev/sdb,则命令为:

   sudo hdparm -I /dev/sdb | grep Rotation

3、输出结果解释

命令执行后,会输出类似如下的信息:

   Nominal media rotation rate: 7200

这里的7200表示硬盘的转速为7200 RPM。如果是固态硬盘(SSD),输出可能是 Rotation Rate: Solid State Device。

使用smartctl命令查看硬盘转速

smartctl是一个用于读取硬盘S.M.A.R.T.(Self-Monitoring, Analysis and Reporting Technology)信息的工具,也可以用于查看硬盘的转速,以下是使用smartctl命令查看硬盘转速的方法:

1、安装smartmontools

smartctlsmartmontools软件包的一部分,首先需要安装这个软件包:

   sudo apt-get install smartmontools  # Debian/Ubuntu系统
   sudo yum install smartmontools      # CentOS/RHEL系统

2、查看硬盘转速

使用以下命令查看硬盘的转速:

   sudo smartctl -a /dev/sda | grep Rotation

同样,将/dev/sda替换为你实际要查看的设备名称。

3、输出结果解释

命令执行后,会输出类似如下的信息:

   Rotation Rate: 7200 rpm

这里的7200 rpm表示硬盘的转速为7200 RPM。

其他方法

除了上述两种常用方法外,还有其他一些方法可以查看硬盘的转速或相关信息:

使用lsblk命令:虽然lsblk不会直接显示硬盘转速,但它可以提供硬盘的型号和供应商信息,根据这些信息可以进一步查找硬盘的转速。

  lsblk -d -o NAME,ROTA

ROTA 列显示设备是否为旋转设备(1 表示机械硬盘,0 表示固态硬盘)。

查看sys文件系统:通过查看/sys文件系统中的相应设备文件,可以获取硬盘是否为旋转设备的信息。

  cat /sys/block/sda/queue/rotational

如果输出为1,则表示该设备是旋转设备;如果输出为0,则表示该设备是固态硬盘。

在Linux系统中,有多种方法可以查看硬盘的转速,其中最常用的是hdparmsmartctl命令,这些命令不仅可以显示硬盘的转速,还可以提供其他有用的硬盘信息,帮助用户更好地了解和管理自己的硬件设备,选择合适的方法并根据实际需求进行操作,可以有效地提升系统性能和稳定性。


参考:

程序员面试攻略(四):实力才是王中王

2025-03-05 09:21:30

之前的《程序员练级攻略》系列文章,对于面试成功与否是非常重要的,但是因为内容太多,所以,你可能会迷失。这里,我再补充一下相关的知识。

对于后端程序员来说,C、C++ 和 Java 是一定要学好的,TCP 网络和 Linux 系统编程也是需要学好的。《练级攻略》中那些资料如果你能全部吃透和掌握的话(也就是“编程语言”和“系统知识”这两个章节),那么,中国的所有公司你都可以进,包括 BAT,职位可以面到一级的高级工程师。年薪至少 30 万左右。

如果你要更为底层的话,那么需要掌握高手篇中的“Linux 系统、内存和网络”、“异步 I/O”、“Lock-Free”,以及“Java 的底层知识”,把里面的那些资料都看懂学透,那么,你可以面过年薪 50 万的职位。这是没有问题的。

如果你要往架构师方面发展,一方面你需要有足够多的经验,以及相关的项目实施经验,这需要在相当的大公司里做过相应的项目和架构。再辅助以高手篇中的分布式架构的三篇:入门、经典图书和论文、工程设计,以及微服务和容器化这些内容,我保证你至少可以拿到年薪 60 万以上的工作。

前端的东西如果要学习好的话,并不难。攻略中也有三篇和前端相关的文章,那三篇文章学习个 3-5 年,你也是一个非常厉害的前端工程师了,能找到 30 万 - 50 万的工作应该没什么问题。只不过,如果你还想更好的话,你需要走两个方向,一个是设计(不是软件设计,而是 UI/UX 设计),另一个是后端架构技术。

你一定要明白,真正解决用户的问题的不是前端技术,而且是后端的业务逻辑和数据计算。前端并不是计算机的本质,计算机提升社会运作效率并不是靠前端完成的,而是靠自动化来完成的,前端只是辅助。

另外,如果你今天还在做支持性的工作,那么你要赶快转到有产出性的工作上去,不然的话,你未来也危险了。比如像测试、运维、项目管理等,这些都是支持性的工作。我个人建议你转到开发工作上,比如开发测试工具,开发运维系统和工具,开发项目管理软件……只有到了开发上,你才会有更好的发展空间。

多唠叨一句,学习不要图快,要学会找到掌握知识的方法,而不是死记硬背。学习要细嚼慢咽,一天吃不成个胖子。

面试的训练

对面试来说,比较好的训练就是要经常出去面试,所以还是应该隔三岔五就出去面试一下的。一方面可以攒攒经验值,可以训练一下自己的语言表达能力和应对各种问题的回答。另一方面更重要,可以了解一下目前市场的需求(技术、技能和业务),同时了解一下自己的身价。

我记得以前我在一家公司埋头干了 4 年不问外界的事。有一天,被朋友推荐到某公司,去面了一把。那家公司问我要多少钱,我说,8 千一个月。对方说,你要少了,你这样的能力,市场价至少一万五了(我在当时所在的公司才拿 6 千)。所以,我开始更新简历,面了好些公司,发现我的薪资、岗位以及我的能力,果然与市场价严重不匹配……

你之所以会紧张,会不知所措,会感到不适,会觉得难,大多数情况下是因为你不熟悉这个环境,你对这个环境还很陌生。只要你面得多了,你就会熟悉这个环境,你也就能驾轻就熟了。“老司机”之所以能成为“老司机”,还不是因为经常跟女孩子聊天交谈,时间长了,就成老司机了。

另外,对于语言组织的训练,除了多多与人交流,还有就是你平时需要多看多写,喜欢看书和写作的人通常在语言表达能力方面也不会差,而反之则通常会比较差。所以,写 blog,表达自己的想法是很重要的。

跳槽和升职

有人说,跳槽是升职加薪最好的手段,这么说也有一定道理,因为只有用人单位在竞争你,你的职位和薪资才能提得上去。如果你想靠公司的良心,这是比较难的,除非你非常非常出色。很多人都是会以跳槽来作为升职或加薪的手段的。

我认为,对于一个人来说,适当的跳槽还是很有必要的。有些时候,在一个地方做得再好,也要出去看看外面的世界是什么样的。一方面,有了对比后,你才会更明白自己要什么,另一方面,想把握趋势和行业动态,也需要你跳槽。只是跳槽不宜太频繁,最好不要低于两年换一次,而且最好承前启后,不要有太多的过渡。

如果你想在一家公司内从普通员工升职到公司高管这个可能还是有点难的,所以,通过跳槽的方式来达到这一目标还是可能的。但是,这需要一定的策略。比如,你需要先去世界顶尖公司,在里面做到高级技术人员的级别,甚至可能你先要去读书深造。总之,你需要先进入国外一流公司(比如微软),然后,在里面升 1 或 2 级,然后可以跳到另一家相当的公司(比如谷歌或亚马逊)。

此时,你的简历会非常亮眼了,只要你的级别是高级程序员(对应于亚马逊的 SDE3),你会成为国内各大公司追捧的人才,你回国到 BAT 这样的公司里做个高级管理人员是没有任何问题的。然而,如果你一开始不是去这些顶尖公司,而是直接到 BAT 里做个程序员,我觉得未来能上到中高层的机会不会多。

总之,如果你决定在职场大展宏图的话,那么在年轻的时候,让自己的简历变得越漂亮越好。最好是先去国外,然后在需要职业成长的时候,被国内公司重金请回来,会比直接在国内的公司里发展要好一些。这是我个人觉得比较好的方式。

最重要的事

程序员面试中,最重要的事还是自己技术方面的能力,国内会注重你的项目经验,国外会注重你的基础知识、项目经验、解题思路,以及软件设计能力。所以,要努力提高自己的这些技术技能和见解。

在《程序员练级攻略》这一系列文章中,除了一个大型的地图,以及很多技术的学习资料和资源外,我也给出了很多公司的最佳实践和解题思路。就算你没有实际工作经验,通过思考和研究这些前人的经验,站在巨人的肩膀上,会为你开启更大的舞台。当你去到这些大公司后,就可以把你学习到的这些知识立马用上。

当然,计算机软件开发是一件动手能力很强的事,所以,你需要不断地动手。好在这个世界有开源项目,加入开源项目会比加入一个公司的门槛要低得多。你完全可以到开源项目中攒经验,这可能会比在工作中攒到的经验更多。

总之,我想说的是,要应付并通过面试并不难,但是,千万不要应付你的人生,你学技术不是用来面试的,它至少来说是你谋生的技能,要尊重自己的谋生技能,说不定,哪天你还要用这些技能造福社会、改变世界的。

小结

总结一下今天的内容。《程序员练级攻略》系列文章,对于面试成功与否是非常重要的,但内容太多,所以在本文一开始,我总结概述了其中的重点内容,方便你能提纲挈领地掌握关键知识点。

随后,我强调要想取得良好的面试效果,也是需要多加练习的,隔三岔五就出去面试一下,积累面试经验的同时,也了解一下市场行情。然后探讨一个有些敏感的话题“跳槽和加薪”,我认为,先去国外,然后在需要职业成长的时候,被国内公司重金请回来,会比直接在国内的公司里发展要好一些。

最后分享的是程序员面试过程中最重要的事:技术能力,国内会注重你的项目经验,国外会注重你的基础知识、项目经验、解题思路,以及软件设计能力。所以,要努力提高自己的技术技能和见解。但是你要记住,学技术不是用来面试的,它只是你谋生的技能,要尊重自己的谋生技能。

来源:《左耳听风专栏:程序员面试攻略》

K8s集群性能测试

2025-02-28 16:10:28

Kubernetes 集群的性能测试是确保集群在高负载下稳定运行的重要步骤。KubemarkClusterLoader2 是 Kubernetes 社区提供的两个重要工具,专门用于模拟大规模集群负载和性能测试。以下是它们的详细介绍和使用方法:

1. Kubemark

概述

Kubemark 是 Kubernetes 的一个性能测试工具,用于模拟大规模 Kubernetes 集群。它通过创建“空心节点”(Hollow Nodes)来模拟真实的节点,而不需要实际的物理资源。这些空心节点会模拟 Kubelet 的行为,但不会真正运行 Pod。

使用场景

  • 测试 Kubernetes 控制平面(如 API Server、Controller Manager、Scheduler)在大规模集群下的性能。

  • 验证集群的扩展性和稳定性。

  • 避免使用大量物理资源进行性能测试。

工作原理

  1. 空心节点:Kubemark 创建虚拟节点(Hollow Nodes),这些节点不会运行实际的 Pod,但会模拟 Kubelet 的行为。

  2. 控制平面:实际的 Kubernetes 控制平面(API Server、Controller Manager、Scheduler)会与这些空心节点交互。

  3. 负载生成:通过工具(如 ClusterLoader2)在空心节点上生成负载,测试控制平面的性能。

使用步骤

1、部署 Kubemark 集群

    • 在现有的 Kubernetes 集群中部署 Kubemark。

    • 使用 Kubemark 的配置文件创建空心节点。

    • 例如:

    kubectl apply -f kubemark-config.yaml

    2、运行性能测试

      • 使用 ClusterLoader2 或其他工具在 Kubemark 集群上生成负载。

      • 例如:

      ./clusterloader --kubeconfig=/path/to/kubeconfig --testconfig=/path/to/test-config.yaml

      3、监控和收集指标

        • 使用 Prometheus、Grafana 等工具监控控制平面的性能指标(如 API Server 的请求延迟、CPU 和内存使用率等)。


        2. ClusterLoader2

        概述

        ClusterLoader2 是 Kubernetes 的另一个性能测试工具,用于在集群中生成负载并测量性能。它可以模拟多种工作负载场景,例如创建大量 Pod、Service、Deployment 等,并测量集群的响应时间和资源使用情况。

        使用场景

        • 测试 Kubernetes 集群在大规模负载下的性能。

        • 验证集群的扩展性和稳定性。

        • 测量集群的资源使用情况(如 CPU、内存、网络等)。

        核心功能

        • 负载生成:支持创建 Pod、Service、Deployment、StatefulSet 等资源。

        • 性能测量:测量集群的启动时间、调度延迟、API 响应时间等。

        • 可扩展性:通过配置文件定义测试场景,支持自定义负载模式。

        使用步骤

        1. 安装 ClusterLoader2

        • 从 Kubernetes 源码中构建 ClusterLoader2:

        cd kubernetes/test/kubemark
        go build -o clusterloader2 ./clusterloader.go
      1. 准备测试配置文件

        • 创建一个 YAML 配置文件,定义测试场景。例如:

        namespace:
          number: 10
        deployments:
          number: 100
          template: |
            apiVersion: apps/v1
            kind: Deployment
            metadata:
              name: test-deployment
            spec:
              replicas: 10
              template:
                spec:
                  containers:
                  - name: nginx
                    image: nginx
      2. 运行性能测试

        • 使用 ClusterLoader2 运行测试:

        ./clusterloader2 --kubeconfig=/path/to/kubeconfig --testconfig=/path/to/test-config.yaml
      3. 分析测试结果

        • ClusterLoader2 会输出测试结果,包括资源创建时间、API 响应时间等。

        • 可以使用 Prometheus 和 Grafana 进一步分析集群的性能指标。


        3. Kubemark + ClusterLoader2 结合使用

        Kubemark 和 ClusterLoader2 通常结合使用,以模拟大规模集群的性能测试:

        1. 部署 Kubemark 集群:创建空心节点,模拟大规模集群。

        2. 使用 ClusterLoader2 生成负载:在 Kubemark 集群上运行性能测试。

        3. 监控和分析:使用监控工具收集和分析性能数据。


        4. 性能测试的关键指标

        在使用 Kubemark 和 ClusterLoader2 进行性能测试时,需要关注以下关键指标:

        • API Server 延迟:API 请求的响应时间。

        • 调度延迟:Pod 从创建到被调度的时间。

        • 资源使用率:控制平面组件(如 API Server、Controller Manager、Scheduler)的 CPU 和内存使用情况。

        • Pod 启动时间:Pod 从调度到运行的时间。

        • 网络性能:Service 和 Pod 之间的网络延迟和吞吐量。


        5. 注意事项

        • 资源需求:Kubemark 虽然可以模拟大规模集群,但仍需要一定的资源来运行控制平面和空心节点。

        • 测试环境:尽量在与生产环境相似的配置下进行测试,以确保测试结果的准确性。

        • 监控工具:使用 Prometheus、Grafana 等工具实时监控集群性能。


        6. 总结

        • Kubemark:用于模拟大规模 Kubernetes 集群,测试控制平面的性能。

        • ClusterLoader2:用于生成负载并测量集群的性能。

        • 结合使用这两个工具,可以全面测试 Kubernetes 集群的扩展性和稳定性。


        《寒窑赋》

        2025-02-27 08:18:10

        hyf.jpeg


        天有不测风云,人有旦夕祸福。蜈蚣百足,行不及蛇;雄鸡两翼,飞不过鸦。马有千里之程,无骑不能自往;人有冲天之志,非运不能自通。


        盖闻:人生在世,富贵不能淫,贫贱不能移。文章盖世,孔子厄于陈邦;武略超群,太公钓于渭水。颜渊命短,殊非凶恶之徒;盗跖年长,岂是善良之辈。尧帝明圣,却生不肖之儿;瞽叟愚顽,反生大孝之子。张良原是布衣,萧何称谓县吏。


        晏子身无五尺,封作齐国宰相;孔明卧居草庐,能作蜀汉军师。楚霸虽雄,败于乌江自刎;汉王虽弱,竟有万里江山。李广有射虎之威,到老无封;冯唐有乘龙之才,一生不遇。韩信未遇之时,无一日三餐,及至遇行,腰悬三尺玉印,一旦时衰,死于阴人之手。


        有先贫而后富,有老壮而少衰。满腹文章,白发竟然不中;才疏学浅,少年及第登科。深院宫娥,运退反为妓妾;风流妓女,时来配作夫人。青春美女,却招愚蠢之夫;俊秀郎君,反配粗丑之妇。


        蛟龙未遇,潜水于鱼鳖之间;君子失时,拱手于小人之下。衣服虽破,常存仪礼之容;面带忧愁,每抱怀安之量。时遭不遇,只宜安贫守份;心若不欺,必然扬眉吐气。


        天不得时,日月无光;地不得时,草木不生;水不得时,风浪不平;人不得时,利运不通。注福注禄,命里已安排定,富贵谁不欲?人若不依根基八字,岂能为卿为相?


        吾昔寓居洛阳,朝求僧餐,暮宿破窑,思衣不可遮其体,思食不可济其饥。上人憎,下人厌,人道我贱,非我不弃也。


        今居朝堂,官至极品,位置三公,身虽鞠躬于一人之下,而列职于千万人之上,有挞百僚之杖,有斩鄙吝之剑,思衣而有罗锦千箱,思食而有珍馐百味,出则壮士执鞭,入则佳人捧觞,上人宠,下人拥。人道我贵,非我之能也,此乃时也、运也、命也。


        嗟呼!人生在世,富贵不可尽用,贫贱不可自欺,听由天地循环,周而复始焉。


        《寒窑赋》作者介绍

          吕蒙正(944或946—1011),北宋大臣。字圣功,洛阳(今属河南省)人。公元977年(宋太宗太平兴国二年)丁丑科状元。授将作监丞,通判升州。再著作郎,入值史馆。公元980年(太平兴国五年),拜左补阙,知制诰。后任参知政事。公元988年(端拱元年),拜为宰相。为人质厚宽简,素有重望,以正道自持,遇事敢言。每论时政,有不允者,必不强力推行。与赵普同在相位,关系极为融洽。公元991年(淳化二年),贬为吏部尚书。两年后复以本官入相。公元995年(至道元年),再度罢相。真宗即位,任命吕蒙正为左仆射。公元1001年(咸平四年),第三次登上相位。后封莱国公,授太子太师。不久,因病辞官,回归故里。卒谥文穆,赠中书令。

            《破窑赋》系吕蒙正之《劝世章》,又称《寒窑赋》。由于受传统观影响太深,有人认为吕蒙正的思想过于保守消极,因此吕蒙正的许多文章典籍都已失落,而在《吕文穆公传》中这首破窑赋被看作是吕蒙正的经典之作。相传当初是为教化太子而作此文的。吕蒙正曾三次入相,兼任太子的老师。当时太子(后来的宋真宗)青春年少,目中无人,没有哪个太师敢当面教训太子。吕蒙正决定写一篇文章,来告诫太子。于是写了这篇《破窑赋》。这篇文章,虽然内容短小,但是却包含了无穷智慧,聪明的太子一下子就懂得其中的道理。据说太子读过此文后,一改常态,常虚心向他人请教。

        程序员面试攻略(三):面试风格

        2025-02-24 15:37:02

        国内公司和国外公司在面试风格上完全不一样,所以,这里我们也需要了解一下不同风格的面试方法,这样有利于你准备。

        说句实话,国内的公司是比较好面的,国外的公司是比较难面的。从职位招聘信息上你就可以看出来,国内的公司包括知名公司更多的是面试在表面上。因为国内公司招的基本上都是马上能来干活的,所以,问的更多的是一些技术知识上的东西。

        准备这些知识性的东西,本质上来说跟准备考试没什么两样,恶补一下相关知识就好了。然后讲一个项目,项目中他们也不怎么追问细节,面试的过程中,也不需要写代码,也不需要解决一个难题,所以,容易蒙混过关。

        国外的知名公司就没有那么容易了,真是全方位的考察,你的表达能力、沟通能力、思维方式、解题思路、代码风格、算法和数据结构、设计和架构能力、解决难题的能力……这是很难靠恶补就可以过关的,没有踏踏实实的沉淀、钻研和思考,你是很难过关的。

        国内公司

        对于在基层干活的程序员来说,国内的公司,小公司不说了,诸如 BAT 这样的公司,基本上来说,都是比较好面的。一般来说,都会问你一些技术知识,比如:Java 语言的一些特性啊,会不会用 Spring 和 Netty 啊,JVM 怎么配置怎么调试啊,并发编程是怎么玩的……

        这些问题基本上来说都是知识性的问题,都是可以 Google 的,通过查手册查文档就可以知道的。所以,这些问题是很容易准备的,只要你老老实实地看几本我在《程序员练级攻略》里推荐的书就好了。当然,还是有很多人连这些基本的问题都回答不上来,这只能怪自己了。

        回答完这些知识性的问题,就是项目经历描述了。你可以随便讲你做过的项目,把这个项目用到的一些技术架构都说清楚就好了,还有怎么上线的,怎么运维的,怎么加班的,怎么苦逼的,怎么带人的,怎么管理项目的。面试官也很少追问技术细节,因为可能面试官自己都不懂(哈哈)。

        只要你按照我前面说的那个讲项目的方式来,面试官一看你用到的技术栈和我这边的很类似,他就开始想要你了。当然,国内的公司更多的是缺劳动力,所以,只要你能让他们感到你很能吃苦耐劳、任劳任愿,而且能很快上手干活就好了。

        然后就是 HR 和老板的面试了,HR 和老板不懂技术,也不会问你技术问题,他们主要是看看你的性格和态度等。只要你表现能吃苦耐劳,踏实肯干,如果还有一点 “ 灵性 “(脑子转得快,与人好沟通,一来一回有问有答,性格外向点儿),在国内的面试你是很容易通过的。

        基本上来说,国内公司喜欢快进快出,也就是说,不在面试上花太多的精力,进来就干活,不行就开掉,基本上是找工人找劳动力的玩法,也不关心员工的成长。所以,面试过程基本上来说,都是围绕你干什么,我这边这些事你会不会干,你会不会加班、能不能吃苦耐劳,听不听话等这样的内容进行的。

        当然,对于架构师或是高级别的技术人员,又是另一种面试方式,这在国内的大公司中得分两种。

        • 一种是业务型部门的高级技术人员,基本上来说,不会再问你一些技术的细节,只会问你一些架构方面、项目管理方面,以及技术方面的事,或者一些业务架构上的事情。相对来说,业务或应用方面的架构师和高级工程师需要对业务和行业比较了解,有丰富的业务项目经验就好了,技术上倒不需要有多深的知识。我觉得,在一个行业呆久了,只要你对业务有思考,再加上有技术把持,基本上来说,只要平时多读一些不错的业务上的想法,还是比较好过的(因为不会问及细节问题)。

        • 另一种是偏技术部门的架构师和高级工程师,比如核心基础技术,或是云计算之类的。那就会问你很多技术细节上的东西了,而且问得还很深,需要你有相应的项目经验,或是开源社区里的工作经验。你需要有过相当的经历才有可能面过。但是,回过头来说,就算是这样的岗位,本质上还是会回到面知识型问题的方法,所以,无非就是你能钻研的知识深一点儿罢了。知识是死的,只要你努力,你总有一天能学会的。

        总体来说,与国外公司相比,国内的公司不管是哪个层级上的面试都是比较好通过的。

        国外公司

        国外的公司我面过的不多,只面过,Amazon、Google、Microsoft、Facebook 这几个大公司,还有一些小公司就不在这里说了。这几个大公司中,Facebook 是相对比较好面的,Google 是相对最难面的。这些公司的面试最近都有改观,不再以算法为主要面试手段了,但还是会多多少少面你算法方面的题目。而且,无论初级还是高级的技术人员的面试都还是有点难的,因为这些公司的招聘标准是要招超过现有团队同等级别 50% 以上的人。这就要求团队成员只能越来越好,最终导致标准越来越高。

        一般来说,会有两轮电话面试,一轮是工程师面写代码,主要是算法相关的代码,然后可能还是工程师再面一轮技术,或是经理电话面一轮,主要想了解一下你目前的工作职责还有你的一些长处和喜好,包括你的一些想法什么的。如果没有什么问题,你就会进入到 in-house 面试。

        in-house 面试一般要面一天,最少 5 轮,3 轮和技术相关(包括代码、算法、设计、架构、Problem solving),1 轮是经理 (包括做过的项目、解决问题的能力、学习能力、思考方式……),1 轮是 HR(包括性格、喜好、薪水……)。老实说,这种车轮战的面试,如果你之前没玩过,是第一次上,那么会非常不习惯。一天面下来,你会累死。当然,习惯了你就会觉得没什么问题,所以还是要多练习。

        国外的公司面试时一定会让你写代码,无论你面多高级的职位,只要是技术岗,基本上都会让你写代码。你千万不要把代码写得跟面条一样,至少要分模块函数,把函数接口定义得清楚点儿,代码逻辑也要简洁清楚(有大量的 if-else 嵌套的一定不是好代码),变量命名也要好一点儿。写代码的过程中如果有觉得不好的要打上 //TODO:refactor me 之类的注释,这样会是一个好的编码习惯。一般写完代码后,面试官会问如下几个问题。

        • 讲解一下你的代码。这主要是跟你一起 Review 代码,一般会考你的表达能力。最好用一到两个 case 来讲解一下代码会更好。

        • 分析一下代码的时间和空间复杂度。

        • 优化代码,包括代码中的 Bug 以及更高性能的算法。

        在这个过程中,面试官除了要答案以外,也会了解你的思维方式或是做事方式。

        注意,有些很有经验的面试官会从一个很简单的编码题开始,然后不断地加需求,或是改需求。一旦你发现这个事的时候,我给你的建议是不要马上实现新的需求,而是停下来,和面试官讨论需求,感觉一下未来可能的需求变化,然后开始重构代码,抽象该抽象的代码,将接口和实现分离,把程序逻辑和业务功能分离。

        这里,你需要使用很多编码技巧甚至一些设计模式。如果你让面试官看到你是在 Case-by-Case 地写代码,那你就完蛋了。基本上来说,如果你平时写代码不是这样的习惯,在这个过程中你是无法装的,你会被搞得原形毕露的。

        在设计和架构中,一般会涉及面向对象方面、数据库设计方面和系统架构方面的内容。系统架构方面的内容问得也很多,基本上都在问一些和高并发、高可用、高性能和大规模分布式相关的架构。但是,在你解题前,你一定要问清楚需求,不要仓促 jump into conclusion。先调研需求,最好再问一下,为什么要做这个需求?做这个需求的意义是什么?

        当你了解完需求后,你还可以挑战一下,如果是这个需求的话,为什么不用另外一种方式或架构?这些问题,都是加分项。搞清楚需求后,你要开始设计系统了。设计系统时,你不要只是拍脑袋,还需要做一点容量计算。如果数据不完整,你直接跟面试官说清楚就好了,有数据上的支持会让你更好地设计好你的架构,而且,这会是非常大的加分项。

        另外,在设计系统时,还要考虑到系统未来的扩展性,也就是未来如果又加入一些别的东西进来,或是量变得很大了,你的系统是否可以容易地进行功能扩展或性能扩展。这个架构问题,如果你没有足够丰富的经验,或是严谨的思考,并不容易做得出来。

        Problem Solving 是一些国外公司尤其是 Amazon 最喜欢面的一个环节了。国外的这些大公司都认为他们要解决的问题是没有人解决过的,所以他们需要的人才也是能解决自己从来没有见过的问题的人。一般来说,面试官会给你一个你从来没有见过的问题,而且是很难的问题,很明显是一个只有工程师才能解的问题。

        比如,用最简单的方式统计一条公路上向两个方向开出的汽车(比如在公路路面上放两个压力传感器什么的),或是让你设计一个自动化的学校排座系统,能够让性格接近的人坐在自己身边等。一般来说,他也不指望你能在一个小时的面试中找到问题的最优解,主要看你的解题思路。另一方面,面试官也会和你一起来解(有可能面试官自己也不知道答案),这样他想感觉一下,和你一起工作,一起解难题是个什么样的体验。

        总之,面试国外的公司不是你在短期就能准备的,尤其是面一些高级别的技术职位,还是比较难的。基本上来说,你脑子要转得快,智商也要比较高,还要在日常受过比较好的软件开发或是工程架构上的训练,平时还要很系统、很工程地做事,用正确且严谨的方式做事。不然,你一定是面不过的。

        小结

        总结一下今天的内容。我认为,国内外公司的面试风格有很大不同。国内的公司是比较好面的,国外的公司相对难面一些。国内公司包括知名公司要招的基本上都是马上能来干活的,所以,面试中问的更多的是一些技术知识上的东西。比较好准备,恶补一下相关知识就好了。不怎么追问细节,也不需要写代码,也不需要解决一个难题,容易蒙混过关。

        国外知名公司则对面试者进行全方位的考察,你的表达能力、沟通能力、思维方式、解题思路、代码风格、算法和数据结构、设计和架构能力、解决难题的能力……这些是很难靠恶补就能过关的。因此,我针对这两种不同的面试风格,给出了相应的面试流程,以及应对技巧。

        来源:《左耳听风专栏:程序员面试攻略》