Daniel Miessler认为,他们的关系可以这样表示—开发者 ⊆ 程序员,黑客 ⊆ 程序员,黑客 ∩ 开发者 ≠ Ø。
程序员、黑客与开发者究竟有何区别?这个问题往往会引发踊跃的讨论与辩论。但是我看到的很多说法往往至少在一个重大方面是有瑕疵的,所以在此我愿给出我的定义,希望这个定义能够更准确些。
- 程序员是能够通过操纵计算机代码解决问题的人。他们的技能水平可高可低—从掌握基本脚本的入门级到可利用任何一门语言的绝对巫师都算是。
- 黑客是做东西的人。在本文背景下,是指通过对计算机编程做东西的人。这是对这个术语的原创、纯粹的定义,比方说,你有了一个想法以后就设法 “破解” 某个东西让它可以工作。这个词也可用到修改东西使其功能发生重大改变的人身上,但是不像前面的定义用得那么多。
- 开发者是正规培训的程序员。他们并不仅仅要解决问题或者创造东西,而是按照一套设计和实施原则去做事。这些事情包括性能、维护、伸缩、健壮性以及安全等。
简而言之,这三者都利用代码去解决问题。程序员是一个涵括性术语,带有问题解决者的含义,黑客是创造者 / 多面手,开发者是正规培训的程序员,他们不仅解决问题,而且是采用(很可能是通过正规教育学到的)结构化和按照规定的方式去做解决问题。
关系
一个人可以是上述三种角色的组合。以下就是这三者的相互关系(参见下面的维恩图)
- 黑客和开发者都是程序员
- 许多程序员,甚至开发者的创意都不足以被视为是黑客
- 许多程序员,甚至也包括黑客,其教育程度或者经验均不足以被看作是开发者。
理想情况下一个人当然想同时成为这三种角色,比方说足够有创意成为一名黑客,受到的正规训练和经验足够多可以设计软件而不仅仅是破解东西。
不过即便你不是很有创意,并且 / 或者缺乏教育以及 / 或者经验来正确开发大规模应用,你仍然应该对自己是一名程序员感到自豪。利用代码解决问题本身就是一种超级能力。
附注:
- 黑客的类型很宽泛,可应用到任何领域,不仅仅是计算机。而本文主要是针对软件类型。
- “coder” 基本上等同于程序员
- 破解往往跟质量差相关联,但并不总是这样。这是因为破解通常都是大刀阔斧一想到就开干效果最好而不是一点点的慢工出细活。在黑客也是开发者或者虽然不是开发者但还需要盯住设计和质量的情况下,事后回过头来看看自己的创作并且解决存在问题几乎是免不了的。
- 确定谁可以叫做黑客,谁不能被称为黑客是一件认知见仁智者见智的事情。大都同意的基本规则包括 1)你得做出 1 件或以上大家觉得有用的东西,2)其他黑客觉得你是黑客。
- 在安全界,黑客还意味着多件事情。对于测试者来说这通常意味着这个人理解系统并且能攻克其安全控制。不过顶级安全对黑客的定义要更加纯粹,比方说创建了供他人使用的安全软件或工具的人就是黑客。
- 在流行文化里面,黑客意味着计算机犯罪。在安全界此类演员往往被称为是 “攻击者”。
- 著名程序员,同时也是最早的计算机社区名人之一的 Eric Raymond 是这样定义黑客的,“聪明、有创意、思想开放,享受问题解决和学习,乐意分享知识高于一切的人。”
- “软件工程师” 等同于开发者。意味着受到过有关软件架构、设计的正规教育以及必要的预教育。
本文由36氪编译自:danielmiessler.com
·氧分子网(http://www.yangfenzi.com)延伸阅读:
撰文:陈上进(台湾软件工程师,https://vinta.ws/blog/695)
对于刚踏入程序设计领域的初学者来说,万一程序语言选得不好,可是会一开始就落入鄙视链的底层
惨绝人寰的鄙视链提醒你:先去交个女朋友再来学写程序,一旦你成为软件工程师之后,就交不到女朋友了
一位台湾程序员眼中软件工程师的鄙视链:在软件工程师(大陆叫作“程序员”或“码农”)的圈子里,文人相轻的现象可是非常严重的,在程序设计的各个领域里都有着错综复杂的鄙视链。
最近这几年在世界各地突然吹起了一股全民写程序的风潮,连美国总统奥巴马都在写JavaScript了,但是身为一个靠写程序(以及在上班时间胡乱上网)来谋生的developer(所谓的developer就是“软件工程师”的比较潮的说法),想要提醒那些想学习写程序的人一件重要的事:慎选你的第一个程序语言。
从程序语言、编辑器、平台到{是写在if的同一行还是下一行,不同阵营的人都习惯鄙视来鄙视去。而其中“你用什么程序语言?”更是大家最热衷的一条鄙视链,所以对于刚踏入程序设计领域的初学者来说,万一程序语言选得不好,可是会一开始就落入鄙视链的底层啊。软件工程师的鄙视链到底有多惨烈、多残酷呢?
//程序语言篇//
懂Functional Programming的工程师鄙视老是把设计模式挂在嘴边的工程师,老是把设计模式挂在嘴边的工程师鄙视会说“你这样写就不OO了啊”的工程师,会说“你这样写就不OO了啊”的工程师鄙视会说“啊?什么面向对象?不是把重复的code写成一个function就好了吗?”的工程师,会说“啊?什么面向对象?不是把重复的code写成一个function就好了吗?”的工程师鄙视把同一段code到处复制粘贴的工程师,把同一段code到处复制粘贴的工程师鄙视PM。
写计算机静态语言的工程师鄙视写动态语言的工程师。
写汇编语言的工程师鄙视写C语言的工程师,C语言工程师鄙视C++工程师,C++工程师鄙视Java和C#工程师,Java工程师和C#工程师则互相鄙视,而C#工程师又鄙视Visual Basic工程师和会把C#念成“C井”的工程师,会把C#念成“C井”的工程师则鄙视认为HTML是一种程序语言的设计师。
用Python3的工程师鄙视还在用Python2的工程师,用Python2的工程师鄙视遇到UnicodeEncodeError的工程师。
写苹果iOS的工程师鄙视写Android的工程师,写Android的工程师鄙视写Windows Phone的工程师。
有Swift一年经验的工程师鄙视有Objective-C五年经验的工程师,写Objective-C的工程师鄙视用PhoneGap包装成native app的工程师。
用React.js的工程师鄙视用AngularJS的工程师,用AngularJS的工程师鄙视用jQuery的工程师,用jQuery的工程师鄙视用Vanilla JavaScript的工程师,用Vanilla JavaScript的工程师鄙视IE的用户。
用debugger的工程师鄙视用assert的工程师,用assert的工程师鄙视只会print()的工程师;用console.log()来debug的工程师鄙视用alert()来debug的工程师。
写Ruby on Rails的工程师鄙视所有使用其他语言的工程师。
什么?你说Ruby?Ruby只是Ruby on Rails的一套框架,才不是什么程序语言呢!
所有的工程师都鄙视PHP工程师。
//工具篇//
用text editor的工程师鄙视用IDE的工程师。
用Vim的工程师鄙视用Emacs的工程师,用Emacs的工程师鄙视用Vim的工程师,无论是用Vim或Emacs的工程师都鄙视所有用其他编辑器的工程师;用Atom、Notepad++、Sublime Text的工程师鄙视用Windows记事本的工程师。
用Android Studio或IntelliJ IDEA的工程师鄙视用Eclipse的工程师,用Eclipse的工程师鄙视用NetBeans的工程师。
程序代码用space缩排的工程师鄙视用tab缩排的工程师,用tab缩排的工程师鄙视混用space和tab来缩排的工程师。
用Git或Mercurial的工程师鄙视用Subversion的工程师,用Subversion的工程编程特刊99师鄙视用Dropbox来做版本控制的工程师,用Dropbox来做版本控制的工程师鄙视根本不知道什么叫作版本控制的工程师。
知道GitHub的工程师鄙视不知道GitHub的工程师;在GitHub有private repo的工程师鄙视为了免费的private repo而去用BitBucket的工程师。
用Zsh的工程师鄙视用Bash的工程师,用Bash的工程师鄙视用Cygwin的工程师,用Cygwin的工程师鄙视用“命令提示字符”的工程师,用命令提示字符的工程师鄙视用GUI接口的工程师。
用IRC的工程师鄙视用HipChat的工程师,用HipChat的工程师鄙视用Slack的设计师和PM。
用reStructuredText写文件的工程师鄙视用Markdown写文件的工程师,用Markdown写文件的工程师鄙视用HTML写文件的工程师,用H T M L写文件的工程师鄙视不写文件的工程师,然后用LaTeX写文件的工程师鄙视所有工程师。
用Nginx的工程师鄙视用Apache的工程师,用Apache的工程师鄙视用IIS的工程师。
用Spark的工程师鄙视用Hadoop的工程师,用Hadoop的工程师鄙视用Hadoop处理只有几GB数据的工程师,用Hadoop处理只有1GB数据的工程师鄙视用NoSQL的工程师,用NoSQL的工程师鄙视用关系数据库的工程师,用关系数据库的工程师鄙视用Excel的PM。
用Docker来部署server的工程师鄙视用Ansible或Puppet来部署server的工程师,用Ansible或Puppet来部署server的工程师鄙视用Fabric来部署server的工程师,用Fabric来部署server的工程师鄙视手动SSH的工程师。
//OS篇//
用Mac OS X的工程师鄙视用Linux的工程师,用Linux的工程师鄙视用Windows的工程师。
用Debian的工程师鄙视用Ubuntu的工程师,用Ubuntu的工程师鄙视用非LTS版本的Ubuntu的工程师。
//硬件篇//
用MacBook Pro Retina的工程师鄙视用MacBook Air的工程师,用MacBook Air的工程师鄙视用ThinkPad的工程师。
用Raspberry Pi的工程师鄙视用MacBookPro Retina的工程师。
用Dvorak键盘的工程师鄙视用Mac键盘的工程师,用Mac键盘的工程师鄙视用QWERTY键盘的工程师,用QWERTY键盘的工程师鄙视不知道QWERTY键盘是什么的工程师,不知道QWERTY键盘是什么的工程师鄙视用手写板的设计师。
坐Aeron椅子的工程师鄙视坐普通办公椅的工程师,坐普通办公椅的工程师鄙视跟他一样坐普通办公椅的PM,然后站着写程序的工程师鄙视坐Aeron椅子的工程师。
//职场篇//
搞硬件的工程师鄙视搞软件的工程师。
写OS的工程师鄙视写Web的工程师,写Web的工程师鄙视写desktop application的工程师。后端工程师鄙视前端工程师。工程师跟设计师互相鄙视。
信奉Test-Driven Development的工程师鄙视先写code再补tests的工程师,先写code再补tests的工程师鄙视不写tests的工程师,不写tests的工程师鄙视乱改需求的PM。
没有等级证书的工程师鄙视考了一堆证书的工程师。
上班穿休闲服的工程师鄙视上班穿西装的工程师,上班穿西装的工程师鄙视上班穿学校纪念衫的工程师。
如果你看了以上这些惨绝人寰的鄙视链之后,仍然没有击倒你想要学习coding的心,那我必须提醒你一件最重要的事:先去交一个女朋友,再来学写程序。
因为一旦你成为软件工程师之后,就交不到女朋友了。
有阵子没写程序员相关的文章,干脆再来个程序员三部曲吧。为什么是再呢?因为写过很多三部曲了:)
以前在文章里写过程序员鄙视链的问题,比如:写汇编的鄙视写 C 的,写 C 的鄙视写 C++的,C++程序员鄙视 Java 和 C#,Java 和 C# 程序员相互鄙视,写 Python 的和写 Ruby 相互鄙视,写 Scala、JRuby、Clojure 的一起鄙视 Java 程序员。写静态语言的和写动态语言的相互鄙视,写前端的和写后端的相互鄙视,Vim 程序员和 Emacs 程序员相互鄙视,然后一起鄙视使用 IDE 的程序员。
Go 语言程序员鄙视所有其他语言的程序员,所有其他语言的程序员都鄙视 PHP 程序员。PHP 程序员说,PHP 是世界上最好的编程语言,同时鄙视 Swift 程序员,因为他们经常写着写着就不能编译了(语法特性变更激进并且随时抛弃旧包袱)……
总之,程序员之间的技术鄙视链极其复杂,这里面虽然黑色幽默的成分居多,但技术宗教的意味也显而易见。除此之外,还有一种鄙视,属于不同形态技术人之间的。当年都是从写 Hello World 过来的,走过山,趟过河,埋过雷,填过坑。随着时光流逝,经历不同,机遇不同,每个人的特质也不同,于是大家有了不同形态的发展。有的程序员创业了,有的成为了产品经理,有的开始负责一块业务,有的则一直在技术领域深耕并成为技术大牛,还有一些像我这样的不知道是什么形态,二爷说是打杂形态(捂脸)。这本身无可厚非,毕竟每个人的特质是不一样的,找到自己最强的那 1% 才最重要。但奇怪的是,这条鄙视链居然一直存在,像一条若隐若现的丝线,纠结在技术人的中间,牵绊他们的成长。
早些年是那些管理者或产品经理嘲笑老程序员,说你都 35 了怎么还在编程。现在有点反过来,不少一直在技术领域的程序员开始吐槽那些转型的程序员「不务正业」,CTO 居然不写代码,嵌入式程序员跑去设计产品,等等。不说别人,被拉黑不太好,就说阿里的王坚博士,曾经任职阿里 CTO,他老人家应该有日子不写代码了,代码能力可能比不过在座的很多位,当年非议不少。但在王博士的主导下,最终阿里云成为了中国最大的云计算服务商,占据了国内 30% 以上的云计算市场。这个贡献,是不是比代码能力更强一些呢?
上周与阿里云的道哥(吴翰清)聊天,我俩总结了一下,觉得技术人有三种境界:
1、做好自己的技术,写出优秀的代码,一方水土,养一个技术人
2、技术驱动业务,做出优秀的产品,让世界变得更好一些。什么是优秀的产品?很多,比如微信
3、让更多的技术和技术人产生交集,让更多的人认识到技术真正的价值
在这个时代,技术和技术人本身是最有价值的,他们碰撞出的火花会形成巨大的驱动力,可以达到上千上万倍的价值提升,并推动世界的发展。在现代社会,技术一直是最强有力的底层驱动力,从操作系统 Windows,macOS,Unix,Linux 到移动操作系统 iOS 和 Android,从互联网技术体系到大数据 Hadoop 平台,每一种技术,一旦成为工业标准,就会迸发出巨大的能量,推动世界前行。
你造吗,我们在前两天的阿里巴巴技术大会上发布了「NASA」计划
不造啊,干啥用,你们要去造航天飞机了吗?这个进入硬件领域的角度多少有点刁钻啊。
不是,就是个类比,马云准备玩个大的,阿里的「NASA」计划就是在做技术驱动这件事。你们极客邦做为一个高质量的技术社区和内容服务提供商,也该去做这样的事情。
明白,看来阿里要把技术提到一个新的高度了。
是这样,「NASA」计划会组建新的团队,聚焦在机器学习、芯片、IoT、操作系统、生物识别等核心技术,全力以赴进行新技术研发。
和道哥聊完,我自己也陷入了思考。记得马云说过,以前阿里巴巴是技术跟着业务走的兵工厂模式,这种模式手榴弹造得再好,也造不出导弹来。阿里必须思考建立导弹的机制,成立新技术研发体系,研究的目标是为了解决 10 年 20 年后的困难。
硅谷钢铁侠马斯克的三个公司,Google,Apple,Facebook,中国的阿里,腾讯,华为,都在做类似的事情,这是一个技术力量以前所未有的姿态穿透世界的时代,如果你是个技术人,是不是该放弃成见,扯掉鄙视的链条,投入到这场技术变革的浪潮中呢?
扯的有点远,也有点大,但做事不就是大处着眼,小处着手么?不说了,你们忙着,我去搬砖了。