工作对于大部分人而言,是个人时间分配的大头。也是个人付出精力最多的一部分,同时也不仅会对现在的生活,自己的未来产生潜移默化深远的影响?所以不仅自问,付出了这么多的精力,抛去薪酬,工作中到底做了什么?这与自己对于自己的定位是否一致?站在现在这个每天都发生很多变化的时代,自己的工作在其中是个什么角色呢?我想,这是自己对于自己工作意义的梳理,也是自己将自己从日常的琐碎中跳出来,尝试宏观角度观察的一种尝试。
编码工作,在工作类型定义中属于技术类。对于技术类工种,由于专业门槛的限制,对于门外人常常来讲是很难理解。大多数情况下,就是鸡同鸭讲。《三生三世十里桃花》与《动物世界》般的不在同一个频道。
先来点准备工作,技术基础知识简单一览。
语言。以Java为例,首先是语法。在我看来第一重要的是就是几种判断分支。
1 顺序模式,也就是作完一件事之后,接下来做什么。
1 if else 模式 ; 在什么条件下,执行什么操作,并且可以考虑到多种条件.
2 for 循环模式;这是机器运算与人脑思维很大不同的一个方面。对于计算机而言,假如要寻找100个人中手里,谁有超过1000块钱的零钱。使用遍历模式,取出每个人有多少零钱,然后进行判断。瞬间搞定。而对于人类思维而言,使用同样的方式效率是很低的。对于机器而言,100还可以继续往上累加。1000,1000区别也仅仅是毫秒级别的区别。而如果在循环中嵌套使用循环,可解决的问题就更多了。
第二:如何进行运算?这里包括逻辑运算与数学运算。逻辑运算,就是非,且,或。数学运算就是加减乘除,或者使用数学公式进行计算。
第三:书写方式,书写规则。
第四:语言本身的设计。Java是面向对象的语言。在java中新建对象。每个对象都有很多属性。比如定义一台电脑。这个从不同的角度来看就会有不同的内容。对于有些人来讲,电脑就是一堆硬件的组合,显示器,键盘,摄像头,主板,内存条…那么这个时候电脑就是由这些组成它的硬件属性组成的。打开这个电脑对象,里面就有这一堆硬件。对另外一些人来讲,电脑是其工作生活的工具,有文字处理软件,有视频播放器,有各种游戏软件...那么对于这些人来讲,打开电脑,里面的属性就是这一堆堆软件。估计很多人会立马反应过来,这不就是按照不同标准就是分类的,是的,就是这样的。按照每个人不同的场景,建立对应的对象。从而可以调取到自身需要的属性。
作为语言而言,最核心的也就这些了。
对于自然语言而言,上面列举的内容更像是在进行想法梳理时候使用的逻辑工具及最终的文字展示。但是这些想法是如何对应到程序的世界中的。那就是数据。处理数据的保存与提取有专门的工具就是数据库,这就像仓库,存储着很多货物,并且对外提供很多调取货物的方式。数据库也是一个广阔的领域,这里面的内容也是需要花很长时间能慢慢接触到与掌握的。
算法,提到程序不能不提到算法。算法这个词不仅仅在IT圈闪闪发亮,也是社会生活中,媒体报道中经常出现的词。最简单的解释就是:“解决一个问题的方法”。在很多程序员的心中,算法就是IT领域的耶路撒冷,谁算法牛逼,谁才是真正的大牛,也是衡量一个人智商是否是真高的硬邦邦的指标。
上面提到的语言语法,数据库,算法。是进入CODING世界第一扇门。这个门在每一个方面都有需要很多精力才能研究明白的内容,不过其实有个粗浅的认知,也是可以继续下面的路了。这就像刚拿到驾照的新手与职业赛车手的区别。拿到驾照只是第一步。
接下来进行第二波。构建在最基本语法上的社会化协同与共享。这才是IT工作门槛降低,与整个开发,研发效率提高的原因,社会信息化程度加速提高最重要的助推力。
先说框架,框架就像一个工具包,提供系统级支持与特殊工具。就像开始建一栋建筑之时,工地上各种设施与人员。因为这些无论是建造任何一个建筑都需要的。所以建造完这栋建筑之后,这批人又可以到另外一处,再建造新的建筑。这不由让我想到某某施工单位,包工头。对,他们就类似IT世界的框架。正因为有了他们的存在,建筑设计师才有更多的精力去在设计上去思考整个建筑如何设计,而不是去想在哪搬砖,谁来搭这块玻璃。基于此,程序员们才可以将更多的精力去面对市场的需求,去思考如何实现需求,实现业务。而不是从头到尾什么都得再来一遍。
对于框架,大的公司都有自己的框架。满足本公司的开发需要,开源社区的壮大,造福了很多小公司与初创公司,让他们没有必要再造轮子。快速面对市场的需求。
开源社区的壮大,为很多公司,个人提供了一些基础服务,这些服务都是免费的。同时对于程序员个人来讲,更是加速了个人的成长。互联网上大量优质的源码很多都来源于此。同时极大的提高了整个世界的信息化程度。非程序员只要学习能力强,也可以快速成长。同时,不断又有着来自世界各地优秀的人才对此的贡献,让整个开源社区的社会影响力越来越大。在我看来,这一切促进了信息不同区域,不同国界的流通。是对传统世界权威性,集权化的不断挑战。
对于上面提到的工具有个基本的了解,就可以工作了。
大部分程序员从事的都是业务需求的开发。从事科研性质的开发只占少数。接下来就说业务需求的开发。
肯定会遇到哪些纠结?
刚开始从事开发的时候,会经常面对一些简单的错误,找半天找不到。找到了就有一种捶胸顿足的感叹!比如大小写,比如分号写成冒号,这些不太注意有时是很难发现的错误,每一个程序员都会经历这个阶段。现在由于开发工具的日益强大,语法检查,高亮展示,debug模式的快速定位,编译时进行的语法检查。这种情况也越来越少了。这就像,刚进入一个行业之时,几个老手与一个新手一起喝酒聊天,新手没有意识到自己说了傻话。
接下来,就是对于分解后的需求的理解。刚开始也许都会天真的以为,需求就是组长所说的那样,在开发过程中,一看之前的源码,怎么与需求有矛盾的地方。是我理解能力有问题吗?这个时候,要么是自己对于需求理解的不全面,没有想到逻辑中另外一种情况,要么是组长本身没有考虑到这点,更大的可能是也只有在开发时,才能意识到这个问题。
还有一种可能,就是面对的需求过于复杂。对系统所针对的业务需求缺乏必要的基础理解。这会有一段怎么想都想不通的时期,这是一段焦虑,被迫学习业务的时期,也正是由于这段经历,导致很多程序员对自己所接手功能的了解,甚至已经超过业务人员相关业务的理解。毕竟,谁是一手让这块业务系统化运行的?
这期间还会遇到技术性问题,不是所有公司都采用相同的技术组合方式,期间就要去掌握项目中所遇到的技术,这又会经历一段纠结期,不过这类纠结期,随着经历的次数越来越多,每次持续的时间就会变得越来越短。因为,慢慢的学会把握其中的设计理念与设计思路。
上面提到的几种纠结,基本错误的纠结,需求解释过程中信息损耗造成的纠结,历史代码造成的理解纠结,业务需求理解的纠结,技术学习遇到的纠结。是每个程序员从事这个工作必须经过的挑战。
其实还有种纠结,面对未来的焦虑。新的技术不断涌现,大牛怎么能达到那种程序?社会化标签的不断报道,比如将程序员和直男挂钩,年纪大了从事不了编程工作。并且由于程序员是与互联网连接最紧密的一群人,所以更容易接收到更多这样的信息。
尽管有如上种种纠结,但是大部分人都过去了,甚至在之后获得了一些快感,基本工具用熟之后,基本错误越来越少的快感。需求沟通时,本能的知道这里面会有哪些坑,假如这就是传说中的那个“项目经理”,就知道其靠谱不?这个需求的编码实现方式,被自己以一种牛逼的设计方式解决了。而这种设计灵感竟来源于很久以前不知在哪看过的一段话?或者自己不想再使用之前的写法了,换个方式写写。
这个阶段的挣扎于成长与很多行业的挣扎与成长是具有很多相似点的。刚开始,总是搞不定客户,总是不知道原由?一段纠结期,寻找答案,定位问题。客户需要什么?我能提供什么?我提供的界面是真的友好吗?一步步调整,直到拿到第一单。会计,面对大量繁琐的事情,奇葩们的反应让人总是不能让人保持Inner Peace。有时甚至还会触碰到法律边缘的取舍。面对的事情不同,复杂度不同,复杂的方式也不同,政治正确也不同。不过,都得经历这些挣扎与自我审视,自我突破与自我成长。
程序员到了这一阶段,可能就要分叉了。不是复杂的科研性质的编码,随着理解能力与熟练程度的上升。业务需求的编码工作会慢慢驾轻就熟,提不起兴趣。有人走向了项目管理岗位,有人走向了更专的技术研究领域,有人对于业务的理解日益精深,逐渐转岗到其他岗位。在我看来,如果处在这个阶段,不进则退,几年之后就没意思了,还不如搞其他工作了。
近水楼台先得月。由于平时大量的工作,是不断分析需求,想如何实现需求。这一过程中培养了解决问题的耐性与习惯。个人心智在这方面模块是经得起考验的。
另外一点,也是很重要的。让我们眼光看向市场,市场每天都在传递各种各样的需求。自己有这样的基础,有机会去实现这种需求。肯定不会面对“我什么想法有了,就只差一个程序员了”这种情况。就要将自己的目光面向信息源,去分析信息源的需求,无论自己将来走向了哪条道路?这个历练过程也将会是一个启发个人心智,定会有潜在收益的个人投资。
人是社会关系的总和,开源社区的发展正是借助于不计其数的程序员或者爱好者的共同协作。所以最有意思的事情,让自身融入到时代之中,莫让自己成为工具,工具会让我们看的更加清楚,而不是管中窥豹。有时甚至,需要抛弃手中的工具。看懂这个时代的需求,长久以来的训练是为了让我们看的更懂。所以要学会使用自己的能力。不可辜负大好年华!