当前位置: 首页 > 后端技术 > Java

几十年的发展,没有深层次的技术苦恼

时间:2023-04-01 22:29:31 Java

一位读者最近去采访Android开发。这位读者是一位知名老师(BAT某公司),是一名资深Android工程师,拥有十年软件开发经验,但因为没有技术深度而拒绝了他。我发现他在做模拟面试的时候也发现了这个问题,因为从他的简历和在两家知名互联网公司的经历来看,面试官肯定会不自觉地提高他的期望值。虽然他有丰富的项目经验,但经过实际交往,他发现自己虽然在知名企业工作,却没有掌握“核心技术”,优势一下子变成了劣势。随着年龄的增长,你原来的优势慢慢变成了你的劣势。写信给高级或即将成为高级Android工程师。当我们做初级工程师的时候,最希望的就是拥有丰富的项目经验,让我们苍白枯燥的简历充满耀眼的丰满。然而,随着时间的积累,简历上的项目已经相当“满满”,而我们这种只看“表象”的行为却让我们陷入了另一种困境:看似很有经验,其实并没有做任何困难的事情,工作十年可能只用九次一年的工作经验。就像这位去面试的读者,从简历中确实能看出他辉煌的项目经历,但经历之下,他会发现自己的简历并没有深入的地方。有些虽然写的很有技术含量,但实际上只是在使用API??的层面;一些解决问题的方法非常巧妙,但还不够系统。可惜我们没有多走两步,没有研究和拓展。那么如何改变呢?对方也在问我这个问题,而且很急,很急,希望我今天解释完,明天他有深度采访。我很无奈,直接解释说这大概是不可能的。如果可以的话,其他人也可以很快掌握核心技术,变得非常深入。但是从长远来看,我觉得是可以的,比如给自己半年的时间去学习、拓展和实践之前项目中的某个技术框架。*能够利用你现在公司的资源,比如这个框架的项目组,和他们搞好关系,向他们学习,遇到的每一个问题和他们一起讨论。但是绝对没有其他方法可以仅通过观看或即兴准备就可以进入深度。如果你能做到,那你一定是某一方面很深的高手,自然可以无视我说的话。没有深度的原因我们没有技术深度。最重要的原因有两个:一是为了逃避问题,二是缺乏兴趣。当我们在工作中遇到问题时,我们往往会回避它,无论是在设计上还是技术上,或者寻找其他替代方案,比如使用别人的开源库,使用别人的轮子。这样做没有错,但是如果我们想要有更进一步的提升或者技术上的深度,就必须了解这个问题,至少要了解别人是如何解决这个问题的。第二,关于兴趣,很多人没有再往前走两步。重要的是他们根本不感兴趣或好奇。如果我们遇到一些很有意思的解决方案、框架或者一些奇奇怪怪的问题,但是我们根本不想去“招惹”它们,免得我们避而远之。自然也就失去了在这些点上进行突破和深化的机会。如何提升自己的技术深度?高级Java语言和Android相关技术Android的核心应用是由Java语言开发的,SDK也是由Java语言编写的,所以我们需要学习Java语言。另外,虽然Android官方已经推广了kotlin语言,但是kotlin也是编译成java语言然后运行的。对于Android,只要不是用kotlin重写SDK,就需要学习Java语言。而且Androidapk的后台服务器程序很有可能是用java语言构建的,所以学习java也是很有必要的。那么我们Android程序员需要学习Java中的哪些东西呢?由于Android程序员习惯了CV代码块,所以与Android相关的稍微难点的Java基础几乎是门槛,泛型、多线程、反射、JVM、JavaIO、注解、序列化等。它是CV的对象,而且程序员不懂原理。App开发框架(APP也是一个对象)的知识体系是现在应用最广泛的知识。2013年到2016年我们称它为Android技术,结果对这段经常被“用”到的代码,我既熟悉又陌生:熟悉的是我几乎天天和他们打交道,天天抄这些代码;奇怪的是,虽然我每天都和这些代码打交道,但我并没有深入研究过。代码的原理,代码的深刻内涵。所以我们需要从一个新的角度来分析这些知识点,深入研究,学习源码,模仿源码,然后hook源码,这样才能说我们理解了这块知识。这些是做Android开发,做高级工程师的基础。3.AndroidApp的全方位性能调优一个App的性能好不好,需要从两个层面下功夫。第一层次:你在写代码的时候需要注意,让你的代码是高性能、高可用的代码。这个过程就是写出高性能的代码;通过检测到的问题来指导我们删除和修改代码,这个过程称为调优。如何编写高性能代码?那么我们就需要有深厚的代码基础,这是代码的基础,比如:数据结构可以根据应用场景写出符合当前场景的特殊结构。比如Google针对Android平台的特点,开发了sparseArray来代替HashMap。另外,对于常用的算法,我也有自己独到的见解。LeetCode上百题,让我几乎可以达到精通排序、查找、动态规划等最常用算法的能力。更进一步,如果高效的算法和节省内存的数据结构与满足应用场景的优秀设计模式相结合,那么这些都为高性能代码的实现提供了基础。另一种是对写好的代码进行调优,所以调优的方向是使用Profiler工具进行测试检查,看看哪里有哪些操作是非常消耗性能的,然后分析代码的问题所在。调优的方向变成了如何优化内存、功耗和网络流量。当然还有启动速度、页面切换效果和速度、启动白屏体验、闪屏等原因。等进行分析和调整。*加上屏幕适配和相机适配。音视频/高清大图/人工智能/直播/抖音等,今年最贴近用户、最贴近我们生活的技术,一直在寻找极致的技术落地平台。以前是windows系统,现在是移动系统了,移动系统是建立在Android占绝大多数的前提下,所以AndroidNDK技术已经是我们必备的技能了。学好NDK,需要学习C/C++、jni、Linux基础知识。另外,音视频编解码技术、流媒体协议、ffmpeg都是音视频开发必备的技能,而OpenCV/OpenGl/这些都是图像处理必备的知识,都是原理层面的实战项目。由于篇幅原因,需要完善的地方还有很多,比如混合开发、小程序开发、架构专题等,这里不再赘述。我应该深入哪一点?我们工作多年后,技术一定要有一定的深度和广度。当然,广度不言而喻,你就会明白它的必要性。深度*与自己的兴趣或比较紧密的工作模块有关。如果深入到公司相关的模块,可以使用更多的资源。或者如果是你感兴趣的模块,即使没有资源,因为你很感兴趣,你也会有办法找到你需要用到的东西。我们从不缺少方法。领导与被领导技术的深度是领导与被领导的关系。这一点我深有体会。刚开始做Android开发的时候,我的工作是维护Android自带的系统应用。我可以处理客户提出的问题或进行二次开发。解决方案。然后会有一些空闲时间,反正我会在系统应用程序中找到最简单的应用程序(记事本)来练习。我想既然这么简单,那我就自己写一个,从零开始实现一个记事本应用。当我开始写的时候,它颠覆了我对安卓应用的理解。我发现我不明白我以前认为我知道的东西。我遇到了很多无解的问题。这是一个非常简单的应用程序。只有对比原代码实现,才能发现自己的问题出在哪里,才能确定实际做和看到的差距有多大。如果你只是在别人解决问题的基础上做事,即使你觉得自己想出了一个好主意,看起来灵光一闪,很巧妙地解决了客户的问题,但实际上这是只是一种技能。在这个应用、架构、设计组织的大方向上,你们并没有取得太大的实质性进展。这时候你只是一个跟风者,被别人的源码牵着走。即使你看过和使用过很多应用框架,也会觉得纸上谈兵,只是在纸上加了点本钱。你永远是一个被领导的人。领导给你定了框架,给你定了路。然后你在他给定的路上耍花样,你却有一种错觉:你觉得自己很厉害,很有潜力。技能。而如果你自己写一个这样的框架,或者设计一个思路,指定一个方向和路径,你会发现并没有你想象的那么简单。你是一个想领导别人的人吗?或者你想成为一个被领导的人?总结没有技术深度是大多数程序员的常态。不能说这是好现象还是坏现象,只是一种合理的状态,因为很多工作,很多人从事的是对技术深度要求不高的项目。即使你有深度,你可能会发现你并不需要它。对于大多数人来说,理性的做法不是追求技术深度,而是适可而止。但是对于个人来说就不一样了。你需要在技术上足够好,但是你需要在某个方面有一定的深度,才能突出自己的学习能力、理解能力和应用能力,而这种能力必须要有成功的案例来背书。尤其当你成为高级工程师后,很多公司都不希望你平庸,没有深度。虽然你可能会想,就算我有深度,你也未必会用得上吧?但是这个级别的人员需求没有初中级开发人员那么高。对公司来说更理性和安全的做法是选择有深度的人,不是吗?关注公众号接收Android资讯,纯干货https://blog.csdn.net/qxf8656...