愚者困惑 智者提问

一、编程语言

二、编程技术体系

2.1 编程基础

2.1.1 操作系统

2.1.2 数据结构

2.1.3 编译原理

2.1.4 计算机组成原理

2.1.5 算法

2.2 编程语言

2.3 编程素质

2.3.1 编程规范

2.3.2 软件工程

2.3.3 设计模式

2.4 编程应用

三、编程语言分类

四、初学语言选择

五、学习方法


一、编程语言

在这里举个通俗易懂的例子:我们在日常交流中,和中国人交流使用中文,和美国人交流使用英语,和韩国人交流使用韩语……那么和计算机交流就要使用到我们所说的编程语言。

二、编程技术体系

知其然知其所以然,想要学好编程,首先要了解编程的技术体系。

2.1 编程基础

2.1.1 操作系统

计算机系统由硬件和软件两部分组成,操作系统是配置在计算机硬件上的第一层软件,在计算机系统中占据重要的地位,是计算机科学技术、管理信息系统及相关专业的一门专业基础课。操作系统主要内容包括操作系统的概念、发展历史、分类、功能、特征及进一步的发展,作业管理与用户接口,进程管理,处理机调度,存储管理,文件管理,输入输出设备管理等。大部分编程研发都是基于windows或Linux平台,程序是运行于操作系统之上,受操作系统的管理和调度,所以操作系统是至关重要的一个内容。

2.1.2 数据结构

数据结构是面向计算机科学与技术、信息安全、物联网工程专业的本科学生开设的专业核心必修课程。数据结构可以使得熟练地掌握在程序设计应用中,特别是在软件系统的非数值计算类应用方面,常用数据模型以及实现方法;熟练建模的基本方法以及在计算机科学与工程中的基本应用;在高级语言程序设计课程的学习基础之上,进一步提高程序设计的综合能力;在理论和方法上,奠定后续专业课程学习的基础。

2.1.3 编译原理

编译原理主要介绍程序设计语言编译程序构造的基本原理和设计方法,包括:编译程序概述、高级语言及其语法描述、词法分析、语法分析、属性文法和语法制导翻译、语义分析和中间代码产生、符号表、运行时存储空间组织、优化、目标代码生成等。

2.1.4 计算机组成原理

计算机组成原理可以帮助理解计算机基本组成部件(包括运算器、控制器、存储器、输入/输出)的结构、工作原理、内部运行机制和设计方法。加深对计算机软、硬件系统的整体化理解,建立硬件/软件协同的整机概念,并有效增强计算机系统设计能力。

2.1.5 算法

经典算法,包括递归与分治算法、动态规划算法、贪心算法、回溯算法、分支界限算法的基本原理、实现方法和应用实例,使之熟悉算法复杂性分析理论和评价算法性能的标准,掌握基本的算法设计方法,能运用一些常用算法去分析和解决实际问题,具有较强的问题抽象和建模的能力,可以进一步分析和解决计算机科学与技术领域的复杂工程问题奠定良好的基础。

2.2 编程语言

编程语言可以简单的理解为一种计算机和人都能识别的语言。编程语言处在不断的发展和变化中,从最初的机器语言发展到如今的2500种以上的高级语言,每种语言都有其特定的用途和不同的发展轨迹。

2.3 编程素质

2.3.1 编程规范

高质量代码有三要素:可读性、可维护性、可变更性。

  • 可读性:不要编写大段的代码,合理的命名,适当的注释。
  • 可维护性:预测可能发生的变化,代码不能写死。
  • 可变更性:通过提高代码复用提高可维护性,利用设计模式提高可变更性,职责驱动设计和领域驱动设计。

2.3.2 软件工程

软件工程是将工程化的方法运用到软件的开发、运行和维护之中,以达到提高软件质量,降低开发成本的目的。

2.3.3 设计模式

设计模式是针对软件开发中经常遇到的一些设计问题,根据基本的设计原则,总结出来的一套实用的解决方案或者设计思路。

2.4 编程应用

应用方向主要技术应用领域
前端开发HTML、CSS、JS、jQuery等网站、小程序、WebApp开发等
安全方向密码学与编码、服务器完全、逆向工程等应用安全、风控、数据安全等
应用测试黑盒测试、白盒测试等性能测试工程师 、测试开发等
人工智能计算机视觉、机器学习、自然语言处理等机器翻译、自己能控制、专家系统等
大数据技术数据的采集、数据预处理、分布式存储等大数据分析师、、大数据研发工程师等
………………………………

三、编程语言分类

  1. 按照语言的抽象等级,由低到高分为机器语言、汇编语言与高级语言;
  2. 按照程序设计方法,分为面向过程与面向对象编程语言;
  3. 按照语言所编写的程序的执行方式,分为编译型、解释型与混合型语言;混合型指的是先编译为中间代码,再解释执行。
  4. 按照程序在运行时能否改变结构,分为动态语言与静态语言。运行时可以改变结构的为动态语言,反之为静态语言。改变结构指的是运行时代码可被动态改变,比如添加新的代码、更改对象定义(如为对象新增属性与方法);
  5. 按照变量是否需要指明类型,分为强类型语言与弱类型语言,需要则为强类型语言,不需要则为弱类型语言。强类型语言要求变量的使用要严格符合定义的类型,所有变量都必须先定义后使用。弱类型语言则恰恰相反,变量无需事先定义,数据类型可以被忽略,一个变量可以赋不同数据类型的值。

