软件开发入门指南

天天都看到不少对编程感兴趣的人在问是否是能够自学软件开发,或者应该怎么自学编程才能入门。在这篇文章里,我将尝试重现一个初学者在学习计算机编程时可能会碰到的问题,并尽可能提供相应的解决思路,但愿对初学者有所帮助。若是你在看完这篇文章后仍是有些疑惑,欢迎点击 这里 咨询我。java

目录

  1. 编程能够自学吗?
  2. 学习编程须要什么基础?
  3. 什么是编程语言?什么是程序?
  4. 我应该学习哪一种编程语言?
  5. 编程的核心思惟是什么?
  6. 应该按什么步骤学习编程语言?
  7. 学习编程有什么方法吗?

一、编程能够自学吗?

答案是确定的,并且自学是学习软件编程极其重要的一个途径。不过最好的方式是自学的同时,有一个能够帮助解决问题的同事或者老师,这样能够避免卡在一个问题上太长时间。数据库

如今有不少途径能够自学,例如IT图书,或者在线视频教程,咱们的网站 也提供一些面对初学者的免费的在线互动课程,能够边学习边实践, 你也能够尝试一下:编程

二、学习编程须要什么基础?

简单地说,只要具有正常的思惟能力,就能够学习编程。后端

让咱们从一个实际的梗来理解这一点:如何把大象装进冰箱里?服务器

你也许知道这个搞笑问题的搞笑答案:网络

frig elephant solution

这就是编程所须要的最基本的思惟能力:把一个大的问题分解为若干个小的问题,解决了小的问题,大的问题就解决了,这种分而治之的思考方法是一种至关工程化的思惟,也是科学技术在过去的两百年里的统治性思惟。机器学习

回忆一下,你在生活中难道不就是这么作的吗?编程实际上就是把生活中常见的思惟活动用编程语言表达出来的一个过程。编程语言

三、什么是编程语言?什么是程序?

若是把计算机当作一我的,编程语言就是你和计算机对话的语言,你须要用计算机能听懂的语言才能和计算机对话,就像你须要用当地的语言才能和老外沟通一个道理。函数

不过因为发明一种新的编程语言的成本至关低,而成就感至关高,所以目前已经出现了太多的编程语言。即有针对娃娃的图形化编程语言,也有中文的编程语言,更有针对不一样计算平台的编程语言,试图学习全部的编程语言是不明智的,也是毫无必要的,由于编程最重要的是思惟,语言只是向计算机表达你的思惟的一个手段而言。oop

在和计算机沟通时,一次说一句话是比较低效的,由于它会处理的很是快,大量的时间浪费在等待咱们的输入上。因此一般是写不少句话一并告诉计算机照着作,这就是咱们常说的计算机程序。例如,对于前面说到的把大象放进冰箱这个任务,能够编写以下包含三句话的计算机程序:

openFrigDoor           
putElephantIntoFrig
closeFrigDoor

基本上就是咱们的操做步骤的翻译,对吧?

四、我应该学习哪一种编程语言?

虽然编程语言不重要,可是初学者选择合适的编程语言却很是重要,由于它会影响你的学习效果和成就感的达成,并且,你终归须要选择一种编程语言才能开始学习编程。

就像你们都喜欢学英语而不是非洲某个国家的法语变种同样,一般你选择一个你们都在用的编程语言是不会有大的问题的,例如看一下权威的TIOBE编程语言排行榜2019年3月的统计:

