45 岁程序员,在网上发求职贴:精通各种技术,却没有面试机会

大家好,我是老皮。

11 月 1 日,有网民留言称,“我是一名软件开发人员,今年 45 岁,精通各种技术体系…… 而我辞职回家半年后再回来寻找工作机会的时候,却发现连个面试机会都很难得到。”

其实,这件事,最早的时候我是在微博上看到的,然后顺便评论了一句:

留言者有夸张成分,竟然精通那么多技术,还没找到工作,可能留言者想通过夸奖的叙事来彰显就业年龄限制的问题。

然后在微博上被喷惨了,其实,大家可能没有理解我的意思。

因为怀疑这个人不是程序员,因为他描述的都是精通,什么都精通。所以,有点怀疑,所以,我当时评论的时候已经比较温和了。我即使怀疑他不是程序员,我也只是说留言者的目的就是为了通过对比的手法彰显就业年龄限制和歧视的问题

年龄歧视和限制确实是一个很严重,也很复杂的社会问题,确实值得重视。

从市场的机制来看

这是一个自由竞争的市场,我们能怎么着呢?哪个企业不想招聘便宜又好用的年轻人呢?就相当于我们消费者在市场上购买产品一样,是不是也喜欢货比三家,买那家最便宜的?

从个人的角度来看

话有说回来了,既然年龄大了,技术也能这么牛,为什么还竞争不过年轻人呢?你说不如年轻人体力好,不如年轻人有精力,但是,技术呢?按正常的发展逻辑是工作 10 年的人,应该比工作 3 年的人技术好吧?如果你的技术是企业的必需品,企业肯定不敢辞退你,反而你可能是抢手货。

但是,现实却是,工作 10 年的职场人,可能技术就跟工作 3 年的水平差不多,这时候,就没有优势了

从企业的需求来看

为什么很多企业需要技术不怎么样的年轻人,不需要技术牛逼的中年人呢?原因也很简单:现在企业应用的技术,都很基础,并不需要那么高深的技术,企业做的业务就是普普通通的技术就能做到,你即使做到了很精通,很专深,做到了技术专家,但是,那么高的技术,你在大部分企业,尤其是中小型企业当中,是没用用武之地的,在企业的角度来讲,你的技术是多余的,可称之为:剩余技术劳动力,叫:技术节余

我花高薪聘请剩余技术劳动力,是干这点活,聘请年轻人也是干这点活,价格又不一样,企业肯定是怎么划算怎么来。

换句话来讲,我国的很多 IT 技术企业普遍的技术深度不够,或者说是企业的基础研究创新不够,用不到那么多高深技术的人才。你看美国的工业软件多发达,我们在工业软件方面还受到美国的限制,国内到现在没几个微软、IBM、甲骨文、SAP 这样级别的公司,同类型差距太大

这就会导致大部分公司用不到那些有技术积累的,经验丰富的中年人,所以,这就导致中年人跟年轻人相比唯一的经验和技术都没有优势了,毕竟年轻人那点技术就够用了。

再回到市场供给层面来谈一谈

大家都说企业不要 35 岁以上的人,那么为什么这么多企业还能好好活着呢?那就说明这个市场的年轻人就满足了企业的需求了。

你想一想:如果整个社会一共有 100 家公司,需求是 1000 人,市场提供了 1 万人,包含 6000 年轻人,4000 超过 35 岁的中年人,那这 100 家公司肯定都会去找年轻人,因为年轻人满足了他们的需求,没有技术大佬并不影响公司的生存。

如果你是企业负责人,你会怎么选?

所以,有些事情,并不能单纯怪企业只要年轻人,这个本质的背后最大的问题是供求关系的问题

供大于求的时候,企业就有选择权,当然选择便宜又有精力的年轻人

从国家层面来看,该如何解决?

解决这个问题,最本质的背后是:要从国家层面出发,政府要引导正确的就业供需,保证和调节供需平衡,而不是什么行业火,就全都往这一个行业里钻,这势必就会供大于求,将选择权由企业主导

有的行业是撑得撑死,有的行业是饿的饿死。

另外一个层面就是:当供需关系失衡的时候,国家应该有一种托底的机制,就是可以引导大家通过现在的技术进行一些创新或者培训再就业,引导多余的劳动力积极探索企业就业方向,国家应该有更多的政策支持和优惠 35 岁以上的人再就业和创业,给中年人更多的,更好的就业环境

