如何从零开始成为一名优秀的程序员?---转载、翻译自Quora

原作者在这里插入图片描述

许多人问我,我怎么才能从零开始学编程呢?在这个回答里你会了解到怎么样做。我编程二十年了,在此我将分享我在这二十年里为相关从业人员指导过的职业规划及发展的经验。 —本回答最初写于我的博客并且在Wykop(波兰的类似于天涯+贴吧的网站)有30,000浏览量和1,000个赞,希望大家能从中获益!(Enjoy!)

在这里插入图片描述

许多人问我,怎样从零开始学编程。每天我都会看到如此的评论。比如,有些人在一个不同的领域工作,并且希望成为一个软件测试师,或者有人在IT行业工作,不过想要跳到一个新的层次,比如编程。所有的这类人都有一个特点,那就是他们想要开始编程之路。不过这个领域是很广的,他们不知道该如何着手,而且许多行业人士也会给出不同的答案。

从本回答中你会了解到如何从零开始编程。你也将看到在学习编程过程中的一些好的建议。那么,让我们开始吧!

为了学习如何敲代码你需要跟随这些步骤:

1-找寻方向(Look Around)

如今的编程(Programming)是一个涉及领域非常广的行业,所以纵览这个行业并且确定适合你的方向是很好的。因为如果你了解了有哪些路,你就可以更好选择一条正确的路,这也会帮助你决定该学习哪些技术。
一开始我将会介绍web程序员。这些人利用Wordpress或者其他内容管理系统(CMS)和他们的职业技能来打理(adjust)网站以满足客户需求。为了做这个你一般需要学习JavaScript HTML 和CSS。
web程序员,即网站开发工程师(Website developer)—这可能是世界上最流行的对“程序员”的理解。不过编程并不只是关于用Wordpress建网站,它包含很多领域。首先我会给你三个前端领域(Frontend Realms) 的例子。前端编程是在用户/客户能看见的地方编程,简而言之,就是人机交互的界面(interface)。
Web应用开发(Webapp programming)-开发在线的商业app(也就是那些在你的浏览器上运行的应用,例如你的银行app,或者电影评论app,在线播放器 在线小说阅读器之类的)。这些都是满足特定用户群体需要的应用,它们并不是拿来管理内容的(例如Wordpress)而是用来管理工作过程(就是人们可以在这此协助下完成他们的工作)。除了JavaScript,HTML和CSS,在此编程序需要知道一些额外的webapp编程技术。这依赖于一个项目(project),例如SCSS,TypeScript 和任何一个如下的框架:Ember,Angular,Vue 或 React.(框架就是完成一个应用的体系结构所需要的封装特性的接口,具体需要学习JS )(Framework is a skeleton of an application with build it features))
桌面应用编程(Desktop app programming)-类似于Webapp开发,不过这类的应用是那些你可以安装在例如Windows系统上的运行的(电脑桌面上的各种软件)。这些软件不同于网页上的app,它用了其它的技术,例如在Windows系统上编写程序你可以用C#语言和.NEW框架。
移动应用开发(Mobile app programming)-也就是那些写在移动设备上运行的程序(主要是在安卓和ios系统上)。给安卓系统编程主要用Java语言,ios主要为Swift语言。对于不同的手机系统有不同的框架,不过也有适用于两个系统的框架。

以上都是前端领域的例子。现在让我们继续前行,到后端领域(Backend realms) 看看。后端,也就是编写那些用户/客户看不到、对于系统正常工作十分关键的东西(programming something, client / user does not see, but is essencial for the system to work):
数据库编程(Database programming)-像MySql和MSSQL的数据库系统就是一个更高级的电子表格程序(an advanced spreadsheet)。数据库能存储更多的数据并且能通过写代码方式(例如数据库语言SQL)操作这些数据,像添加、删除、修改数据这些。此外,数据库能以其他不同的方式处理数据,例如删除不正确的数据或者从不同的表格中收集汇总数据。数据库系统用不同的SQL语言(像T-SQL和MSSQL)。这些语言能编写不同的操作代码来处理数据,也有许多数据库不用SQL语言,这类非SQL语言有一个神秘的名字-NoSQL。
后端开发(Backend programming)-后端开发人员处理那些介于数据库和前端,或者介于不同系统运行所需的数据。几乎每个编程语言都能为后端所用。不过因为后端开发那些有特定的使用目的的软件,相较于前端,人们倾向于使用不同的语言,比如PHP Ruby Python Jave ,也有JavaScipt。
许多程序员都被分为前端开发者和后端开发者。全栈工程师(Fullstack developer)。全栈工程师就是一个同时知道前端和后端技术的人。这类人能照看好开发一个应用所需的一切:数据库、后端和用户交互界面。