<table class="table table-striped table-top20"> <thead><tr> <th>Mar 2019</th> <th>Mar 2018</th> <th>Change</th> <th>Programming Language</th> <th>Ratings</th> <th>Change</th> </tr></thead> <tbody> <tr><td>1</td><td>1</td><td></td><td>Java</td><td>14.880%</td><td>-0.06%</td></tr><tr><td>2</td><td>2</td><td></td><td>C</td><td>13.305%</td><td>+0.55%</td></tr><tr><td>3</td><td>4</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/up.png" alt="change"></td><td>Python</td><td>8.262%</td><td>+2.39%</td></tr><tr><td>4</td><td>3</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/down.png" alt="change"></td><td>C++</td><td>8.126%</td><td>+1.67%</td></tr><tr><td>5</td><td>6</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/up.png" alt="change"></td><td>Visual Basic .NET</td><td>6.429%</td><td>+2.34%</td></tr><tr><td>6</td><td>5</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/down.png" alt="change"></td><td>C#</td><td>3.267%</td><td>-1.80%</td></tr><tr><td>7</td><td>8</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/up.png" alt="change"></td><td>JavaScript</td><td>2.426%</td><td>-1.49%</td></tr><tr><td>8</td><td>7</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/down.png" alt="change"></td><td>PHP</td><td>2.420%</td><td>-1.59%</td></tr><tr><td>9</td><td>10</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/up.png" alt="change"></td><td>SQL</td><td>1.926%</td><td>-0.76%</td></tr><tr><td>10</td><td>14</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/upup.png" alt="change"></td><td>Objective-C</td><td>1.681%</td><td>-0.09%</td></tr><tr><td>11</td><td>18</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/upup.png" alt="change"></td><td>MATLAB</td><td>1.469%</td><td>+0.06%</td></tr><tr><td>12</td><td>16</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/upup.png" alt="change"></td><td>Assembly language</td><td>1.413%</td><td>-0.29%</td></tr><tr><td>13</td><td>11</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/down.png" alt="change"></td><td>Perl</td><td>1.302%</td><td>-0.93%</td></tr><tr><td>14</td><td>20</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/upup.png" alt="change"></td><td>R</td><td>1.278%</td><td>+0.15%</td></tr><tr><td>15</td><td>9</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/downdown.png" alt="change"></td><td>Ruby</td><td>1.202%</td><td>-1.54%</td></tr><tr><td>16</td><td>60</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/upup.png" alt="change"></td><td>Groovy</td><td>1.178%</td><td>+1.04%</td></tr><tr><td>17</td><td>12</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/downdown.png" alt="change"></td><td>Swift</td><td>1.158%</td><td>-0.99%</td></tr><tr><td>18</td><td>17</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/down.png" alt="change"></td><td>Go</td><td>1.016%</td><td>-0.43%</td></tr><tr><td>19</td><td>13</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/downdown.png" alt="change"></td><td>Delphi/Object Pascal</td><td>1.012%</td><td>-0.78%</td></tr><tr><td>20</td><td>15</td><td><img src="http://blog.hubwiz.com/2019/03/25/how-to-learn-coding/downdown.png" alt="change"></td><td>Visual Basic</td><td>0.954%</td><td>-0.79%</td></tr> </tbody> </table>

不过贸然地从众选择并不适合全部的状况,每种编程语言都有它特定的优点领域和优点生态, 我尝试根据你学编程的目的以及特定领域从业企业的主流选择给出适合初学者的几种选择, 但更细化地分析远远超出了本文的范围:

<table class="table table-striped"> <thead> <tr><th>学习目的</th><th>推荐编程语言</th><th>推荐理由</th></tr> </thead> <tbody> <tr><td>只是玩玩</td><td>JavaScript</td><td>随处能够找到运行环境,容易得到成就感</td></tr> <tr><td>开发网页应用或网站</td><td>JavaScript</td><td>只有JavaScript能够支持单一语言先后端全栈开发</td></tr> <tr><td>开发安卓应用</td><td>kotlin、java</td><td>Kotlin是趋势,Java更通用</td></tr> <tr><td>开发苹果应用</td><td>Swift、Object-C</td><td>Swift是趋势,初学者不要选Object-C</td></tr> <tr><td>开发游戏</td><td>C#、JavaScript、C/C++</td><td>C#是由于Unity的存在,JavaScript更适合网页游戏,C/C++更适合网络端游</td></tr> <tr><td>开发数据分析或机器学习应用</td><td>Python、Julia、R</td><td>Python是这一领域当之无愧的王者,Julia是值得关注的趋势语言,R在数据分析上有本身的价值</td></tr> <tr><td>开发企业应用</td><td>Java、C#</td><td>去偏传统的IT公司工做的最佳语言是Java和C#,工做机会很是多</td></tr> <tr><td>开发嵌入应用</td><td>C、Assembly Language</td><td>穿戴设备或IOT软件的运行环境受限,须要这种底层的语言</td></tr> <tr><td>开发服务端应用</td><td>JavaScript、Go</td><td>JavaScript是由于NodeJS的存在,Go是由于它为网络服务应用开发专门进行了优化</td></tr> </tbody> </table>

