大三下面试黑历史

preface

其实这是一篇填坑的Blog。怎么说呢,因为最开始是在2013年4月的时候动笔的。但是当时烂尾了,后来各种事就一直没管。然后就一直拖到今天了。。。由于时间跨度太大,导致之前写的一些东西都超过TTL了,不得不重新改。最近感觉比较浮躁(其实一直都是这样好吧),想静下心来写点东西。

Tencent

实习生(4月)

Tencent 实习生招聘,LZ报的是技术运营,有260人参与该职位应聘。乍一看,好像挺多人的样子,其实相对于这次实习生招聘的总面试人数6000+人来说真心不算什么的了。 正如前言,这周的事实在太多,各种项目开发,文档编写都扎堆,所以也没有很好的准备这个笔试。但是其实我本来就觉得,笔试这种东西本来就不需要准备什么,因为虽然都是考试,但是跟我们广义上的考试性质不一样。企业并不想招一个考试帝进去却无法为其创造价值。既然如此,最好就是平常心来应对。话随如此,但是考试毕竟还是要求临场发挥的,因此做一些必要的准备还是很值得的。所谓考前突击,对LZ来不过是心理安慰罢~

说到Tencent的运维笔试题,LZ觉得可以好好总结下。首先,以基础题为主,内容包括计算机组成原理,操作系统(Linux),数据库(Mysql),C程序设计与数据结构,计算机网络,还有一些逻辑分析题。大部分是选择题,最后有3道简答题。经过这次笔试,感觉自己在数据库方面确实是有待提高啊,对于一些概念性的东西,由于没有在实际项目中试验过,印象不够深刻,理解不过透彻,忘了也不奇怪。另外Linux基础知识还是需要不时review一下,即使经常用,但不能只停留在命令层面。

校招(9月)