以上所述并不是全部的编程领域,这样的概述使得其它领域被忽视了。我们现在有越来越多的为信息系统提供数据的先进设备、传感器(例如智能家电)。这些东西都需要被编程,这叫做嵌入式开发(Embedded programing)。嵌入式开发主要用C和C++语言,因为这些语言给程序员提供了更底层的抽象,并能为那些微型设备节约许多资源。
另一个令人激动的编程领域是数据分析(Data analysis)。数据分析工程师操作在公司里的大量数据集(Date Sets)并且为其商业决策提供数据分析结果。这类程序员用不同的编程语言,包括Python和R(没错,这就是一个编程语言的名字,就是一个字母“R”,这个世界什么时候才能合理呢?)
另外一个领域就是legacy编程(legacy programming)。Legacy开发者知道过去用于开发系统的技术,不过这已经过时了,他们支撑着很多年前的目前仍发挥着作用的legacy系统。
还有许多其它的编程领域,我不会把它们介绍完。不过你是有可能找全它们的。
大概的领域就这么多,为什么了解它们很重要呢?如果你找到了你感兴趣的领域,你可以选择该领域所需的技术来学,并且专门学几个技术比无头苍蝇似的去学200多个技术简单地多。

好了,让我假设你已经知道你对哪个领域感兴趣了,那么下一步呢?

2-选择技术

为了走得更远,你需要提前选择你要学习哪个技术。不过老实讲很难给你提供这方面的建议。你可以尝试问问其他人,或者自学或者跟培训班。不过不管哪个方式,你都将会正式开始了解:1)什么是当下流行的? (what is popular)2)教你的人有什么知识要传授的?( what is known by the person who teaches you) 3)该利用回答你的人什么?( what uses person who answers)通常来说这并不是一个好的选择。不过我一个有好消息,那就是你可以慢慢提高一步一步做得更好!
去了解你所感兴趣的领域的公司都在用什么技术。去看看招募信息,看看他们都需要哪些技术。不要因为要学习20多个技术而直接把你的激情之火扑灭了,这只是幻想罢了。人们会在招聘信息中加上一些在工作之后并不需要的东西。
通常,我了解到人们知道这方面的一点点,那一方面的一点点,然而他们还是不知道怎么样成为一个程序员。他们迷失了,这确实是对的。编程是一个范围很广的行业,你并不需要什么都要学。你只需要选择好方向然后坚持努力,这样你就能增加你成功的机率。

3-选择学习方法

这一点非常重要,我会介绍原因。
每个人都有关于如何成为一个程序员的观点,如果你在网上浏览对此的回答,你会发现许多的关于如何正确学习的建议。比如有些人建议在用TouTube观看在线课程来学习,有些人认为看书是最好的,还有一些人则认为报培训班是最好的。而软件工程师要从文档中学习!一些开发者说大学教育是没用的!关于某些表述我感到悲哀。
你不需要知道什么方法是最好的,每个人都有不同的建议,这很自然。就我本人而言我会推荐电子书和视频课程,因为我喜欢这样学习。不过这也可能不是一个正确的或者有用的回答。
事实上,你如何学习并不重要,只要你确实在学习。
还记得你在学校是怎么学习的吗?那样的学习是怎么样的呢?是不是老师要求你这个学一点点,那个学一点点,然而这些东西之间并没有联系?-不,在学校里你学习的复杂东西,对你而言并没有什么用,不过每个人都会记住关于那些东西的一点点的知识。这是因为在学校的学习是系统地有条理地(systematic and methodical)学习,一步接着一步,一门接着一门。这套学习系统是建立在几百年的经验上的。如果你认为这样学习不好,那么问问你自己:如何做一个土豆电池?(所以你会发现你需要一套的学习体系才能做出来,而这个学习体系好就好在这)
你对编程有兴趣,所以你能选择的最好的就是一个系统的、有条理性的学习方法。所以让我们自问自答,什么才是一个系统性的、条理性的学习?显而易这就是高等教育。高等教育知道如何系统地、有体系地教授相关东西。这很难,不过通过这一学习你会学会编程。
还有一个方法就是看书看书看书。在一点点的细心学习下你会发现书中教授的东西都是一步一步来的。从简单到困难,从入门到精通,从“A"到"Z”。不过你需要喜欢看书。
关于在线课程,如果讲师准备得很有条理性的话就很好。这会促进你的学习,特别是如果你喜欢通过看视频来学习。
关于培训班,这是一个集中式的编程训练,你可以从中获益许多。如果你喜欢在一个群体中和其他人一起学习的话这是一个好方法。