现在不都是倡导所有的企业上云,积极倡导传统企业进行互联网探索吗,这叫:互联网 + 。那么,像题主这样,技术这么牛的人,是不是政府可以推荐引导这些人进入传统企业,进行互联网 + 的探索呢?如果有这么一个推荐平台,是不是更好?

现在很多传统企业没有自己的研发人员,很多项目都找外包公司,买模板,做系统,干的非常烂,就是因为这些企业当中没有人懂技术。

外包技术公司的盛行,也导致了程序员行业劣币驱逐良币。市场上有太多垃圾的外包公司了,既坑害程序员,有坑害那些想转型的传统企业

从程序员自身层面,应该想办法提升自己的多维竞争力

另外,程序员自身也是,我一再倡导程序员不要仅仅只关注技术,也应该关注行业的变化,趋势,要熟悉公司的各项业务,拓展的眼界,这既有助于你进入管理层,也有助你与转型或者转行

这个问题是全社会的问题,就像是经济的发展需要自由经济这只看不见的手,也需要政府这只看不见的手一样,在就业市场上,也是这样,自由竞争保持活力,供需调节保证人才被充分利用

目前国内环境跟国外不一样,我感觉最大的问题,是我们国家人口多,劳动力多,竞争压力大,国外人少,竞争少,本质上是由供求关系导致这种现象。

当然了,这个问题的背后也说明了一个问题:为什么大家都不愿意生孩子了?可能就是这个原因。

如果国家解决了剩余劳动力再就业,再转型的问题,可能二胎,三胎的问题,都不是问题了。

毕竟生了这么多孩子,都来竞争,压力大,而且生了孩子就没精力了,少生孩子,压力和竞争不就小了,也不浪费精力了,而且,解决不了年龄限制和歧视问题,也没钱生孩子和养活孩子。

好了,最后对此点就只说这么多了,有人选择走技术路线,有人选择走管理路线,有人选择了独立创业,但不论走那方面,自己都永远不需要后悔,因为这是你自己选择的道路,那么它就是对的,最后为大家分享一些Android程序员大厂面试题,有需要答案的可以文末领取

常规面试题

Android面试题

  • ListView 如何缓存的?
  • RecyclerView联系人列表如何实现A-Z快速定位
  • 广播和EventBus的区别
  • 主线程Looper循环为什么没有卡主线程?nativePollOnce
  • SharedPreference的线程安全、进程安全,如何跨进程
  • Android 中实现多线程: threads, Handler, AsyncTask, IntentService
  • Android 中如何实现多进程
  • 自定义View的过程:measure,layout,draw
  • LayoutInflater#inflate 的 attrachToParent true 是什么意思
  • theme 和 style 有什么区别,优先级
  • 有哪些进程间通信方式
  • View 的渲染过程
  • Binder 的原理和优势
  • AIDL 中的 oneway 有什么用,方向标签 in、out、inout 是什么意思
  • Android 中有哪些动画,都说下
  • Serializable 和 Parcelable 的区别
  • 你知道哪些Layout,ConstraintLayout 的特点是什么
  • 手机开发者选项有哪些,不保留活动是什么
  • 基本的数据类型有哪些?
  • String、StringBuilder、StringBuffer的区别?
  • Fragment是什么,使用场景和生命周期
  • 说一下Context和内存泄露
  • 线程创建的方法?
  • Activity的启动模式和适用场景?
  • ViewPager用过吗?然后扯到了它和Fragment联合;

内存泄露和内存溢出说一下

(1)内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

(2)内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。

内存溢出的原因及解决方法

(1)内存溢出原因:
①内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
②集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
③代码中存在死循环或循环产生过多重复的对象实体;
④使用的第三方软件中的BUG;
⑤启动参数内存值设定的过小

(2)内存溢出的解决方案:
①第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
②第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
③第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

垃圾回收机制说一下?

