程序员的 7 个等级:程序员、程序员、计算机科学家、开发人员、工程师、架构师软件构建者的众多名称武术腰带结论

2025-05-25

程序员的 7 个等级:程序员、程序员、计算机科学家、开发人员、工程师、架构师

软件构建者的众多名称

武术腰带

结论

这篇文章最初发表在CoderHood上,标题为“Coderhood 的 7 个等级:程序员、程序员、计算机科学家、开发人员、工程师、架构师”。CoderHood 是一个致力于软件工程人性化维度的博客。

软件构建者的众多名称

在我的博客,我交替使用了“编码员”、“程序员”、“软件开发人员”和“软件工程师”这些术语。我这样做主要是为了避免语言上的重复。然而,我认为这些词语与其他类似的词语之间存在差异。

在本文中,我将讨论一组常用于指代编写代码的人的名词。我还将解释这些术语与工程技能水平之间的关系。

含义解读

我在这里提出的定义并非官方定义。据我所知,目前还没有正式的定义,也没有值得信赖的机构来制定这样的定义。然而,很多人对此持有强烈的看法。我对每个术语含义的理解基于我在软件行业三十年的经验,但我完全预料到其他人会不同意我的解释。

我的目的并非引发争论,也并非试图说服任何持有强烈观点的人。我认为目前尚无对错之分。然而,如果您尚未就此事形成强烈的看法,我希望本指南能够为您提供一些可能的解读。

三管齐下的方法

为了清楚起见,对于每个名词我将做三件事:

#1 - 描述技能水平

我将提供对我的解释而言该术语所暗示的技能水平的描述。

#2 - 提供与武术等级对应的对比

我将用武术段位来打个比方。具体来说,我将把该术语所隐含的技术软件开发技能水平等同于武术腰带的颜色。

#3 - 给出代码示例

我将举一个例子,说明我预期该水平的人会如何解决一个简单的编程问题。我将使用的定义很简单,并非旨在成为一个现实的例子。其目的是比较和讨论技能水平。之所以设计得如此简单,是为了让任何人,无论经验如何,都能轻松跟上。我将使用的问题如下:

计算一组整数的总和。

当你阅读我的论文时,请你不妨想象一下,这代表着一个更为复杂的情况。在这个虚构的宇宙中,这项任务需要认真思考,并且有许多潜在的解决方案和设计方法。想象一下,它是一个需要扩展和执行的系统的核心计算部分。

我将使用 Ruby 展示一些简单的实现示例;代码足够简单,即使您不了解 Ruby 也应该能够理解。如果您看不懂,不用担心。

清单

我将要讨论的名词是:

  • 初学者。
  • 檔案員。
  • (黑客)
  • 程序员。
  • 计算机科学家。
  • 软件开发人员。
  • 软件工程师。
  • 软件架构师。

准备好了吗?让我们开始吧。

武术腰带


我十几岁二十几岁的时候住在意大利,那时体重大概只有40磅。我花了好几年时间练习柔道和功夫。那段时间我了解到,在很多武术中,腰带的颜色象征着练习者的技艺水平。典型的颜色图案是从白到黑,颜色的深浅与经验水平成正比。

初学者佩戴白带,因为他们缺乏经验。白色象征着“崭新而干净”。随着武术家的训练,腰带颜色会逐渐变深,以表明他们的进步。这种颜色代表着辛勤汗水和积累的污垢。经验丰富的武术家最终会获得黑带,以表明其高超的专业知识和技能。

传统上,腰带只有黑色或白色。近几十年来,腰带颜色逐渐丰富。如今,不同的武术流派有不同的腰带颜色方案。具体方案取决于流派、道场和国家。

我为什么要谈论武术?

我将用武术腰带的颜色来比较软件专业人员的软件开发技能和武术家的格斗技能。为此,我将使用欧洲常用的腰带颜色方案。顺序为:白色、黄色、橙色、绿色、蓝色、棕色和黑色。

下表列出了我提到的工程学等级。每个等级都对应着相应的腰带颜色,以及通常授予该技能等级人员的称号:

工程级别 武术等级(腰带颜色) 职位名称示例
初学者 白色的
黑客 街头霸王(无腰带)
编码器 黄色的 初级开发员
程序员 橙子 软件开发
计算机科学家 绿色的 软件开发
软件开发人员 蓝色的 高级软件开发人员
软件工程师 棕色的 首席开发人员
软件架构师 黑色的 软件架构师