只是我要提醒你注意的是不要用没有系统性、条理性并且(体系)并不完整的学习方法。试想你已经从YouTube在线视频上学习了50%的相关课程(因为这是免费的!),不过突然就没有了后面的部分。你又要去找其他课程,可是在其它课程中有一些你并不知道的相关知识(因为你没有完整的过一遍),也有一些你知道的知识,并且这些知识是以完全不同的方式来讲授的,这很让人沮丧!所以,对于初学者,一定要满足于那些从“A”到“Z”的课程。
最后,我喜欢提出一个很重要的问题。我看到一些人建议初学者要通过去看英文资料来学习,其实这些人根本就不知道他们在做什么。当你只是一个初学者时,不要让你的学习之路很艰难! 如果你喜欢用你的母语去学习,那么就用啊。为什么你要通过外国语言来学习编程?这真是糟糕透顶的建议,当你说的是英语时你可以从德语书中学习西班牙语,或者当你说的是日语时你可以从加拿大书里面学习波兰语,这可能吗?是的,不过为什么一定要呢?

扫描二维码关注公众号,回复: 8692996 查看本文章

4-定下一个目标

通常在你计划你的工作生涯时会忽视目标的制定。人们开始学一个东西了,然后又停下来,当时间不可避免地流逝时又马上去报培训班。几个月下来你不会记住之前你学习了什么内容。这就像你学习了一些东西,不过你又完成了相关的哪些具体的成就呢?
为了让学习简单点,设立目标是很必要的。比如你可以发誓要在一个月之内阅读完一个800页的书,或者你要完成大学学业,又或者你要在六个月内一定要找到一个初级开发者的工作。
所有的事都会因为你设了一个目标而变得更好。目标让生活变得更容易,这是有关于我们人的本性的。我并不是说学习编程很简单,学习编程需要离开计划表亲自去做的,这就是为什么目标是很重要的。而且到达你的目标后你会有很大的满足感,从而激励你去更深入的学习。

5-系统性学习

当你已经有了一个目标时,下一步就是制作一个学习计划表。 比如每天拿出一个小时出来学习。这一小时不是单单上网课或者看相关文章,而是一定要学到一些有意义的东西。
是否还有其他方法让此变得更简单点?那就是学习时保持大脑的专注(Mind Fucus)。 一定要很专注、认真,不妨这样这样—向所有人宣布:在下午六点我要学习一个小时的编程,你们不要打扰我!然后关机,登出Facebook。把孩子交给岳父岳母,把狗交给邻居。看看你会学到多少的东西!你需要把你从这个世界中分离出来,去真正地获得对编程的理解。

6-亲手敲代码

我在领英上关注了一个令人赞叹的初级软件开发者。她发现了一个练习编程的很好的方法:每天她都设了一个小目标-敲点什么东西。比如,其中的一天:一个简单的计算器。第二天:一个简单的有电影封面的页面。她会创建一个关于她做了什么的动态GIF并发在领英上,她会记录她那一天学到了什么。 我很喜欢关注她的动态,因为她会创造一些十分出色的微型项目。鉴于此,在我早年间我就运用她的方法学习。我知道的每个优秀的软件开发者也会这么做。想出任务然后编程实现,这就是成为一个软件开发者的方法。
显而易见,当你开始学习时,或者工作或者报一个培训班或者看书,跟着样例敲代码很容易,因为你不需要亲自思考如何敲代码来完成一个任务,这也是一个好的方法。不过有时样例任务是很枯燥的,那么如果你亲自解决一个任务时会是怎么样的呢?—你会遇到一些障碍,这些障碍会让你精确定位你应该学习什么来继续完成你的任务。

7-寻求帮助

现在让我们谈谈问题,所有人初学编程时很难说出他/她有什么问题。比如,当一个bug出现在一个应用里时,你如何用文字来表述这个问题?如何针对这个问题求助?有时这很困难,人们并不知道有什么词汇能表述(articulate)一个 DuckDuckGo 问题的求助。很多年以前这要更容易一点,因为有Stackoverflow和帮助群组,在那里你可以问任何问题,你可以在那里得到他人的帮助。
今天你会看到一些类似于“自己google”或者“这个问题已经被问过了”或者“下一个”的回答,这很令人挫败。不幸的是,互联网上充满着类似的答案。高级软件开发人员难以理解初级软件开发者的是他们很难去正确命名(name)一个问题。即使这些都是相同的问题!我能向你保证这一点。因此我强烈建议你问问题。在互联网上在一个好的相关平台,或者找一个导师(mentor),然后就问问问!有时你会因为含糊不清的回答而受挫(stumble upon a hesitation),不过这不应该把你击倒。如果是这样的话,换一个更好的平台问问题!
问得越多,那么你表达相关问题的能力就会越强。熬过这段时间,你的问题就会变得越来越好,回答也会出现得越来越快。不久之后,你会发现一些问题会仅仅通过想出如何表述此问题而解决。