四大组件

  • 当内存不足时Service被杀死了,如何重启这个Service
  • Android系统杀进程时,是怎么考虑进程优先级的?
  • Fragment 的 ViewModel 如何访问到 Activity 的 ViewModel 的数据
  • Activity 4种启动模式说下,各种启动模式适合的应用场景
  • Activity 任务栈从底到顶为 A-B-C,低内存杀死进程后,重新点击,显示哪个?这时如果C里面有Fragment是怎样恢复的?
  • Activity如何传参给Fragment?为什么用setArgument传参,而不是使用带有参数的构造器?
  • window、view 和 Activity 的关系
  • Activity、Fragment 的各个生命周期依次说一下,各个生命周期里面适合做什么
  • Activity 调用 finish 方法后怎么走到 onDestroy 的

图片

  • Glide缓存特点
  • Glide为我们做了哪些内存优化
  • Glide如何加载 GIF
  • ListView 图片错位的原因,解决方案
  • bitmap如何处理大图,30M的大图如何防止OOM?

网络

  • OKHttp 如何实现缓存
  • OKHttp 的超时时间,有考虑DNS超时码
  • OKHttp 线程池、连接池讲下
  • OKHttp 的所有拦截器有哪些,请求失败了重试1、2次怎么做
  • Retrofit实现机制
  • Room注解如何在编译时生成类文件
  • http 和 https 的区别,shakehand的过程说下
  • 状态码400、401,3xx有哪些
  • 网络劫持是什么,应该怎么做
  • TCP三次握手,握手中的网络包各个标记位是多少,四次挥手说一下
  • TCP 发送窗口是什么?
  • 混合开发h5了解多少
  • 浏览器窗口访问一个网址的过程
  • POST 和 GET 有什么区别

优化

  • 内存泄漏分析,LeakCanary的原理,泄漏对象是如何找到引用链的
  • APK瘦身
  • 启动优化
  • 卡顿分析!!
  • ANR分析!!
  • 为什么布局文件中层级越多,性能可能差很多
  • 你有哪些应用性能优化的经验必问
  • ProGuard怎么写

Java

  • 1、Java中==和equals和hashCode的区别
  • 2、int与integer的区别
  • 3、谈谈对java多态的理解
  • 4、String、StringBuffer、StringBuilder区别
  • 5、抽象类和接口区别
  • 6、Serializable 和Parcelable 的区别
  • 7、string 转换成 integer的方式及原理
  • 8、哪些情况下的对象会被垃圾回收机制处理掉?
  • 9、什么是强引用、软引用、弱引用以及虚引用?
  • 10、什么是依赖注入?能说几个依赖注入的库么?
  • 11、静态代理和动态代理的区别,什么场景使用?
  • 12、Java的异常体系
  • 13、JVM的回收算法是怎样的
  • 14、说一下泛型原理,并举例说明
  • 15、能说说HashMap常用操作的底层实现原理吗?
  • 16、垃圾回收机制和调用 System.gc()的区别?
  • 17、说一下你所了解的设计模式有哪些
  • 18、说下java中的线程创建方式,线程池的工作原理。

Kotlin

  • Kotlin协程为什么能以同步代码写出异步逻辑?
  • suspend 函数的工作原理
  • 在协程上定义了一个局部变量,为什么在其中的其他线程里的协程也能访问到?
  • by 的两种场景,by Lazy 的实现
  • object 单例的实现

算法

  • 各种排序算法(冒泡、选择、快排、归并。。。)的时间复杂度,各种查找算法(顺序查-找,二分查找。。。)的时间复杂度
  • LRU 实现(146)参考LinkedHashMap实现的3个方法
  • LFU 缓存(460) 同一频率使用LRU的NodeList,外面套一层{freq to NodeList},NodeList用双链表实现
  • 两数相加(445)
  • 找缺失的数字(268)注意相似题目里有中等
  • 两个队列实现栈(225)
  • 删除子文件夹(1233)
  • 螺旋矩阵打印(54)
  • 用生成随机数1-5(1,2,3,4,5)的方法,得到一个可以生成随机数(1-7)的方法
  • 54张扑克牌,分成3堆,大小王出现在同一堆的概率(排列组合算数题)

Android第三方库源码

