全文共6061字,预计学习时长16分钟
图源:unsplash
曾因折戟于JEE(联合入学考试)而与心仪大学的计算机科学学位失之交臂,但仍想在技术领域开拓事业吗?毕业于非一级大学的你在软件开发这条路上缺乏导师的指引吗?未能进入心仪专业或者大学的你进入了非核心领域,现在正囿于这索然无味的专业吗?想在编码行业谋求一份薪水可观的工作养家糊口但却不知从何着手吗?
如果任一问题的答案为“是”的话,那么这篇文章就是为你量身定做!
正文开始之前,笔者想先做一下自我介绍,并介绍一些背景信息。笔者毕业于印度理工大学罗克分校冶金与材料工程学院,平均绩点并不高。但目前,笔者在亚马逊担任SDE-1(软件开发工程师)并且曾在GoogleSummer of Code 项目中实习过两次(2020 和 2019)。如果笔者能做到,那么你也能!
接着为你介绍三位朋友——Aayush、Bhaskar和Chirag(名字有所改动)。他们的JEE排名分别是2500、7000、和13000。有好几种大学和专业可供他们选择:可以在印度理工大学一所新分校中主修计算机科学,或者在印度理工大学一所历史悠久的分校中学习非核心的分支专业,再或者可以在一所二级或三级大学中学习计算机科学的分支专业。
他们做出了如下选择:
· Aayush在印度理工大学德里分校学习土木工程。
· Bhaskar在印度理工大学一所新的分校中学习电气专业。
· Chirag在一所二级大学中主修计算机科学专业。
每个人都有一肚子苦水:
Aayush担心没有多少公司会从自己的专业招聘软件开发人员,因为他的专业与计算机科学无关。
Bhaskar担心由于他所在的印度理工大学是一个新分校,所以很多公司可能不会去那里进行校园招聘,他可能不得不在校外申请工作。
Chirag有CSE(Computer Science andEngineering)学位,但是他担心因为自己的学校不是一级大学,他可能因此得不到认可。他们三人都有一个共同的烦恼,那就是不知道如何在软件开发领域开拓自己的事业,也不知道如何在心仪的公司谋到一份工作。
图源:unsplash
这也是很多人面临的困境。
你是否也曾因为“品牌价值”而选择知名大学的非核心专业?你是否对你的专业兴致全无,并且正经受着低绩点的掣肘?你会为实习和招聘季而感到焦虑吗?你是否正被同辈压力压得喘不过气?你是否正纠结应着手Web开发还是机器学习?因为第一学年的编程课学的一塌糊涂,你是否担心自己将无法在科技行业开创自己的事业?
解决之策来了!可以通过遵循一个简单的策略或方法在软件开发领域大展宏图。只需一台笔记本电脑,连上网,然后你就可以开始了。
这篇文章主要面向那些想要从事软件开发领域但非计算机科学专业的人,或者出于某些原因没有前辈指点迷津的人。下文将呈现一幅“路线图”,按其指引可了解计算机科学的所有主要主题而不会感到茫然无措。我见过一些人在不懂Java/Kotlin或数据结构和算法的基础知识的情况下就一头栽进Android开发中,结果败兴而归,别再做傻事。
这篇文章与上述提及人群的每个人都息息相关,无论学习年数与研读专业。即使是计算机科学专业的学生,即使是一个想要转行的毕业生,或者即使是在找一份能帮你短时间内找到编码工作的速成指南,这篇文章也会很有帮助。笔者只讲干货。
笔者将路线图分为三个阶段。在第一阶段之后,应该能够处理基本的CP(Competitive Programming竞争性编码)问题。在第二阶段之后,应该可以被像FAANG这样的大型科技公司雇用。第三阶段教授网页开发,以增多应聘机会。第四阶段将教授有关计算机科学的热门话题,比如ML、DL,以及其他可能对准备面试有所帮助的话题。
图源:unsplash
在编程这条路上,你需要掌握的最基本的东西就是编程语言的相关知识。常用的编程语言有C、C++、Java、Python,笔者建议使用C++。
为什么呢?因为它运行速度很快而且配备有STL。STL即为标准模板库,它配备安装了几种常用的数据结构,如vectors、maps、stack、和queues。请注意,在面试中你可能不能使用STL,因为有些面试官很刁钻,他们可能会要求你在不使用STL容器的情况下实现算法。除此之外,STL容器在处理在线编码四舍五入问题和竞争性编码时也很方便。
哪里可以学呢?Youtube上thenewbosto频道的播放列表是一个不错的资源。Tutorial Point上的教程和w3schools也是不错的文档资源,也可以从HackerEarth上学习STL。
接下来,需要学习数据结构和算法。笔者推荐一种事半功倍的“混合学习法”来学习数据结构和算法。数据结构将充当容器,以你需要的任何层次结构和形式存储数据。可以在GeeksforGeeks和 HackerEarth上学习数组。
接下来你需要链表。一定要在点击链表之前修改指针(pointers)和引用(references),否则可能会遇到麻烦。
然后学习堆栈(Stacks)和队列(Queues)。请注意即使你可以简单地使用“ stack
当笔者要读者学这个学那个的时候,是想让读者从那些链接和实操问题中细品理论知识,直至对那些功能驾轻就熟。至于实操习题,可以使用GeeksforGeeks搞定结构方面的问题(按照主题的顺序),或者去Hackearth的答题部分也是一样的。
接着,你需要学习字符串(Strings)。字符串和数组是一个重要的主题,也是除了DP和 Graphs之外,面试官最喜欢的话题。
一旦过了字符串这一关,就可以使用你的技能轻松地应对来自矩阵(matrix)的问题。过了矩阵这一关,依然还有漫漫长路要走。到这一步后,你就解锁了在线CP(Competitive Coding竞争性编码)网站A、B等级的难题并且已经掌握了以下内容:
· C++
· 数组Arrays
· 链表Linked List
· 堆栈Stacks和队列Queue
· 字符串Strings和矩阵Matrix
像Codechef和Codeforces这样的在线编码网站会定期举办竞争性编程竞赛(CP)。CP指的是在限定时间内解决一个问题,可以通过解决问题来获得分数。解得越快,得到的分数就越多。每场比赛有5至8道题,难度逐渐增加。试着解决这些竞赛中A、B等级的问题。在刷题的同时又能结合运用刚学到的知识,刷个7、80道你就上道了。
图源:unsplash
现在是时候进入第二阶段了。首先,你需要学习散列法(Hashing,又称哈希法)。这篇关于散列法的博客文章对于学习散列法的基础知识来说已经足够了:https://www.hackerearth.com/practice/data-structures/hash-tables/basics-of-hash-tables/tutorial/。
接着是算法分析了。你应该知晓如何计算一个随机算法的时间复杂度和空间复杂度。时间复杂度和空间复杂度的知识会帮助你决定哪个算法将会通过测试用例而不会产生超出内存限制或超时的问题。通常,服务器可以在一秒内执行10⁸条指令。所以,在一秒内(这里的N指的是测试用例的输入之和):
· N=10⁶-10⁷ : O(n) solution is required.
· N=10⁵ : O(nlogn) solution.
· N=10⁴ : O(n¹.5 or n(logn)²) solution.
· N=10³ : O(n²) solution.
接下来学习“查找”。花一些时间攻克二分查找(折半查找)的难题,二分查找法应用在难题上时,可能并不显现于难题本身。练的多了,才能对这种算法得心应手。
下一步,去这个网站学习排序(Sorting):https://www.hackerearth.com/practice/algorithms/sorting/bubble-sort/tutorial/。
有9种不同方法的算法,试着了解它们背后的工作原理。不必非得在编码竞赛中执行这9种算法,但有些面试官可能会要求面试者写下它们的执行情况,或者有时会出现要求使用归并排序和插入排序的情况。
然后需要学习递归(Recursion)。这是一种函数调用自身的编程技术。这篇GeeksforGeeks上的博文(https://www.geeksforgeeks.org/recursion/)足以让你对递归是如何工作的以及如何应用它有一个基本的了解。学习递归是因为递归在接下来要学习的主题中(如B.T.、BST、Graphs等)将被频繁使用。
接下来要学习二叉树(B.T.)、二叉搜索树(BST), 和堆(优先队列)。二叉树、二叉搜索树和堆都是面试官最喜欢的话题之一。要知道如何计算深度、直径、宽度优先搜索、深度优先搜索、顺序遍历、前序遍历和后序遍历。其他问题,如二叉树的侧视图和水平顺序遍历也很常见。对这些东西要烂熟于心、倒背如流,它们将成为你以后理解图的基础。
做完这些之后,你就解锁了Codeforces 上C等级的难题。继续练习Codeforces和Codechef上的题。Codeforces和Codechef最主要的区别在于Codechef是以数据结构和算法为中心的,而Codeforces则通常以数学为中心。Codeforces上的大部分竞赛都可以说是关于数学的角力。
在第三阶段初,你需要学习用贪心算法(Greedy)解决问题。大体上只需一步步选出局部最优解,直到得到最终的解。在这之后 ,就只剩下图(Graphs)和动态规划(Dynamic Programming)这两个主题了。这两个主题很难,所以请保持耐心。
可以从GeeksforGeeks和HackerEarth这两个网站上学习图。首先,可以通过矩阵形式(matrix)和邻接表 (adjacency list)来理解图的表示。接下来是广度优先遍历(Breadth-firstTraversal)和深度优先遍历(Depth-first Traversal),攻克掉广度优先遍历和深度优先遍历的难题。要清楚在使用递归和不使用递归这两种情况下如何实现广度和深度优先遍历。
然后转战最小生成树(Minimum Spanning tree);接下来学习Prims算法和Kruskal算法;再然后把目光投向最短路径搜索算法(Shortest Path Findingalgorithms),即Dijkstra算法、Floyd Warshall 算法和Bellman Ford算法;接着学习连通分量与其工作原理,以及强连通分量;还要学习Kosaraju算法的工作原理。
接下来要学习动态编程。在动态编程中,我们用空间交换时间。通过记住不同状态的值,就可以不用一遍又一遍地计算某些东西,从而节省了时间。可以去看一看Michal Danilak (mimino)在 Quora上对动态编程的阐释。题刷得越多,对动态编程就越游刃有余,记忆不同状态的值也就不成问题。
图源:unsplash
第三阶段过后,你应保持在编码平台上的刷题状态,并且着手申请一份实习或正式的工作。LinkedIn是寻找工作机会的好去处。要扩张人脉,打探打探有没有空缺的岗位,Internshala和Indeed是申请这种空缺岗位的好平台。
数据结构和算法的知识和竞争性编码的技巧会在申请顶级跨国公司的offer时助你一臂之力。但如果事不遂人意,就需要进一步提高你的开发能力。你可能需要学习一些实际的软件开发。
一个全栈开发人员可以同时处理服务的客户端和服务端两个方面。从HTML和CSS入手,这是很基础的东西,谷歌上有很多资源可供参考学习。
接下来需要学习 JavaScript。根据运行环境的不同,JavaScript大致上可以被分为两种类型——一个在客户端或者浏览器上运行,另一个在服务器上运行。现在只需学习客户端的JavaScript,了解如何动态编辑HTML以及如何做出炫酷的内容。可以在Mozilla Development Network上深入学习HTML、CSS和 JavaScript。在这之后,可以试着着手Bootstrap,这是建立响应性网站的一种快速方式。
无论现在学习到前端的哪一个部分,你都需要决定选择使用哪种语言。Java、JavaScript、Python和Ruby是比较流行的选择,它们每个都带有自己的框架。
笔者推荐学习JavaScript。主要原因是它既可以在前端运行,也可以在后端运行。后端运行就学Node.js。Node Js有一个express框架, 这样就可以省去很多无用功。
数据库将被用来存储数据。既可以使用NoSQL数据库,也可以使用SQL 数据库。慢着!到底啥是SQL?SQL即为结构化查询语言(Structured Query Language),用于从数据库中获取数据。NoSQL 意味着不使用结构化查询语言,而SQL意味着使用结构化查询语言。数据库如果以表格形式存储数据,则使用SQL,反之则使用NoSQL。
对于数据库,你需要学习NoSQL或SQL数据库。NoSQL 数据库类型的Mongo和SQL数据库类型的PostgreSQL都是比较时兴的选择。至于前端运行,可以学习Angular或React。然后,你就可以创建项目了,MEAN和MERN堆栈开发员的职位也将为你敞开。
如果你正在使用Python,或者对Python更熟悉,可以学习Django作为后端框架。Python没有任何前端框架(据笔者所知没有)。至于Java,可以学习Spring框架。
· 学习Git。GitHub 是码农们存储项目的平台,在这个平台上可以托管、部署项目,也可以展示自己的项目。
· 有效地使用Google和 Stackoverflow。Stackoverflow 是所有错误和问题的救星。只需把错误复制粘贴到谷歌,然后就是见证奇迹的时刻!
· 学习Docker。Docker是一组“平台即服务”产品,其使用操作系统层虚拟化,在名为容器的包中交付软件。
图源:unsplash
走完这四个阶段,没有计算机学位也不怵了!
一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”
(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)