工程技能水平与开发人员的技术和团队合作能力相关。职位名称是业内对该级别人员的称呼示例(很大程度上取决于公司和地理区域)。

初学者 - 白带


你必须从某个地方开始,而这通常意味着“完全没有经验”。软件开发中的初学者指的是:刚接触编程,处于学习初期的人。如果不查阅书籍、教程、指南或寻求他人帮助,初学者还无法可靠地编写或理解简单的功能程序。

初学者或许能够编写出可用的代码,但他们往往不理解代码运行的细节。他们通常会花费大量时间在 StackOverflow 或类似网站上搜索代码片段,然后将它们拼凑在一起,直到最终实现功能。

强大的工具并不等同于强大的技能

更令人困惑的是,许多“现代”语言和框架允许任何人生成复杂程序的结构和部分实现,而无需了解幕后运作。例如,任何人只需几个命令行命令和一点点决心,就能启动并运行一个简单的 Ruby on Rails 应用程序并接受 HTTP 请求。

以下是在 *nix 系统上执行的操作:

$ gem install rails
...
$ rails new website
...
$ cd website
$ bin/rails server
...
Enter fullscreen mode Exit fullscreen mode

搞定!这就是让服务器响应 Web 浏览器生成的 HTTP 请求所需的全部内容。如果这是一场武术比赛,这就相当于带着盔甲和枪出现。盔甲或许能让你多活一会儿,而枪或许能让你赢得比赛。然而,以这种方式赢得比赛并不意味着你就是技艺精湛的武术家。它只是为你提供了一些工具,让你无需传统的训练、努力或学习就能完成一些具有挑战性的事情。

别误会我的意思。像 Ruby on Rails 这样能让开发者快速完成工作的工具确实很棒。事实上,我认为减少花在任何样板代码上的时间非常有效。这对于项目来说是一个很好的开端,但它只需要白带级别的技能。

真正的战斗始于教程结束,工具无法自动生成你试图实现的应用程序。要想克服这一点,你需要成为一名程序员。

一个例子

如果一个初学者想用 Ruby 编写一个对一组数字求和的程序,他们可能会在 Google 上搜索“如何在 Ruby 中对数组进行求和?”,然后找到这个页面。这是本文撰写时 Google 搜索结果中的第一个。该页面给出了以下得票最多的答案,在 StackOverflow 上获得了 524 个赞:

array.inject(0){|sum,x| sum + x }
Enter fullscreen mode Exit fullscreen mode

果然,它成功了。以下是示例:

$ irb
2.4.2 :001 > array=[1,2,3]
 => [1, 2, 3] 
2.4.2 :002 > array.inject(0){|sum,x| sum + x }
 => 6 
Enter fullscreen mode Exit fullscreen mode

初学者或许能做到,但他们并不理解这段代码的利弊。它可读性强吗?与其他实现相同功能的方法相比,它速度快吗?它易于维护吗?它为什么有效?执行这行代码时究竟发生了什么?它占用了多少 CPU 资源?变量“sum”和“x”在这行代码运行后是否被定义?

初级 Ruby 开发人员不知道大多数这些问题的答案。

编码员 - 黄带


程序员是指能够编写多行计算机代码,无需他人帮助就能解决一系列简单问题的人。代码的最终结果可能并不完美,但他们理解代码的工作原理,并能出色地完成工作。

第一步

我把我的博客命名为“CoderHood”,因为每个以写代码为生的人,在某个阶段都会达到“程序员”的水平。“Coderhood”这个词是我自创的,用来形容从拿到第一条黄带开始的科技开发者生涯。

初学者和程序员之间的主要区别在于,程序员可以编写代码并理解代码。他们可能不完全了解幕后发生的事情,但他们知道自己为什么要写这些代码。

在行业中,与程序员相关的头衔是“初级开发人员”或“培训中的开发人员”。

一个例子

我希望“Ruby 程序员”能够想出并知道以下大多数计算整数数组和的方法之间的区别:

$ irb
2.4.2 :001 > array=[1,2,3]
 => [1, 2, 3] 