若是你目前尚未明确的学习目的或者倾向性,我推荐两种语言:JavaScriptPython。 这两种语言都有很好的生态,意思是当你须要帮助或者须要使用第三方代码时比较容易获取。若是你有意向数据分析/机器学习/人工智能方向发展,那么选择Python,其余状况,选择JavaScript。

不管如何,仍是建议你首先考虑本身学习编程的目的是什么,有哪一个方向是本身感兴趣而且愿意付出时间和努力的,毕竟,兴趣是最好的老师。

五、编程的核心思惟是什么?

在机器学习成为显学以前,传统的编程思惟只有一条主线,就是逻辑的表达:把你解决问题的思惟,用特定的编程语言表达出来,整理出程序让计算机去执行。这须要你把目标问题分解成一个一个的已经解决的小问题,而后再把这些小问题的解决方案整合成最终的完整解决方案。

理论上只须要三种整合手段就能够实现任何计算任务:顺序、条件判断和跳转:

traditional logic

第一种就是咱们解决大象问题时用到的,顺序整合逻辑,依次执行分解后的解决方案就能够获得最终的解决方案。顺序执行是最基本的整合逻辑,它为程序的编写奠基了基础。

第二种关键的整合手段是条件判断,意思是须要根据执行时的实际状况判断是执行方案A仍是执行方案B,这个看起来极其简单的判断逻辑事实上是程序展示出变幻无穷的核心所在。你能够在不少软件里观察到条件判断的存在,例如高铁的烟感探测软件只有在检测到有人在车箱内抽烟时才会报警,而游戏只有在你击杀大BOSS以后才会通关,或者12306检测到你成功识别了它至关有情趣的验证码以后才容许你登陆...

12306 challenge

第三种整合手段是跳转,这使得程序能够改变执行的前后流程,从而改变程序的运行效果。实际上条件判断以后执行的就是一种规范化的跳转,例如跳过方案A的片断或者跳过方案B的片断。

循环则是另外一种常见的规范化跳转,它可让咱们将一个方案重复执行若干次,而不是在程序中将这个方案复制若干次。例如,当须要咱们编写程序实现猴子吃香蕉的任务时,能够看到使用朴素的顺序整合与循环整合的区别:

use loop

所以,在传统意义上的编程,其核心思惟就是目标任务的分解与解决方案的整合,将目标任务 分解细化到你已有的解决方案层面,再使用以上三种手段进行整合。

软件2.0

在机器学习兴盛以前,几乎全部的软件都是规则逻辑的表达,开发者须要对任务进行分解,理清每个细节的解决方案,而后再整合到一块儿。虽然技术不断地更迭,也不断出现新的开发语言和领域模型,可是这一基本的思路是历来没有变化过的。

不过机器学习尤为是最近十年深度学习的兴起,已经逐渐产生了一种新的软件开发范式,这种新的范式被Tesla的AI主管Andrej Karpathy称为 软件2.0 。若是你学习编程的目的是要进入人工智能领域,但愿这部分的内容对你有所帮助。

