你好,我是 Haiyung,这是“做软件开发的第一年”系列,预计两集,这是第一集。
很多东西刚刚入门的时候你看着挺简单,比如象棋、围棋,规则非常简单,也很容易学,可真的要下好,需要付出巨大心血。
软件研发行业,对你我来说,很可能入门都不容易。
这与计算机在我国普及的时间有关系,也跟计算机本身就是一门独立的、带有自然科学性质的学科有关。做软件开发,尽管他没有想象中的那么难,但知识的积累是少不了的,除此之外,还需要时间,需要你的耐心,有时甚至需要你忍一忍。
在本文中,我会分享作为职业开发者(初级)的一年多来,我,用到了什么技术上的硬技能。我是做 Go 语言方向的,那么 Go 初级开发者又会用到哪些基础知识,本文也会有提及。
不过,仍需要额外做说明的是:局限于自己的水平、眼界,我只能就我自己的开发经验对所谓的“软件开发的第一年”进行定义。当然不可否认,每个人都有每个人的成长路线。我将我自己的成长轨迹分享出来有我自己的目的:
如果你是个零基础的同学,不要怕,一步一步来。
如果你是个有些许基础却没实战经验的学生,尤其不是根正苗红、计算机科班出身的朋友们,出校门后,要面临找工作,很多技能已经成为事实上的标配了,希望你能警觉。
如果你是个高材生或者是工作 N 年的大佬,希望这篇文章能让你找回自己当年的模样。
酷壳网作者陈皓老师写过一篇文章《HELLO WORLD 集中营》,读完以后你就知道,“Hello-World”在我们软件开发者中的地位了。
“Hello-World”是什么呢?就像我们小时候学习英语从“Hello.How are you.I’m fine,thank you.”开始学起的一样。
你首先需要明白的是,计算机编程语言跟汉语、英语、俄语、法语差不太多,本质上都是“交流”的工具,刚才说的几种语言要解决的是“人与人的交流”,而编程语言要解决的是“人与机器的交流”。
“Hello-World”是你通过某种编程语言向计算机说的第一句话:你好,世界。跟“Hey,guys”差不多。
“Hello-World”很简单,也非常关键。
下面我们就来看看不同的编程语言是如何跟计算机“打招呼”的吧。
(以下仅列出常用的编程语言 Java、Python 和 Go 的 “Hello-World”,更多请参见陈皓老师推荐的 The Hello World Collection )
// Hello World in Java
class HelloWorld {
static public void main( String[] args ) {
System.out.println( "Hello World!" );
}
}
# Hello world in Python 3
print("Hello World")
// Hello world in Go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
我们不考虑你安装环境的问题,也不考虑这些代码怎么运行,我们仅从“语法”的角度看看它,你猜,它在干什么?
你看到每门语言的语法都不一样。没错!中文跟英文的语法也不一样,发音还不一样嘞,但你知道“你好啊”和“Hello”都是表达相同的意思。上面三段代码虽然表现的形式不太一样,但意思是一样的,你注意到每段代码都有一个用双引号包裹着的“Hello World”了吗?
一个字(包括汉字和英文字母),被用双引号包裹,这在计算机编程里是有特殊的含义的。我们想个场景:
你是如何跟别人说话的?
这个问题乍一听很奇怪,怎么说话的,当然是张嘴说话啊。没错,但还不够。最起码,张嘴说之前,你应该知道要说什么吧。
说话的过程:
人跟人之间的交流你当然熟悉了,不用费一丁点力,不假思索的就可以把话说出来,轻松的走完上面三步,用时有时都超不过 1 秒钟。
跟计算机交流,过程是一样的,但毕竟对方是机器,同样的三步,做起来就免不了有些繁琐。
第一步:你要用双引号把你要说的话存储起来,跟人说话的时候你会存到人的大脑里,跟计算机对话,你就把话用双引号引起来,它代表你组织好的词汇。
第二步:跟计算机交流可以用很多种语言,你要把对应的语言捋顺了。
第三步:张嘴说话环节需要你用对应的语法“说”出来,中文叫“说”,英语叫“say”,Java 叫“println”,Python 叫 “print”,Go 叫“Println”。
通过一个 Hello-World 你可以一窥编程的究竟。
有人会说:平常一句随随便便打个招呼,放到计算机编程里,就要搞的如此复杂?
不是编程把事情搞复杂了,而是这件事本身就这么复杂,只是你身在其中,这么多年习惯了,没把它当回事。
编程对人有几个非常显著的好处:
总的来说,编程有清理大脑垃圾的功效,并训练大脑相关肌肉群,让大脑变得更加健壮、更加性感。每当面对复杂的事物,你那经过编程训练过的大脑,会更有目标性、针对性,通过分析,更能把握住事情的重点、关键。最起码,能有理有据的分析出事情的原因、经过以及可能的结果,有哪些突破点、潜在的风险点等等。到现在,我找不到更好的工具了。
Hello,world。你跟计算机世界打过招呼了吗?
说完 Hello-World,我希望你有了对编程基本的认知:用规定的语法来操作计算机。
我们还需要逐渐掌握更多的语法。编程语言的语法不难,如果英语的语法难度系数是 100,那编程语言基础的语法就相当于 5 这个高度。因为编程语言的基础语法就来自于生活。
我们生活中有类似的场景:
这两个场景背后代表的逻辑非常典型。
第一个场景是如果…那么…句型,是因果联系,即只有满足了某个条件,才可以完成下面某个动作;反之,不满足条件,则后面的动作无法执行;
第二个场景是来来回回、反反复复、翻来覆去句型,即同样的动作,被重复执行。
编程语言也是语言,编程语言来自于生活,任何编程语言,基本都具备这两个语法。
用编程语言来说,第一个场景是if…else…,第二个场景是 for 循环,他们代表着程序的运行流程:
var a = 10
if a == 0 {
fmt.Println("a = 0")
} else {
fmt.Println("a ≠ 0")
}
上面这段代码是什么意思?有一个 a,这个 a 的值为 10,接下来有一个“流程语句”,说:
问 a = 0 吗?(两个等号就是在发问,问是否相等)
如果等于 0,那么就输出 “a = 0”
else 是“其他”的意思,放在这里意思是说,除了 a = 0 外其他的情况,就输出“a ≠ 0”
你明白if…else…了吗?还有一个 for 循环,我就不打算举例子了。
希望这两个“流程语句”能引发你思考。其实,我们的世界里充满了类似的逻辑,有很多“只有这样…才能那样…”的例子,有很多来来回回、反反复复的例子,希望你能思考一下,如果没有了因果联系,这个世界将会怎样。
这两个逻辑在现实生活中至关重要,在编程工作中同样。
你需要明白什么是数组、字典。
这两个东西在编程中简直太常见了。
不过,对于初学者来说,这两个数据类型仍然非常让人费解,很可能不能理解它存在的意义。这很正常。
形象点来说,数组是一列车厢,里面工工整整的坐满了人,1 号 2 号 3 号,各就各位,互不干扰。
字典是你期末成绩单。语文:59分;数学:89分;英语:76分;一个科目,对应一个值,科目和值像是搞对象似的“绑定”到一起。
车厢(数组)、成绩单(字典),他们有一个共同点,你感受到了吗?
他们都像容器一样能够存储数据。
请问,数据如何存进去?数据如何取出来?
因为数组、字典在编程过程中用的实在太频繁了,那么里面数据的存、取,用的次数就太多了,你一定要弄熟练。
又是数组又是字典的,怎么这么多事儿啊?别急,还有字符串、布尔值等类型呢?
如果你是初学者,我相信你在学了两个数据类型后就开始不舒服了,那是一种脱离舒适区的不快,我曾经就真切的感受到过,并且还放弃过。
有这个感觉很正常,希望你能理解一下计算机,毕竟这么大的玩意儿,要解决的东西这么多,规矩嘛,还是应该有的。
其实呢,每一种数据类型都有它自己的特点,什么时候用这个,什么时候用那个,是非常明确的。你应该坚信,每一种数据类型都将是你未来的得力助手。
编程语言是工具,那么编程语言的流程语法、N 多种类型就是让工具成为工具的工具。
你说,现实生活中:
如何把名字倒过来写?
名字中的姓氏是?
名字中的名为?
你看,上面的问题不过分吧。
你的名字在程序中就是一个字符串,如何把字符串反过来写?如何得到字符串中的第一个值?如何得到字符串中第一个以后的所有值?
这些,就是字符串的处理。
推荐你去看余晟老师所著的《正则指引》。
我的第一份工作、第一份工作要处理的第一件问题,就是写正则表达式。
正则表达式是对字符串的另一种处理方式,它像一把筛子,而字符串就好像筛子上面的大大小小的粮食,通过这把筛子,就可以把合你心意的字符串收入囊中了。
举个简单的例子,有很多文件名,我希望从这些文件名里挑选出以 golang 开头并且以 pdf 结尾的名字,这时候有两种办法:
不用正则;遍历每个文件名,对每个文件名进行判断,是否以 golang 开头,是否以 pdf 结尾;
使用正则;写出正则表达式,再遍历每个文件名,利用正则直接就可以判断该文件名是否符合要求;
简单来说,正则表达式是对字符串进行“筛选”的工具。
排序和分页这一节,讲的就不是关于某门编程语言的基础知识,它是一个功能。
下面我出个题目,你来想一想:
全班有 60 个人,要求你能按照名字将同学们顺序排列,并将排序后的结果打印在 A4 纸上,每张纸 10 个人;
不难对吗?思路是先把这些人按照顺序排好,再 10 个人一组即可。
这里面有难度的地方在于使用什么样的方式把这些名字排序?
使用的“方式”、“方法”在计算机科学里有个酷酷的名字:算法。
常用的排序算法有:冒泡排序、选择排序、快速排序。希望你能掌握它们,它们是解决排序问题的王!
啥是函数?你学过的第一个函数应该是 y = x + 1。
啥意思呢?用初中数学的解释就是:
x 是自变量,y 是因变量,因变量 y 随着自变量 x 的变化而变化。
我们把 x 称作输入,y 称作输出,那么从这个函数来看,只要输入给定,那么输出也必然是固定的;比如 x 为 4,y 肯定得 5。
函数体现出了某种抽象的对应关系。还是拿 y = x + 1 来说,无论你给到什么数值,它都会输出比这个值大 1 的数,它不是仅仅对某个数字有效,而是无差别的对任何数字有效。函数的抽象就体现在不局限于某一个个体,它阐述的是一个普遍适用的关系。
拿上一节的排序来说,如果你的方法仅仅支持对本班 60 个人的名字排序,那这就算不上一个函数;如果你的方法可以扩展到任意班、任意数量的人,那就是函数了。
函数是具有普遍意义的方法。
程序员世界有很多黑话,比如:面向过程编程、面向对象编程、函数式编程,以及难以启齿的面向搜索引擎编程。
其实,我认为,就只有两种编程思想:
哈哈哈哈,开个玩笑。
言归正传。我们在编程过程中,若仅仅使用函数的方式,不足以支撑起现在逻辑如此复杂、量级如此庞大的软件,这就用到了对象(object)。
函数是什么?函数是一个个具有普遍适用性功能的工具,就像炒锅、剪刀、锯子这些工具一样,那么对象是什么呢?对象就是使用这些工具的人。人是一个对象,这个对象拥有诸多独特的技能,比如会用炒锅炒菜,会用锯子砍树,这些技能是其他的“对象”所不能掌握的,比如狗,狗也是个对象,狗会汪汪叫,这个技能也是其他的对象所不能掌握的。
那么什么是对象?对象是一个具备某些技能的个体。这些技能的表现形式是“对象中的方法”(简称“方法”),方法与函数相比没有大的区别,但因为对象中的方法隶属于某个对象,而函数则是独立的,所以在名字上做了区分。
当然,以上的观点不能代替你的学习,我只是希望在这里能够抛砖引玉,希望你能通过更多的学习渠道把“面向对象”搞清楚,要学,请深学。
你非常熟悉操作系统,比如 Windows 或者 Mac OS,你甚至经常帮周边的朋友们重装系统、解决各种使用上的疑难杂症。
但这不够,作为一个软件工程师,Linux 操作系统是你必须掌握的操作系统。因为你的软件很大的可能性是运行在 Linux 服务器中的。
Linux 操作系统就是你代码的“生存环境”,想一想假如人类不了解四季的更替、天气的变化,那会是怎样的灾难。不了解操作系统的软件研发人员,最终的成品也很有可能像台风过境一样糟糕。
作为新手,了解 Linux 操作系统,到底需要了解什么?
就像 Windows 操作系统下人尽皆知的“记事本”功能一样,Linux 操作系统下也有一个著名的、功能极其强大的、入门曲线极其陡峭的文本编辑工具- -Vim。
若你使用 Linux 操作系统,那么像打开并查看文本文件这样的操作应该是家常便饭,Vim 这个工具值得你探索一下:
说起来,真的不少呢。
你需要了解什么是数据库。因为在工作中,写一些 SQL 语句是一件寻常的事情。
流行的数据库 Mysql 是个不错的选择,有机会深入的学习 Mysql 数据库的运作机制对你和我来说很可能是个挑战,不过也是个不错的机会。
假如你是老板或者软件中心的总负责人,你一定特别希望做成一件事:知道每个人都做了哪些工作。
放到软件研发工作上来说,这就是 Git。
一个项目由多人维护,哪行代码是由谁写的,又是由谁在哪一天哪个时间点因为什么事情做更改了,这些事情我们必须要知道。如果没有一个完整的记录,会造成以下问题:
Git 是个性能强大的、分布式的版本管控系统,非常适合团队形式的项目开发。Git,你值得拥有。
本文完
请看下集:《做软件开发的第一年,还需要用到哪些技能(还需要篇)》