最快入门程序员
前面的话:
这么久以来,我一直思考一个问题,就是怎么从一个其他的专业入门进入程序员行业,从业余变成专业。从什么也不会,到可以完成基本的代码编写,到可以完成简单的程序任务,并且在后期完全进入这个行业,有自己往下专研的能力。
隔行如隔山:
隔行如隔山,其实不止是隔行如隔山。
想象这样一幅场景,同样是做软件开发的人,如果我从未接触过python,我是一名C程序猿,有一天另外一个专门的python程序员跟我说一堆python的概念,说python如何简洁高效优美,能够完成多少不可思议的任务,他说的越详细,越感觉深入,越感觉到表达的很清楚,我也只是感觉到他的情绪而已,而对于python我却一无所知。在我真正进入python这门技术之前,我依然会觉得那很难让人理解,因为对不确定性的恐惧将是第一扇难以打开的门。
出于工作需要,时间很少,所在的领域学到的工具和技术是有限的,所以在工作中没有涉及到的领域,往往以后也不太可能谈得上说精通,即使是出于兴趣研究过一段时间,也只能稍微熟悉,至于一门技术的精髓,那只能在大量的项目实际应用中才能体现。
我却尝试引领你快速入门:
入门一个新行业那么难,有时间不够的压力,有兴趣不足的阻碍(其实没进入无从谈兴趣)、有天生的专业缺陷、有那么多没法理解的概念,那么多那么多的困难,这就是实实在在的难点,没有办法吗?不,如果我现在告诉你没有办法,那我这篇文章就是在扯淡,就是毫无意义。我会告诉你,这是有办法的,我真正做的一件事情,就是在这么多困难面前,引领你快速入门。
你无法要求你自己从一开始就理解什么是程序的本质:
你无法要求你自己从一开始就理解什么是程序的本质,就算是我,可以在这里大言不惭写文章的我,也谈不上真正明白程序的本质。只不过,通过实践和学习,我有了自己的一些理解而已,仅此而已,真理是什么其实我们并不关心。如果你想入门就成为所谓的大牛的水平,那是做梦,技术从来都是从头开始,一点一点积累的,就像你看过一分钟打两百字的打字员,你就应该明白他曾经敲坏过多少键盘,任何事情都无法一蹴而就。但是,打住。编程这件事情,其实是可以速成的。
程序的本质:
编程的本质是什么,在我看来,编程是用代码的方法告诉计算机,让他去完成我不愿意亲自去做的或者我根本就做不到事情。比如,做一个乘法,25534x32324,这是我能做到但我不愿意去做的事情,因为在纸上做我觉得很累很麻烦。又比如计算92.3782的开根号结果,那是我能力做不到的事情。但是计算机可以,如下:
为什么计算机可以,因为计算机计算能力强,我们知道它有CPU、GPU.....但,这不是重点。重点是,我们知道它能办到,对于编程入门来说,这就够了。
我们入门到底需要掌握什么:
说了这么多,可能都不是所谓的干货,但是相信我,看下去你整个思路就会很清晰,当然了,觉得自己了不起的大神,请绕道。那么,我们入门需要掌握什么,各类语言都要掌握吗,其实语言真的不重要,为什么不重要,其实对于入门者来说,这个不好解释,解释的结果跟八股文一样难以理解,因为你还没有入门,所以我索性不解释了,你只要接受这句话(语言对于编程不重要)就行。这里我选C/C++语言做例子,我总结我们初学者需要的技能有什么,大概是变量、程序流程结构、函数、简单的数据结构(简单的程序甚至不考虑这个),基本就够你写程序了,事实上我最近的几个项目的程序都是只有简单的数据结构+程序结构+函数+变量定义组成。
具体来说,一个一个说,先说变量,什么是变量,我假设你没学过数学,没关系,其实变量就是用来指代一个数的东西,比如上面程序中的a、b、c,是给要保存的数字起的一个名字而已,和张三李四的区别是它是字母,有三个人分别叫做a、b、c,当计算机(这个boss)叫到a的时候a就把自己肚子里的东西(那个数字25534)给他。计算机说a+b的时候,其实和说张三加李四没什么区别,这就是变量名字。至于为什么说是"变量",是因为计算机可以把其他数字叫做a,那a的内容就变了,所以称变量。
再说程序流程结构,计算机去完成一件事情,也是一步一步来的,那就有三种做事的结构:顺序结构,选择结构 , 循环结构。
- 顺序结构就是一件一件来,我想要计算机去给我做饭,那它首先去洗米,蒸饭,切菜,然后炒菜,然后端上来....一步一步,按顺序来,这就是顺序结构。更加贴近程序的描述是,我要计算a+b的结果,那我首先要输入a的值,输入b的值,然后计算,然后输出,这就是顺序结构。
- 再说选择结构,假设我要出去运动,首先我会关注今天的天气,如果下雨,我就去学校室内打网球,如果出太阳,那我就去小区公园里打篮球,这就是选择结构。更加贴切程序的例子是,我要给小明的分数评等级,首先输入他的分数,如果分数在60以下,则结果是不及格,如果在60以上就是及格。(当然可以设定各种等级:优秀、良好等)
最后说循环结构,可以理解为今天工人在流水线上做事,一直做的就是一件事(比如打包装),直到今天下午6点下班,循环的工作就结束了。更加贴切程序的列子是,我要用程序做1+1+1+.......+1的100个1相加的计算(当然这只是个简单的例子,只方便理解循环的意思),我就定义一个变量为a=1,然后定义一个sum初始=0用来存结果,我让sum循环加a一百次,输出的sum就是结果。
重点说函数:
函数是很重要的,但是函数的存在,也是为什么能够快速入门,因为你只要懂了变量的定义,然后知道函数的概念就可以开始编程了。
为什么这么说,因为函数,可以让别人来写,惊讶吗?所以这就是为什么编程如此简单。用别人的函数来开发,那就可以很快做出自己的东西。可能有很多所谓的大神并不建议初学者这样来学习编程,但是,我想了很久,觉得这可能是最快成为一个程序员的方法了。这样进入这个行业之后,才会慢慢开始自己写函数。放心,有一天你把你的代码开源给别人,也会有人用你的函数。
函数有输入和输出,综上可知,你只要知道你的输入是什么,并且想得到的结果是什么,那就够了,其他的工作,借助第三方吧,无论是百度别人分享的代码,还是一个开源的API(不用懂这是什么,简单认为这是别人写好的函数),或者是系统以及集成的函数。
证明一下我的结论_(用C++借助opencv的函数(别人写的)做图像处理_把彩色图变成黑白):
你可以通过我的思路快速入门,现在我就证明。假设你想要把任何一张彩色的图像变成黑白的图像,你考虑一下你的程序该怎么写,你考虑你的图片怎么输进程序里吗?考虑怎么把颜色去掉吗?相信初学的你不会有思路怎么做到。
如果我给你加一个前提,这个前提是,opencv是一个开源的库,里面提供了Mat的变量类型,一个Mat可以代表一张图片,你又会怎么考虑来实现彩色图转成黑白图?
正常人会这样考虑,我的输入是一张彩色图片,那我定义一个Mat 变量来存我的彩色图片,我的输出是我想显示出黑白的图,但是中间那步转换过程我不知道怎么办。这时候,我提示一下你,你可以用函数,你会不会想到去查一下opencv里面有没有现成的彩色转黑白的函数呢?现在事情就变得简单了,重新整理一下:
- 定义一个Mat 来代表我的彩色图,(当然你得在某个路径下有一张彩色图,然后用一个opencv里面的函数到那个路径去读出来,没错,这个也有函数:imread)
- 用opencv自带的函数cvtcolor来实现彩色转黑白
- 定义一个Mat 来存黑白图像
- 将得到的黑白图像显示出来
下面是代码和效果:(你根本不用关心怎么去搭建环境、创建项目和开始写代码,因为这都很简单,理解上面的,你就开始了)
希望这篇文章的结束,是你程序入门的开始。