笔者毕业于华中科技大学软件工程专业,在互联网摸爬滚打8年,一直从事后端开发工作,目前就职于 Shopee 供应链自营快递业务方向。在校招面试官的角色上,接触过的应届生近百人。受邀分享面试的经验技巧,借此机会总结对求职道路的一些心得。首先围绕「业务方向」、「工作方向」、「发展平台」三个方面,对工作选择的影响因素进行解释,其次着重给出「面试准备」的相关建议,希望对工作“小白”们有所帮助。
虽然个人认为第一份工作主要以个人能力培养为主,对业务方向的侧重会弱一些,但是在允许的情况下,第一份工作便能选择自己所喜欢的业务方向,能更早地积累对应的业务知识,少走一些弯路。
现在软件行业比较火的电商、物流、支付、金融、保险等业务方向,都是不错的选择。Shopee 这家公司可以说集“爆款”于一身,面向东南亚、拉丁美洲等市场,做量身定制的本土化电商。在提供买卖家购物交易体验的同时,延伸了多元的丰富场景,例如自建物流渠道 Shopee Logistics Service、自营快递 Shopee Express、电子钱包 ShopeePay 等。还有诸如本地生活、数字银行等业务,这里就不详细展开了。
相比业务方向能够及时转型,那么“陪伴”时间更长的当然是工作方向,也就是岗位的选择。因为软件开发是一种更偏向工程项目的工作,需要很多不同职责的角色,共同合作解决问题以实现目标。随着软件行业的快速发展,工作方向也越分越细,但无论是互联网还是传统行业里的软件开发,工作方向基本都分为产品、前端、移动端、后端、测试、运维、大数据、算法等。每个方向的工作职责完全不同,发展轨迹和技能需求差别巨大,所以求职准备的第一步就是明确好自己的发展方向,再有重点地做知识储备。
以后端开发为例,后端开发的工作主要涉到:需求分析、系统设计、功能实现、测试跟进、系统上线等。
为了完成以上基本工作,需要后端至少拥有以下基本技能:
第一份工作尤为重要,不仅仅是积累基本的技术能力,更重要的是个人软素质的养成,尤其以工作习惯最为重要。已经养成的工作习惯,在未来的职业生涯中是很难改变的,好的工作习惯可以让个人职业生涯走的更远。
大多数的小公司,由于人力资源所限,大多数人都身兼数职,没有过多的精力去系统地培养应届生,新人更多靠自学来提升能力,也就是通常说的野蛮生长。而相对成熟的公司,会有比较完善的新人培养体系,无论是基础技术能力还是软技能。同时用规章制度来指引新人的工作流程,以此来培养好的工作习惯。另外,会有更多的机会去接触复杂的业务场景,积累解决问题的能力。
以 Shopee 为例,在新人培养方面,为校招生量身定制了入职培训,叫作“虾米计划”。全程都有1V1导师带教,帮助大家顺利度过从“学校人”到“职场人”的转变。在工作规范上,Shopee 每个项目组都会有 Leader 和导师跟进新人每个需求的评审、方案设计、开发、自测、Code Review、测试、上线整个流程,让新人养成谋定而后动的良好工作习惯。
在公司业务上,Shopee 属于互联网大热的电商行业,且每年保持着强劲的业务增长,各种各样高并发、大数据、分布式等复杂的业务场景,为职场人提供加速成长的养料。
以我所在的供应链团队为例,做个简单场景的展示:
海量数据:千万级别的日订单带来的海量数据的存储、查询问题
大数据&算法:物流各个环节的成本优化(仓储、物流资源组合、快递分拣、运力资源调配等)
复杂业务:分段运输、多段订单、运单正向逆向(退货)等各种业务场景。
接下来便是大家最关注的面试准备了,依据个人经验,我会列一些作为面试官会考察的方向。
代码一:
func lengthOfLongestSubstring(s string) int {
m := map[byte]int{}
n := len(s)
rk, ans := -1, 0
for i := 0; i < n; i++ {
if i != 0 {
delete(m, s[i-1])
}
for rk + 1 < n && m[s[rk+1]] == 0 {
m[s[rk+1]]++
rk++
}
if ans < rk - i + 1 {
ans = rk - i + 1
}
}
return ans
}代码二:
func lengthOfLongestSubstring(input string) int {
// 记录已经出现的字符
existCharacters := map[byte]int{}
inputLength := len(input)
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rightIndex, ans := -1, 0
for leftIndex := 0; leftIndex < inputLength; leftIndex++ {
if leftIndex != 0 {
// 左指针向右移动一格,在已出现的字符集合中移除该字符
delete(existCharacters, input[leftIndex-1])
}
for rightIndex+1 < inputLength && existCharacters[input[rightIndex+1]] == 0 {
// 右指针右移
existCharacters[input[rightIndex+1]]++
rightIndex++
}
// 第 leftIndex 到 rightIndex 个字符是一个最长的无重复字符子串
ans = max(ans, rightIndex-leftIndex+1)
}
return ans
}
func max(x, y int) int {
if x < y {
return y
}
return x
}
明显第二段代码的可读性高于第一段,通常代码的可读性都是通过一些注释、变量命名、方法命名、代码组织等编码习惯来提升代码可读性。
因为很多题解都是单纯的解决问题,并没有过多的考虑可读性,我们在刷题的时候,可以考虑将题解里的方案,按照自己的理解进行重写(调整代码组织、修改变量命名以及增加注释等),这样不仅在面试中,能交出来比其他人更优质的答案,而且也能加快理解速度,比死记硬背的效果要好很多。
除此之外,编程题所要考察的,不仅仅是候选人在数据结构和算法上的积累,还考察:
虽然都说编程题存在知之为知之、不知为不知的情况,但是遇到没刷过的题,可以先整理思路,与面试官交流、讨论可行性,再将可行的思路写出来,也会给面试官留下很好的印象,甚至成为加分项。
软素质
尽管软素质不会有专项问题,但是一些表现会直接影响面试结果,例如:
互联网多元化且高速发展,与其他行业最大的不同便是它的热门业务时刻在变化,从高速发展初期的电商、社交,到近几年大热的直播、短视频等,互联网会应当时情况衍生出对应的热门行业。再加上相对其他行业较高的薪资水平和相对公平的竞争环境,吸引着越来越多的人涌入其中。作为互联网中核心的软件开发人才,在各个公司拓展新业务的道路上不可或缺的资源。虽然越来越多的人才涌入这个行业带来了更大的就业压力,但是开发岗位的面试相对更纯粹,竞争更公平,面试官的主观因素对面试结果的影响较小,只要不断提升技术能力,就会有更大的机会找到心仪的工作。
当前 Shopee 春招已经结束,同学们可以在6月左右关注23届的提前批、秋招机会,还会释放大量的研发岗位。相较后端、算法这类竞争激烈的岗位而言,前端、测试、SRE 显然是更易“上岸”的选择,不妨利用秋招开始前的空窗期,针对性地着手准备。至于社招机会,Shopee 一直在做很多招聘动作,尤其是3-5月的乘风季专题,北京、上海、深圳三地都上线了丰富的专场活动、热招岗位,具体信息大家可以在官方招聘号「Shopee虾皮招聘」进行了解。