校招的笔试貌似更简单,主要问题就是数据库的right join,mysql的C/S连接方式,另外还有字节对齐,寄存器等相关方面。至于面试,倒没有太大问题,前面两轮的面试官都非常nice,问的问题都偏向基础,Linux基本知识,网站优化策略,因为LZ也算有点自动化运维经历,在这方面也稍微聊了一下,然后虚拟化方面也聊了一下。我还跟第二个面试官探讨了一下学习技术应该是广度优先还是深度优先的问题。个人感觉吧,大学期间可以广泛涉猎各种不同的技术(特别是学校没有的),对其有一个感性的认识,了解它的特性,如果有感兴趣的话,再深入研究也不迟。我是大三才开始学习Python,相对于之前用过的PHP,Shell script,Java等(才不会黑C/C++呢),真让人眼前一亮啊,其强大的语法和功能,严谨的代码结构,丰富的第三方库,对大多数*nix系统的原生支持,都是非常棒的特性。可惜学校宁可花几个课时教你怎么在Windows上安装jdk和Eclipse,也不会尝试去开一门新的基础语言类课程。sign~(貌似跑题了?

Alibaba

阿里巴巴的面试经历同样有两次,第一次(实习生)笔试直接跪了,略过不表。再次参加阿里的笔试,虽然已经做好了被虐的准备,但还是不得不感叹,还是阿里的试题有技术含量。虽然大部分题目不算难,都是基本概念,但涉及的知识面相当广泛,而且不是单纯的理论知识,还需要一定的实践经验才能回答。这才是好试题啊我去。。。

简单记录一下题目的类型和keyword:

  • 计算机体系结构:反/补码, CPU指令流水线(吞吐量)
  • 概率论,离散数学(矩阵链积,这啥。。) 这一类数学基础考得不少
  • 算法: 贪心(Dijkstra,Prim,kruskal,Floyd),排序(堆排序,时间复杂度,空间复杂度),haffman编码
  • 数据结构:环形队列,stack,二叉树遍历
  • 操作系统:CPU任务调度,内存屏障,自旋锁,信号量,volatile关键字,循环优化(内循环与外循环,缓存命中率)
  • 数据库:ACID
  • Unix编程:利用线程的调度随机性和sleep实现固定长度数组的伪随机输出; select VS epoll
  • 普通编程:长度为N的数组X,只遍历一次,求方差; C++类的使用(Debug); 不使用临时变量交换两个变量的值
  • 实际应用:用户登录淘宝之后,网站如何保持登录状态,如何验证用户的登录和保证其安全性

对于笔试中我不了解,或者不确定的题目,考完以后我都会去找一下相关资料。事实证明,笔试的题目在后来面试的过程中一般都会有提及,所以在这方面有所准备会是个加分项。而且我觉得,考试只是检验知识面的过程,同时基本上都是基础题目,如果有不了解的地方,说明你的知识面出现短板,应该特别注意一下,不需要说十分精通,但是基本概念和操作还是应该会的。

说到面试,这里必须赞一下大阿里的高效,两三天的时间就把技术类的同学都面完而且敲定了最终名单。这比Tencent要好很多。另外要大赞淘宝六一同学,这是我见过最好的面试官(目前为止),没有之一。事情是这样滴,第一轮面试安排我的时间是早上11点,当时刚面完Tencent,直接就过去了。但是貌似有三个相同岗位(System Engineer)的童鞋都安排都同一个时间点了,而且只有一个面试官,所以我等了将近两个小时。到我的时候,面试官(就六一嘛)了解我的情况,然后亲自去拿了一些饼干和水之类的给我(其实可以让HR的小同事去拿的),说一会可以边聊边谈,不用客气哈。其实我已经紧张得感觉不到饿了XD。后来面试的过程十分轻松,六一同学给人的感觉就是非常的和善,就像一个慈祥的长者在和你聊家常,完全没有某些面试官那种咄咄逼人或者不屑一顾的感觉。在技术方面,更多像是在探讨,而不是面试。一个小时,聊的很尽兴。出来的时候阿里管饭了,接着进行二面,然后隔天貌似就发offer了。

NetEase Game

网易游戏是我最喜欢和看好的公司之一。暑假的时候曾经投过NE的实习生,虽然一面跪了,但是NE给我的感觉就是“一间有态度的公司”,不只是新闻的态度,对待员工甚至求职者,也有很好的态度,可以说是我经历过面试安排最合理和周到的公司(也可能是当时人数比较少吧)。而且NE对技术的要求也很高,回忆NE的SA-Dev/Ops一面,是有两个面试官。问题涉及的知识面非常广,包括但不仅限于算法,Linux基础,网络,安全,Unix编程,网络编程等,而且会就简历提到的知识点逐渐深入。现在我依然记得的两个题目,比如说算法题“如何随机输出一个任意长度的数组?如何判断输出足够随机?”,或者聊到科学上网的时候,“如何在Linux CLI上设置全局代理”等等比较实际的问题。由于当时还是很水的,所以整个过程基本上是单方面被虐(何况还有两个面试官+两部macbook车轮战,瀑布汗)。尽管如此,我觉得对我个人的面试/成长经历还是很有意义的。因为是大公司处面,我彻底意识到自己的基础知识有多薄弱,一些不起眼的基础理论缺失往往制约了你往更高层次的发展。同时有些Linux常识,你自认为很熟悉,实际上只是知道怎么用,并没有深入了解背后的原理。或者说看过没有理解,然后很快就忘记了。

拿到阿里offer之后,还是决定去参加NE的校招笔试,就是觉得NE的试题应该会让我从某种自满的状态中醒悟过来–“你仲未够水准啊”龙马君如是说。事实也确实如此,试题考得相当细与广,而且涉及很多实际应用的软件知识和概念(如mongodb,redis,mariadb,memcache等)。如果对比Tencent和ali的试题,Tencent会偏简单基础,ali则有较多理论知识,也偏深。NE的试题虽然也偏深,但是偏向概念和应用,对面试者的知识面和实际操作经验有一定要求。给我印象比较深就是正则的知识考的比较多(awk,sed)。

尽管如此,LZ还是止步NE一面。依然是那两个面试官~颇有意思的是,貌似他们也认得我,然后还问我还记得之前的面试题不,简单回答/分析一下。自我感觉吧答得不太好,一是因为年代久远(半年前),有些细节记不清;二是SA-Dev方向要求确实高点,面试官估计看出来了,经过半年我还是个编程渣渣,毫无长进啊,sigh~

Software-Defined Networking - Note 3

Week 4 - SDN Nuts and Bolts(螺母和螺栓) - Control Plane

===================

Learing objectives:

  • Review how an SDN controller can populate(填充) a switch’s forwarding table.
  • Determine how an SDN controller can be used to control multiple switches in a single network, and why to do so.
  • Gain experience setting up a controller and basic switch environment.
  • Understand the design tradeoffs between some of the more commonly used SDN/OpenFlow controllers. (一些广泛使用的控制器之间的设计抉择)
  • Set up controller in Mininet that can perform basic operations,like switch-table population and firewalling.

Control plane basics

Openflow protocol specification(协议规范) (pic in PPT - P6)

  • OpenFlow controller communicates with switch over Secure channel

    • OF protocol defines msg format
    • controller use control channel to update flow table
    • logic is executed at controller
  • Switch components including:

    • flow tables: perform packet lookup, if matching then take action
      • actions: forward, drop, modify, enqueue
      • flow table format:
 switch| MAC      |Eth |VLAN|IP               |TCP/UDP
 port  |[src][dst]|type|ID  |[src][dst][proto]|[sport][dport]|action
  • secure channel

控制器与OF交换机之间通过SSL连接,使用OF协议进行通信,并在交换机上设置和更新流表。交换机只负责根据流表处理数据包,因此所有的逻辑都在控制器。每个数据包协议头部与所有流表(flow table)一一对比,如果匹配则执行相应的操作,如果所有都不匹配则发送到控制器(controller)。

  • dpctl Control channel
    • switches default port: 6634
    • inspect, modify flow table

Even in the absence of a controller, we can use dpctl to talk to the switch.

Read on →

Software Defined Networking - Note 2

Week 3

Learning Objectives:

  • Discover what network virtualization is and why it is used
  • Identify various ways of implementing virtual networks
  • Explain why Mininet is useful
  • Practice how Mininet works
  • Gain more experience using Mininet, setting up topologies, etc.

Network virtualization

definition: Abstraction of the physical network(物理网络的抽象)

  • support multiple logical networks share a physical substrate(多个逻辑网络共享物理基础设施)
  • container of network services

Aspects of network virtualization(网络虚拟化的应用层面)

  • Nodes: VM
  • Links: Tunnels
  • Storage

Motivation & Goal

  • Flexibility
  • Manageability
  • Scalability
  • Security & Isolation
  • Programmability
  • Heterogeneity(异质性): 支持不同技术

Virtual switch(虚拟交换技术)

Mechanism that taking Ethernet frames inside a VM and passing them to the physical interface, which networking VM together over L2 topology.(通过虚拟交换技术将虚拟机连接到二层网络)

Example: * short-bridge in VINI: extension of Linux bridging(桥接) * Open vSwitch: can be configured remotely with OpenFlow, json

Application of virtual networking

  • Experimental deployments
  • Isolation on shared infrastructure
  • Reuse of resource pool
  • Dynamic scaling
  • Easier management of logical resources

Virtual network in Mininet

Mininet

difiniton: a virtual network environment that can run on a single PC

Mininet VM architecture paradigm(review it in ppt/pdf):

  1. lanuch mininet process(mn)
  2. create subprocesses(/bin/bash) & network namespace in per vhost
  3. create virtual ethernet(veth) pairs and assign to namespace(establish tunnel between virtual interface(VHost) and real interface(local).)
  4. create OpenFlow switch to connect vhosts
  5. create OpenFlow controller to control flow table entries in switch through OpenFlow protocol

Software Defined Networking - Note 1

SDN (Software-Defined Networking) is an approach to computer networking which abstracts the distributed systems, the control plane and the data plane.

                                                    -- from Wikipedia

刚好coursera的SDN课程开在暑假,总算有个课是想上又有时间上了 = =

这里权当是做个笔记。因为本人英语渣,如果不作笔记的话基本上过了没多久就忘得一干二净了(虽然现在也差不多)。

实话说,课程比较抽象,ppt过了第一遍基本上就云里雾里了,很多地方都是知其然不知其所以然。虽然SDN是针对数据中心网络的技术,但是个人觉得网络硬件在这几年来确实没什么重大的革命(菜鸟我没听说过有咯),而现在各大互联网公司都在抢占用户上网入口,也就是路由器。如果SDN走出学术界,在工业界量产的话,那也算的上是网络硬件的革命了。难怪SDN会被称为Computer Network的X86。当然目前离大规模普及还是长路漫漫啊,具体面临的困难这里略去不表…(表不了啊)

以下内容参照 Coursera 的 SDN open course

Read on →

Shadowsocks 源码解释

对于科学上网这种事,我向来一丝不苟。

但本po的主题并不是如何科学上网,而是深入了解proxy背后的原理。

Preface

去年shadowsocks在V2EX刚发布的时候,我就已经开始留意这个项目。当时还在用Goagent,但有时候速度确实不咋的,而且重新配置的话会比较麻烦。9月份入手VPS之后开始折腾PPTP VPN,效果相当不稳定。不久后OpenVPN也开始受到干扰了。看来必须寻找比较小众的方式,避免躺枪。因此,初试shadowsocks(python版),速度或者稳定性都相当好,一直用到现在,未出现过什么问题。配置也很简单,唯一的门槛就是需要国外的Linux 主机(VPS)。现在shadowsocks项目已经发展到多语言跨平台了,社区也比较活跃,主要原因是项目架构简单,代码精简易于维护。

一周前开始学习python,主要是想用python写一个爬虫。大概用了4天的课余时间把 《Dive Into Python3》过了一遍,了解基本语法。结合文档看大牛的源码是很好的学习方式,所谓learn by doing嘛。不得不说,shadowsocks的源码真心简洁,再看一下SOCK5协议的报文格式,并没有花很多时间。貌似说了不少废话,现在入正题= =!

Read on →

First Blood

First Blood

出自ACM/ICPC 形容某道题第一个AC的team称为拿到了该题的 First Blood

一直想测试一下Octopress的使用体验,花了一个晚上折腾Ruby的安装环境和各种各样的奇怪问题,总算是弄好了。

说起来最近折腾了不少东西,比如Sublime Text 2的各种plugins,比如zsh,比如tmux,etc。真心觉得生命在于折腾啊。越来越体会到先进的工具对生产力的影响了。神器如ST2,如果使用得当,绝对是可敌IDE,但是要记得那么多快捷键也不是那么容易啊。vim的话,我也常用,但是只能算入门。大概就是八二原理吧,百分之八十的时间只用到百分之二十的功能。

原来的博客放在Blogspot上面,写po的时候非常不方便,比如不支持markdown,比如代码高亮要添加各种插件,比如被墙(这个才是最重要的)。另外数据导出和备份也是个问题。之前想在VPS上鼓捣wordpress,但是感觉吧,还是不够纯粹,加上WP默认主题太多槽点。Orz 虽然说WP也是有很多可折腾的地方,但是吧我发现如果不通过点什么东西来巩固我的git技能和markdown语法,估计要掉的差不多了 = =

网上关于octopress的教程一陀陀的,我就不重复了。然后比较蛋疼的ST2的中文输入问题一直没有解决,然后vim输入中文感觉灰常怪,所以就gedit先凑合着。突然想起一个比较蛋疼的问题:如果在别的机器上要写blog,那岂不是也要有Ruby的环境?看来要尽快考虑将静态网页生成的工作交由服务器负责了。果然什么都是有利有弊啊,更多优缺点有待发现ing….

其实呢,折腾虽说是由个人喜好决定,但是也不要太过了,码农还是以敲代码为主嘛,只停留在一些应用层面上的东西没什么太大的意思,这也是我不愿意折腾UI的原因…

PS: 原先的Blog在Blogspot由于贴代码太不方便了,而且被墙,应该不会再更新….