当我们谈论程序员时在谈论什么?

我们每个人都知道程序员的工作是写代码,那究竟什么是写代码?

如果非要对给程序员的工作做一个比喻的话,在社会上最接近程序员工作的是翻译,只是平日的翻译是针对人和人,而程序员针对的是人和机器。浓缩成一句话形容程序员的工作的话,那就是:把人类的需求告知机器。

当我们用电脑用手机在玩游戏或者上网时,做的其实都是对计算机程序的交互。一个例子能讲清楚很多事情。我们定义此时此刻正在阅读这行字的人—你,为『加法』,意思是我们强迫你大脑放空,除了加法不要(也不能)去思考任何其他的内容,你的工作只有在遇到两个数字的时候,给我们一个运算结果。也就是说,当你看到1和2在你身边出现的时候,你的工作就是说出来等于3,那么此时此刻恭喜你,你成为了表达式(expression)世界中的一员。

为了方便去描述上面的事情,我们约定成俗把你写作『+』,也就是上面的过程简单的表达为:1 + 2 。

但这个过程过于缺乏娱乐性,我们再找到三个小伙伴一起玩一个游戏。游戏的规则是,某个旁观者给你一个数字,当遇到数字5的时候就有人站出来喊『是的(true)』,其他所有的数字都喊『错误(false)』。

现在我们要重新安排任务了,显然在这个模型内并不需要做加法。值得注意的是,在任务设计的时候,尽可能减少每个人所做的工作,一是为了减轻压力,减少出错的可能性,二是为了下次游戏的时候每个人依然可以使用自己的身份。其中我们称你为『判断者』,代号是『==』(两个等于号),另外三个小伙伴分别为『正确者』称为『true』;『错误者』称为『false』;『提醒者』要出现两次,一次为『if』,一次为『else』。

下面游戏开始,第一次我给出的数字是1。首先『判断者』判断这个数字不是5,所以走到『提醒者』的身边告诉他得到的数字不是5,之后『提醒者』回忆规则里面说道,如果不是5的话就要喊『错误(false)』,于是他走到了『错误者』的身边戳了一下,『错误者』只能怨念的喊出『false』。

这个过程如果简化的话,可以写成下面的样子:

if( 1 == 5) true; else false;

我们用括号确定优先级关系,和数学里学到的一样。而分号作为了一个分隔符,只是为了区分前后关系。

一个计算机语言,就是找了成千上万个小伙伴,把他们抽象成了某种特殊的功能,去做上面的游戏。而程序员,就是要设计这个游戏,让其满足人类的某种特殊目的。

世界上有多少种计算机语言?为什么有这么多种?

没有人清楚世界上有多少种语言,因为创建一门计算机语言其实并不太复杂,有的计算机语言可能只是沉睡在某个实验室的硬盘里,有些计算机语言可能只是写在书里。但可以讲一个故事解释为什么有这么多种。

假设我们出生在一个剑与魔法的世界,而你是命中注定拯救世界的英雄。我们先设定你的职业为一个魔法师。当你18岁那年,你的老师告诉你这个世界即将遁入黑暗,唯有你能拯救一切,然后让你选择一个以后发展的方向。因为年少时你就喜欢玩火,所以决定做一个火系魔法师。在苦练数载完成学习后你踏出人生旅程,你在『码农去死村庄』门口遇到了一只树妖,打了一个响指就直接烧死了它,再往前走了几部发现村子门口蹲着一只『水箭龟』,卒。

显然火系的魔法师在水的面前完全没有施展空间。就像树妖见到火系法师一样怂。

计算机语言也是如此。不同语言各司其职。

像PHP用来写网页,Objective-C用来做iOS app,Perl做文本处理,C语言做底层开发,Haskell用来装逼,Prolog为了检测智商。但事情并不绝对,因为库和框架的存在使得很多语言能做的事情要宽广的多,我们之后要介绍的Javascript就是如此。那库和框架是什么?你可以理解为是一门语言的装备,就像火法师拿了霜之哀伤一样是强者。

但不要失落,觉得一辈子也就学一门语言。编程语言的共通性比想象中强的多,当你真的把一门语言入门以后,就能感觉其实像不同地方的汉语方言一般,并没有太难懂。哪怕不会说,但或多或少也能听懂或者看懂,再学一门语言的难度远远小于用了20年汉语后去学克林贡语。

我们笼统的也会因为使用习惯问题,把一些语言去做分类,经常见到的一个名称是『面对对象编程(Object-oriented programming,缩写:OOP)』,也是现在程序设计领域的主导思想之一。

要理解面对对象很容易,我们先声明一个类(Class)叫做『人』,并且将其记住。每个人具体包含的有:『身高』,『体重』,『长相』,『收入』。我们之后每次形容一个人的时候,都可以套用这个类。