2.4.2 :002 > array.inject(0){|sum,x| sum + x }
 => 6 
2.4.2 :003 > sum=0;array.each { |x| sum+= x };sum
=> 6 
2.4.2 :004 > array.sum
=> 6 
2.4.2 :005 > array.inject(0, :+)
 => 6 
2.4.2 :006 > array.reduce(0, :+)
 => 6 
2.4.2 :007 > eval array.join '+'
=> 6 
Enter fullscreen mode Exit fullscreen mode

如果你感到疑惑,你会发现其中一些是糟糕的解决方案,但它们仍然是有效的解决方案。

黑客 - 牛仔裤和无腰带


我把“黑客”也加到列表里,因为肯定会有人问起。不过,这个词不太适合这次讨论。

并非必备技能

我不认为“黑客”技能是软件开发人员成长道路上的必备技能。白帽黑客技能对于学习如何测试和保护软件应用程序和系统很有用,但我不认为这个词描述了整体的“技能水平”。我将其归类为某些人会做的事情,而不是技术熟练程度的指标。事实上,黑客的技能水平参差不齐。有些人非常出色,而有些人则不然

由于黑客并非软件开发进阶的必要垫脚石,因此在我的比喻中,黑客不会佩戴传统的武术腰带。他们更像是穿着牛仔裤却不系腰带的街头霸王。

他们中有些人是愤怒的暴徒,有些人是生存主义者,有些人是保卫人民的好人,大多数人介于两者之间。

“黑客”的种类有很多。

黑客有很多种类型。有些人会编程,有些人不会。“黑客”一词的含义取决于上下文和使用者。一些常见的定义如下:

  1. 一位坚持技术和编程亚文化的计算机专家。
  2. 可能为了恶意(黑帽)或安全研究(白帽)目的而危害计算机安全的个人。
  3. 以最快、最粗糙的方式完成工作的软件开发人员。
  4. 研究、试验或探索电信系统、设备以及与电话网络相连的系统的人。这类黑客也被称为“电话窃听者”。
  5. 一名技术娴熟的工程师,他工作非常接近硬件,以便出于正当理由(即从硬件中榨取更多性能)或恶意目的(即利用安全漏洞并找到绕过操作系统防御的方法)来获取对系统的更多控制。

一些例子

类型 3

类型 3 的黑客可能会选择使用以下“ruby 代码”来对整数数组进行求和:

$ irb
2.4.2 :001 > `echo "1+2+3" | bc`.to_i
 => 6 
Enter fullscreen mode Exit fullscreen mode

至少在某些系统上,它可以正常工作,但它是一种……“完全的黑客行为”。这种行为是那些不熟练的黑客才会做的事情。他们做事的方式很可疑,通常会执行一些难以理解的命令行命令,直到以某种方式得到他们想要的结果。

类型 5

第五类黑客的操作非常底层,接近硬件层面。这种技能确实有其优点:它不容易掌握,但如果你试图保护软件系统的安全或编写高性能应用程序,它就非常有价值。我从来都不是所谓的“黑客”,但我开始使用非常接近硬件(C 语言和汇编语言)的代码,而且我内心深处仍然认为自己是一名底层开发人员。

第五类黑客可能是出色的街头霸王,他们拥有超强的技能,在一些非常专业的任务上甚至能让许多专业程序员望尘莫及。这类“黑客”可能会选择使用汇编语言对整数数组进行求和,就像这样

程序员 - 橙带


程序员能够编写功能齐全的应用程序,了解基本算法,并具备一些计算机科学基础知识。程序员可以让产品正常运行,即使该产品在长期内可能不太具备可扩展性和可维护性。程序员通常擅长独立工作,但也可能不擅长团队合作。

大多数开发人员都停留在这个级别,尤其是如果他们不打算学习计算机科学理论的话。程序员可以编写出不错的代码,并在这个级别上在软件行业工作,并在整个职业生涯中一直保持这个水平。

从行业头衔的角度来看,程序员通常被称为“软件工程师”。

在简单的“整数数组的总和”示例中,程序员可能会决定以这种方式编写代码:

#!/usr/bin/env ruby

if ARGV.size==0
  puts "Usage: "
  puts "   sum [space separated list of integers]"
else
  puts ARGV.sum{|x| x.to_i}
end
Enter fullscreen mode Exit fullscreen mode

