谈一谈入门一种或多种开发语言的套路?

说到开发语言,常见的有Java、C、C++、JavaScript、PHP、C#以及Perl等等(其实现在全世界的计算机开发语言不下200种,可以到wikipedia上搜索),太多了一一列举出来意义也不大,我们暂且在这里分一下类吧:

1.硬件驱动类:汇编、C之类的 常见于硬件接口编程、嵌入式设备等。
2.底层开发类:C、C++之类,比如各种核心引擎、生物识别、自然语言处理、图像识别等。
3.上层服务类:Java、C#较多,当然也有一部分Node JS、Php、Perl等。
4.PC桌面开发:C++、VB、Dephi等。
5.Web端开发:JavaScript、HTML、CSS、Flash等。
6.移动端开发:Java、Object-C等。
7.数据库开发:SQL为代表的各种关系型数据库,也有一些非关系型数据库等。

标题没敢用精通二字,怕遭到吊打,就像现在稍微有水平的人简历中就会避免精通二字一样,也代表着一种谦虚进取的态度。这是题外话,这里要说的是,上面那么多种语言,如果要选一门或者多门该如何开始呢?

俗一点:谈一谈入门一种或多种开发语言的套路?

我们先聊聊定位,眼界不同,对开发语言在软件开发周期中的定位也不同:

1.对于一个初级工程师来讲,开发语言几乎是全部,因为可能开始也看不到软件开发周期的全部,只好将语言作为一个突破口,先做再说。
2.对于一个高级工程师来讲,开发语言是我们的利器,这个时候会觉得自信满满,没有自己做不出来的东西。
3.对于一个资深工程师来讲,开发语言虽然贯穿始终,但这个时候已然把它作为一个工具,因为自己的除了写代码,还有设计模式、系统安全、性能等需要考虑。
4.对于一个开发领域的专家来讲,开发语言只是甜甜圈,因为你要出的是这个领域内的完整方案,一个方案可能会包含很多子系统以及模块,不同的部分会需要各式各样的开发语言,这个时候我们会经历:前期需求论证、系统设计、语言及框架选型等各个阶段。
5.作为一个CTO来讲:因为自己还没做到CTO,等以后做了CTO再回来完善这一段,防止被大家吊打。-_-

到这里有人可能会有些着急,怎么还不说怎么开始呢。抱歉再略微等下,我们上面说了语言分类语言定位,接下来我们还要把编程基础也聊了。我们暂且把编程基础分为四类:文件系统、内存管理、图形编程、通信&协议。

从这个分类可以看出来,到这里基本上还没开发语言什么事,而且现在近乎所有的应用,万变不离其宗,都是在这四个分类的基础上衍生的。

文件系统:我们的代码、图像、视频、声音、文档等等都是以文件的形式存在的,不管要做底层开发、web开发、移动等,都需要依赖于文件,和文件打交道。而且绝大数语言也都提供了文件操作能力,我们首先需要了解如下一些点:

1.文件存储在哪?由这个带出来我们要了解市面上常见的存储设备。
2.文件的操作权限
3.文件大概分为哪些种类?文档类、图像类、纯文本、流式等
4.文件和目录的读、写、移动、复制、删除、压缩等基础操作。

无论要入门哪种语言,或者说想成为一个开发者,必须要把文件系统的大概原理和常见操作都先摸清楚,这样后续学语言,只目的性就很强,效率也会高。当然后续进阶之后还需要对自己的程序能达到的文件规模,要有预估和预案。
内存管理:曾经服务的一家公司CTO说过,编程思想的核心体现就在内存的管理能力上,是指软件运行时对计算机内存资源的分配和使用的技术。
该怎么使用内存,需要考虑方方面面,简单列举几个:

1.可用内存是多大?
2.我需要多少内存?
3.什么时候申请内存?
4.什么时候释放内存?
5.资源的加锁解锁
6.为局部内存还是全局内存?

早期的编程语言,内存有申请就必须要释放,不然那些不用的区块就会成为孤魂野鬼,程序也容易出问题。虽然现在像Java C# JS之类的都不需要在编程阶段过多的考虑资源申请释放问题,但运行阶段一样需要关注内存使用,所以我们才要去做监控做报警,内存使用往往决定着程序的稳定性。
上面这些书籍和网络上资料堆积如山,在这里不再多说,到什么程度才算是内存管理能力达标了呢?根据用户、数据规模能相对精确估算出自己应用程序会占用多少内存,遇到了内存泄漏,能快速定位到是那段代码造成。想达到这个,必须要对自己写的程序内存使用把控的非常严谨,方可做到。
图形编程:当我们沉浸在AV美好画面的时候,是否思考过这些图像都是怎么渲染的吗?早期的DOS界面、桌面软件、现在的浏览器、移动端APP,都属于图形编程,偏重于表现类,关于界面编程,至少如下知识点需要去了解:

