同学,技术栈真的真的没有那么重要
这是在我的知识星球上,一个同学问我的问题。
bobo 老师您好,抱歉打扰您,有几个问题希望得到您的点拨:
我是一名大四学生,已经拿到某知名公司 Windows ring 3 的安全 offer,现在对未来的方向有些迷茫。
1、觉得 Linux 无论是现在,还是未来,前景都比 Windows 要好得多,但是之前一直学的是 Windows,Linux 现在学不知道还能不能来得及。毕竟 4 个月后就毕业了,也不知道什么方向比较好转。
2、如果现在来不及的话,将来工作中 Windows 转 Linux 好不好转呢?需要平时做什么努力和准备?
谢谢!
bobo 老师的回答:
我不是安全领域的专家,所以针对你的问题,我不能给出非常具体的,有操作的建议。非常抱歉。
但我想我的回答会对你有帮助。
我想借这个问题聊一类我经常见到的问题。就是诸如:在选定一个领域之后,还是会有很多具体的技术栈可供选择,应该怎么选择?
我的答案可能要让你失望了。我认为不需要特别的选择。
如果你已经选定了领域,其实就已经完成了最重要的选择。具体的技术栈或者是平台,没那么重要。
为什么这么说,因为你学习的关注点,应该是这个领域,而不是具体的技术栈。
技术栈是为解决领域问题服务的,而非反过来。
举个例子,如果你选择要做移动开发,那么在我看来,你是做安卓开发,还是 iOS 开发,是无所谓的。你要觉得安卓机的基数大,也好找工作,选择做安卓,挺好;你要觉得苹果的生态好,用户付费意愿强,去做苹果,也挺好。
但是,不管你选择什么,你在学习或者工作的过程中,一旦度过了初期阶段,关注的重点或者思考的重点,都应该在更抽象的“系统层”,而非一个一个的语法或者接口。
比如:组件之间是如何通信的?使用的什么模式?布局的原理是什么?网络连接是靠什么方式?刷新数据又是靠什么机制?怎么处理网络异常?怎么处理延迟?如何使用多线程?在使用多线程的过程中,遇到各种问题又要如何解决?如何整理数据?如何使用你的应用和设备的各种系统打交道?等等等等。
诚然,所有这些技术点,落实到代码上,在不同的技术栈,使用的语法规则,或者接口规范,都是不同的。
但他们的原理,90% 都是一样的。
剩下的 10%,虽然有所不同,但是对于一个习惯这样思考学习的人来说,这也将带给他一个全新的思考机会:为什么在 iOS 系统里,这个机制的实现是这样的;而在安卓系统里,同样的机制,实现却是那样的?
他们有什么不同?各自的优缺点是怎样的?适用于什么场景?
融会贯通就在这个过程中,领域专家就是这样炼成的。
同理,后端工程师也是如此。不管你是 Java 后端,C# 后端,Python 后端,NodeJS 后端,还是什么语言什么框架的后端,在度过入门阶段以后,你的关注点都应该是“机制”,而非“具体的实现”。
我们当然是使用不同的语言,不同的代码,来实现了这些“机制”,但核心是,这些“机制”的原理是共通的。
依然是,存在不同的框架,采用不同“机制”的情况,那么此时,就带给了你一个全新的思考的机会:为什么这里使用这个机制?那里却使用那个机制?他们的优缺点是什么?使用场景是什么?
甚至,我能不能把这些机制彼此借鉴?乃至创造全新的机制?用一种更综合的方式,乃至全新的方式,解决现有的问题?乃至全新的问题?
融会贯通就在这个过程中,领域专家就是这样炼成的。
我相信安全领域也是如此。
诚然,Windows 和 Linux 确实有很大的不同,但我相信,他们在安全策略上,有很多相同的机制。这些机制在不同的系统下,对应的具体技术细节不同,但掌握理解这些机制,是至关重要的。
融会贯通就在这个过程中,领域专家就是这样炼成的。
我相信你已经理解我的 point 了。回到你的具体问题中,我认为:
1.
Linux 很重要,这个判断是绝对没问题。你将来做安全方面,肯定也要接触 Linux。
毕竟,这个世界上大多数服务器,都是运转在 Linux 上的。甚至我上次看到的新闻,微软自家的云服务平台 Azure,所使用的 Linux 服务器都是多于 Windows 服务器的。
而 Windows 已经内置 Linux 内核了。
但是如果你手头的 Windows 安全的 Offer 很好,你自己对薪资,城市,工作环境,等等方面都很满意的话,我觉得没必要逼自己,一定要在现在,短时间内转 Linux。
因为,这完全不影响你未来成为一个安全专家。
甚至有可能,很多 Linux 的安全专家,由于没有接触过 Windows,反而思维体系没有你全面。接触过 Windows,反而是你的优势。
2.
如果你对手头的 Offer 不满意,让你满意的 Offer 都是 Linux 安全方向的话,那你完全可以突击学习一下 Linux 相关的内容。但因为我不做安全,我也不敢肯定需要多长时间可以达到一个什么程度。
但是,我建议你在简历上写清楚:我在 Windows 安全领域更厉害,是我的擅长;Linux 安全刚接触而已。
如果有机会去面试,把面试的方向往更抽象层面的安全领域的问题上引,而不是一些具体的操作和指令。
向面试官展现你在安全领域上的技术思考和问题解决能力,而不是某一个具体的命令或者实现。如果厂子不太差,面试官不太奇葩的话。前者应该是面试官更关注的。
虽然具体面试过程和面试结果,也有可能因为不同的原因而受影响,但我不认为没有机会。
其实,在开发领域也是如此。如果你去仔细观察大厂的面试问题,就会发现,大多数问题其实是在探讨机制,而非一个具体的实现。
具体的技术细节是为了更方便明确地阐述机制的,而非反过来。
只要你关注原理,关注机制,关注系统,而不仅仅是语法,接口,这类东西,在同一个领域,转换一个平台,绝对不难。
为了防止有同学误读,在这里我也要强调:我的回答,不代表具体的实现不重要。
计算机是工科,工科不能泛泛而谈。实打实的用代码将功能实现出来,去解决具体问题,是最根本的。
但做技术的瓶颈,绝不是具体的语言,框架,API 接口,这些东西。
这些东西会过时,但是,蕴含在这些东西背后的原理,机制,思考方式,和解决问题的思路,是不会过时的,是真正可以积累的经验。
我见过很多当年诺基亚的塞班工程师,在塞班彻底退出历史舞台以后,不但轻松转型 iOS 工程师或者安卓工程师,还能快速胜任带领团队的角色,完成移动开发任务。
为什么?因为他们的知识体系在更抽象,更高的层面,而不是简单的实现一个功能,要使用什么 API,这类问题上。
大家加油!:)