0x00前段时间高考不是刚结束吗。每年高考一结束,如何选择专业、如何填报志愿就成了热门话题。去年,我帮家乡两个亲戚的孩子介绍了志愿者,今年也接到了家乡几位叔叔阿姨的电话。父母比孩子更着急,他们也进行各种询问和研究。去年,一个去了计算机专业,一个去了师范学校。估计家里的两个孩子今年也要补电脑(或相关),学理科。当然,这并不是说我推荐他们填电脑。个人一直觉得兴趣很重要,但是当问到对专业有没有兴趣时,我说没有明确的目标,希望能填一份热门的工作。更何况现在网络这么发达,孩子们可以自己去查,而且他们也知道这几年电脑很流行,然后也会详细调查一些与电脑有关的情况。孩子关心的是能不能学好,父母关心的是能不能找到好工作。但我建议说去争取,保持稳定,并保证安全。能冲进计算机相关专业当然没问题,但如果考不上,那通信/电子也不是不可以,有保障。0x01对于我们这些普通家庭的理科生来说,我还是觉得工科是一个友好的选择。没有太高的障碍。如果你有技术,你就会有机会。学完最实用的技术,就可以近距离接触了。只要是对学习感兴趣,一般选择这个是没有问题的。当然,这个兴趣并不是说一定要特别浓,有时候不讨厌也是一种兴趣。尤其是计算机相关专业,这几年确实在工程领域名列前茅。首先,大家都知道工资高。稍微好点学校的应届毕业生,毕业后在北上广深拿几十块年薪基本没问题。所以学习计算机必须能够满足我们生活工作、养家糊口以及对未来美好生活的向往。盘点了一下自己熟悉的同学,通信/电子/计算机都还行。所以,选择计算机专业确实更迎合市场。还有一个,个人感觉计算机的学习门槛好像不高。一般来说,理科出身,有点逻辑思维,一般都能学好。再说计算机的学习资源不是太多,开源的世界也很丰富,网上都能找到。没有明显的学习障碍,用电脑就可以学习。而且付出和回报是成正比的,我不拼别的,只看技术。所以可能就是因为这些各种各样的原因,现在报电脑的人太多了,这叫火。除了高考志愿填计算机的,还有转专业转计算机的,考研跨机考的,工作后转计算机的,甚至谁在培训班培训电脑……所以我也会告诉他们,压力和竞争并不重要。小朋友们,做好心理准备吧。0x02说到试卷,从最常见的两点可以看出,一是考研,二是求职面试的难度。我想很多朋友可能都亲身体验过。现在考研不仅仅是计算机,所有热门的工科专业压力都很大。我们考研考了多少分?300出头,就可以上学了。现在来看,比较好的学校的计算机相关专业,400分大神大战,报考的人也很多,高手也很多。并谈论工作面试。以前就是背八股作文,然后刷题,找个像样的工作没问题。什么是八股文?可以背一下,比如什么OOP特性,接口和抽象类的区别,hashmap的原理,List和Set的区别,Java运行时内存区域,Get和Post请求,三次握手和四次挥手、OS页面置换算法……等等,大家可能也都背过了。然后刷题。那时候我们做完Offer上的40、50题就可以保证底线了。我记得当时LeetCode好像没有现在那么多题。但是站在现在,看看面试问的是什么。问底,深入骨髓。像JVM底层原理,JVM调优实践,JDK源码,JUC并发,锁实现原理,数据库底层原理,索引优化,SQL调优,Spring源码,各种框架机制,然后还有什么集群,分布式锁,缓存一致性...以及其他问题也经常被问到。然后是项目。要么挖到底,最后是底层原理,像上面那样,要么往上走到架构层面,比如架构设计、框架选择、链路设计、架构扩展……等等。除了这些,还有手撕算法题。现在LeetCode找工作不用几百题了。恐怕连笔试都很难找到感觉。面试过的朋友一定有感受。所以现在自学,包括面试准备,真的不是说你就可以背八股文章,可以用SpringBoot,SpringCloud。刚才讲了两个比较有价值的方面:要么是底层原理:操作系统底层原理、底层JVM、底层框架、算法原理、对源码的理解和掌握……要么是架构思维:架构设计的能力,框架的选择与比较,链接的设计与把握,架构的扩展与扩展……而这些一般都是需要去了解和实践的。而且,我明显感觉到身边应届毕业生的计算机素养普遍都很高。不管是面试的时候,还是下班后观察身边的一些新人。除了对计算机的思考非常好,学东西很快之外,他还非常年轻有活力,这是无可匹敌的。所以基于这些,我也会告诉家里填志愿的小朋友,随波逐流、无脑梭哈电脑是不行的。想要申请,首先要有心理准备,能够承受压力,其次要对这个东西有一点兴趣(至少不讨厌),最后要有强大的自我-学习能力和习惯,不然就算进去了也是很痛苦的。0x03接下来的问题是关于编程的难度?这是我家乡几位同学最近在研究专业时共同提出的一个问题。编程难吗?其实我真的不知道怎么回答这个问题。个人觉得计算机的学习门槛应该不高。都是理科生,平时有点逻辑思维就可以了。当然这里说的不是那种学到极致的天才选手,我们说的是从普通发展的角度来学习。以最常见的编程工作为例。它对人的思维能力有一定的要求。其实简单的理解差不多就是分析问题,然后抽象出要素,最后建立模型的思考过程。如果你觉得编程难,或者代码难入手,那么很有可能是这种思维方式还没有形成。说明首先可能是基础有待加强,另外就是锻炼可能还不够,还没有突破门槛。尤其是加入工作后,我做的那些系统和各种业务。其实说白了就是把每一个实际的需求进行抽象和建模,用合适的数据结构和算法流程来表达,然后辅助一些框架或者工具用编程语言来描述,然后通过一系列处理,最后由计算机执行。先实现功能,把流程跑的顺畅,然后再考虑如何做的更快,如何做到更高的并发,如何更安全。我们可以回想一下,项目中的复杂系统往往并不是都这样演化的。因此,对于很多刚入职的年轻小伙伴来说,最头疼的问题之一就是刚加入团队,对实际项目还是陌生的。工程太大了,他们一时半会也看不懂。为什么?因为里面有很多演进迭代的过程,你没有看到。其实系统一开始并没有那么复杂,只是后来迭代了很多版本,改了很多东西,加了很多东西。这时候如果没有比较靠谱的迭代记录、文档、评论,确实难以理解,这是很正常的。所以这时候只能靠自己多问,多想,多了解,脉络/前后,从整体到部分,从部分到安排,只是反复来回摩擦,逐渐明白它。所以有时候想想,好像事情并没有那么复杂。但是你有没有想过,为什么现在的互联网开发界如此繁荣?尤其是我们梳理大数据和后端开发的知识点和学习路线的时候,涉及的技术点和框架太多了。其实仔细想想,它们往往是用来辅助的。它们的出现很多时候是为了处理企业级应用开发所面临的复杂性、代码质量、可测试性、可扩展性和可维护性等一系列问题。总之,都是为了更好的工程迭代。举个例子可能会更好理解。比如很多人使用Spring框架进行Java后端开发。其实我们写这些web服务的时候,完全可以不用Spring。也可以写得简单一点。这样,不同的人就会造出自己的轮子,包装自己的工具,包装自己的工具和方法。没有问题,可以满足要求。但此时,由于不同的人思维方式不同,习惯不同,能力不同,每个人写的代码可能参差不齐,质量参差不齐,很难达到企业级开发的代码质量和可靠性。关注。可测试性、可扩展性、可维护性和可迭代性。这样写的项目后期可能不好维护,长期迭代演进也没有办法。而这些框架内部使用了很多机制,实现了很多工具类、方法、流程,还规定了很多限制性的写法,暴露开发者或者暴露API,或者暴露接口……其实对某一个extent可以理解为提供了一个约束规划。你想用我的相框吗?能。那你就得遵守我这边的游戏规则(codingrules)。这不就是Spring的典型吗,IoC容器是用来做什么的?方便管理对象,然后还有很多方面,像编程,接口编程,声明式编程……等等,我们可以把它理解为一种限制性编程。只有这样,才能保证编写的代码在满足需求的同时,也便于测试、扩展、维护,甚至与其他技术集成,创造商业价值。不过写到这里,好像有点远了,时间不早了,有机会再说吧。后记另外,最近自己也花了不少心思整理自己的编程学习资源。均为纯肝制品,目录如下。内容GitHubhttps://github.com/rd2coding/Road2Coding已经收录,里面有6大编程方向+知识点整理的自学路线,我的简历,面试考点,几个硬核pdf笔记。还有我的程序员生活,欢迎star。整理不易,欢迎多多支持,下期见!