1、网络底层框架:OkHttp实现原理
2、OKhttp针对网络层有哪些优化?
3、网络请求缓存处理,okhttp如何处理网络缓存的?
4、从网络加载一个10M的图片,说下注意事项?
5、网络封装框架:Retrofit实现原理
6、响应式编程框架:RxJava实现原理
7、图片加载框架:Glide实现原理
8、Glide如何确定图片加载完毕?
9、Glide内存缓存如何控制大小?
10、加载bitmap过程(怎样保证不产生内存溢出)
11、Android中软引用与弱引用的应用场景。
12、LruCache原理
13、Fresco与Glide的对比:
14、Bitmap如何处理大图,如一张30M的大图,如何预防OOM?
15、事件总线框架EventBus实现原理
16、内存泄漏检测框架:LeakCanary实现原理
17、leakCannary中如何判断一个对象是否被回收?
18、依赖注入框架:ButterKnife实现原理
19、依赖全局管理框架:Dagger2实现原理
20、数据库框架:GreenDao实现原理

性能优化

这个主要结合你所做过的项目问,一般面试官会问你项目做过哪些方面的优化,常见的问法就是:
优化的思路是什么
用到了哪些技术
遇到了哪些困难(问题)
如何解决
有什么心得
主要结合自己项目回答。切记不要自己给自己挖坑,比如没有做过这方面优化,你为了表现自己,说做过,结果面试官往下问回答不出来,这关乎诚信问题,你们懂的~

抽象问题

  • 讲讲做过的项目,有哪些亮点
  • 你自己的亮点在哪里,你的加入可以给团队带来什么
  • 技术规划,怎么发展

设计题

  • 如果让你设计一个音乐播放器,要实现哪些接口
  • 设计一个图片下载库:深挖 Glide,如果图片没有设置有效期,如何保证缓存被更新?

下面统计一些公司的真实面试题

(一)泰科电子面经 高级安卓工程师社招面试题目

1.ContentProvider的权限管理(解答:读写分离,权限控制-精确到表级,URL控制)
2.如何通过广播拦截和abort一条短信?
3.广播是否可以请求网络?
4.广播引起anr的时间限制是多少?
5.计算一个view的嵌套层级
6.Activity栈
7.Android线程有没有上限?
8.线程池有没有上限?
9.ListView重用的是什么?
10.Android为什么引入Parcelable?
11.有没有尝试简化Parcelable的使用?
12.四大组件以及使用方式
13.网络请求
14.get/post请求的区别
15.xml/json的区别以及解析方式
16.谈谈对Handler的理解
17.service的启动方式
18.屏幕适配
19.ArrayList与LinkedList区别
20.Application和Activity的Context对象的区别
21.Android属性动画特性
22.如何导入外部数据库?
23.LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景。
24.谈谈对接口与回调的理解
25.回调的原理
26.写一个回调demo
27.介绍下SurfView
28.RecycleView的使用
29.动态权限适配方案,权限组的概念
30.Android系统为什么会设计ContentProvider?
31.下拉状态栏是不是影响activity的生命周期
32.说说ContentProvider、ContentResolver、ContentObserver之间的关系
33.请描述一下广播BroadcastReceiver的理解
34.广播的分类
35.序列化的作用,以及Android两种序列化的区别
36.Android中PID和UID的区别
37.Binder的理解,以及为什么要用Binder,进程间通信的方式
38.框架搭建选型的注意点
39.第三方SDK应用
40.MVC、MVP设计模式
41.TCP与UDP的区别
42.Dalvik虚拟机方面
43.EventBus实现原理
44.对自定义view的理解
45.详细介绍下自己做过的项目对你的成长最大?哪个的收获最大?
46.你认为一名安卓工程师最重要的特质是什么?你在工作中最终重视的因素是什么?你在工作中是怎么保持持续学习的?

(二)咻电科技 安卓工程师 社招 面试技术题目

