编程世界通识地图 - 上篇 - 入门指南

2020-11-16  本文已影响0人  晓晓軍

送你一张编程世界的通识地图

对于一个刚入行的程序员来说,你会发现你越往前走越感觉这是一个非常复杂的领域,会碰到很多很多不懂的东西。

当一个人去到一个非常复杂的而又陌生的世界的时候,多多少少都会感到恐惧,解决这种恐惧的办法是什么呢?

就是你要有一张地图,你知道往前走是什么,哪些是比较浅的,哪些是比较深的,这样你才可以去制定你的学习路线。

编程地图

制定你的地图

程序设计其实就是解决问题,它需要发明、创造和灵感。

对于我们来说,最重要的就是思维方式,你必须得学会对复杂的问题,进行分解。

那分解的办法是什么呢?一般就是分层和分类两种。

从水平的角度去对事物或信息进行判断和归类,就叫做分类。如果是层次上有差别的,我们进行垂直划分就叫做分层。

我们今天的这张地图是垂直划分的,共五层。

这种越基础,越朴实,越一般性的东西,我们就把它放在下面。

这种越具体,越特定的东西,我们把它放在上面。

按照这个标准,我们一共把它分为五层。

分别是:思维方式、基本原理、通用工具、基础技术和领域技术。

分类法

下面我们分别展开来聊一聊

1.思维方式

分解和隔离:分而治之,创建独立的解决方案并黏合起来。

一个好的分解方法是对分解出来的每个子问题都可以单独去创造解决方案,同时这些解决方案最后可以联合起来解决这个问题。

要想达到这种效果,需要将子问题分解得足够开,子问题与子问题之间没有足够多的耦合,同时我又能够将这些解决方案联合起来,最后串联起来形成一个解决方案。

抽象:从特殊到一般,解决越来越通用的问题

在编程领域抽象思维非常重要,它将决定你在以后的工作中是否可以偷懒。

当你解决完一个问题后,不要满足于此,而要去探索越来越通用的解决方案。

假设和验证:大胆假设,小心验证,正确归因

这个其实并不是编程所特有的,这是非常常见的科学方法,但是他在编程的工作当中会十分重要。

举个例子,比如当我们在调试程序时遇到一个问题的时候,同样的代码,别人执行没问题,换你执行就不行,到底是怎么回事呢?

这个时候你就需要做一些假设,要有办法去一点点的验证你的假设。如果不知道具体是哪一行代码有问题,就一行行打印出来,看看到底是哪出了问题,再根据你的结果去归因,到底哪里错了。

学编程就是学思维方法,但是思维方法实在是太多了,光听不练没有用,只有在实践中遇到了,去反思,去琢磨,才能悟到其中的关键点。

2.基本原理

基本原理从字面上理解就是隐藏在具体事物下面的本质和原理。比如:面向对象很多人认为只有object,class,其实也不一定。

比如:我们常用的Rest架构风格,就是那种REST API的格式,它也非常的面向对象,因为它本质就是以资源为中心而不是以操作为中心。

面向对象就是把对象作为中心,而把对象的属性和它做所的事情围绕它来组织,这就是面向对象的思维方法。

理解关键的原理有助于触类旁通,举一反三。

引用第一届图灵奖主席Alan Perlis的一句话:

如果一门编程语言,不能影响你对编程的一些思维方法的话,那么你就不值得去学。

所以我们学习一门语言或者一个技术,绝不能只是学习表面上的东西,而要去学习它的一些特色,这样在以后碰到相关的技术时,学起来就会轻车熟路。

有一些原理是可以在实践中去学习的,但是如果你打算在编程这个行业深耕,那么系统化的原理学习,是迟早都要学的,否则你学任何技术都很难突破。

这里我分享三个比较重要的原理给大家,一起学习。

计算机系统

它是了解计算机硬件的抽象模型,以及学习如何用程序来调用这些硬件资源。只要你想编一些原生应用(Native Apps),无论是桌面应用、手机应用、Windows、Mac OS、iOS、Android或者任何其它的智能设备,这些都是关键的基础。

这里推荐《深入理解计算机系统》这本书给大家,我们需要从程序员的视角去看计算机系统,学完这本书,计算机系统就通了。

算法理论

算法和数据结构,这个主要是了解计算机程序的开销,可能不同的程序对同一个问题都能够给出同一个结果,可是这个程序占用的系统资源与花费的时间是不同的。

这块骨头很难啃,我也一直没有突破。

学习算法理论,最重要的是,它提供了一套完整的体系来分析一个程序的时间和空间复杂度。

学完这个才具备程序性能的概念,而不仅仅是实现一些具体的功能。

对于算法的学习是一个长期的过程,在学校学习的只算是入门的第一步,今后在进入特定领域时,要去学习特定的算法。比如:人工智能中的统计,数据分析等等。

网络协议栈

现在完全不碰网络的软件已经很少了,基本上都会跟网络有一些关系。

所以至少你得了解TCP/IP,HTTP以及相关的安全协议。搞清楚计算机网络是如何分层运作的。

