程序员这一行,专科毕业,如何混到‘985’同等的待遇呢?,小白必看

160 阅读14分钟

  • 一面

一面大概持续了半个多小时。面试官最开始就让我介绍我最闪光/特质的地方,上来就把我弄懵了,因为只准备过自我介绍。跟面试官说等我想两分钟后,我就开始说了,切入点就是我学习能力强,而且学的好;我主动说我本科是学的武器,花了接近两年的课余时间准备考研考上了南大,准备考研期间自学了计算机四大专业课和附属课程,在研究生阶段也学的很好之类的;面试官表示满意。

然后就问算法题了,问的是一道经典算法题,两个字符串大数相加,这道题是LeetCode原题,所以很快就写出来了。然后面试官扩展问如果是小数该怎么修改算法,我说把数的整数部分和小数部分分开处理,照之前的算法分别相加并处理完小数向整数进位问题后再拼起来,面试官表示赞同。

然后问我对于小数还有没有别的方法,我说还可以直接把小数当整数对待,相加完成之后算出小数点的位置,再插入到字符串中就好了,面试官让我写出来,我就很快在纸上写出来了。紧接着面试官让我想想可以设计哪些测试用例来检查算法正确性,我写了几个测试用例。

再然后面试官问了我一个概率题,掷一个骰子n次,每次掷完骰子后,可以选择立即停止、以当前骰子的值作为结果,或忽略当前骰子的值,继续掷骰子,问用什么策略可以得到最大的数。

这题我就犯难了,因为之前想过类似的问题还把自己绕进去了,这次也马上就把自己绕进去了而且越想越迷糊,最后干脆说每次掷的超过3就立即停止,不超过就继续掷;面试官马上就举例子说假设一共可以掷9次,掷第1次的时候就掷到了4,那应该立即停止吗?我答不上来。

面试官提示了我两三次后说应该考虑后面还会掷多少次,我就明白不应该看前面掷的情况,应该根据后面还有多少次没有掷来计算后面掷骰子会超过当前值的概率,概率大于50%就应该继续掷,随后写出了计算概率的公式。面试官对我的这个答案表示赞同,随后他补充说还可以用动态规划的思想来看。最后面试官跟我说我太紧张了,需要放松。

  • 二面

二面差不多也是半个多小时。面试官最开始让我介绍了我做的项目,对我的科研项目很感兴趣,多问了一些,但没有深入。随后开始做算法题,主题是二叉搜索树,问了我搜索的时间复杂度,让我在纸上举例各种情况下(最好、平均、最坏)的时间复杂度,然后让我分析如何在二叉搜索树中寻找仅小于指定结点的结点(就是中序遍历的前驱结点),于是就跟面试官讨论了不同树的形状下如何寻找前驱结点,然后面试官让我写出这个算法。

我想了想其实中序遍历就能搞定,于是默不作声写了个非递归逆中序遍历,然后给面试官看,并解释了原理;然而这并不是面试官想要的结果,面试官希望我通过结点父子关系来寻找前驱结点,而非遍历的方式。我想了一下,然后跟面试官说,这样每个节点就必须有一个parent指针指向其父结点,面试官说可以有parent指针。

然后我就顺着之前讨论的各种情况一一写出了寻找前驱结点的方法。面试官看了我写的代码表示赞同,但跟我说其实我的代码还可以精简,其实就是两种情况不断向上遍历判断。然后面试官让我设计测试用例,来检查我写的算法的正确性,我很快写了几个。然后让我再之后面试官简单问了我如斐波拉起数列的问题,就愉快结束面试了。

  • 三面

三面也差不多半个小时。三面面试官也是先让我介绍项目,我介绍了我的科研项目,他问了一些性能参数后,问我有没有考虑到手机耗电问题,我说没有,主要因为这个领域都不做这个,他就谈了谈他对耗电的看法,我表示赞同。

然后面试官问我前两轮面试有没有问英语,我答没有,面试官就说从现在开始我们用英文交流,所以接下来全程英语了。然后就是做算法题了,不同于前两轮面试是在纸上写,这次直接在墙上的白板写了。问的是LeetCode上的原题——判断镜像二叉树(LeetCode 101),这题我早有准备。

首先画了个镜像二叉树跟面试官确认了我没有理解错题意,然后就很顺畅地开始写了,一口气写完之后就让面试官来检查了。面试官首先问为什么我的传入参数是用a和b表示两个树的,我答为了简单起见,然后面试官说可不可以用left和right来表示两个树(递归结构,这里指左子树和右子树),我答不可以,因为第一个参数不一定一直是left、第二个参数也不一定一直是right,如果用left和right反而会让人误解,面试官表示赞同。

然后面试官让我设计测试用例,我写出了七八种测试用例,面试官看了后说其实我漏掉了最重要的一种测试用例,我想不通,于是问面试官是哪种,面试官说我写的测试用例都是来检查算法不正确的情况,而测试用例最先应该检查的是算法正确的情况,即正常的测试用例,我说这确实是我没想到。然后三面也结束了。

  • 四面

四面就是部门大佬了,一共持续了大概四十分钟。最开始还是让我介绍我的科研项目,他表示很感兴趣,还让我介绍一些系统中的一些细节,于是我就在墙上白板上用整个板面画了我设计的系统的整个流程和一些细节,中间穿插着面试官的问题。然后就进入正题开始做算法题,也是LeetCode上的原题——通配符匹配(LeetCode 44),看到面试官出这题我惊出一身冷汗,因为前一天复习的时候就见过这题,然而没有做出来,而且因为这是一道Hard难度的题,我觉得面试不会问,也就没有去找答案做出来,然而就这么遇到这题了。