这段代码实现了一个可用的命令行命令,用于对一串数字进行求和。如果不带参数调用,它会显示一条有用的使用信息。否则,它会将结果打印到标准输出上。以下是使用示例:

$ sum
Usage: 
   sum [space separated list of integers]
$ sum 1 2 3
6
Enter fullscreen mode Exit fullscreen mode

它是一个“完整的解决方案”,它是自文档化的,并且有点抽象,因为您可以将其作为命令行命令调用。

计算机科学家 - 绿带


计算机科学家是指在学校或工作中学习过计算机科学的人,对以下概念有很好的理解:

  • 基数-N(N = 2、10、16)
  • 二元运算
  • 布尔逻辑
  • 算法复杂度和大O符号
  • 数据结构(数组、链表、B 树、红黑树、队列、堆栈、哈希表、堆、集合、图)
  • 排序算法以及何时使用它们。
  • - 对 NP 完全性的基本理解
  • 基本多线程算法
  • 内存管理和垃圾收集(仅仅因为你使用一种可以为你处理内存管理的语言编写代码,并不意味着你可以不理解它)
  • 指针(即使您不使用 C 或 C++ 编写代码,您至少需要理解这个概念),以及通过值或引用传递参数之间的区别。
  • OOP 概念(接口、继承、构造函数、析构函数、类、对象、抽象、封装、多向性等……)
  • OO 设计和模式
  • 递归
  • 对动态规划、贪婪算法和摊销分析、字符串匹配和近似算法的一些基本了解

计算机科学家拥有计算机科学学位,或者拥有多年的开发经验,并在工作中学习过应用计算机科学理论。正如你所知,我认为拥有计算机科学学位并非在软件工程领域取得成功的必要条件。

现在,仅仅成为一名计算机科学家并不能让你成为一名优秀的程序员,这似乎有点违背了武术的类比。然而,事实并非如此。想想看:即使在武术界,也有专长。有些绿带在某些方面比其他绿带更胜一筹。这种进步是非线性的。腰带的颜色通常代表着经验的水平和为掌握武术所付出的努力,并不一定代表着每个方面的技能水平。

计算机科学家可能会像程序员一样编写整数和的解法。然而,不同之处在于,计算机科学家可以立即告诉你该算法的复杂度是 O(n)。如上所述,这是一个简单的例子,但你应该明白我的意思了。

软件开发人员 - 蓝带


软件开发人员能够完成更大、更复杂的项目。与程序员和计算机科学家相比,软件开发人员:

  • 编写更清晰、设计更好、更易于维护、更有文档记录且更易读的代码。
  • 编写更少的错误。
  • 工作速度更快。
  • 更善于团队合作,并了解开发过程的价值。
  • 更善于发现和优化代码和软件系统的瓶颈。
  • 拥有更多经验(去过那里并做过那事)。

一个例子

在简单的“整数求和”示例中,软件开发人员可能会选择通过构建一个公开 Web API 的服务来解决问题。该 API 会输入一组整数,然后返回求和的结果。

我希望该应用程序至少有完善的文档和可配置性。它还应该包含测试、合理的源代码组织,并且易于其他开发人员维护。

使用 Sinatra 的 Ruby 主应用程序可能看起来像这样:

require 'sinatra'
require "sinatra/config_file"

# Load the server configuration from config.yml:
config_file 'config.yml'

#
# EndPoints:
#
# /sum/n1+n2+n3+n4+...
# Return:
#     {result: [sum of n1,n2,n3,n4,...]}
#
# Example:
#    $ curl http://localhost:8080/sum/1+2+3+4
#    {"result":"10"}
#
get '/sum/:numbers' do |numbers|
    {result: numbers.split("+").collect{ |x| x.to_i}.sum}.to_json
end
Enter fullscreen mode Exit fullscreen mode

优秀的软件开发人员应该清楚,与其他解决方案相比,此解决方案存在诸多局限性。例如,它只能计算 URI 中匹配的一组数字的和;它没有明确的错误检查,会将非数字开头的字符串解释为零,等等。

软件工程师 - 棕带


