`

程序员的本质--->>转自php100

 
阅读更多
很多人认为计算机变得如此智能,所以在不久的未来将不再需要程序员。另外一些人认为程序员是天才,他们在电脑前能不断地解决复杂的数学难题。甚至不少程序员对他们是做什么的都没有清晰的概念。在这篇文章中,笔者想给不知情的人解释一下程序员到底是做什么的。

  程序员是将人类想法翻译成计算机语言的译者。

  他们是两种世界之间的纽带。你认为维护这个纽带很容易吗?

  人类世界的背景

  The problem with people is that they’re only human. – Bill Watterson

  人类的问题是,他们只是人而已。——比尔·沃特森

  人类是生物进化的产物,并且拥有独特而宝贵的器官——大脑,它能为程序员提供想法。大脑有组合复杂的新大脑皮层(对人类而言是独特的),还有从哺乳动物和爬行动物继承的旧结构。旧的大脑结构主要负责生殖(性)和生存(寻找食物或者躲避危险)。新大脑皮层进化成能够更好地支持这些功能,但是,它开始产生奇怪的副作用——意识、思考和好奇心。幸亏这些副作用的影响,人类产生了文明并在数千年后发明了计算机。

  一些人相信经过数千年的发展,人类应该变成完全沉闷的、理性的、可预测的生物,但是这并没有发生。人类旧的大脑结构、复杂的心理和社会行为往往使人们不理性,不可预测并带有欺骗性。并且,人类有糟糕的记忆力、强烈的情感和个人兴趣。但是,程序员没法选择与更理性的物种工作,他们不得不与人类共事并且把人类的想法翻译成计算机语言。

  计算机世界背景

  Part of the inhumanity of the computer is that, once it is competently programmed and working smoothly, it is completely honest. – Isaac Asimov

  计算机非人性的一部分表现是,一旦完成编译并且顺利运行,它将忠实地完成工作。——艾萨克·阿西莫夫

  计算机是人类文明的最佳发明。它由CPU、主板、内存、硬盘驱动器、显示器和其他部分构成。计算机将我们的文明推入一个新的水平,使我们的生活更有意义并充满乐趣,还弥补了我们大脑的缺陷。很可能计算机比人类更聪明。(不过,我有点关心如果这成为现实后,计算机还需要人类程序员吗?)

  现代计算机具有完全逻辑性、直接性和顺从性。如果你知道它应该做什么并且知道如何命令它,那么和计算机一起工作是快乐的。唯一的问题是,计算机只会做你告诉它去做的。因此,你应该有清晰的思路并且在见你的上司或客户时保证计算机不出岔子。

  在人类和计算机之间的翻译

  翻译中会遇到三个主要的挑战:

  1. 语言歧义。人类语言是模糊、复杂并且双关的,例如:“这个程序不能提供良好的用户体验”。文化、背景和上下文语境都会对沟通和含义造成影响。与之相反,所有计算机语言都是准确、直接的,与上下文无关。

  2. 细节层次。人类的沟通是笼统而不带有过多细节的,例如:“我想让这该死的程序运行起来”。这样可以节省时间与精力,但由于缺少详细信息,会产生两个比较大的问题——误解和不确定性。而计算机需要所有细节——每件事都要说清楚。

  3. 思维模式。人类习惯于思考需求、结果与解决方案之间的关系,例如:“这份报告应该在2秒内运行,而不是2个小时”。然而,计算机需要算法——按照步骤去达到想要得到的结果。

  为了写出优秀的软件,程序员们必须克服这些困难,理解人们的想法并将之转换成计算机语言。

  一名优秀程序员所具备的能力


  我们可以看到,一名优秀程序员应该具备应付两个不同世界的两套技能。

  理解人类的需求并提出解决方案:

  1. 沟通——与人建立联系的能力,能够同他人亲密的交谈,并有勇气去尝试分享自己的观点。

  2. 意图——从谈话中提取有用的信息,理解并使之有意义。

  3. 逻辑——为不懂让步的计算机整理、剔除那些人类思想中含糊而有争议的内容。

  4. 创造力——挖掘、转变人类的想法,从而创建优秀的解决方案。

  5. 构思——利用人类友好的接口和便捷的互动性来包装编程思想。

  6. 大局观——清楚解决方案是如何适应全世界的用户、企业以及其他,从而使你的程序更有用。

  告诉计算机该做什么,并建立解决方案:

  1. 逻辑(再次强调)——把程序员的想法组织整理成有凝聚力的软件思想和计算机指令

  2. 技术——发现并理解科技黑箱(对于99%的人来说是黑箱)。

  3. 编程语言——学习美观的、富有逻辑的、清晰明了的语言,从而把程序员的想法提供给电脑。

  4. 算法——精通让计算机完成任务最高效的方法。

  5. 建模——在软件代码中建立抽象和模型,从而掌握并操控想法。

  6. 实践(比如代码重构、单元测试、持续集成)——周期性活动,以保持系统可靠、健康与可改变。

  面向人类和面向硬件对象/系统的程序员有很大不同。

  不与人沟通的程序员不是好程序员。一个优秀的解决方案需要计算机世界与人类世界的双重技能。只有连接起两个世界,才能成为一个真正的优秀程序员。
分享到:
评论

相关推荐

    CodeIgniter:php敏捷开发框架web快速开发详解

    下列网址可以找到一个针对十种框架的简明图表分析:http://www.phpit.net/article/ten-different-php-frameworks/。 如果你访问上述网址中相关产品的官方网站,你将会注意到,每个论坛都有一个共同的热点,就是到底...

    开源的社交登录PHP库.zip

    开源系统其实面向的用户有两个群体,一是程序员,他们最关心源代码,能不能进行二次开发利用;二是普通终端用户,他们只关心软件功能够不够强。开源系统的重点应该是在“开放”,是接纳、包容和发展,求同存异,互利...

    php 利用socket发送GET,POST请求的实例代码

    作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步。最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅。希望分享给大家。本文需要有一定http基础的开发者阅读。  ...

    让PHP开发者事半功倍的十大技巧小结

    如果你使用一面大镜子作为冲浪板会发生什么?或许你会在较短的时间内征服海浪,但是你肯定从内心深处明白,这不是冲浪的正确选择。...这并不是因为你是一个糟糕的程序员,而是因为如果你想写出好的可维护性强的代码,有

    inspekt:Inspekt是一个PHP库,可以更轻松地编写安全的Web应用程序

    通过PHP超全局变量访问用户输入本质上是危险的,因为“默认”操作是检索原始的,潜在危险的数据 在应用程序源代码的各个位置进行的零散的“内联”过滤/验证太容易出错,无法有效执行 库或框架的目的是使程序员的工作...

    在PHP中养成7个面向对象的好习惯

    在 PHP 编程早期,PHP 代码在本质上是限于面向过程的。过程代码 的特征在于使用过程构建应用程序块。过程通过允许过程之间的调用提供某种程度的重用。 但是,没有面向对象的语言构造,程序员仍然可以把 OO 特性引入...

    libMBTA:用于访问 MBTA 实时 API 的 PHP 库

    无法保证编写良好的代码,因为我不是天生的程序员,我只是一个会编程的人。 因此,当您不可避免地发现错误或更好的做事方式时,请买家注意并提交拉取请求。 实际上,目前在这个库中没有太多的增值。 它本质上是将...

    数据分页程序完全解决方案(含普通分页/分段分页/原始分页/since_id分页)

    因此, 程序员们开始使用since_id的方式, 将下一次获取数据的点记录下来, 已减轻上述弊端. 在同一个用户界面, 通过用户阅读行为自动获取下一段/上一段数据的确比点击"下一页"按钮的用户体验要好, 但同样有弊端: a) ...

    计算机程序的正确定义

     可是,当我们只关注形式而不关注实质的时候,有些事情就发展到了它的反面。程序不是医治百病的灵丹妙药,在它走向反面的时候,它是使那些官僚主义者和视劳苦大众利益如不见的人们推脱掉自己应当承担的责任的最好的...

    springCloud

    而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置...

    reviewLearned:复习学过的知识,和做过的项目,用作应付面试

    二次注入本质是程序员信任数据库中的数据,拿出来使用没有进行过滤。再拼接数据库时会直接操作admib用户5.宽字节注入数据库端使用GBK编码,%df开头的连续两个字符变成汉字。输入%df'通过后台过滤变成%df'到数据库...

Global site tag (gtag.js) - Google Analytics