于是我就主动跟面试官说这题我前一天晚上还见过,但我没有做出来,这题的最优解法应该是动态规划,但我不会;面试官回答说现在是不是很后悔当时没有看这题,没关系现在再好好想想,争取做出来。然后我就在白板前站着想了好几分钟,万幸的是总算想出来了,用递归来做,然后慢吞吞写出了代码。然后给面试官看,还逐行解释了算法工作过程,面试官说挺好的,这不是做出来了么。然后就是写测试用例了,吸取了三面的教训,这次测试用例很快就写出来了。这样就结束了四面。

四面结束后回到会议室,问HR什么时候能出面试结果,HR说等差不多十分钟就有结果了。于是坐在那等,然后有HR叫我,出去跟我说我的面试情况挺好的,现在在hirable list中,大概等两周就可能有是否发offer的决定。然后我就愉快回学校了。

但是等微软offer的日子是漫长的,在HR连续跳票两次后总算接到了offer电话。惊喜的是我拿到了微软的sp,并且今年苏州微软的薪资待遇较往年也有较大提升。

五、谁说学历及一切

学历,确实是一个敲门砖,我们没有这个敲门砖会辛苦很多,但是可以努力提升自己,学历不行,有学历要求的公司,自己实在想去,可以一边工作,一边自考提升学历,万物都有解决办法,就看你愿不愿意去做。我是以专科渣校进入的一个小公司,可是我没有放弃,因为我瞄准了讯飞一个不大不小的公司。在这个小公司工作花了2年,在这期间一直没有松懈过,一边工作一边自考。

一次就考上了本科成功拿到了讯飞Offer。于是我再次把目标定在了微软,花了3年时间一边考研究生,一边准备下一次机会的来临,功夫不负有心人。终于我还是做到了,一个专科生到研究生,一个小厂到所有程序员梦寐以求的微软我的“逆袭”花了整整5年,尽管很辛苦,很孤独可是我还是做到了不是吗?

最后,送一句话给大家,哪些打不倒我们的困难,终将使我们变得更加强大!

六、五年期间我的学习笔记分享

我自己做Android开发已经是第5个年头了,在毕业后的第二年,有幸加入到字节跳动这个大家庭。在字节的4年,见证了太多人的来来去去,印象很深一个同事,跳槽阿里薪资直接double,但也看到很多人镀着“大厂”的金四处碰壁,终究还是倒在了技术上!

我自己或许也算是个成功的例子,在4年的时间里从1-1做到了2-2,当然,这背后的“辛酸泪”就留到日后再说。总的来说,归功于自己不断地学习,复盘总结,提升技术!以下分享一下我4年来具体的学习路线及笔记文档,希望能帮助到有心提升技术的朋友!

  • 架构师筑基必备技能

目前Android APP开发主流语言就是Java语言,Java语言最大的特性就是提高了软件的交互可能性,可以说安卓手机几乎所有应用程序都是利用Java语言来进行编写的。

知识要点:

1、深入理解Java泛型

2、注解深入浅出

3、并发编程

4、数据传输与序列化

5、Java虚拟机原理

6、高效IO

架构师筑基必备技能

  • 设计思想解读开源框架

随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。

所以,当今的Android移动开发,不会热修复、插件化、组件化,80%以上的面试都过不了。

知识要点:

**1、热修复设计

2、插件化框架设计

3、组件化框架设计

4、图片加载框架

5、网络访问框架设计

6、RXJava响应式编程框架设计**

设计思想解读开源框架

  • 360°全方位性能调优

在不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。

另外,随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍。综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。

1、设计思想与代码质量优化

2、程序性能优化

  • 启动速度与执行效率优化
  • 布局检测与优化
  • 内存优化
  • 耗电优化
  • 网络传输与数据储存优化
  • APK大小优化

3、开发效率优化

  • 分布式版本控制系统Git
  • 自动化构建系统Gradle

4、项目实战

  • 启动速度
  • 流畅度
  • 抖音在APK包大小资源优化的实践
  • 优酷响应式布局技术全解析
  • 网络优化
  • 手机淘宝双十一性能优化项目揭秘
  • 高德APP全链路源码依赖分析
  • 彻底干掉OOM的实战经验分享
  • 微信Android终端内存优化实践

360°全方位性能调优

  • Android框架体系架构

Android框架体系架构(高级UI+FrameWork源码) 这块知识是现今使用者最多的,我们称之Android2013~2016年的技术。

Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码熟悉而又陌生:熟悉的是几乎天天在和它们打交道, 天天在复制这些代码 ;陌生的是虽然天天和这些代码打交道,但是并没有深入研究过这些代码的原理,代码深处的内涵。

本篇知识要点:

**1、高级UI晋升

2、Android内核组件

3、大型项目必备IPC

4、数据持久与序列化

5、Framework内核解析**

Android框架体系架构

  • NDK模块开发(音视频系列)

NDK(Native Development Kit缩写)一种基于原生程序接口的软件开发工具包,可以让您在 Android 应用中利用 C 和 C++ 代码的工具。通过此工具开发的程序直接在本地运行,而不是虚拟机。

在Android中,NDK是一系列工具的集合,主要用于扩展Android SDK。NDK提供了一系列的工具可以帮助开发者快速的开发C或C++的动态库,并能自动将so和Java应用一起打包成apk。

本篇知识要点:

**1、NDK开发之C/C++入门

2、JNI模块开发

3、Linux编程

4、底层图片处理

5、音视频开发

6、机器学习**

NDK模块开发

资源分享

  • 最新大厂面试专题

这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

  • 对应导图的Android高级工程师进阶系统学习视频 最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!

下载方法:点赞+关注后 点击【Android高级工程师进阶学习】即可领取!