1.简单的图形基础知识,图像种类、什么是位图,什么是矢量图?
2.设备分辨率知识
3.图像的变形、透明
4.界面流程度是由什么决定的?
5.什么是动画?
6.3d和2d有什么区别?
7.表单输入控件有哪些?
8.界面交互的基本原则?

当然图形编程设计较广,像图像合并、图像识别等属于高阶应用,特殊领域才会接触到。
通信&协议:我们的每一次冲浪,每一次贪婪的汲取着自己感兴趣知识的时候,有没有思考过,这个页面到达我的面前,经历了怎样的步骤呢?说到通信是现在互联网的基石之一,没有通信,就没有互联网。几乎所有的开发语言都涉及到网络,除了及个别的纯本地程序之外。

1.通信协议有哪些?了解tcp/ip、socket、udp、http、ftp、smtp吗?如果要做web编程,http是必须了解的。
2.短连接和长连接有什么区别?
3.如何保障传输的可靠性?丢包了怎么办,不安全被篡改了怎么办?
4.我的应用保持多少个连接合适,能支持多少并发?
5.我的程序连接超时、发送超时、接收超时分别设置多久是合适的?
6.连接不上、超时了、对方主动断开了,一些常规的处理策略。
7.心跳检测,怎么做,有什么用?

这些如果搞网络编程,都是一些基础要了解的,如果搞web编程,可能需要对资源加载优化要了解的更深入才行。有人在面试的时候喜欢问,说下用户敲一个网址到界面渲染完毕,这中间都发生了什么,虽然话题很大,但很考验水平,可以横向说,也可以纵向说。同一个问题,我相信每个人三年前和三年后的答案肯定会不同。

上面说了很多,下面来聊下语言能力:

语言能力:如果有上面的基础作为支撑的话,我们学习一个语言的打开方式将会是怎样呢?

1.怎么定义一个变量,怎么赋值?
2.如何写一个逻辑判断?
3.如何写一个循环?
4.如何使用不同的数据类型?
5.如何引用其它模块?
6.系统都提供了哪些API?
7.如果是面向对象语言,还要看如何使用命名空间、类、方法、属性等。
8.再进阶一点,如果我要用和其它语言相互调用,该怎么写?

上面这些呢,基本都属于语法层次的,我们拿着语法手册,通读一遍,再看一些实例代码,写个几天就覆盖的差不多了。所以照这么看,语言虽然我们用的最多,但站在编程的全局来看,恰恰是最简单的。如果有了扎实的基础知识,学什么语言不是手到擒来呢?

语言能力掌握了以后,就可以把上面说的基础操作逐一演练一遍,上手基本的项目是没有问题的。怎么操作文件,怎么请求网络资源,怎么绘制一个简单界面,几乎所有的应用也都是基于这些,只是复杂度的提升而已。

搭建环境:搭建环境是相对容易被大家忽视,其实非常的重要,万事开头难,就算是理论知识再好,三天搞不定一个环境,都会崩溃吧。不错,搭建环境也有套路,盲目去搭建,费力不讨好。

1.我要开发的语言需要编译吗?
2.我要开发的语言最终是运行在哪?
3.依赖是怎样的?比如是否需要连接数据库、远程服务等。
4.哪个开发工具最好用?有的语言好几种IDE都可以,如果不做了解,上去选了个不顺手的,浪费精力,后续还得换。
5.怎么调试?
6.怎么打包发布?
7.先来一个hello word。
另外还有三个主要能力:算法、设计模式、工程能力,这三个同样是语言无关性的,要想进阶,每一个都必不可少。编程是一个复杂学科,尤其是做应用编程,知识广度是有一定要求的,如果应用触及到一些特殊领域,比如图像处理、生物识别、自然语言处理等,对算法也会有较高要求。工程能力和设计模式,对于上规模的项目,都是贯穿始终的,这两个也决定工程的生命周期。

如果你是一个新手,如果按照上面说的去逐一了解,假设你心急或者时间紧的话,肯定来不及,那就以语言能力作为一个切入点。但要想进阶,这些基础知识都早晚都要补回来。 仔细梳理,想跟大家分享两个观点:

1.不管是新手还是老手,切忌一叶障目,上去就学,一定要先拓宽自己的眼界,延伸来说,就是需要为自己将要做的事情做一个预估和规划,学习开发语言如此,做事亦如此。
2.要尽早建立自己的知识框架,当我们遇到新的事物,不用老是去开辟地方存放记忆,而是我们早就建立了一套知识体系,只是在整个体系中有熟悉的点,有不熟悉的点,后续只需要对号入座,逐步扩充即可。

世界那么大,知识那么多,如果我们照单全收,会爆体而亡的。至于如何建立自己的知识体系,没有捷径,思考、归纳、举一反三的去锤炼吧。

相关阅读