前言
“程序员真的干到35岁就干不动了?”
在这个知乎问题下,443个答案为中年码农指明了三条路线:走技术,转治理、本人守业。
实际上,答复投放到广袤的事实,大龄程序员的“求生之路”确实是清晰清朗的,大概率都在这三个方向里。
只是清晰的布局搁置在个体上,学历、家庭、精力、无奈升高冀望阈值都成为制约因素,远没键盘下那么容易。面对提前来到的中年危机,“被高龄”的程序员,有得选,也没得选。无论是一般出身的码农,还是自带光环的大厂程序员,他们都在一直地问本人:
我当前要做什么?我还能做什么?
故事汇
壹
36岁生日这天,小任就业了。
前年,他从华为外包辞职,去了一家守业公司。本想着能撑两年,后果一年不到,资金链断裂,公司开张。
去守业公司时,敌人感觉这个抉择有危险,外包更加稳固,“根本跟事业单位一样。”但也是稳固,让小任感到不安。来华为外包前,小任在一家小型科技公司做了6年。和大部分频繁跳槽的程序员相比,他算定力强的。
小公司团队气氛好,工资待遇也不差,但技术焦虑始终裹挟着他。六年里,他写代码全靠网上自学,“没人通知你写的怎么样。” 他用了一种具象的表白来形容本人的代码程度:“他人去南山,能够中转,我可能要绕到龙岗和福田,再到南山。”
来华为外包,是解决技术焦虑的一根稻草,“做大我的项目,学新技术。”事实是,他在公司过着朝九晚七的生存,偶然新版本须要测试,才须要通宵赶工。“技术一点没学到,就学了一堆办公室政治。”
贰
技术焦虑同样存在30岁的小邹身上。五年前,他进入IT行业,薪资从8500到现在的18000。放在行业里,这个薪资和涨幅都不算太高,五年很多都拿30K了。想拿高工资,就要学更多的技术。
互联网更迭迅速,谋求翻新,对教训传承要求不高,资格在这一行业施展不了太大效用。技术稍一落后,职业倒退或者就会碰壁。小邹那些已经做PC端的同行,现在不知去向何处。程序员是靠技术谈话,糊弄不了人。
他还记得刚进公司时,一个35+的共事被卡在公司大门外,认为是门卡出了问题,去到HR那才被告知被解雇了。彼时,小邹离30岁还有一年,但他意识到,五年后,他或者也会被挡在门外,那时再次踏入人才市场,本人面对的将是另一番现象。
进大厂是小邹的幻想。他每天都会抽空学习编程语言,“但光学实践,没地实际也是白搭。”进大厂就是他眼里的实际,“资源多,平台好。”在外包公司,大多是重复性工作,学了技术也没法利用。如果不是受限于专科学历,小邹决定在技术这一条路走到底,做个技术大牛。但眼下,他能想到的是如何在年后让本人的薪资升到20K。“如果是在大厂,进去抉择也会更多吧。”
叁
“等着被公司干掉”,这是小蒋让我印象最粗浅的一句话。2015年,腾讯位于南山的滨海大厦封顶,分为南北两幢,最多能够包容1.2万名员工办公。也是在这一年,31岁的小蒋进入腾讯,工资一万七,级别T2.3。六年的工夫里,小蒋升到了T10,工资翻了几番。当初项目组19集体,跟他同龄的人只有一个,曾经当上了组长。
在大厂,一个大龄程序员面对的抉择同样狭隘,想要降职,团队的成绩必须足够优良。腾讯履行的是“赛马机制”,每个我的项目都是一条赛道,赛道里七八个团队一起竞争,只有产出足够优良和显眼,能力在“厮杀”中冲出重围。这样的后果,天时地利人和缺一不可,“不确定性很强。”
现在,摆在小蒋眼前最紧急的,不是降职,而是如何让本人的KPI晋升一点。去年开始,小蒋的KPI排名就在部门的末位了。想要让KPI难看,就要承当一些边界性工作,“不是本人干的活也揽了”,或者就是产出高于同组的人,跃升前位。“路子是有,但真没这个精力了。”
怎么学习能力更好的进大厂呢?
无他,就是靠本人的毅力以及信心。一天不行,一个月;一个月不行,一年;有信心的人,啥学历、或者资格,那些都是借口。
不过除了毅力和信心之外,其实学习还是有效率之差的。
互联网时代,其实网上有很多收费学习材料,只有你用点心,也总能找到学习材料。然而,很多时候,效率很重要,网上纵有很多收费音讯,然而一来破费你的工夫,二来本人摸索也会踩不少坑,三是不够零碎。
Android面试外围知识点精讲
对于一位开发者来说,基础知识决定了能走走多远,能做多好,甚至是决定了能挣多少,尤其一些大厂十分重视根底,根底是所有的基本,很多面试时候都是问基础知识,只不过问得比拟深刻,而不只是理解,如果没有当时筹备,很容易被淘汰。整顿了一部分知识点,不便大家温习及坚固常识。
Android:(具体答案解析,点击我的GitHub能够看到全部内容)
1.Activity
- Activity的启动流程
- onSaveInstanceState(),onRestoreInstanceState的掉用机会
- activity的启动模式和应用场景
- Activity A跳转Activity B,再按返回键,生命周期执行的程序
- 横竖屏切换,按home键,按返回键,锁屏与解锁屏幕,跳转通明Activity界面,启动一个 Theme 为 Dialog 的 Activity,弹出Dialog时Activity的生命周期
- onStart 和 onResume、onPause 和 onStop 的区别
- Activity之间传递数据的形式Intent是否有大小限度,如果传递的数据量偏大,有哪些计划
- Activity的onNewIntent()办法什么时候会执行
- 显示启动和隐式启动
- scheme应用场景,协定格局,如何应用
- ANR 的四种场景
- onCreate和onRestoreInstance办法中复原数据时的区别
- activty间传递数据的形式
- 跨App启动Activity的形式,注意事项
- Activity工作栈是什么
- 有哪些Activity罕用的标记位Flags
- Activity的数据是怎么保留的,过程被Kill后,保留的数据怎么复原的
2.Service
- service 的生命周期,两种启动形式的区别
- Service启动流程
- Service与Activity怎么实现通信
- IntentService是什么,IntentService原理,利用场景及其与Service的区别
- Service 的 onStartCommand 办法有几种返回值?各代表什么意思?
- bindService和startService混合应用的生命周期以及怎么敞开
3.BroadcastReceiver
- 播送的分类和应用场景
- 播送的两种注册形式的区别
- 播送发送和接管的原理
- 本地播送和全局播送的区别
4.ContentProvider
- 什么是ContentProvider及其应用
- ContentProvider,ContentResolver,ContentObserver之间的关系
- ContentProvider的实现原理
- ContentProvider的长处
- Uri 是什么
5.Handler
- Handler的实现原理
- 子线程中能不能间接new一个Handler,为什么主线程能够 主线程的Looper第一次调用loop办法,什么时候,哪个类
- Handler导致的内存泄露起因及其解决方案
- 一个线程能够有几个Handler,几个Looper,几个MessageQueue对象
- Message对象创立的形式有哪些 & 区别? Message.obtain()怎么保护音讯池的
- Handler 有哪些发送音讯的办法
- Handler的post与sendMessage的区别和利用场景
- handler postDealy后音讯队列有什么变动,假如先 postDelay 10s, 再postDelay 1s, 怎么解决这2条音讯
- MessageQueue是什么数据结构
- Handler怎么做到的一个线程对应一个Looper,如何保障只有一个MessageQueue,ThreadLocal在Handler机制中的作用
- HandlerThread是什么 & 益处 &原理 & 应用场景
- IdleHandler及其应用场景
- 音讯屏障,同步屏障机制
- 子线程能不能更新UI
- 为什么Android零碎不倡议子线程拜访UI
- Android中为什么主线程不会因为Looper.loop()里的死循环卡死 MessageQueue#next 在没有音讯的时候会阻塞,如何复原?
- Handler音讯机制中,一个looper是如何辨别多个Handler的 当Activity有多个Handler的时候,怎么样辨别以后音讯由哪个Handler解决,解决message的时候怎么晓得是去哪个callback解决的
- Looper.quit/quitSafely的区别
- 通过Handler如何实现线程的切换
- Handler 如何与 Looper 关联的
- Looper 如何与 Thread 关联的
- Looper.loop()源码
- MessageQueue的enqueueMessage()办法如何进行线程同步的
- MessageQueue的next()办法外部原理
- 子线程中是否能够用MainLooper去创立Handler,Looper和Handler是否肯定处于一个线程
- ANR和Handler的分割
6.View绘制
- View绘制流程
- MeasureSpec是什么
- 子View创立MeasureSpec创立规定是什么
- 自定义Viewwrap_content不起作用的起因
- 在Activity中获取某个View的宽高有几种办法
- 为什么onCreate获取不到View的宽高
- View#post与Handler#post的区别
- Android绘制和屏幕刷新机制原理
- Choreography原理
- 什么是双缓冲
- 为什么应用SurfaceView
- 什么是SurfaceView
- View和SurfaceView的区别
- SurfaceView为什么能够间接子线程绘制
- SurfaceView、TextureView、SurfaceTexture、GLSurfaceView
- getWidth()办法和getMeasureWidth()区别
- invalidate() 和 postInvalidate() 的区别
- Requestlayout,onlayout,onDraw,DrawChild区别与分割
- LinearLayout、FrameLayout 和 RelativeLayout 哪个效率高
- LinearLayout的绘制流程
- 自定义 View 的流程和注意事项
- 自定义View如何思考机型适配
- 自定义控件优化计划
- invalidate怎么部分刷新
- View加载流程(setContentView)
7.View事件散发
- View事件散发机制
- view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch办法 三者优先级
- onTouch 和onTouchEvent 的区别
- ACTION_CANCEL什么时候触发
- 事件是先到DecorView还是先到Window
- 点击事件被拦挡,然而想传到上面的View,如何操作
- 如何解决View的事件抵触
- 在 ViewGroup 中的 onTouchEvent 中生产 ACTION_DOWN 事件,ACTION_UP事件是怎么传递
- Activity ViewGroup和View都不生产ACTION_DOWN,那么ACTION_UP事件是怎么传递的
- 同时对父 View 和子 View 设置点击办法,优先响应哪个
- requestDisallowInterceptTouchEvent的调用机会
8.RecycleView
- RecyclerView的多级缓存机制,每一级缓存具体作用是什么,别离在什么场景下会用到哪些缓存
- RecyclerView的滑动回收复用机制
- RecyclerView的刷新回收复用机制
- RecyclerView 为什么要预布局
- ListView 与 RecyclerView区别
- RecyclerView性能优化
9.Viewpager&Fragment
- Fragment的生命周期 & 联合Activity的生命周期
- Activity和Fragment的通信形式, Fragment之间如何进行通信
- 为什么应用Fragment.setArguments(Bundle)传递参数
- FragmentPageAdapter和FragmentStatePageAdapter区别及应用场景
- Fragment懒加载
- ViewPager2与ViewPager区别
- Fragment嵌套问题
10.WebView
- 如何进步WebView加载速度
- WebView与 js的交互
- WebView的破绽
- JsBridge原理
11.动画
- 动画的类型
- 补间动画和属性动画的区别
- ObjectAnimator,ValueAnimator及其区别
- TimeInterpolator插值器,自定义插值器
- TypeEvaluator估值器
12.Bitmap
- Bitmap 内存占用的计算
- getByteCount() & getAllocationByteCount()的区别
- Bitmap的压缩形式
- LruCache & DiskLruCache原理
- 如何设计一个图片加载库
- 有一张十分大的图片,如何去加载这张大图片
- 如果把drawable-xxhdpi下的图片挪动到drawable-xhdpi下,图片内存是如何变的。
- 如果在hdpi、xxhdpi下搁置了图片,加载的优先级。如果是400800,10801920,加载的优先级。
13.mvc&mvp&mvvm
- MVC及其优缺点
- MVP及其优缺点
- MVVM及其优缺点
- MVP如何治理Presenter的生命周期,何时勾销网络申请
14.Binder
- Android中过程和线程的关系,区别
- 为何须要进行IPC,多过程通信可能会呈现什么问题
- Android中IPC形式有几种、各种形式优缺点
- 为何新增Binder来作为次要的IPC形式
- 什么是Binder
- Binder的原理
- Binder Driver 如何在内核空间中做到一次拷贝的?
- 应用Binder进行数据传输的具体过程
- Binder框架中ServiceManager的作用
- 什么是AIDL
- AIDL应用的步骤
- AIDL反对哪些数据类型
- AIDL的要害类,办法和工作流程
- 如何优化多模块都应用AIDL的状况
- 应用 Binder 传输数据的最大限度是多少,被占满后会导致什么问题
- Binder 驱动加载过程中有哪些重要的步骤
- 零碎服务与bindService启动的服务的区别
- Activity的bindService流程
- 不通过AIDL,手动编码来实现Binder的通信
15.内存透露&内存溢出
- 什么是OOM & 什么是内存透露以及起因
- Thread是如何造成内存泄露的,如何解决?
- Handler导致的内存泄露的起因以及如何解决
- 如何加载Bitmap避免内存溢出
- MVP中如何解决Presenter层以避免内存透露的
16.性能优化
- 内存优化
- 启动优化
- 布局加载和绘制优化
- 卡顿优化
- 网络优化
17.Window&WindowManager
- 什么是Window
- 什么是WindowManager
- 什么是ViewRootImpl
- 什么是DecorView
- Activity,View,Window三者之间的关系
- DecorView什么时候被WindowManager增加到Window中
18.WMS
- 什么是WMS
- WMS是如何治理Window的
- IWindowSession是什么,WindowSession的创立过程是怎么的
- WindowToken是什么
- WindowState是什么
- Android窗口大略分为几种?分组原理是什么
- Dialog的Context只能是Activity的Context,不能是Application的Context
- App应用程序如何与SurfaceFlinger通信的 View 的绘制是如何把数据传递给 SurfaceFlinger 的
- 共享内存的具体实现是什么
- relayout是如何向SurfaceFlinger申请Surface
- 什么是Surface
19.AMS
- ActivityManagerService是什么?什么时候初始化的?有什么作用?
- ActivityThread是什么?ApplicationThread是什么?他们的区别
- Instrumentation是什么?和ActivityThread是什么关系?
- ActivityManagerService和zygote过程通信是如何实现的
- ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系
- 手写实现简化版AMS
20.系统启动
- android系统启动流程
- SystemServer,ServiceManager,SystemServiceManager的关系
- 孵化利用过程这种事为什么不交给SystemServer来做,而专门设计一个Zygote
- Zygote的IPC通信机制为什么应用socket而不采纳binder
21.App启动&打包&装置
- 利用启动流程
- apk组成和Android的打包流程
- Android的签名机制,签名如何实现的,v2相比于v1签名机制的扭转
- APK的装置流程
22.序列化
- 什么是序列化
- 为什么须要应用序列化和反序列化
- 序列化的有哪些益处
- Serializable 和 Parcelable 的区别
- 什么是serialVersionUID
- 为什么还要显示指定serialVersionUID的值?
23.Art & Dalvik 及其区别
- Art & Dalvik 及其区别
24.模块化&组件化
- 什么是模块化
- 什么是组件化
- 组件化长处和计划
- 组件独立调试
- 组件间通信
- Aplication动静加载
- ARouter原理
25.热修复&插件化
- 插件化的定义
- 插件化的劣势
- 插件化框架比照
- 插件化流程
- 插件化类加载原理
- 插件化资源加载原理
- 插件化Activity加载原理
- 热修复和插件化区别
- 热修复原理
26.AOP
- AOP是什么
- AOP的长处
- AOP的实现形式,APT,AspectJ,ASM,epic,hook
- jectpack
- Navigation
- DataBinding
- Viewmodel
- livedata
- liferecycle
28.开源框架
- Okhttp源码流程,线程池
- Okhttp拦截器,addInterceptor 和 addNetworkdInterceptor区别
- Okhttp责任链模式
- Okhttp缓存怎么解决
- Okhttp连接池和socket复用
- Glide怎么绑定生命周期
- Glide缓存机制,内存缓存,磁盘缓存
- Glide与Picasso的区别
- LruCache原理
- Retrofit源码流程,动静代理
- LeakCanary弱援用,源码流程
- Eventbus
- Rxjava
Java:(具体答案解析,点击我的GitHub能够看到全部内容)
1.HashMap
- HashMap原理
- HashMap中put()如何实现的
- HashMap中get()如何实现的
- 为什么HashMap线程不平安
- HashMap1.7和1.8有哪些区别
- 解决hash抵触的时候,为什么用红黑树
- 红黑树的效率高,为什么一开始不必红黑树存储
- 不必红黑树,用二叉查找树能够不
- 为什么阀值是8才转为红黑树
- 为什么进化为链表的阈值是6
- hash抵触有哪些解决办法
- HashMap在什么条件下扩容
- HashMap中hash函数怎么实现的,还有哪些hash函数的实现形式
- 为什么不间接将hashcode作为哈希值去做取模,而是要先高16位异或低16位
- 为什么扩容是2的次幂
- 链表的查找的工夫复杂度是多少
- 红黑树
2.Jvm
- Jvm的内存模型,每个外面都保留的什么
- 类加载机制的几个阶段加载、验证、筹备、解析、初始化、应用、卸载
- 对象实例化时的程序
- 类加载器,双亲委派及其劣势
- 垃圾回收机制
3.多线程
- Java中创立线程的形式,Callable,Runnable,Future,FutureTask
- 线程的几种状态
- 谈谈线程死锁,如何无效的防止线程死锁?
- 如何实现多线程中的同步
- synchronized和Lock的应用、区别,原理;
- volatile,synchronized和volatile的区别?为何不必volatile代替synchronized?
- 锁的分类,锁的几种状态,CAS原理
- 为什么会有线程平安?如何保障线程平安
- sleep()与wait()区别,run和start的区别,notify和notifyall区别,锁池,期待池
- Java多线程通信
- 为什么Java用线程池
- Java中的线程池参数,共有几种
4.注解
- 注解的分类和底层实现原理
- 自定义注解
5.反射
- 什么是反射
- 反射机制的相干类
- 反射中如何获取Class类的实例
- 如何获取一个类的属性对象 & 结构器对象 & 办法对象
- Class.getField和getDeclaredField的区别,getDeclaredMethod和getMethod的区别
- 反射机制的优缺点
常识体系
写在最初的话
有些程序员自认本人技术挺好在面试时薪资会谈时感觉本人要求很低,但还是被淘汰了,因而想不通起因,这都是因为对本身的技能层级认知不够清晰,进行了谬误的判断。你筹备越充沛,你胜率就越大,给你的回报也就越大。学习就是逆水行舟,逆水行舟。当大潮褪去,你才晓得谁在裸泳。