一转眼2016年都过去了,我已经离开学校两年。
这两年中感觉自己成长了很多。在此对过去一年工作学习生活中的经验体会做一个比较主观和抽象的总结。
##一、思想:面向数据的程序设计
要说在过去一年的工作实践中,我最大的成果,不是什么产品,而是想到了一个新的角度去看待程序:
面向数据的程序设计
要做一个优秀的程序员,首先就要脱离“Java程序员”,“IOS工程师”,“前端工程师”,“后端工程师”这些狭隘的定位。我尝试去思考编码的本质是什么。我们每天敲的代码到底都干了什么。
最后基于我现有的见识和理解。有了一个不是很成熟,但是基本适用于我的现状的结论:
我们是在操作数据。
将且仅将数据作为程序世界唯一的一等公民,抛开什么语言什么平台之类的东西,我们说到底,每天都只是在和数据打交道而已。
这话听起来很大很扯,很抽象很神棍。当然这套理论不可能解决所有的问题,但是我认为这是一种行之有效的,确实给了我很大帮助的编程观。
在这一套观点中,写一段代码,我们不外乎要对数据做增删改查操作而已。
至于具体怎么实现的,这是语言的,是算法的,是次要的东西。
确认了这一点,就很容易跳出某种语言,某个位置,而去整体的观察和理解程序,理解软件这个东西。
下面举几个基本的例子,比如说快速排序算法。
具体快速排序的算法就不多说了,首先我们要确认几个数据。
首先,待排序的数据,这个毋庸置疑。很多人认为数据仅仅指这个数组,但是于我而言,我看到的还有其它的数据。
比如指向位置的指针数据,做中轴的数值也是数据。
那么搞清楚这些数据的意义在哪呢?搞清楚了他们,算法本质是对数据的操作。当我们弄清了算法,就是弄清了如何对数据进行操作,那么具体用什么方法,什么语言去实现,就不是一件难事了。
比如快速排序,我们要做以下工作:
-
对比指针指向的数据和中轴的数据
-
将两个指针指向的数据做交换
-
修改指针数据
然后重复。
那么写出代码还很困难么?
基于以上的例子,我想说明一个什么呢。
在学习和帮助别人学习的过程中,我发现了两个很重要的问题:
1、很多人知道要做什么,但是不知道怎么去做。
2、很多人拿到了一个开源的代码,但是不知道怎么去看。
这个面向数据编程的思想,是我解决这两个问题的利器。
一个积分看不懂,那就拆成一加一去看。把常用的编程语言加在一起,对数据的操作也就那么几个,程序也就三大结构。这是谁都能很轻松学得会的。
剩下的问题就是把很复杂的东西拆成这些简单易懂的基本操作。比如对快速排序的实现。
而一个项目的代码看不懂,那就不要死看代码,看他对数据做了什么。最简单的,看数据从哪来,经过了哪里,最后成了什么样子,到了哪里。对于理解一个项目而言就很快捷了。
##二、工作:程序员之所以是程序员
现在有一个论调,说随着计算机技术的普及,最后会达到人人都是程序员的共产主义世界。
这个论调引发了我的思考,那就程序员为什么是程序员。
其实拆解了这个论调,这其中有一个转换,恰恰是一个关键:
计算机技术普及->大家都会写代码->大家都是程序员
那么重点就在于,会写代码≠程序员。
于是问题就来了:除了会写代码之外,差别在哪呢。
其实说起来,现在很多高端科研人员都写得一手好代码。尤其是做理科研究的。但是他们若是出来找程序员的工作,却不一定能够做得好。
其实抽象起来说,程序员不仅仅是会写代码,而是会完成一个项目。
那么作为一个程序员,要保证自己的竞争力,那就必须要提升自己的全面素质,而不是做一个会写代码的普通人。
写代码距离写项目,有多远呢?有一个软件工程那么远。
软件工程,这个词很少有人提及。但是不论是流行全栈也好,流行敏捷开发也好,这都是属于软件工程的一部分。
说到软件工程,人们可能第一想到的是人月神话,然后想到这是一门管理的学问。
这并不仅仅是管理人,管理项目的学问。这是一门融入到我们每一行代码的学问。所以这不是只有管理者才需要关注的学科,而切实是每一个程序员都应当懂得的知识。
当写代码的时候,我要思考的不应当仅仅是如何实现这一个功能,而是完成一个简洁,安全,可靠,可读性高,便于修改,随时扩展的功能模块。
这些琐碎的要求就是程序员与写代码之间的距离。
磨刀不误砍柴工,这句话直到现在才切实的理解。
写代码真的不应该是一个程序员最重要的工作。而仅仅是实现工作的一个手段。
少思考一点,快点写代码,最后往往会花更多的时间去弥补代码的缺陷。
记得有个故事,说“画一条线值一美元,知道在哪划线值9999美元”
程序员也是如此,写代码不是什么值钱的工作,知道怎么写好代码,才是一个程序员最大的价值。
##三、生活:我们距离他们其实很遥远
在程序员的圈子呆久了,我们会产生这样的错觉。
每个人都能很熟练的用电脑。每个人都切实的知道电脑能做什么,在做什么。
然而每次遇到圈外的人,都会深刻的体会到我们之间到底有了多大的裂痕。
其实这样的问题在每一个圈子里都应当存在。但是唯独在计算机这个圈子里,显得尤为突兀。
因为就算人手一个智能手机的今天,还是有绝大部分人对于计算机几乎一无所知。
前一阵我的一个亲戚买了一个新手机。她是当年的大学本科毕业,高中教师。但是她看着开机提示的“是否激活华为会员”,和下面的“激活”和“跳过”选项不知所措。
这几乎是无法可想的事情,但是切切实实的在发生,还是发生在一个学历水平不低,含金量很高,才刚到中年的“高级知识分子”身上。
与其说是不知道,倒不如说是畏惧。
很多人在每天迷恋于计算机的时候,也在畏惧计算机,畏惧互联网。
“我哪敢乱碰,万一坏了呢。”
“我不敢乱点,万一花钱了呢。”
“我搞这个干啥,万一把信息泄露了呢”
这是我最常听到的说法。作为这个圈子里的人,很难理解他们的那种畏惧心理。但是如果换个角度,将我们扔在一个放满了各种试剂的化学实验室里,应该也会很担心万一爆炸了怎么办吧。
但是计算机不是化学试剂啊,它是电,它是水,它是火,是我们生活中不可或缺的一部分。
年轻一代的人伴随着互联网成长,在最无知无畏的年纪里就积累了大量的经验,探索了足够的知识疆域。他们对于计算机的了解就更加深入和普及。
但是新一代还很少,有足够条件伴随互联网成长的新一代其实比想象中要少得多。
所以说,其实计算机距离人们还太遥远。
至少,人们听到程序员,第一反应依旧是可以修电脑。
但是计算机又距离人们太近,与人们一点一滴的生活息息相关。
这带来了一个很尴尬的局面:太多的人无法正确的理解我们工作的价值。
诸如话少钱多死得快,坐办公室领高薪,乃至加班多,都是这种问题的一个体现。
无法理解价值,也就意味着无法正确理解这个工作的内容。
很多人将程序员作为求职失败后的一条出路,殊不知这条出路向来不是谁都能走得通的坦途。码农都说自己在搬砖,但真的不是简单的搬砖工。
我见过一些人,来自各种奇怪的专业,培训过后来求职。没有半点系统的知识结构,乃至于对电脑的基本使用都不流畅。每当这种时候真的想问一句何苦来哉。
我清楚地认识到了,我们距离他们真的很遥远。貌似熟知,但是却更加遥远。人们都知道化学很难,物理很难,律师很难,会计很难。但是偏偏却看不到一个合格的程序员也很难。
而我们走在这条可能很难的道路上,回头看去已经走了很远,远到需要身边的圈外人提醒你,你所学的东西,真的很难。
这是我们的困境,也是我们的价值。