8-尽快找工作

我经常了解到人们在他们学更多东西后才去找工作,这通常要花上大半年的时间。软件开发是一个你需要不断更新你相关知识的行当。让我们假设你已经学会了3-4个你需要的技术,然后你开始找工作,但是却很难一时找到。然你会花几个月的时间来找工作!并且在这个过程中,你会忘记半数你已经学到的东西。
所以我的建议是你应该在你的学习路线已经完成一半后就开始着手去找工作,对此有几点理由:首先如果你是一个实习生,或者实在一个初级的工作职位,你的老板会假设你几乎什么也不知道。第二,找工作本身就要花时间。在你细细雕琢你的简历时,当你在网上学习了预设模板和面试问题时,当你练习面谈时如何使谈话清晰明了并且克服紧张情绪时,时间会被消耗掉。找工作也是你需要学习的。
所以你的学习计划一旦过了一半便要开始去找工作了,投递你的简历,安排好时间去面试,并且要做到习惯于此。这样下去你的技能方面的准备(readiness)就能满足招聘的要求(readiness)并且不会有任何(学习与找工作)时间的间隙(lags)。

9-寻求更多的复杂的工作任务

现在你已经有了一个工作,可是编程行业的最大的陷阱正在前面等着你呢。 既然你有了一个工作,你就可以撇开书本然后只做你被要求要做的工作。并不是这样的!你要明白实习生或者初级程序员并不会被要求完成复杂的工作任务,而是完成一些十分简单的任务。不久你会注意到,你会花越来越少的时间去完成这些任务,之后你就会觉得很枯燥。对此如果你不解决的话,你就是在浪费你的时间。你完全可以去学习新的东西,而不是在一个圆圈里不断转圈。基于此,当新人工作停滞不前时(stands still),你的老板会看得很清楚。我就是一个老板,这些(新人的状态)就和蓝天一样透彻可知(as clear as the sky),并且没有一个人希望要一个浪费时间的员工。
所以,如你所见,当你变得越来越熟练时,去向你的上司请求更多的复杂的任务,他/她应该会知道给你相应的更复杂的任务,这对于在工作时保持你的学习和提高自我很重要。
作为一个新人,你需要学习更多,更多的更多。我100%保证你不会想成为一些人的一员,这类人在网上说实习生或初级程序员职位并没有给他们一点东西,他们从中什么也没学到,(其实是因为)他们不会去学习,因为他们不想走得更远,他们是在浪费他们和他们老板的时间。

10-掌握新的技术

编程是一个棒极了的行业,不过它也在随时变化。你今天所学的,一年后就会过时(outdated),在五年后就会落后(obsolete )。 当你找到一个工作并感觉很舒服的时候,去掌握新的东西吧。增长(expand)你的技能,不要在你的职业发展中停滞不前。如果你已经停止了学习,回头重拾学习是很值得的。报一个培训班,看书,参加线上课程,无论如何也要保证你是跟着技术发展而发展的。

这就是你所需要的从零开始学习编程的步骤,这真的是一个很长的文章,我很惊讶你已经坚持读到末尾了。我敢肯定99%的人做不到这点。这就表示你真的有心于成为一名软件开发者。用心(caring)是成功所需的99%,祝你一切好运!
编程很棒,并且能给我们许多专业上的满足感。不要不用心地对待它,坚持吧,一步接着一步。
注:英语并不是我的母语,如果你发现关于本回答的任何错误,请提出来!您的大名会被我在这篇回答中提到的,谢谢!
注的二次修订:英语也不是我的母语,所以你发现翻译过程中有任何不达意的地方,请提出来,您也会被我在这本文提到的,谢谢各位前辈指导!
原文链接:https://www.quora.com/What-are-some-of-the-best-ways-to-learn-programming/answer/Tomasz-Smykowski?ch=10&share=4c2bc6d8&srid=hfLTW

发布了5 篇原创文章 · 获赞 2 · 访问量 250

猜你喜欢

转载自blog.csdn.net/imNicolas__/article/details/103918669