虽然接触编程已经快三年了,但是一直感觉缺点什么?
我的第一门程序语言是C。那是大一,学校教的。正是这门课带我走进了程序员的世界,不过或许这么说并不准确。学了点C,就标榜自己为程序员,这样有点自大了。当然C语言博大精深,想要精通并非易事。
C是一门高级程序语言,相比于Java、C#来说,算是比较接近计算机底层的。可是,当学到指针这一节的时候,一些微妙的东西总是抓不住。看大神指针玩的出身入化,自己指针漏洞百出,甚是沮丧。
后来因为学长,接触到了PHP。这门语言更是高级,可以说是“智能”。在C中,声明变量需指明类型,但是在PHP中,所有皆美元($)。当时有种相见恨晚的感受,妈妈再也不用担心我的类型出错了。最为关键的是,PHP里好像没有指针,是的,我找了一圈,没有发现。这对我来说,无疑又是一个不错的消息。
当我渐渐深入PHP,我发现自己遇到了瓶颈。PHP太强大了,太智能了。但我们要清楚“智能”的背后隐藏着什么?是复杂的逻辑判断及众多的黑盒子。
举例来说,PHP所有变量不需要声明类型,难道是PHP消除了变量类型吗?追本溯源,现在的PHP是用C语言写的,我们之所以不需要声明那么多复杂的类型,是因为PHP会根据上下文判断我们变量的类型。而判断就要设计复杂的逻辑处理,且不说会增加开销,关键对你来说是个黑盒子。虽然,PHP是开源的,你可以看见它的源码,但是现在的你可能去看吗?能够看懂吗?或许你会说,我需要懂吗?别人封装起来,就是让你不用关心内部怎么样实现,针对它的接口编程而已。
针对接口编程,而不要针对实现编程——这是OPP里的一项原则。我自己编程的时候,也是如此。但是我上面的例子,仅是个说明,告诉大家“智能”背后是什么。还有,我不是提到了瓶颈吗?如果你接触PHP久了,就会遇到很多问题。
比如,你新装了一个PHP环境,包括apache、mysql以及php。但是当你使用pdo去连接mysql的时候,发现报错,找不到数据库驱动。如果你是一个新手,你可能会谷歌、百度。如果你是一名老手,你可能会去检测可能出错的地方。最后,你可能发现原来是pdo-mysql的扩展没有打开。第一次发现这个错误时,你可能知道了只要把配置文件中pdo-mysql这一行前面的分号去掉即可。而当你再次发现同样其它问题时,比如使用redis时,你会发现,默认的配置文件里根本没有关于redis的扩展,更谈不上去不去分号。所以你还需要去下载redis的扩展文件,然后在配置文件中加入redis的扩展。
随着你使用PHP的时间越久,这样那样的问题会越来越多。如果你和我一样,会发现我们在慢慢回到C语言,或者说我们正在打破智能,回到原始。
在谈一个比较头疼的问题,或许许多PHPER至今都还没有理清。关于编码,我想一般大家在初学的时候,都有遇到过乱码的情况。比如,我们在.php文件中使用echo输出了一段中文,通过浏览器预览的时候,发现是一串乱码。出现问题后,我们当然要解决问题。新手就是谷歌百度啦,老手嘛直接在浏览器中更改一下编码格式,或者在.php文件中加个header来处理。久病成医,经过多次的乱码问题,新手已经知道了如何处理浏览器中出现乱码的方法。然后,这类头疼的问题还没有结束,有一天,你通过连接数据库取出了一些数据,当你把这个数据通过PHP输出到浏览器上时,乱码问题又出现了,明明按照以前的方法进行处理了,为什么还是乱码呢?本以为经过了数次的乱码问题,自己好歹能轻松解决了,但是不知怎么的过去的灵丹妙药失效了。于是,又去谷歌、百度。
这样那样的问题层出不穷,我们每天疲于各种BUG的解决。现在回头想想,为什么一个编码会引发这么多问题?原因莫过于我们向来治标不治本。我们只知其一,不知其二。我们很多人都想要一种速成的方法,只要能解决问题,不管黑猫还是白猫。但在学习阶段,有一个很重要的点那就是一点要扎实。如果你在公司,一天之内不解决问题,要损失几百万,那么你可以只求抓到老鼠。但是学习阶段,我们有必要那么急吗?我们何不花点时间去了解一下编码的知识,搞清楚它的原理呢?
回到我们主题“无Linux不程序员”,这句话作何解释?我们知道,无论你作为一个什么样的程序员,比如C\C++程序员、Java程序员或者其它脚本语言程序员,总之,我们离不开计算机。计算机硬件或许离我们有十万八千里,但是它之上的操作系统,与我们关系很大也较为接近。最为重要的是,我们在直接在它之上作业,我们工作当中所遇到的大多问题与它息息相关,而这些问题都需要我们自己来解决。至于操作系统如何管理硬件不需要我们操心。
既如此,我们直接与它接触,我们就有必要学习它,否则我们的程序员之路会越走越艰难,后期不仅有BUG问题,还会有性能优化的瓶颈。还有一点我想说,程序不是独立运行的,它需要很多东西的支持,一个不懂程序运行平台的程序员,如何在他的程序中尽可能的利用计算机资源为他的程序服务呢?
众所周知的操作系统是Windows,但是在程序员世界中还有一个强大的操作系统,便是Linux。之所以选择它,最主要的原因是它开源免费,它所有的源代码,我们都可以查看,没有黑盒子。当然它还有其它有点,比如可靠的稳定性,丰富的服务软件等等。当然,它也有它的缺点,不过这些缺点对程序员来说是可以忽略的。
大学有两学期的Linux课程,但是我都没有好好听,现在想来真是可惜。如今自己重学Linux才发现它的博大精神。并且想学好Linux必须要懂很多东西,不过也可以说学了Linux我们懂了很多。
以前在课堂上学习,使用的课本都是教课书。我想大家都知道里面的内容是满满的干货,看似严谨,但是读起来总觉得不是那么有逻辑,很多东西都是平铺直叙,总为关键的是一门课就只有它自己的内容。但其实很多东西都需要你有一定的其它基础,那样你才能很好理解,否则在你心中总有一些神秘的地方。比如,若谈到文件系统,你心中是否会有疑惑,我们知道文件一本存储在硬盘中,那么硬盘和文件系统有什么关系?文件系统又分不同的类型,那么这些不同的类型又是怎么样划分的呢?不知道大家是否有同样的疑惑,反正当年我心中是满满的问号。可是,上课的时候,老师仅仅介绍了文件系统,告诉了我们有哪几种,紧接着就是一连串的Linux命令。在Linux中,一切皆文件,所以如果能理解文件系统的本质,那么我想对Linux的理解又会深刻很多。
我总是觉得从源头开始,那么我心中的疑惑才会减少。而从客观的事物逐步到抽象的事物,这样我才能真正去理解那些被抽象了不知道多少层的东西。好在计算的历史不是太长,我们开始学习也不会太过于辛苦。若要像《人类简史》一样,把人类讲清楚,追述到几万年前,那才是真正要命的。
看到这里,有人会发问,我仅仅想做一名高级语言的程序员而已,照你这样去学,那是要成为计算机专家的节奏。如果你真的想把计算机中每一个问题都弄清楚,那么你应该能成为一名专家。但是即使你让我说的,从计算机源头开始学起,最后学到你现在所了解的高级语言,你也不一定是一个计算机专家,很有可能你还仅仅是一名程序员,只不过你升了以及,成为了高级程序员或高大上一点——XX高级工程师。
我这里所说的学习,只是让你去了解计算机的历史,也是硬件构成,CPU架构而已。我只是说让你去明白计算机到底怎么从一些没有生命的硬件或者说是一堆废铁变成,我们生活中不可或缺的一部分的。知道别人怎么实现和自己设计实现两者之间隔了一个银河系的距离。所以,我们不用担心我们学了这些我们会变成一个别的什么专家,我们大多数人还是和以前一样,仅仅是个程序员,不应该说你这时候才是一名真正的程序员。
这里我想补充谈一下科班出身与非科班出身的问题。那些自诩科班出身的人,骨子里都有一些傲气,有些时候他们瞧不起非科班出身的人。那么这点傲气来自于哪里呢?我想究其根本,就是一个“Linux”。计算机类考研专业课有数据结构+计算机组成原理+操作系统+网络这四门课。如果你学习了Linux,那么基本上可以了解计算机组成原理、操作系统、网络这三块。至于数据结构可能有些问题,或许你需要去其它地方补补,不过你既然已经是一名程序员了,那数据结构对你来说也算是基本功了。 这里我要着重强调一点,一般考研的同学重点关注的都是理论行知识,大部分都是刷题党,而且这四块知识,他们是分散对待。但是计算机是一个整体,你最终的目的是去用,将这些知识融会贯通才是王道,所以你学会了Linux所得到的东西绝对比考研的学生要有价值的多,当然这是针对于你所处的职位来说。
我之所以会去重学Linux主要是因为建站的缘故。我们知道如今的web服务器大多搭建在Linux系统中,所以很多时候我们需要在Linux平台下进行操作。自然而然学习Linux就成了一种必须。但即使你不是一个web开发人员,你是一个桌面软件工程师,你会需要懂Windows系统,但是Linux同样值得你去学习,本质大体差不多,并且Linux的参考资料要多的多(归功于如今开源精神的流行)。