在传统的编程中,开发者是规则的制定者,这些规则以程序的形式存在,而计算机则仅仅负责执行,也许因为开发者的某个疏忽可能会致使程序的运行出人意料,但总体上来说开发者是程序的强力操控者,全部的执行逻辑是开发者的思惟的展现。

可是在软件2.0中,开发者只是实现一个基准的程序,而大量具体化的处理规则是这个基准程序经过对大量数据的处理而得出的,也就是说,程序执行的规则一部分由开发者设定(被称为模型的超参数),而另外一部分规则倒是由程序本身经过与数据的磨合优化出来的。

例如,人脸识别已经从早期的手工设计用于识别的特征进化到由深度神经网络自动从大量标注数据中提取特征:

cnn

软件2.0中的基准程序须要更高层级的抽象,而不局限在一事一议的具体问题解决的逻辑表述上。在目前这一层主要是利用人工神经网络来实现的,程序自主学习的规则体如今神经元的链接权重调整上。所以软件2.0的开发范式,其核心思惟就是设计适合问题领域的模型,而后用数据来优化出模型的参数。

软件2.0还处于极其早期的萌芽阶段,但很是值得初学者关注,它的发展也许会最终改变软件开发的模式,虽然我确信在至关长的时间内编程做为一种工做而言都不会消失。

六、应该按什么步骤学习编程语言?

编程是须要熟练的掌握一些基本技能的,由于须要用这些基本技能来组合出来针对特定问题的解决方案。当你仍是一张白纸的时候,即便了解了顺序、条件判断或者跳转、循环之类的思惟也解决不了具体问题,由于分解到最后仍是找不到可用的武器。

编程语言是你的第一个武器,要用好这个武器,就须要尽量多的了解一个编程语言的能力。能够参考下面的问题探索编程语言的能力:

一、这个编程语言怎么定义变量、函数或者类?

变量是让同一段程序可以适应各类执行环境的必备品,在程序中顺利地使用变量意味着你有了初步的抽象能力。几乎全部的编程语言都支持变量,那么先了解一个编程语言如何定义变量、如何给变量赋初值是理所应当的。

例如,你要编写的程序可能有不少个注册用户,而你的程序核心逻辑并不须要根据用户的不一样而区别对待,那么将注册用户抽象成一个变量来编写你的程序逻辑就是合理的选择:

variable

函数(或者过程)是组织可复用代码的一种经常使用手段。若是有一个功能你会在多个地方使用,那么把这个功能封装到一个函数里是常见的代码复用手段,这样就避免了一样的实现代码在程序的不一样地方重复出现,优化了代码,也更容易维护。

若是说函数是对计算机原生的顺序过程化思惟的一种优化组合方法,那么类则是面向对象的软件设计思惟的优化组合方式,不妨简单地把面向对象视为对现实世界中的实体对象以及相互关系的模拟,例如能够把全部的用户视为一个类,由于在咱们的程序中这些用户有一些共同的特性和方法。

二、这个编程语言怎么表达顺序、条件判断、跳转或循环逻辑?

就像前面说到的,这些组合手段用来把程序的各部分拼装在一块儿,所以是必须掌握的。

三、这个编程语言提供了哪些基准解决方案?

所谓基准解决方案就是能够解决某个单一问题的方案,例如:怎么输出一句话、显示一个图片或者访问服务器上的数据库。一般一个编程语言都会提供一些内置的基准解决方案,以函数或者类的形式提供给开发者,这些函数或者类,就是咱们常说的API —— 应用开发接口。

所以在了解了编程语言的基础语法以后,须要学习的就是编程语言提供的API的使用方法。虽然不须要逐个验证每一个API的功能,可是强烈建议你设定一些问题,而后带着这些问题找出能够解决这些问题的API进行练习 —— 这些API是你解决具体问题的基础。

四、这个编程语言有哪些优秀的第三方开发包?

大多数的编程语言都采用开发包的形式支持第三方提供扩展解决方案,以便开发者能够根据本身的领域需求进行选择。了解你选择的编程语言有哪些经常使用的开发包是很是重要的一件事,这能够避免你从新发明轮子,提升学习效率。