例如,我们形容程序员,这里我们把程序员称为『对象(Object)』,在这个系统下,每个『对象』都是『类』的实例。程序员被定义为:『身高』=『矮』,『体重』=『胖』,『长相』=『丑』,『收入』=『低』。农民工可以被定义为:『身高』=『高』,『体重』=『正好』,『长相』=『丑』,『收入』=『高』。之后每次我们提到程序员或者农民工,脑海中就会自然而然的浮现上面那些内容。

这种方法相比较其他的编程哲学来说好处非常明显,主要提升了程序的复用性和可扩展性,并且更容易维护。像在上面对程序员和农民工的定义里,不用每次都重复考虑一个人需要包含什么,同样当你要对人的描述增加时,只用在定义『人』这个类的地方修改就可以。

编程难在什么地方?面对众多的路口,我们该如何抉择

编程是一个考验人生观和价值观的事情。作为一个程序员有几点非常重要的品格:

自学能力。程序员要面临的是一个更新换代远远快于其他行业的学科,甚至快到如果在学校内学习计算机毕业之后可能发现学校里的东西已经落伍。所以要抱着一颗开放的心态去随时接受各种新鲜事物。

激情。程序员的工作和这个社会绝大部分工作一样枯燥,但当你真的喜欢了一个创造事物的过程以后,这种看似乏味的工作也能演化出一些欲罢不能的激情。

实用主义。程序员是工程师。要面对的事情是把东西做完做好,而不是给出一个模棱两可的答案,这就要保证每个写程序的人必须头脑清晰的认知到自己所做的事情和将要发生的事情究竟是什么。如何做好,才是真的重要的。

当你真的满足这些条件的时候就能觉得渐渐已经上道,但你距离一个优秀的程序员差距还有很大,例如脑子是不是够清晰,例如是不是真的耐得住寂寞,例如英语是不是够好,例如颈椎是不是受得了。

曾经虎扑上讨论过关于天赋和努力的问题,结果是很残酷的,多数人都认为在球员的世界里天赋决定上限,勤奋决定下限。程序员的世界也是如此,当真的往顶级程序员努力的时候,可能『脑子笨』就是天花板。但幸运的是对于正常程序员的工作范围来说,一辈子都碰不到那天。

最后引用《疯狂的程序员》里的一句话:程序员是值得尊敬的。 程序员的双手是魔术师的双手。 他们把枯燥无味的代码变成了丰富多彩的软件。

文字:王亚晖 插图:郦橙

原文发布于微信公众号 - BestSDK(bestsdk)

原文发表时间:2015-07-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LET

我的面试心得:面试官视角

15460
来自专栏程序员的知识天地

自学Python找不到工作?吃鸡半小时,编程五分钟,劝你还是放弃吧

Python发展可以说是如日中天,更多的人选择学习Python,也更多的人开始关注它,从这些关注度来看,我发现关注度最高的还是Python的就业前景是怎么样的,...

14030
来自专栏程序员互动联盟

面试程序员需要注意的七个小细节

此文是我作为一个面试官关于如何在技术面试中出奇制胜的经验总结。现今大多数的面试都遵循一定的模式。如果你能够理解面试官的问题,按照他的方式回答,那么任何面试都将不...

42770
来自专栏程序员互动联盟

学会了C语言,能开发什么?

看招聘职位要C语言的比例真不多了,是不是C语言真的过时了? 看看很多招聘网站有关找纯粹的C语言开发的比例真的不是很多,都被Java,php,python等等语言...

60960
来自专栏java一日一条

不拼颜值的编程世界你靠什么上位?

随着功能需求的逐步升级,编程语言的更新换代也变得越来越频繁,近年来编程语言的种类更是已经突破了600大关。在前浪不断被拍在沙滩上的编程语言世界里,斑斑却发现每一...

8520
来自专栏机器人网

3D打印可以造出天下所有物品(多图~)

3D打印其实并不是最近几年才有的,之前就有类似的技术,只是当时还不够完善,还没有引起足够多人的关注。最近几年随着技术的发展不断诞生优秀的3D打印设计作品,3D打...

28350
来自专栏Java学习网

Java初学人员的注意事项

初学者如何学好Java 1、适合自己的图书才是最好的,最好的书并不一定适合你,看自己的情况。(如果你是一个Java初学者一上手就捧一本Thinking in ...

24550
来自专栏架构师之路

架构师需要具备的几项技能

1. 好的架构师,一定是好的程序员 没写过N年代码,何来指点江山? 没做过N年架构实践,何以指导避坑? 只有框架,没有细节,何以服众? bad case:项目失...

29030
来自专栏企鹅号快讯

什么是好的程序员?

C语言杂谈 什么是好的c/c++程序员? c/c++程序员就应该有c/c++程序员修养 ? 什么是好的c/c++程序员?是不是懂得很多技术细节?还是懂底层编程?...

198100
来自专栏PPV课数据科学社区

R语言知识体系概览

1. R的知识体系结构 R语言是一门统计语言,主要用于数学建模、统计计算、数据处理、可视化 等几个方向,R语言天生就不同于其他的编程语言。R语言封装了各种基础学...

38670

扫码关注云+社区

领取腾讯云代金券