四、初学语言选择

编程语言处在不断的发展和变化中,从最初的机器语言发展到如今的2500种以上的高级语言,每种语言都有其特定的用途和不同的发展轨迹。选择合适的语言更有助于编程的学习和方便快捷的工作。

  • Java:据TIOBE的数据显示,几十年来,Java比其他语言更常名列榜首。许多知名公司使用Java来开发软件和应用程序,所以如果你碰巧使用Java,绝对不必为找工作而苦恼。Java受欢迎的主要原因是它拥有可移植性、可扩展性和庞大的用户社区。
  • C语言:最古老的编程语言之一,由于其可移植性,微软、Oracle和苹果等科技巨头采用它。它与几乎所有系统兼容,很适合操作系统和嵌入式系统。
  • C ++:在20世纪80年代开发而成,现在仍应用于从桌面Web应用程序到服务器基础设施的众多系统。具有灵活性、高性能以及可用于多种环境的特性。以C++为业的工作通常需要开发面向性能密集型任务的桌面应用程序。掌握C++可以更深入地了解编程语言,帮助获得低级内存处理方面的技能。
  • Python:作为如今人工智能、机器学习、大数据和机器人等一些最有前途的技术背后的主要语言,Python近年来积累了庞大的粉丝群。你会惊讶地发现学习Python很容易,这就是为什么许多经验丰富的开发人员选择Python作为第二或第三语言的原因。
  • C#:一种现代的面向对象编程语言,由微软开发,与当时商业软件开发人员广泛使用的Java相抗衡。它专为在微软平台上开发应用程序而设计,需要Windows上的.NET框架才能工作。可以使用C#开发几乎所有应用程序,但它尤其擅长于Windows桌面应用程序和游戏开发。
  • JavaScript:超过90%的网站使用这种语言,它也是初学者开始上手的最友好的编程语言之一。所以,如果你掌握JavaScript,根本不缺机会。然而,你需要学习其他支持性的语言和框架,才能成为主攻桌面和移动应用程序或游戏开发的专业的前端开发人员。
  • Go:谷歌公司推出的一款相对较新的语言,对于web服务器开发、网络开发以及命令行程序开发来说,它是又一个比较优秀的选择。
  • …………

在此推荐初学者首先进行c语言的学习,由于运行时环境相对小巧,因此C是保持这种系统精简的完美选择。它实际上是编程语言的通用语言,已催生出了同样很受欢迎的衍生语言,比如C++和C#。

五、学习方法

5.1 选择一门语言

根据自己对编程的了解程度和工作发展方向选择适合自己的语言。

5.2 选择渠道

无论自学还是报班学习,见仁见智,国内知识付费课程差别不一,擦亮眼睛自行选择。
5.3 课程渠道

  1. cousera,最大最全的公开课网站,类似于大学生选课,有老师布置课后作业;
  2. 优达学城(udacity),类似计算机学院开设课程,课程偏重于实战性,收费;
  3. edx,麻省理工哈佛大学联合开发;
  4. 中国大学mooc慕课,国家精品课,有app,较为方便,部分收费;
  5. 网易云课堂,偏重于实战性,有一些较为特色的课程,与多家教育机构合作,收费;
  6. 菜鸟教程(runoob.xom)编程技术网站,收录大量编程语言文档,且文档配有案例;
  7. w3school,学习所有网站建设的基础教程,从基础的html,Javasxribe,jssql;

5.4 书籍推荐

书籍配合课程的学习或许产生更好的效果,但是不要囫囵吞枣。书籍的选择各大学习网站均有推荐。
5.5 运用引擎

一名好的程序员,他的检索能力一定是强的,遇到问题第一时间不是去问人,而是自己通过自己可以翻阅的书籍、网页等渠道查找进行解决,如解决不了再找比较懂得来帮助并解答。
5.6 提升

找一个大佬,老师,知乎、博客、微博。实在搞不定再去请教
5.7 学习捷径

没有!学习没有捷径。但是学习编程有一个很笨的但很实用办法,就是用量变引起质变。在学习编程的过程中最少进行三遍代码练习:

  • 第一遍,跟随教程进行编写,学习思想;
  • 第二遍,自主默写,遇到问题查询第一遍的脚本,解决自己编写时的细节问题;
  • 第三遍,脱离教程和资料进行编写,起到复习巩固作用。

这是我能想到的,唯一可以让我既当工程师又做艺术家的工作。它要求具备极其缜密的技术思维,因为你必须要完成精确的思考,这点我很喜欢。另一方面,它又鼓励你肆意挥洒自己的创意,只有你想不到没有你做不到的。