软件开发人员和软件工程师之间的区别是有争议的;我完全承认这一点。这两个术语通常可以互换使用。然而,我认为软件工程师是指拥有计算机科学家的计算机科学知识,并拥有丰富的软件开发经验的人。主要区别在于:

  • 能够创建更具可扩展性的系统。
  • 工作寿命。他们的工作寿命更长,问题更少。
  • 更少的错误,更好的代码质量。
  • 有能力担任项目和团队的技术负责人。
  • 具有出色的协作和沟通能力。
  • 足够的软件架构技能才能完成工作。

在行业中,你会发现这种开发人员的头衔是“高级开发人员”或“首席开发人员”。

一个例子

软件工程师可能会选择编写“整数求和”应用程序,通过构建服务并公开 API 来获取一组整数,就像开发人员一样。但是,我希望软件工程师的解决方案能够包含以下改进:

  • 结果缓存。
  • 将概念从总和抽象为请求中传递的任何数学表达式。
  • 包括日志记录、身份验证、监控挂钩等。

这个例子有点傻

正如你所见,我选择的例子本来很简单,但却成了问题,甚至显得愚蠢。它演变成了一场关于如何改进一个已经过度设计的解决方案的讨论,而这个解决方案原本就很简单。

例如,管理对一小组数字执行简单运算的结果缓存,很可能比直接进行计算更繁重、更慢。只有当传递给 API 的数字集合非常庞大时,这才有意义;但在这种情况下,请求的 URI 无法容纳该列表。

您可以将数字列表移到请求主体中,但这样一来,它就不再是一个 RESTFUL API,请求也将不再可缓存。这时,您可能会想将请求更改为 POST,但这将使其永远无法缓存。总之,这个讨论可以一直持续下去。

关键部分

你明白是怎么回事了吗?随着开发人员技能的提升和项目变得越来越复杂,一件有趣的事情发生了。艰难的选择越来越少地集中在“核心代码”上。相反,它们越来越集中在处理核心代码运行的上下文上。

因此,高技能的软件工程师将大部分时间花在改进系统的各个方面,例如可扩展性、性能、错误检查、稳健性、可维护性、抽象性、可移植性、边缘条件处理等。

此外,他们还学习更高效的工作方式或改进与其他开发人员的交互方式以及如何计划开展工作以最大程度地降低风险等。构建软件不再只是编码,而是工程系统和解决问题。

软件架构师 - 黑带


所有软件开发人员和软件工程师都需要能够设计他们即将构建的系统和产品的各个部分。“软件架构师”将这项技能提升到更高的水平,并且需要能够针对其他工程师开发的大型软件系统的高层交互做出设计选择。

一个例子

在我们的示例中,除其他事项外,架构师可能会绘制此图来指导服务实现对一组整数求和:

肌肉记忆和领导力

为了有效地做到这一点,软件架构师必须经过多年在各个层面工作的经验的训练。这些实践经验必须根植于他们的肌肉记忆中。这使得架构师能够做出正确的高层决策,而不会陷入细节。

话虽如此,我并不相信纯粹的架构师,即全职负责制定高层决策的工程师。相反,我认为可靠的架构师需要深入细节,在必要时保持高水平的思维,并随时准备高效地深入代码。

在武术中,黑带负责教导和指导。我认为教导和指导也是软件架构师的职责之一。我所说的教导并非直接的(讲座),而更多的是通过身教,指明方向,引导人们做出决定。

结论

认真的武术家终生研习武术;认真的软件开发人员也是如此。希望您觉得本次讨论有用。希望它能为一些通常定义不明确的术语提供一些背景信息,理想情况下,它能解释如何更精确地使用常用术语。


如果您喜欢这篇文章,请保持联系!

文章来源:https://dev.to/lpasqualis/7-ranks-of-coderhood-coder-programmer-computer-scientist-developer-engineer-architect-eca
PREV
9 个软件工程职业错误,应不惜一切代价避免 9 个错误,应不惜一切代价避免。1 - 不测试您的工作。2 - 隐藏您的错误。3 - 强烈感受到个人代码所有权。4 - 为自己而不是为他人记录代码。5 - 阻碍开发过程。6 - 完成 90% 的工作并在完成之前切换到其他事情。7 - 不签入您的工作。8 - 不理解估算的价值。9 - 不与他人分享知识,因为害怕变得不重要或无关紧要。
NEXT
使用 matcha.css 让裸体网站看起来很棒!