1.mvc和mvp的使用场景和优缺点
2.Hashmap实现原理
3.性能优化(一定要具体说出很多方案,比如内存、电量、流量等具体解决方案)
4.单例模式的写法和各种写法的优缺点
5.okHttp、volley、retrofit等网络框架的使用和原理
6.四大图片加载框架的使用和原理
7.如何考虑架构设计
8.自定义View,绘制流程、步骤,
9.事件拦截和分发机制
10.进程间的通信方式
11.应用的创建启动流程
12…Handler是怎么导致内存泄露的
13.设计模式理解问得也多,
14.Binder驱动
15.如果在onStop的时候做了网络请求,onResume的时候怎么恢复?
16.Bitmap使用时候注意什么?
17.Bitmap的recycler()
18. Android中开启摄像头的主要步骤
19. ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
20. 点击事件被拦截,但是想传到下面的View,如何操作?
21. 微信主页面的实现方式
22.微信上消息小红点的原理
23.如何优化自定义View
24.低版本SDK如何实现高版本api?
25.描述一次网络请求的流程
26.HttpUrlConnection和okhttp关系
27.Bitmap对象的理解
28.looper架构
29.Activity上有Dialog的时候按Home键时的生命周期
30. 两个Activity之间跳转时必然会执行的是哪几个方法?
31.前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。
32. ActivityThread,AMS,WMS的工作原理
33.自定义View如何考虑机型适配
34.自定义View的事件
35.AstncTask+HttpClient与AsyncHttpClient有什么区别?
36事件分发中的onTouch和onTouchEvent有什么区别,又该如何使用?

(三)腾讯社招安卓岗面试经历(凉)

1、synchronize用法,volatile用法,两者的区别和场景
2、动态权限适配方案,权限组的概念
3、网络请求缓存处理,okhttp如何处理网络缓存的;图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM
4、进程保活
5、listview图片加载错乱的原理和解决方案,listview是如何做缓存的?
6、https相关,如何验证证书的合法性,https中哪里用了对称加密,哪里用了非对称加密,两者的区别?
7、Android系统为什么会设计ContentProvider,进程共享和线程安全问题
(1)提供一种跨进程数据共享的方式:
由系统来管理ContentProvider的创建、生命周期及访问的线程分配,简化我们在应用间共享数据(进程间通信)的方式。我们只管通过ContentResolver访问ContentProvider所提示的数据接口,而不需要担心它所在进程是启动还是未启动 。
(2)更好的数据访问权限管理:
ContentProvider可以对开发的数据进行权限设置,不同的URI可以对应不同的权限,只有符合权限要求的组件才能访问到ContentProvider的具体操作。
微信的聊天数据在本地都是加密处理的(防止root了被破解),设计一个类似的本地数据存储系统
8、jvm相关和GC回收算法的区别
9、Android相关优化(如内存优化、网络优化、布局优化、电量优化、业务优化)
10、EventBus实现原理和观察者模式在开发中的运用?
11、动态代理模式如何运用?
12、App是如何沙箱化,为什么要这么做?

(四)滴滴社招面试

一面
1、询问项目相关的问题;
2、概述一下****HashMap
答:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
3、hashmap原理说一下;
4、HashMap什么时候进行扩容呢?
答:当HashMap中的元素个数超过数组大小时,就会进行数组扩容。
5、https相关过程说一下;
6、线程安全。synchronized,lock各种原理
7、如何保证通信安全性?
8、如何实现链表数组?
二面
1、项目经历介绍;
2、content-type有哪些值?
3、常见的响应码有哪些?
(1)200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
(2)404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
(3)500:请求资源找到了,但服务器内部出现了错误;
(4)302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
4、UNICODE和utf-8是干什么的,一个中文分别在其中占据多少大小?
5、如何批量发布?
6、应用崩溃了怎么办,如何收集崩溃信息?
7、应用网络不好如何判断?
8、通信如何保证安全?
9、android缓存如何缓存,图片如何缓存,数据如何缓存,缓存机制?**
10、js和android耦合;
11、react native
12、kotlin以及看法;
13、flutter
14、算法题:洗牌不回到原来位置;
三面
1、线程锁的区别;
2、同一个锁为什么效率有差别?
3、多态和重载区别;
(1)多态是建立在重bai写的基础之上的,是类与类du之间的zhi关系,是发生在不同的类之dao间的,子类重写zhuan父类的方法。实现不同的子类,不同的实现形态。多态有3个条件:继承、重写和父类引用指向子类对象
(2)重载则是类的内部的方法构型上的不同,是发生在同一个类里面的。同一个函数名称,参数不同的多个方法,实现同一类型的功能。
4、Hashmap
5、Jni
6、设计模式:观察者模式怎么用?
7、说一下自身的优缺点;
8、你对领导期望是?
9、你对滴滴了解有多少?印象如何?说一下你的看法。

上面社招大部分答案我已经整理好了,需要的可以扫描下方二维码免费领取。

在这里插入图片描述