比如:当你在浏览器中输入一个URL,然后回车,到底发生了什么?

每一层的协议是如何对话的,跟我们写的程序有什么关系?

搞清楚网络协议栈之后,你就会知道哪些问题是要在网卡、路由器、电信交换机这一层去解决的;哪些在操作系统;哪些在Web服务;哪些在我们的程序去解决。

3.通用工具

熟悉自己的操作系统,积累专属工具箱,不断提升效率

通用工具跟我们讲的基础技术其实挺像的,但是它更偏工具层面。

这里面包括不论你学什么技术都离不开这些工具,比如:命令行界面、软件包管理、各种IDE、git和GitHub等很多很多,还有的人直接在GitHub上写书,大家一起修订一起共同编写。

每个优秀的程序员都会积累一套属于自己的专属工具箱,将自己的工具技能打磨得越来越好,这样可以始终将自己保持在一个高效的状态。

我们都知道不论是Windows、Linux或者是Mac OS 都可以去编程,所以你需要熟悉自己的系统,至少需要精通一个领域,打造自己的工具箱。

Docker

这里有一个最近特别火爆的工具值得一提,那就是正在发展中的Docker,也就是所谓的容器化技术Container。

它的原理就是把一整套系统环境定义成一个Container,这个Container包含了最底下的操作系统核心,也包含了所有的系统配置和要安装的服务软件,还有你开发的软件。

你定义的时候只需要写一个脚本,然后把它发布出去,别人拿到之后,就运行这个脚本,从操作系统底层开始配置安装,最终生成一个容器,从理论上来说,这个容器运行起来最终跟你的开发环境就是一致的。

这个方案现在已经得到所有主流云服务厂商的支持。

现在DevOps越来越火,这也是因为软件的交付和部署,一直都是软件行业的一个挑战,容器化技术的普及,很有可能会让这个挑战变得没那么难,DevOps会变得前所未有的简单和标准化。

Docker近两年来越来越成熟,也越来越容易被普通开发者所使用,所以建议你用起来,我也在学习使用。

搜索引擎

搜索引擎是非常非常重要的通用工具。

你最好懂英文,英文的阅读和筛选比较快,这样你会有很多的优势。

很多人没有意识到,自己用搜索引擎的效率没有别人高。搜索引擎用的好与不好,在效率上会有非常大的区别。

同样一个问题,不同的人得到的答案就是不一样,有的人就走的是弯路,被带偏了,有的人却能从纷繁的网络素材中找到答案。

4.基础技术

基础技术是你无论从事哪个领域的开发工作都离不开的技术。

熟练掌握2~3种主流编程语言,其中之一是JavaScript

主流编程语言:C、C++、Python、Java、Switf、Go、Javascript等等

为什么是JavaScript呢?我们下面会讲

Web技术

现在主流的互联网应用里面,最底层的后端技术,比如:集群,异地灾备,流控等等,五花八门。这些技术通常都是需要根据你的具体场景,你的业务需求去设计实现。你要去做非常复杂的研究和取舍,这个是少数架构师和非常高阶的程序员的乐园。

比如:像阿里云这样的大型云厂商,在最底层的后端服务这一块都已经给你产品化了,你只需要购买他的服务,按照他的要求去配置,对接,使用就好了。核心的技术难点,都不需要你来操心,使用起来已经非常方便。

所以说大部分程序员是不需要去做这件事情的,也是没有机会去做这些事情的。

大部分偏前一点的后端程序员主要是在做业务服务,也就是REST API的开发。这部分的重点是API的设计,尤其是复杂的业务模块之间的联动耦合如何设计。

这也意味着所有前端应用面对的都是REST API,从这一点也可以看出,浏览器技术使得Web前端的技术开发跨平台的优势越来越大。

现在比较流行的一种方案就是在原生应用中嵌入Web技术,这会带来开发工作量的下降,测试也容易。

另外一方面,就是当你有一些基础的想法,还没有产品化时,使用Web前端技术来开发,是成本最小,实现最快的。这也是为什么,不管什么领域只要你会前端,都会极大的提升你的效率。

这也是我为什么说,每个人都需要熟练掌握JavaScript的道理,所有领域只要你会前端都能提高你的效率。

关系型数据库和SQL

为什么我们要学习关系型数据库?

因为我们这个世界,对数据的依赖会越来越重。而对数据的使用会逐渐变成越来越通用的技术,就像你会使用WPS软件一样。

而这个时候,你懂关系模型,你懂关系原理,你会用SQL来操作一些数据,你会拥有极大的优势。甚至你不是程序员,你是一个运营人员,财务人员都会有很大的优势。

5.领域技术

领域技术涉及的面很多,这一篇文章篇幅太长,我们下次再讲几个我比较关注的领域方向,分别是:移动app开发、Web前端开发、后端业务开发、数据相关、人工智能相关以及运维和DevOps。

领域技术

Ps:本文整理自李骏老师的口头分享

上一篇 下一篇

猜你喜欢

热点阅读