例如,一样是学习Python,若是你的目标是要开发Web应用,那么须要了解的就是Flask之类的Web开发包,而若是你的目标是要开发机器学习/深度学习应用,那么须要了解的就是numpy、scikit-learn这些开发包了:

packages

七、学习编程有什么方法吗?

毋庸置疑,和学习其余知识或技能同样,学习编程也须要掌握正确的方法。

一、多实践基准API

第一个学习方法就是多实践,只有思路是远远不够的。过于强调看书看视频而忽略实践的结果就是眼高手低。你看到一个问题,思路上以为行得通,可是却怎么也实现不出来。这是由于编程须要精确地考虑并实现每个细节,若是只是粗线条的理解,是很难达到学习目标的。

那么怎么才能多实践?应该多模拟一些实战项目吗?

不是这样的。在早期的学习中,不该该参与复杂的实战项目,而是应该尽量多的了解编程语言的能力,好比练习它的基础API的使用方法、练习它的扩展包的API的使用方法。一个实践任务必定不要包含太多的代码,最好聚焦于一个API,尽量地理解它的用法,以及它对应的抽象模型的内在机制。

有的时候一个API用起来很简单,可是它有对应的抽象模型存在,这个模型并不容易一下理解。例如当你学习JavaScript操做网页的时候,就会接触到文档对象模型、Flex盒模型等诸多抽象,在这种状况下,建议你先遵循黑盒法则,就是先了解这个模型的做用,掌握API的使用方法,而暂时忽略其内部运行机制,而后将这个不理解的问题暂且记到小本本上,留待往后解决。

因此,咱们说的多实践,不是实战项目的实践,而是在很细粒度上的实践,理想的粒度是在单一API上完成一个实践,由于API自己就体现了编程语言或开发包的设计者的初衷。

二、多问本身为何

第二个学习方法就是在学习的过程当中,多问本身一些为何,有意识地设计一些问题挑战本身,把一时解决不了的问题记录下来,带着问题继续学习。

第一种问题是在学习过程当中自发产生的,好比前面提到的,如今学习的某个知识点可能涉及到了另外一个以前不了解的知识点,若是那是一个比较难理解的知识点,那么仍是先记录下来,不要打断当前的学习思路。

第二种问题是有意识的发问。例如当你练习一个API的使用时,不妨考虑一下这几个问题:这个API可能在什么场景下能用到?为何这个API须要这些参数?这个API和以前学的哪些API常常一块儿用?

可以主动地向本身提出问题是很了不得的进步,这意味着你真正进入了主动思考的状态。

三、设定分级目标,继续实践

在实践API的时候,咱们的目标就是理解并掌握这个API的使用方法。当初步熟悉了编程语言的API以后,就能够设定下一级的目标,尝试着用已经掌握的知识去实现这个目标。不须要完成一个大程序,对于大多数状况而言,这时候试着编写一个诸如贪吃蛇这样的小游戏是合适的:

snake

固然这种阶段性的目标也是与你的最终学习目标相关的,例如,若是你的学习动力是要开发网页应用,那么这个阶段试着实现一个简单的图片分享或者博客系统都是能够的;而若是你的目标是人工智能,那么这个阶段能够试着用神经网络解决一下文本分类的问题。总之阶段性的分级目标的设定是为了给本身一个前进的动力,太高或者太低都很差。

四、在战斗中学习战斗

学习编程的目标是否是学习,而是开发出有价值的程序。所以彻底脱产的学习终究会告一段落,你可能会投入到繁忙的编程工做中去。不过这并不意味着你再也不须要学习,事实上,技术的演变是极其快速甚至剧烈的,所以别忘了:

保持积极学习的心态和敏锐的好奇心,在战斗中学习战斗!


原文连接:编程入门自学指南 — 汇智网

相关文章
相关标签/搜索